blob: cb091562e621d48927cae5dbd312dd1373387c0a [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/trusted_vault/trusted_vault_crypto.h"
#include "base/check_op.h"
#include "components/trusted_vault/securebox.h"
#include "crypto/hmac.h"
namespace trusted_vault {
namespace {
const size_t kHMACDigestLength = 32;
const uint8_t kWrappedKeyHeader[] = {'V', '1', ' ', 's', 'h', 'a', 'r',
'e', 'd', '_', 'k', 'e', 'y'};
} // namespace
absl::optional<std::vector<uint8_t>> DecryptTrustedVaultWrappedKey(
const SecureBoxPrivateKey& private_key,
base::span<const uint8_t> wrapped_key) {
return private_key.Decrypt(
/*shared_secret=*/base::span<const uint8_t>(), kWrappedKeyHeader,
/*encrypted_payload=*/wrapped_key);
}
std::vector<uint8_t> ComputeTrustedVaultWrappedKey(
const SecureBoxPublicKey& public_key,
base::span<const uint8_t> trusted_vault_key) {
return public_key.Encrypt(
/*shared_secret=*/base::span<const uint8_t>(), kWrappedKeyHeader,
/*payload=*/trusted_vault_key);
}
std::vector<uint8_t> ComputeMemberProof(
const SecureBoxPublicKey& key,
const std::vector<uint8_t>& trusted_vault_key) {
crypto::HMAC hmac(crypto::HMAC::SHA256);
CHECK(hmac.Init(trusted_vault_key));
std::vector<uint8_t> member_proof(kHMACDigestLength);
CHECK(hmac.Sign(key.ExportToBytes(), member_proof));
return member_proof;
}
bool VerifyMemberProof(const SecureBoxPublicKey& key,
const std::vector<uint8_t>& trusted_vault_key,
const std::vector<uint8_t>& member_proof) {
crypto::HMAC hmac(crypto::HMAC::SHA256);
CHECK(hmac.Init(trusted_vault_key));
return hmac.Verify(key.ExportToBytes(), member_proof);
}
std::vector<uint8_t> ComputeRotationProofForTesting( // IN-TEST
const std::vector<uint8_t>& trusted_vault_key,
const std::vector<uint8_t>& prev_trusted_vault_key) {
return SecureBoxSymmetricEncrypt(
/*shared_secret=*/prev_trusted_vault_key,
/*header=*/trusted_vault_key,
/*payload=*/base::span<uint8_t>());
}
bool VerifyRotationProof(const std::vector<uint8_t>& trusted_vault_key,
const std::vector<uint8_t>& prev_trusted_vault_key,
const std::vector<uint8_t>& rotation_proof) {
return SecureBoxSymmetricDecrypt(
/*shared_secret=*/prev_trusted_vault_key,
/*header=*/trusted_vault_key, /*encrypted_payload=*/rotation_proof)
.has_value();
}
} // namespace trusted_vault