text: // Copyright 2017 The Chromium 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_PUBLISHER_PROOF,  // Accept only Crx3 with a 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);
  
  }  // namespace crx_file
  
  #endif  // COMPONENTS_CRX_FILE_CRX_VERIFIER_H_
  