mirror of
				https://github.com/meizu-m86/twrp_multirom_m86
				synced 2025-11-04 06:15:41 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2008 The Android Open Source Project
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _RECOVERY_VERIFIER_H
 | 
						|
#define _RECOVERY_VERIFIER_H
 | 
						|
 | 
						|
#include <memory>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include <openssl/ec_key.h>
 | 
						|
#include <openssl/rsa.h>
 | 
						|
#include <openssl/sha.h>
 | 
						|
 | 
						|
#define ASSUMED_UPDATE_BINARY_NAME  "META-INF/com/google/android/update-binary"
 | 
						|
 | 
						|
enum { INSTALL_SUCCESS, INSTALL_ERROR, INSTALL_CORRUPT };
 | 
						|
 | 
						|
static const float VERIFICATION_PROGRESS_FRACTION = 0.25;
 | 
						|
 | 
						|
struct RSADeleter {
 | 
						|
  void operator()(RSA* rsa) {
 | 
						|
    RSA_free(rsa);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
struct ECKEYDeleter {
 | 
						|
  void operator()(EC_KEY* ec_key) {
 | 
						|
    EC_KEY_free(ec_key);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
struct Certificate {
 | 
						|
    typedef enum {
 | 
						|
        KEY_TYPE_RSA,
 | 
						|
        KEY_TYPE_EC,
 | 
						|
    } KeyType;
 | 
						|
 | 
						|
    Certificate(int hash_len_,
 | 
						|
                KeyType key_type_,
 | 
						|
                std::unique_ptr<RSA, RSADeleter>&& rsa_,
 | 
						|
                std::unique_ptr<EC_KEY, ECKEYDeleter>&& ec_)
 | 
						|
        : hash_len(hash_len_),
 | 
						|
          key_type(key_type_),
 | 
						|
          rsa(std::move(rsa_)),
 | 
						|
          ec(std::move(ec_)) {}
 | 
						|
 | 
						|
    // SHA_DIGEST_LENGTH (SHA-1) or SHA256_DIGEST_LENGTH (SHA-256)
 | 
						|
    int hash_len;
 | 
						|
    KeyType key_type;
 | 
						|
    std::unique_ptr<RSA, RSADeleter> rsa;
 | 
						|
    std::unique_ptr<EC_KEY, ECKEYDeleter> ec;
 | 
						|
};
 | 
						|
 | 
						|
/* addr and length define a an update package file that has been
 | 
						|
 * loaded (or mmap'ed, or whatever) into memory.  Verify that the file
 | 
						|
 * is signed and the signature matches one of the given keys.  Return
 | 
						|
 * one of the constants below.
 | 
						|
 */
 | 
						|
int verify_file(unsigned char* addr, size_t length);
 | 
						|
 | 
						|
bool load_keys(const char* filename, std::vector<Certificate>& certs);
 | 
						|
 | 
						|
#define VERIFY_SUCCESS        0
 | 
						|
#define VERIFY_FAILURE        1
 | 
						|
 | 
						|
#endif  /* _RECOVERY_VERIFIER_H */
 |