Home | History | Annotate | Download | only in crypto
      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