blob: 004e79bcb93ea5cea02e671f0b8f733ec22cecd6 [file] [log] [blame]
// Copyright 2015 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/gcm_driver/crypto/p256_key_util.h"
#include <array>
#include <string_view>
#include "base/logging.h"
#include "base/strings/string_view_util.h"
#include "crypto/kex.h"
#include "crypto/keypair.h"
namespace gcm {
bool ComputeSharedP256Secret(crypto::keypair::PrivateKey our_key,
std::string_view their_point,
std::string* out_shared_secret) {
if (!our_key.IsEcP256()) {
DLOG(ERROR) << "The private key is invalid.";
return false;
}
std::optional<crypto::keypair::PublicKey> their_key =
crypto::keypair::PublicKey::FromEcP256Point(
base::as_byte_span(their_point));
if (!their_key.has_value()) {
DLOG(ERROR) << "Can't convert peer public value to curve point.";
return false;
}
std::array<uint8_t, 32> result;
crypto::kex::EcdhP256(*their_key, our_key, result);
out_shared_secret->assign(base::as_string_view(result));
return true;
}
} // namespace gcm