1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
// 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 <array>
#include "base/check_op.h"
#include "components/trusted_vault/securebox.h"
#include "crypto/hash.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
std::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::array<uint8_t, crypto::hash::kSha256Size> ComputeMemberProof(
const SecureBoxPublicKey& key,
base::span<const uint8_t> trusted_vault_key) {
return crypto::hmac::SignSha256(trusted_vault_key, key.ExportToBytes());
}
bool VerifyMemberProof(const SecureBoxPublicKey& key,
base::span<const uint8_t> trusted_vault_key,
base::span<const uint8_t> member_proof) {
auto proof = member_proof.to_fixed_extent<kHMACDigestLength>();
if (!proof) {
return false;
}
return crypto::hmac::VerifySha256(trusted_vault_key, key.ExportToBytes(),
*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
|