signature_creator_unittest.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 <stdint.h>
  6. #include <memory>
  7. #include <string>
  8. #include <vector>
  9. #include "base/hash/sha1.h"
  10. #include "crypto/rsa_private_key.h"
  11. #include "crypto/sha2.h"
  12. #include "crypto/signature_verifier.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. TEST(SignatureCreatorTest, BasicTest) {
  15. // Do a verify round trip.
  16. std::unique_ptr<crypto::RSAPrivateKey> key_original(
  17. crypto::RSAPrivateKey::Create(1024));
  18. ASSERT_TRUE(key_original.get());
  19. std::vector<uint8_t> key_info;
  20. key_original->ExportPrivateKey(&key_info);
  21. std::unique_ptr<crypto::RSAPrivateKey> key(
  22. crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info));
  23. ASSERT_TRUE(key.get());
  24. std::unique_ptr<crypto::SignatureCreator> signer(
  25. crypto::SignatureCreator::Create(key.get(),
  26. crypto::SignatureCreator::SHA1));
  27. ASSERT_TRUE(signer.get());
  28. std::string data("Hello, World!");
  29. ASSERT_TRUE(signer->Update(reinterpret_cast<const uint8_t*>(data.c_str()),
  30. data.size()));
  31. std::vector<uint8_t> signature;
  32. ASSERT_TRUE(signer->Final(&signature));
  33. std::vector<uint8_t> public_key_info;
  34. ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info));
  35. crypto::SignatureVerifier verifier;
  36. ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
  37. signature, public_key_info));
  38. verifier.VerifyUpdate(base::as_bytes(base::make_span(data)));
  39. ASSERT_TRUE(verifier.VerifyFinal());
  40. }
  41. TEST(SignatureCreatorTest, SignDigestTest) {
  42. // Do a verify round trip.
  43. std::unique_ptr<crypto::RSAPrivateKey> key_original(
  44. crypto::RSAPrivateKey::Create(1024));
  45. ASSERT_TRUE(key_original.get());
  46. std::vector<uint8_t> key_info;
  47. key_original->ExportPrivateKey(&key_info);
  48. std::unique_ptr<crypto::RSAPrivateKey> key(
  49. crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info));
  50. ASSERT_TRUE(key.get());
  51. std::string data("Hello, World!");
  52. std::string sha1 = base::SHA1HashString(data);
  53. // Sign sha1 of the input data.
  54. std::vector<uint8_t> signature;
  55. ASSERT_TRUE(crypto::SignatureCreator::Sign(
  56. key.get(), crypto::SignatureCreator::SHA1,
  57. reinterpret_cast<const uint8_t*>(sha1.c_str()), sha1.size(), &signature));
  58. std::vector<uint8_t> public_key_info;
  59. ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info));
  60. // Verify the input data.
  61. crypto::SignatureVerifier verifier;
  62. ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
  63. signature, public_key_info));
  64. verifier.VerifyUpdate(base::as_bytes(base::make_span(data)));
  65. ASSERT_TRUE(verifier.VerifyFinal());
  66. }
  67. TEST(SignatureCreatorTest, SignSHA256DigestTest) {
  68. // Do a verify round trip.
  69. std::unique_ptr<crypto::RSAPrivateKey> key_original(
  70. crypto::RSAPrivateKey::Create(1024));
  71. ASSERT_TRUE(key_original.get());
  72. std::vector<uint8_t> key_info;
  73. key_original->ExportPrivateKey(&key_info);
  74. std::unique_ptr<crypto::RSAPrivateKey> key(
  75. crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info));
  76. ASSERT_TRUE(key.get());
  77. std::string data("Hello, World!");
  78. std::string sha256 = crypto::SHA256HashString(data);
  79. // Sign sha256 of the input data.
  80. std::vector<uint8_t> signature;
  81. ASSERT_TRUE(crypto::SignatureCreator::Sign(
  82. key.get(), crypto::SignatureCreator::HashAlgorithm::SHA256,
  83. reinterpret_cast<const uint8_t*>(sha256.c_str()), sha256.size(),
  84. &signature));
  85. std::vector<uint8_t> public_key_info;
  86. ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info));
  87. // Verify the input data.
  88. crypto::SignatureVerifier verifier;
  89. ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA256,
  90. signature, public_key_info));
  91. verifier.VerifyUpdate(base::as_bytes(base::make_span(data)));
  92. ASSERT_TRUE(verifier.VerifyFinal());
  93. }