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 "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