blob: 239bdc4038dd1febc7c0bd5e5861e81aa3397650 [file] [log] [blame]
// Copyright 2015 The Chromium OS 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 ATTESTATION_COMMON_CRYPTO_UTILITY_H_
#define ATTESTATION_COMMON_CRYPTO_UTILITY_H_
#include <string>
#include <attestation/proto_bindings/attestation_ca.pb.h>
#include <attestation/proto_bindings/keystore.pb.h>
namespace attestation {
// A class which provides helpers for cryptography-related tasks.
class CryptoUtility {
public:
virtual ~CryptoUtility() = default;
// Generates |num_bytes| of |random_data|. Returns true on success.
virtual bool GetRandom(size_t num_bytes, std::string* random_data) const = 0;
// Creates a random |aes_key| and seals it to the TPM's PCR0, producing a
// |sealed_key|. Returns true on success.
virtual bool CreateSealedKey(std::string* aes_key,
std::string* sealed_key) = 0;
// Encrypts the given |data| using the |aes_key|. The |sealed_key| will be
// embedded in the |encrypted_data| to assist with decryption. It can be
// extracted from the |encrypted_data| using UnsealKey(). Returns true on
// success.
virtual bool EncryptData(const std::string& data,
const std::string& aes_key,
const std::string& sealed_key,
std::string* encrypted_data) = 0;
// Extracts and unseals the |aes_key| from the |sealed_key| embedded in
// the given |encrypted_data|. The |sealed_key| is also provided as an output
// so callers can make subsequent calls to EncryptData() with the same key.
// Returns true on success.
virtual bool UnsealKey(const std::string& encrypted_data,
std::string* aes_key,
std::string* sealed_key) = 0;
// Decrypts |encrypted_data| using |aes_key|, producing the decrypted |data|.
// Returns true on success.
virtual bool DecryptData(const std::string& encrypted_data,
const std::string& aes_key,
std::string* data) = 0;
// Convert |public_key| from PKCS #1 RSAPublicKey to X.509
// SubjectPublicKeyInfo. On success returns true and provides the
// |public_key_info|.
virtual bool GetRSASubjectPublicKeyInfo(const std::string& public_key,
std::string* public_key_info) = 0;
// Convert |public_key_info| from X.509 SubjectPublicKeyInfo to PKCS #1
// RSAPublicKey. On success returns true and provides the |public_key|.
virtual bool GetRSAPublicKey(const std::string& public_key_info,
std::string* public_key) = 0;
// Encrypts a |credential| in a format compatible with TPM attestation key
// activation. The |ek_public_key_info| must be provided in X.509
// SubjectPublicKeyInfo format and the |aik_public_key| must be provided in
// TPM_PUBKEY format (TPMT_PUBLIC for TPM 2.0).
virtual bool EncryptIdentityCredential(
TpmVersion tpm_version,
const std::string& credential,
const std::string& ek_public_key_info,
const std::string& aik_public_key,
EncryptedIdentityCredential* encrypted) = 0;
// Decrypts an identity certificate given a 'credential' decrypted by the TPM
// using TPM2_ActivateCredential.
virtual bool DecryptIdentityCertificateForTpm2(
const std::string& credential,
const EncryptedData& encrypted_certificate,
std::string* certificate) = 0;
// Encrypts |data| in a format compatible with the TPM unbind operation. The
// |public_key| must be provided in X.509 SubjectPublicKeyInfo format.
virtual bool EncryptForUnbind(const std::string& public_key,
const std::string& data,
std::string* encrypted_data) = 0;
// Verifies a |signature| over |data| with digest algorithm |digest_nid|.
// The |public_key| must be provided in X.509 SubjectPublicKeyInfo format. The
// format of |signature| can be PKCS #1 v1.5 for RSA, or OpenSSL DER format of
// ECDSA.
virtual bool VerifySignature(int digest_nid,
const std::string& public_key,
const std::string& data,
const std::string& signature) = 0;
// Verifies a PKCS #1 v1.5 SHA-256 |signature| over |data| with digest
// algorithm |digest_nid|. The |public_key_hex| contains a modulus in hex
// format.
virtual bool VerifySignatureUsingHexKey(int digest_nid,
const std::string& public_key_hex,
const std::string& data,
const std::string& signature) = 0;
// Encrypts |data| as expected by the Google ACA. |public_key_hex| is
// a hex modulus and the |key_id| is opaque; these can change depending on
// which instance of the ACA is used (e.g. production vs test). On success
// returns true and populates |encrypted_data| which can be transmitted
// to the ACA.
virtual bool EncryptDataForGoogle(const std::string& certificate,
const std::string& public_key_hex,
const std::string& key_id,
EncryptedData* encrypted_data) = 0;
// Creates a SignedPublicKeyAndChallenge signed with |key_blob| from
// |public_key| of |key_type| in DER format with a random challenge. On
// success returns true and provides the |spkac|. |key_blob| and |public_key|
// are taken from the already loaded CertifiedKey.
//
// Currently only RSA key type is supported.
// TODO(b/140577280): Support ECC key.
virtual bool CreateSPKAC(const std::string& key_blob,
const std::string& public_key,
KeyType key_type,
std::string* spkac) = 0;
// Verifies that the X.509 |certificate| is signed by CA with the public key
// with hex modulus |ca_public_key_hex|.
virtual bool VerifyCertificate(const std::string& certificate,
const std::string& ca_public_key_hex) = 0;
// Gets issuer name for the X.509 |certificate|. On success returns true and
// populates |issuer_name|.
virtual bool GetCertificateIssuerName(const std::string& certificate,
std::string* issuer_name) = 0;
// Gets SubjectPublicKeyInfo of public key for the X.509 |certificate|.
// On success returns true and populates |public_key|.
virtual bool GetCertificateSubjectPublicKeyInfo(
const std::string& certificate, std::string* public_key) = 0;
// Gets public key for the X.509 |certificate|. On success returns true and
// populates |public_key|.
virtual bool GetCertificatePublicKey(const std::string& certificate,
std::string* public_key) = 0;
// Calculates a SHA-1 |key_digest| over |public_key| modulus. The |public_key|
// must be provided in X.509 SubjectPublicKeyInfo format.
virtual bool GetKeyDigest(const std::string& public_key,
std::string* key_digest) = 0;
// Computes and returns an HMAC of |data| using |key| and SHA-256.
virtual std::string HmacSha256(const std::string& key,
const std::string& data) = 0;
// Computes and returns an HMAC of |data| using |key| and SHA-512.
virtual std::string HmacSha512(const std::string& key,
const std::string& data) = 0;
// Get the default signature hash algorithm according to TPM version.
// TPM 1.2 use SHA1. TPM 2.0 use SHA256.
virtual int DefaultDigestAlgoForSignature() = 0;
};
} // namespace attestation
#endif // ATTESTATION_COMMON_CRYPTO_UTILITY_H_