#include "components/trusted_vault/securebox.h"
#include <algorithm>
#include <cstdint>
#include <memory>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
#include "base/check_op.h"
#include "base/location.h"
#include "base/memory/ptr_util.h"
#include "base/ranges/algorithm.h"
#include "crypto/hkdf.h"
#include "crypto/openssl_util.h"
#include "crypto/random.h"
#include "third_party/boringssl/src/include/openssl/aead.h"
#include "third_party/boringssl/src/include/openssl/bn.h"
#include "third_party/boringssl/src/include/openssl/ec.h"
#include "third_party/boringssl/src/include/openssl/ecdh.h"
#include "third_party/boringssl/src/include/openssl/nid.h"
namespace trusted_vault {
namespace {
const size_t kP256FieldBytes = …;
const size_t kAES128KeyLength = …;
const size_t kNonceLength = …;
const size_t kTagLength = …;
const size_t kECPrivateKeyLength = …;
const size_t kECPointLength = …;
const size_t kVersionLength = …;
const uint8_t kSecureBoxVersion[] = …;
const uint8_t kHkdfSalt[] = …;
const char kHkdfInfoWithPublicKey[] = …;
const char kHkdfInfoWithoutPublicKey[] = …;
base::span<const uint8_t> StringToBytes(std::string_view str) { … }
std::vector<uint8_t> ConcatBytes(
const std::vector<base::span<const uint8_t>>& bytes_spans) { … }
bssl::UniquePtr<EC_KEY> ECPublicKeyFromBytes(
base::span<const uint8_t> public_key_bytes,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
std::vector<uint8_t> ECPublicKeyToBytes(
const EC_KEY* key,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
bssl::UniquePtr<EC_KEY> GenerateECKey(
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
std::vector<uint8_t> SecureBoxComputeSecret(
const EC_KEY* private_key,
const EC_POINT* public_key,
base::span<const uint8_t> shared_secret,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
std::vector<uint8_t> SecureBoxAesGcmEncrypt(
base::span<const uint8_t> secret_key,
base::span<const uint8_t> nonce,
base::span<const uint8_t> plaintext,
base::span<const uint8_t> associated_data,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
std::optional<std::vector<uint8_t>> SecureBoxAesGcmDecrypt(
base::span<const uint8_t> secret_key,
base::span<const uint8_t> nonce,
base::span<const uint8_t> ciphertext,
base::span<const uint8_t> associated_data,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
bssl::UniquePtr<EC_KEY> ImportECPrivateKey(
base::span<const uint8_t> key_bytes,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
std::vector<uint8_t> SecureBoxEncryptImpl(
const EC_KEY* our_key_pair,
const EC_POINT* their_public_key,
base::span<const uint8_t> shared_secret,
base::span<const uint8_t> header,
base::span<const uint8_t> payload,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
std::optional<std::vector<uint8_t>> SecureBoxDecryptImpl(
const EC_KEY* our_private_key,
base::span<const uint8_t> shared_secret,
base::span<const uint8_t> header,
base::span<const uint8_t> encrypted_payload) { … }
}
std::vector<uint8_t> SecureBoxSymmetricEncrypt(
base::span<const uint8_t> shared_secret,
base::span<const uint8_t> header,
base::span<const uint8_t> payload) { … }
std::optional<std::vector<uint8_t>> SecureBoxSymmetricDecrypt(
base::span<const uint8_t> shared_secret,
base::span<const uint8_t> header,
base::span<const uint8_t> encrypted_payload) { … }
std::unique_ptr<SecureBoxPublicKey> SecureBoxPublicKey::CreateByImport(
base::span<const uint8_t> key_bytes) { … }
std::unique_ptr<SecureBoxPublicKey> SecureBoxPublicKey::CreateInternal(
bssl::UniquePtr<EC_KEY> key,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
SecureBoxPublicKey::SecureBoxPublicKey(
bssl::UniquePtr<EC_KEY> key,
const crypto::OpenSSLErrStackTracer& err_tracer)
: … { … }
SecureBoxPublicKey::~SecureBoxPublicKey() = default;
std::vector<uint8_t> SecureBoxPublicKey::ExportToBytes() const { … }
std::vector<uint8_t> SecureBoxPublicKey::Encrypt(
base::span<const uint8_t> shared_secret,
base::span<const uint8_t> header,
base::span<const uint8_t> payload) const { … }
std::unique_ptr<SecureBoxPrivateKey> SecureBoxPrivateKey::CreateByImport(
base::span<const uint8_t> key_bytes) { … }
std::unique_ptr<SecureBoxPrivateKey> SecureBoxPrivateKey::CreateInternal(
bssl::UniquePtr<EC_KEY> key,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
SecureBoxPrivateKey::SecureBoxPrivateKey(
bssl::UniquePtr<EC_KEY> key,
const crypto::OpenSSLErrStackTracer& error_tracer)
: … { … }
SecureBoxPrivateKey::~SecureBoxPrivateKey() = default;
std::vector<uint8_t> SecureBoxPrivateKey::ExportToBytes() const { … }
std::optional<std::vector<uint8_t>> SecureBoxPrivateKey::Decrypt(
base::span<const uint8_t> shared_secret,
base::span<const uint8_t> header,
base::span<const uint8_t> encrypted_payload) const { … }
std::unique_ptr<SecureBoxKeyPair> SecureBoxKeyPair::GenerateRandom() { … }
std::unique_ptr<SecureBoxKeyPair> SecureBoxKeyPair::CreateByPrivateKeyImport(
base::span<const uint8_t> private_key_bytes) { … }
SecureBoxKeyPair::SecureBoxKeyPair(
bssl::UniquePtr<EC_KEY> private_ec_key,
const crypto::OpenSSLErrStackTracer& err_tracer) { … }
SecureBoxKeyPair::~SecureBoxKeyPair() = default;
}