// Copyright 2017 The Cobalt Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_CRX_FILE_CRX_VERIFIER_H_
#define COMPONENTS_CRX_FILE_CRX_VERIFIER_H_

#include <stdint.h>
#include <string>
#include <vector>

namespace base {
class FilePath;
}  // namespace base

namespace crx_file {

enum class VerifierFormat {
  CRX2_OR_CRX3,                    // Accept Crx2 or Crx3.
  CRX3,                            // Accept only Crx3.
  CRX3_WITH_TEST_PUBLISHER_PROOF,  // Accept only Crx3 with a test or production
                                   // publisher proof.
  CRX3_WITH_PUBLISHER_PROOF,       // Accept only Crx3 with a production
                                   // publisher proof.
};

enum class VerifierResult {
  OK_FULL,   // The file verifies as a correct full CRX file.
  OK_DELTA,  // The file verifies as a correct differential CRX file.
  ERROR_FILE_NOT_READABLE,      // Cannot open the CRX file.
  ERROR_HEADER_INVALID,         // Failed to parse or understand CRX header.
  ERROR_EXPECTED_HASH_INVALID,  // Expected hash is not well-formed.
  ERROR_FILE_HASH_FAILED,       // The file's actual hash != the expected hash.
  ERROR_SIGNATURE_INITIALIZATION_FAILED,  // A signature or key is malformed.
  ERROR_SIGNATURE_VERIFICATION_FAILED,    // A signature doesn't match.
  ERROR_REQUIRED_PROOF_MISSING,           // RequireKeyProof was unsatisfied.
};

// Verify the file at |crx_path| as a valid Crx of |format|. The Crx must be
// well-formed, contain no invalid proofs, match the |required_file_hash| (if
// non-empty), and contain a proof with each of the |required_key_hashes|.
// If and only if this function returns OK_FULL or OK_DELTA, and only if
// |public_key| / |crx_id| are non-null, they will be updated to contain the
// public key (PEM format, without the header/footer) and crx id (encoded in
// base16 using the characters [a-p]).
VerifierResult Verify(
    const base::FilePath& crx_path,
    const VerifierFormat& format,
    const std::vector<std::vector<uint8_t>>& required_key_hashes,
    const std::vector<uint8_t>& required_file_hash,
    std::string* public_key,
    std::string* crx_id);

#if defined(IN_MEMORY_UPDATES)
// An overload that instead verifies |crx_str| as a valid Crx.
VerifierResult Verify(
    const std::string& crx_str,
    const VerifierFormat& format,
    const std::vector<std::vector<uint8_t>>& required_key_hashes,
    const std::vector<uint8_t>& required_file_hash,
    std::string* public_key,
    std::string* crx_id);
#endif

}  // namespace crx_file

#endif  // COMPONENTS_CRX_FILE_CRX_VERIFIER_H_
