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