910e62b5创建于 1月15日历史提交
// 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