15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/sha1.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/rsa_private_key.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "crypto/sha2.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/signature_creator.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/signature_verifier.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This is the algorithm ID for SHA-1 with RSA encryption. 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst uint8 kSHA1WithRSAAlgorithmID[] = { 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This is the algorithm ID for SHA-1 with RSA encryption. 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint8 kSHA256WithRSAAlgorithmID[] = { 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0xf7, 0x0d, 0x01, 0x01, 0x0B, 0x05, 0x00 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SignatureCreatorTest, BasicTest) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do a verify round trip. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<crypto::RSAPrivateKey> key_original( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crypto::RSAPrivateKey::Create(1024)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(key_original.get()); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> key_info; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_original->ExportPrivateKey(&key_info); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<crypto::RSAPrivateKey> key( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info)); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(key.get()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<crypto::SignatureCreator> signer( 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::SignatureCreator::Create(key.get(), 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::SignatureCreator::SHA1)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(signer.get()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data("Hello, World!"); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(signer->Update(reinterpret_cast<const uint8*>(data.c_str()), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.size())); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> signature; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(signer->Final(&signature)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> public_key_info; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crypto::SignatureVerifier verifier; 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(verifier.VerifyInit( 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch kSHA1WithRSAAlgorithmID, sizeof(kSHA1WithRSAAlgorithmID), 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &signature.front(), signature.size(), 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &public_key_info.front(), public_key_info.size())); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch verifier.VerifyUpdate(reinterpret_cast<const uint8*>(data.c_str()), 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch data.size()); 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(verifier.VerifyFinal()); 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(SignatureCreatorTest, SignDigestTest) { 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Do a verify round trip. 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<crypto::RSAPrivateKey> key_original( 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crypto::RSAPrivateKey::Create(1024)); 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(key_original.get()); 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<uint8> key_info; 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch key_original->ExportPrivateKey(&key_info); 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<crypto::RSAPrivateKey> key( 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info)); 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(key.get()); 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string data("Hello, World!"); 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string sha1 = base::SHA1HashString(data); 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sign sha1 of the input data. 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<uint8> signature; 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(crypto::SignatureCreator::Sign( 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch key.get(), 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::SignatureCreator::SHA1, 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch reinterpret_cast<const uint8*>(sha1.c_str()), 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch sha1.size(), 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &signature)); 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<uint8> public_key_info; 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info)); 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Verify the input data. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crypto::SignatureVerifier verifier; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(verifier.VerifyInit( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSHA1WithRSAAlgorithmID, sizeof(kSHA1WithRSAAlgorithmID), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &signature.front(), signature.size(), 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &public_key_info.front(), public_key_info.size())); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifier.VerifyUpdate(reinterpret_cast<const uint8*>(data.c_str()), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.size()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(verifier.VerifyFinal()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(SignatureCreatorTest, SignSHA256DigestTest) { 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Do a verify round trip. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<crypto::RSAPrivateKey> key_original( 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::RSAPrivateKey::Create(1024)); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(key_original.get()); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<uint8> key_info; 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci key_original->ExportPrivateKey(&key_info); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<crypto::RSAPrivateKey> key( 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_info)); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(key.get()); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string data("Hello, World!"); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string sha256 = crypto::SHA256HashString(data); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sign sha256 of the input data. 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<uint8> signature; 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(crypto::SignatureCreator::Sign( 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci key.get(), 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::SignatureCreator::HashAlgorithm::SHA256, 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<const uint8*>(sha256.c_str()), 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sha256.size(), 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &signature)); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<uint8> public_key_info; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(key_original->ExportPublicKey(&public_key_info)); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify the input data. 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto::SignatureVerifier verifier; 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(verifier.VerifyInit( 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kSHA256WithRSAAlgorithmID, sizeof(kSHA256WithRSAAlgorithmID), 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &signature.front(), signature.size(), 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &public_key_info.front(), public_key_info.size())); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci verifier.VerifyUpdate(reinterpret_cast<const uint8*>(data.c_str()), 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data.size()); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(verifier.VerifyFinal()); 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 144