signature_creator.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright (c) 2012 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/signature_creator.h"
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include "base/check.h"
  8. #include "crypto/openssl_util.h"
  9. #include "crypto/rsa_private_key.h"
  10. #include "third_party/boringssl/src/include/openssl/evp.h"
  11. #include "third_party/boringssl/src/include/openssl/rsa.h"
  12. namespace crypto {
  13. namespace {
  14. const EVP_MD* ToOpenSSLDigest(SignatureCreator::HashAlgorithm hash_alg) {
  15. switch (hash_alg) {
  16. case SignatureCreator::SHA1:
  17. return EVP_sha1();
  18. case SignatureCreator::SHA256:
  19. return EVP_sha256();
  20. }
  21. return nullptr;
  22. }
  23. int ToOpenSSLDigestType(SignatureCreator::HashAlgorithm hash_alg) {
  24. switch (hash_alg) {
  25. case SignatureCreator::SHA1:
  26. return NID_sha1;
  27. case SignatureCreator::SHA256:
  28. return NID_sha256;
  29. }
  30. return NID_undef;
  31. }
  32. } // namespace
  33. SignatureCreator::~SignatureCreator() {
  34. EVP_MD_CTX_destroy(sign_context_);
  35. }
  36. // static
  37. std::unique_ptr<SignatureCreator> SignatureCreator::Create(
  38. RSAPrivateKey* key,
  39. HashAlgorithm hash_alg) {
  40. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  41. std::unique_ptr<SignatureCreator> result(new SignatureCreator);
  42. const EVP_MD* const digest = ToOpenSSLDigest(hash_alg);
  43. DCHECK(digest);
  44. if (!digest) {
  45. return nullptr;
  46. }
  47. if (!EVP_DigestSignInit(result->sign_context_, nullptr, digest, nullptr,
  48. key->key())) {
  49. return nullptr;
  50. }
  51. return result;
  52. }
  53. // static
  54. bool SignatureCreator::Sign(RSAPrivateKey* key,
  55. HashAlgorithm hash_alg,
  56. const uint8_t* data,
  57. int data_len,
  58. std::vector<uint8_t>* signature) {
  59. bssl::UniquePtr<RSA> rsa_key(EVP_PKEY_get1_RSA(key->key()));
  60. if (!rsa_key)
  61. return false;
  62. signature->resize(RSA_size(rsa_key.get()));
  63. unsigned int len = 0;
  64. if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len,
  65. signature->data(), &len, rsa_key.get())) {
  66. signature->clear();
  67. return false;
  68. }
  69. signature->resize(len);
  70. return true;
  71. }
  72. bool SignatureCreator::Update(const uint8_t* data_part, int data_part_len) {
  73. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  74. return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len);
  75. }
  76. bool SignatureCreator::Final(std::vector<uint8_t>* signature) {
  77. OpenSSLErrStackTracer err_tracer(FROM_HERE);
  78. // Determine the maximum length of the signature.
  79. size_t len = 0;
  80. if (!EVP_DigestSignFinal(sign_context_, nullptr, &len)) {
  81. signature->clear();
  82. return false;
  83. }
  84. signature->resize(len);
  85. // Sign it.
  86. if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) {
  87. signature->clear();
  88. return false;
  89. }
  90. signature->resize(len);
  91. return true;
  92. }
  93. SignatureCreator::SignatureCreator() : sign_context_(EVP_MD_CTX_create()) {}
  94. } // namespace crypto