blob: d254fdc2b899f29d121490d8859cde5a80626c7b [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/base/rsa_key_pair.h"
#include <stdint.h>
#include <limits>
#include <string>
#include <utility>
#include <vector>
#include "base/base64.h"
#include "base/logging.h"
#include "base/rand_util.h"
#include "base/time/time.h"
#include "crypto/sign.h"
#include "net/cert/x509_util.h"
namespace remoting {
RsaKeyPair::RsaKeyPair(crypto::keypair::PrivateKey&& key)
: key_(std::move(key)) {}
RsaKeyPair::~RsaKeyPair() = default;
// static
scoped_refptr<RsaKeyPair> RsaKeyPair::Generate() {
return new RsaKeyPair(crypto::keypair::PrivateKey::GenerateRsa2048());
}
// static
scoped_refptr<RsaKeyPair> RsaKeyPair::FromString(
const std::string& key_base64) {
std::optional<std::vector<uint8_t>> key_bytes =
base::Base64Decode(key_base64);
if (!key_bytes.has_value()) {
LOG(ERROR) << "Failed to decode private key.";
return nullptr;
}
auto key = crypto::keypair::PrivateKey::FromPrivateKeyInfo(*key_bytes);
if (!key.has_value()) {
LOG(ERROR) << "Invalid private key.";
return nullptr;
}
return new RsaKeyPair(std::move(*key));
}
std::string RsaKeyPair::ToString() const {
return base::Base64Encode(key_.ToPrivateKeyInfo());
}
std::string RsaKeyPair::GetPublicKey() const {
return base::Base64Encode(key_.ToSubjectPublicKeyInfo());
}
std::string RsaKeyPair::GenerateCertificate() {
std::string der_cert;
net::x509_util::CreateSelfSignedCert(
key_.key(), net::x509_util::DIGEST_SHA256, "CN=chromoting",
base::RandInt(1, std::numeric_limits<int>::max()), base::Time::Now(),
base::Time::Now() + base::Days(1), {}, &der_cert);
return der_cert;
}
} // namespace remoting