/*
 * 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 */
