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