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 <vector> 6 7 #include "base/memory/scoped_ptr.h" 8 #include "base/sha1.h" 9 #include "crypto/rsa_private_key.h" 10 #include "crypto/signature_creator.h" 11 #include "crypto/signature_verifier.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 namespace { 15 16 // This is the algorithm ID for SHA-1 with RSA encryption. 17 const uint8 kSHA1WithRSAAlgorithmID[] = { 18 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 19 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00 20 }; 21 22 } 23 24 TEST(SignatureCreatorTest, BasicTest) { 25 // Do a verify round trip. 26 scoped_ptr<crypto::RSAPrivateKey> key_original( 27 crypto::RSAPrivateKey::Create(1024)); 28 ASSERT_TRUE(key_original.get()); 29 30 std::vector<uint8> key_info; 31 key_original->ExportPrivateKey(&key_info); 32 scoped_ptr<crypto::RSAPrivateKey> key( 33 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info)); 34 ASSERT_TRUE(key.get()); 35 36 scoped_ptr<crypto::SignatureCreator> signer( 37 crypto::SignatureCreator::Create(key.get())); 38 ASSERT_TRUE(signer.get()); 39 40 std::string data("Hello, World!"); 41 ASSERT_TRUE(signer->Update(reinterpret_cast<const uint8*>(data.c_str()), 42 data.size())); 43 44 std::vector<uint8> signature; 45 ASSERT_TRUE(signer->Final(&signature)); 46 47 std::vector<uint8> public_key_info; 48 ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info)); 49 50 crypto::SignatureVerifier verifier; 51 ASSERT_TRUE(verifier.VerifyInit( 52 kSHA1WithRSAAlgorithmID, sizeof(kSHA1WithRSAAlgorithmID), 53 &signature.front(), signature.size(), 54 &public_key_info.front(), public_key_info.size())); 55 56 verifier.VerifyUpdate(reinterpret_cast<const uint8*>(data.c_str()), 57 data.size()); 58 ASSERT_TRUE(verifier.VerifyFinal()); 59 } 60 61 TEST(SignatureCreatorTest, SignDigestTest) { 62 // Do a verify round trip. 63 scoped_ptr<crypto::RSAPrivateKey> key_original( 64 crypto::RSAPrivateKey::Create(1024)); 65 ASSERT_TRUE(key_original.get()); 66 67 std::vector<uint8> key_info; 68 key_original->ExportPrivateKey(&key_info); 69 scoped_ptr<crypto::RSAPrivateKey> key( 70 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info)); 71 ASSERT_TRUE(key.get()); 72 73 std::string data("Hello, World!"); 74 std::string sha1 = base::SHA1HashString(data); 75 // Sign sha1 of the input data. 76 std::vector<uint8> signature; 77 ASSERT_TRUE(crypto::SignatureCreator::Sign( 78 key.get(), 79 reinterpret_cast<const uint8*>(sha1.c_str()), 80 sha1.size(), 81 &signature)); 82 83 std::vector<uint8> public_key_info; 84 ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info)); 85 86 // Verify the input data. 87 crypto::SignatureVerifier verifier; 88 ASSERT_TRUE(verifier.VerifyInit( 89 kSHA1WithRSAAlgorithmID, sizeof(kSHA1WithRSAAlgorithmID), 90 &signature.front(), signature.size(), 91 &public_key_info.front(), public_key_info.size())); 92 93 verifier.VerifyUpdate(reinterpret_cast<const uint8*>(data.c_str()), 94 data.size()); 95 ASSERT_TRUE(verifier.VerifyFinal()); 96 } 97