rsa_private_key.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "crypto/rsa_private_key.h"
  5. #include <stdint.h>
  6. #include <memory>
  7. #include <utility>
  8. #include "base/check.h"
  9. #include "base/containers/span.h"
  10. #include "crypto/openssl_util.h"
  11. #include "third_party/boringssl/src/include/openssl/bn.h"
  12. #include "third_party/boringssl/src/include/openssl/bytestring.h"
  13. #include "third_party/boringssl/src/include/openssl/evp.h"
  14. #include "third_party/boringssl/src/include/openssl/mem.h"
  15. #include "third_party/boringssl/src/include/openssl/rsa.h"
  16. namespace crypto {
  17. // static
  18. std::unique_ptr<RSAPrivateKey> RSAPrivateKey::Create(uint16_t num_bits) {
  19. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  20. bssl::UniquePtr<RSA> rsa_key(RSA_new());
  21. bssl::UniquePtr<BIGNUM> bn(BN_new());
  22. if (!rsa_key.get() || !bn.get() || !BN_set_word(bn.get(), 65537L))
  23. return nullptr;
  24. if (!RSA_generate_key_ex(rsa_key.get(), num_bits, bn.get(), nullptr))
  25. return nullptr;
  26. std::unique_ptr<RSAPrivateKey> result(new RSAPrivateKey);
  27. result->key_.reset(EVP_PKEY_new());
  28. if (!result->key_ || !EVP_PKEY_set1_RSA(result->key_.get(), rsa_key.get()))
  29. return nullptr;
  30. return result;
  31. }
  32. // static
  33. std::unique_ptr<RSAPrivateKey> RSAPrivateKey::CreateFromPrivateKeyInfo(
  34. base::span<const uint8_t> input) {
  35. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  36. CBS cbs;
  37. CBS_init(&cbs, input.data(), input.size());
  38. bssl::UniquePtr<EVP_PKEY> pkey(EVP_parse_private_key(&cbs));
  39. if (!pkey || CBS_len(&cbs) != 0 || EVP_PKEY_id(pkey.get()) != EVP_PKEY_RSA)
  40. return nullptr;
  41. std::unique_ptr<RSAPrivateKey> result(new RSAPrivateKey);
  42. result->key_ = std::move(pkey);
  43. return result;
  44. }
  45. // static
  46. std::unique_ptr<RSAPrivateKey> RSAPrivateKey::CreateFromKey(EVP_PKEY* key) {
  47. DCHECK(key);
  48. if (EVP_PKEY_type(key->type) != EVP_PKEY_RSA)
  49. return nullptr;
  50. std::unique_ptr<RSAPrivateKey> copy(new RSAPrivateKey);
  51. copy->key_ = bssl::UpRef(key);
  52. return copy;
  53. }
  54. RSAPrivateKey::RSAPrivateKey() = default;
  55. RSAPrivateKey::~RSAPrivateKey() = default;
  56. std::unique_ptr<RSAPrivateKey> RSAPrivateKey::Copy() const {
  57. std::unique_ptr<RSAPrivateKey> copy(new RSAPrivateKey);
  58. bssl::UniquePtr<RSA> rsa(EVP_PKEY_get1_RSA(key_.get()));
  59. if (!rsa)
  60. return nullptr;
  61. copy->key_.reset(EVP_PKEY_new());
  62. if (!EVP_PKEY_set1_RSA(copy->key_.get(), rsa.get()))
  63. return nullptr;
  64. return copy;
  65. }
  66. bool RSAPrivateKey::ExportPrivateKey(std::vector<uint8_t>* output) const {
  67. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  68. uint8_t *der;
  69. size_t der_len;
  70. bssl::ScopedCBB cbb;
  71. if (!CBB_init(cbb.get(), 0) ||
  72. !EVP_marshal_private_key(cbb.get(), key_.get()) ||
  73. !CBB_finish(cbb.get(), &der, &der_len)) {
  74. return false;
  75. }
  76. output->assign(der, der + der_len);
  77. OPENSSL_free(der);
  78. return true;
  79. }
  80. bool RSAPrivateKey::ExportPublicKey(std::vector<uint8_t>* output) const {
  81. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  82. uint8_t *der;
  83. size_t der_len;
  84. bssl::ScopedCBB cbb;
  85. if (!CBB_init(cbb.get(), 0) ||
  86. !EVP_marshal_public_key(cbb.get(), key_.get()) ||
  87. !CBB_finish(cbb.get(), &der, &der_len)) {
  88. return false;
  89. }
  90. output->assign(der, der + der_len);
  91. OPENSSL_free(der);
  92. return true;
  93. }
  94. } // namespace crypto