rsa_private_key_unittest.cc revision 3a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6
14c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Use of this source code is governed by a BSD-style license that can be
34c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// found in the LICENSE file.
44c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
54c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath#include "crypto/rsa_private_key.h"
64c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
74c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath#include <stdint.h>
84c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
94c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath#include <memory>
104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath#include "testing/gtest/include/gtest/gtest.h"
124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathnamespace {
144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathconst uint8_t kTestPrivateKeyInfo[] = {
164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x30, 0x82, 0x02, 0x78, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x02, 0x62, 0x30, 0x82, 0x02, 0x5e, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b, 0x0c, 0xdc, 0x51, 0x61,
204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08, 0x55, 0x84, 0xd5, 0x3a,
214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04, 0x13, 0x3f, 0x8d, 0xf4,
224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a, 0xb0, 0x40, 0x53, 0x3a,
234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30, 0xda, 0x8a, 0x31, 0x4f,
244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17, 0xde, 0x4e, 0xb9, 0x57,
254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89, 0x4e, 0xb6, 0x47, 0xff,
264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85, 0x84, 0x32, 0x33, 0xf3,
274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14, 0x6f, 0x13, 0x8d, 0xc5,
284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18, 0x53, 0x56, 0xa6, 0x83,
294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6, 0x0f, 0x02, 0x03, 0x01,
304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x00, 0x01, 0x02, 0x81, 0x80, 0x03, 0x61, 0x89, 0x37, 0xcb, 0xf2, 0x98,
314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xa0, 0xce, 0xb4, 0xcb, 0x16, 0x13, 0xf0, 0xe6, 0xaf, 0x5c, 0xc5, 0xa7,
324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x69, 0x71, 0xca, 0xba, 0x8d, 0xe0, 0x4d, 0xdd, 0xed, 0xb8, 0x48, 0x8b,
334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x16, 0x93, 0x36, 0x95, 0xc2, 0x91, 0x40, 0x65, 0x17, 0xbd, 0x7f, 0xd6,
344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xad, 0x9e, 0x30, 0x28, 0x46, 0xe4, 0x3e, 0xcc, 0x43, 0x78, 0xf9, 0xfe,
354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x1f, 0x33, 0x23, 0x1e, 0x31, 0x12, 0x9d, 0x3c, 0xa7, 0x08, 0x82, 0x7b,
364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x7d, 0x25, 0x4e, 0x5e, 0x19, 0xa8, 0x9b, 0xed, 0x86, 0xb2, 0xcb, 0x3c,
374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xfe, 0x4e, 0xa1, 0xfa, 0x62, 0x87, 0x3a, 0x17, 0xf7, 0x60, 0xec, 0x38,
384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x29, 0xe8, 0x4f, 0x34, 0x9f, 0x76, 0x9d, 0xee, 0xa3, 0xf6, 0x85, 0x6b,
394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x84, 0x43, 0xc9, 0x1e, 0x01, 0xff, 0xfd, 0xd0, 0x29, 0x4c, 0xfa, 0x8e,
404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x57, 0x0c, 0xc0, 0x71, 0xa5, 0xbb, 0x88, 0x46, 0x29, 0x5c, 0xc0, 0x4f,
414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x01, 0x02, 0x41, 0x00, 0xf5, 0x83, 0xa4, 0x64, 0x4a, 0xf2, 0xdd, 0x8c,
424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x2c, 0xed, 0xa8, 0xd5, 0x60, 0x5a, 0xe4, 0xc7, 0xcc, 0x61, 0xcd, 0x38,
434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x42, 0x20, 0xd3, 0x82, 0x18, 0xf2, 0x35, 0x00, 0x72, 0x2d, 0xf7, 0x89,
444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x80, 0x67, 0xb5, 0x93, 0x05, 0x5f, 0xdd, 0x42, 0xba, 0x16, 0x1a, 0xea,
454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x15, 0xc6, 0xf0, 0xb8, 0x8c, 0xbc, 0xbf, 0x54, 0x9e, 0xf1, 0xc1, 0xb2,
464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xb3, 0x8b, 0xb6, 0x26, 0x02, 0x30, 0xc4, 0x81, 0x02, 0x41, 0x00, 0xc0,
474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x60, 0x62, 0x80, 0xe1, 0x22, 0x78, 0xf6, 0x9d, 0x83, 0x18, 0xeb, 0x72,
484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x45, 0xd7, 0xc8, 0x01, 0x7f, 0xa9, 0xca, 0x8f, 0x7d, 0xd6, 0xb8, 0x31,
494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x2b, 0x84, 0x7f, 0x62, 0xd9, 0xa9, 0x22, 0x17, 0x7d, 0x06, 0x35, 0x6c,
504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xf3, 0xc1, 0x94, 0x17, 0x85, 0x5a, 0xaf, 0x9c, 0x5c, 0x09, 0x3c, 0xcf,
514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x2f, 0x44, 0x9d, 0xb6, 0x52, 0x68, 0x5f, 0xf9, 0x59, 0xc8, 0x84, 0x2b,
524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x39, 0x22, 0x8f, 0x02, 0x41, 0x00, 0xb2, 0x04, 0xe2, 0x0e, 0x56, 0xca,
534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x03, 0x1a, 0xc0, 0xf9, 0x12, 0x92, 0xa5, 0x6b, 0x42, 0xb8, 0x1c, 0xda,
544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x4d, 0x93, 0x9d, 0x5f, 0x6f, 0xfd, 0xc5, 0x58, 0xda, 0x55, 0x98, 0x74,
554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xfc, 0x28, 0x17, 0x93, 0x1b, 0x75, 0x9f, 0x50, 0x03, 0x7f, 0x7e, 0xae,
564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xc8, 0x95, 0x33, 0x75, 0x2c, 0xd6, 0xa4, 0x35, 0xb8, 0x06, 0x03, 0xba,
574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x08, 0x59, 0x2b, 0x17, 0x02, 0xdc, 0x4c, 0x7a, 0x50, 0x01, 0x02, 0x41,
584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x00, 0x9d, 0xdb, 0x39, 0x59, 0x09, 0xe4, 0x30, 0xa0, 0x24, 0xf5, 0xdb,
594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x2f, 0xf0, 0x2f, 0xf1, 0x75, 0x74, 0x0d, 0x5e, 0xb5, 0x11, 0x73, 0xb0,
604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x0a, 0xaa, 0x86, 0x4c, 0x0d, 0xff, 0x7e, 0x1d, 0xb4, 0x14, 0xd4, 0x09,
614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x91, 0x33, 0x5a, 0xfd, 0xa0, 0x58, 0x80, 0x9b, 0xbe, 0x78, 0x2e, 0x69,
624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x82, 0x15, 0x7c, 0x72, 0xf0, 0x7b, 0x18, 0x39, 0xff, 0x6e, 0xeb, 0xc6,
634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x86, 0xf5, 0xb4, 0xc7, 0x6f, 0x02, 0x41, 0x00, 0x8d, 0x1a, 0x37, 0x0f,
644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x76, 0xc4, 0x82, 0xfa, 0x5c, 0xc3, 0x79, 0x35, 0x3e, 0x70, 0x8a, 0xbf,
654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x27, 0x49, 0xb0, 0x99, 0x63, 0xcb, 0x77, 0x5f, 0xa8, 0x82, 0x65, 0xf6,
664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x03, 0x52, 0x51, 0xf1, 0xae, 0x2e, 0x05, 0xb3, 0xc6, 0xa4, 0x92, 0xd1,
674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0xce, 0x6c, 0x72, 0xfb, 0x21, 0xb3, 0x02, 0x87, 0xe4, 0xfd, 0x61, 0xca,
684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath    0x00, 0x42, 0x19, 0xf0, 0xda, 0x5a, 0x53, 0xe3, 0xb1, 0xc5, 0x15, 0xf3};
694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}  // namespace
714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Generate random private keys with two different sizes. Reimport, then
734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// export them again. We should get back the same exact bytes.
744c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, InitRandomTest) {
754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> keypair1(
764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::Create(1024));
774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> keypair2(
784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::Create(2048));
794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair1.get());
804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair2.get());
814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey1;
834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey2;
844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> pubkey1;
854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> pubkey2;
864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair1->ExportPrivateKey(&privkey1));
884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair2->ExportPrivateKey(&privkey2));
894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair1->ExportPublicKey(&pubkey1));
904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair2->ExportPublicKey(&pubkey2));
914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> keypair3(
934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(privkey1));
944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> keypair4(
954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(privkey2));
964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair3.get());
974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair4.get());
984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey3;
1004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey4;
1014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair3->ExportPrivateKey(&privkey3));
1024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair4->ExportPrivateKey(&privkey4));
1034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(privkey1.size(), privkey3.size());
1054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(privkey2.size(), privkey4.size());
1064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(0, memcmp(&privkey1.front(), &privkey3.front(), privkey1.size()));
1074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(0, memcmp(&privkey2.front(), &privkey4.front(), privkey2.size()));
1084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
1094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Test Copy() method.
1114c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, CopyTest) {
1124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> input(kTestPrivateKeyInfo,
1134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath                             kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
1144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key(
1164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
1174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key_copy(key->Copy());
1194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_copy.get());
1204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey_copy;
1224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_copy->ExportPrivateKey(&privkey_copy));
1234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(input, privkey_copy);
1244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
1254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Test that CreateFromPrivateKeyInfo fails if there is extra data after the RSA
1274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// key.
1284c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, ExtraData) {
1294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> input(kTestPrivateKeyInfo,
1304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath                             kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
1314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  input.push_back(0);
1324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key(
1344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
1354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  // Import should fail.
1374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  EXPECT_FALSE(key);
1384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
1394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1404c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, NotRsaKey) {
1414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  // Defines a valid P-256 private key.
1424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  const uint8_t kTestEcPrivateKeyInfo[] = {
1434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
1444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
1454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
1464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x1F, 0xE3, 0x39, 0x50, 0xC5, 0xF4, 0x61, 0x12, 0x4A, 0xE9, 0x92, 0xC2,
1474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xBD, 0xFD, 0xF1, 0xC7, 0x3B, 0x16, 0x15, 0xF5, 0x71, 0xBD, 0x56, 0x7E,
1484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x60, 0xD1, 0x9A, 0xA1, 0xF4, 0x8C, 0xDF, 0x42, 0xA1, 0x44, 0x03, 0x42,
1494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x00, 0x04, 0x7C, 0x11, 0x0C, 0x66, 0xDC, 0xFD, 0xA8, 0x07, 0xF6, 0xE6,
1504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x9E, 0x45, 0xDD, 0xB3, 0xC7, 0x4F, 0x69, 0xA1, 0x48, 0x4D, 0x20, 0x3E,
1514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x8D, 0xC5, 0xAD, 0xA8, 0xE9, 0xA9, 0xDD, 0x7C, 0xB3, 0xC7, 0x0D, 0xF4,
1524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x48, 0x98, 0x6E, 0x51, 0xBD, 0xE5, 0xD1, 0x57, 0x6F, 0x99, 0x90, 0x1F,
1534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x9C, 0x2C, 0x6A, 0x80, 0x6A, 0x47, 0xFD, 0x90, 0x76, 0x43, 0xA7, 0x2B,
1544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x83, 0x55, 0x97, 0xEF, 0xC8, 0xC6};
1554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> input(
1574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      kTestEcPrivateKeyInfo,
1584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      kTestEcPrivateKeyInfo + sizeof(kTestEcPrivateKeyInfo));
1594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key(
1614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
1624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  // Import should fail as the given PKCS8 bytes were for an EC key not RSA key.
1644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  EXPECT_FALSE(key);
1654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
1664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Verify that generated public keys look good. This test data was generated
1684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// with the openssl command line tool.
1694c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, PublicKeyTest) {
1704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  const uint8_t expected_public_key_info[] = {
1714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
1724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81,
1734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x89, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b,
1744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x0c, 0xdc, 0x51, 0x61, 0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08,
1754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x55, 0x84, 0xd5, 0x3a, 0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04,
1764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x13, 0x3f, 0x8d, 0xf4, 0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a,
1774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb0, 0x40, 0x53, 0x3a, 0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30,
1784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xda, 0x8a, 0x31, 0x4f, 0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17,
1794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xde, 0x4e, 0xb9, 0x57, 0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89,
1804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x4e, 0xb6, 0x47, 0xff, 0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85,
1814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x84, 0x32, 0x33, 0xf3, 0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14,
1824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x6f, 0x13, 0x8d, 0xc5, 0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18,
1834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x53, 0x56, 0xa6, 0x83, 0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6,
1844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x0f, 0x02, 0x03, 0x01, 0x00, 0x01};
1854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> input(kTestPrivateKeyInfo,
1874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath                             kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
1884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key(
1904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
1914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key.get());
1924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> output;
1944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key->ExportPublicKey(&output));
1954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
1964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(0,
1974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath            memcmp(expected_public_key_info, &output.front(), output.size()));
1984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
1994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
2004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// These two test keys each contain an integer that has 0x00 for its most
2014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// significant byte. When encoded as ASN.1, this byte is dropped and there are
2024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// two interesting sub-cases. When the sign bit of the integer is set, an extra
2034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// null byte is added back to force the encoded value to be positive. When the
2044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// sign bit is not set, the encoded integer is just left shorter than usual.
2054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// See also: http://code.google.com/p/chromium/issues/detail?id=14877.
2064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath//
2074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// Before we were handling this correctly, we would see one of two failures:
2084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// * RSAPrivateKey::CreateFromPrivateKeyInfo would return null because the
2094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath//   underlying windows API failed to import the key.
2104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// * The import would succeed, but incorrectly interpret the data. On export,
2114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath//   the key would contain different values.
2124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath//
2134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath// This test case verifies these two failures modes don't occur.
2144c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, ShortIntegers) {
2154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  const uint8_t short_integer_with_high_bit[] = {
2164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x30, 0x82, 0x02, 0x77, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
2174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
2184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x02, 0x61, 0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
2194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x00, 0x92, 0x59, 0x32, 0x7d, 0x8e, 0xaf, 0x2e, 0xd5, 0xb2, 0x5c, 0x67,
2204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xc8, 0x7d, 0x48, 0xb7, 0x84, 0x12, 0xd0, 0x76, 0xda, 0xe1, 0xa3, 0x1e,
2214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x40, 0x01, 0x14, 0x5c, 0xef, 0x26, 0x6e, 0x28, 0xa2, 0xf7, 0xa5, 0xb4,
2224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x02, 0x37, 0xd0, 0x53, 0x10, 0xcb, 0x7c, 0x6a, 0xf4, 0x53, 0x9f, 0xb8,
2234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe0, 0x83, 0x93, 0xd1, 0x19, 0xd8, 0x28, 0xd1, 0xd1, 0xd8, 0x87, 0x8f,
2244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x92, 0xfd, 0x73, 0xc0, 0x4d, 0x3e, 0x07, 0x22, 0x1f, 0xc1, 0x20, 0xb0,
2254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x70, 0xb2, 0x3b, 0xea, 0xb1, 0xe5, 0x0a, 0xfd, 0x56, 0x49, 0x5e, 0x39,
2264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x90, 0x91, 0xce, 0x04, 0x83, 0x29, 0xaa, 0xfd, 0x12, 0xa4, 0x42, 0x26,
2274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x6c, 0x6e, 0x79, 0x70, 0x77, 0x03, 0xb2, 0x07, 0x01, 0x3d, 0x85, 0x81,
2284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x95, 0x9e, 0xda, 0x5a, 0xa3, 0xf4, 0x2d, 0x38, 0x04, 0x58, 0xf5, 0x6b,
2294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xc9, 0xf1, 0xb5, 0x65, 0xfe, 0x66, 0x0d, 0xa2, 0xd5, 0x02, 0x03, 0x01,
2304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x00, 0x01, 0x02, 0x81, 0x80, 0x5e, 0x01, 0x5f, 0xb6, 0x59, 0x1d, 0xdc,
2314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x36, 0xb6, 0x60, 0x36, 0xe6, 0x08, 0xdb, 0xd9, 0xcd, 0xc3, 0x8c, 0x16,
2324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x9c, 0x98, 0x8d, 0x7f, 0xd3, 0xdb, 0x1d, 0xaa, 0x68, 0x8f, 0xc5, 0xf8,
2334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe2, 0x5d, 0xb3, 0x19, 0xc2, 0xc6, 0xf9, 0x51, 0x32, 0x1b, 0x93, 0x6a,
2344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xdc, 0x50, 0x8e, 0xeb, 0x61, 0x84, 0x03, 0x42, 0x30, 0x98, 0xb1, 0xf7,
2354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xbd, 0x14, 0x9a, 0x57, 0x36, 0x33, 0x09, 0xd4, 0x3e, 0x90, 0xda, 0xef,
2364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x09, 0x6e, 0xef, 0x49, 0xb6, 0x60, 0x68, 0x5e, 0x54, 0x17, 0x25, 0x5b,
2374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x37, 0xe3, 0x35, 0x63, 0x5b, 0x60, 0x3c, 0xbd, 0x50, 0xdf, 0x46, 0x43,
2384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x08, 0xa4, 0x71, 0x21, 0xf1, 0x30, 0x71, 0xdc, 0xda, 0xd7, 0x6f, 0xd2,
2394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x18, 0xbd, 0x39, 0xf1, 0xe1, 0xbe, 0xa8, 0x8d, 0x62, 0xdf, 0xa2, 0x3e,
2404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb6, 0x15, 0x26, 0xb6, 0x57, 0xbd, 0x63, 0xdb, 0xc1, 0x91, 0xec, 0xb8,
2414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x01, 0x02, 0x41, 0x00, 0xc6, 0x1a, 0x06, 0x48, 0xf2, 0x12, 0x1c, 0x9f,
2424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x74, 0x20, 0x5c, 0x85, 0xa2, 0xda, 0xe5, 0x62, 0x96, 0x8d, 0x22, 0x7b,
2434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x78, 0x73, 0xea, 0xbb, 0x9f, 0x59, 0x42, 0x13, 0x15, 0xc8, 0x11, 0x50,
2444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x6c, 0x55, 0xf6, 0xdf, 0x8b, 0xfe, 0xc7, 0xdd, 0xa8, 0xca, 0x54, 0x41,
2454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe8, 0xce, 0xbe, 0x7d, 0xbd, 0xe2, 0x13, 0x4b, 0x5b, 0x61, 0xeb, 0x69,
2464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x6c, 0xb1, 0x9b, 0x28, 0x68, 0x5b, 0xd6, 0x01, 0x02, 0x41, 0x00, 0xbd,
2474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x1e, 0xfe, 0x51, 0x99, 0xb6, 0xe3, 0x84, 0xfe, 0xf1, 0x9e, 0xfd, 0x9c,
2484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe7, 0x86, 0x43, 0x68, 0x7f, 0x2f, 0x6a, 0x2a, 0x4c, 0xae, 0xa6, 0x41,
2494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x1c, 0xf0, 0x10, 0x37, 0x54, 0x23, 0xba, 0x05, 0x0d, 0x18, 0x27, 0x8d,
2504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb8, 0xe4, 0x8f, 0xf2, 0x25, 0x73, 0x8a, 0xd7, 0x05, 0x98, 0x6b, 0x3d,
2514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x55, 0xb7, 0x6f, 0x7c, 0xec, 0x77, 0x61, 0x54, 0x7b, 0xb6, 0x6b, 0x31,
2524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xec, 0x94, 0xd5, 0x02, 0x41, 0x00, 0x90, 0xa2, 0xa5, 0x9e, 0x12, 0xa7,
2534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x68, 0xa0, 0x7e, 0xdf, 0xb5, 0xcd, 0x98, 0x26, 0xab, 0xbd, 0xbc, 0x5f,
2544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xd5, 0x22, 0x42, 0xc2, 0x97, 0x4a, 0x5f, 0x40, 0x82, 0xfe, 0x7e, 0x33,
2554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb1, 0x78, 0x7f, 0x70, 0x90, 0x2b, 0x8d, 0x01, 0xfb, 0x18, 0xfa, 0x48,
2564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xa7, 0x15, 0xec, 0x0d, 0x2e, 0x85, 0x8d, 0xe2, 0x86, 0xe5, 0xc9, 0x15,
2574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x88, 0x14, 0x53, 0xd8, 0xa4, 0x88, 0xef, 0x10, 0xc6, 0x01, 0x02, 0x41,
2584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x00, 0xba, 0xe4, 0xaf, 0x14, 0xfa, 0xdf, 0xf6, 0xd5, 0xce, 0x8f, 0xfe,
2594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xbb, 0xc8, 0x5c, 0x30, 0x9d, 0xda, 0xdd, 0x9d, 0x80, 0xc0, 0x0e, 0x89,
2604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xa5, 0xb8, 0xc1, 0x1d, 0x28, 0x19, 0x55, 0x67, 0xfd, 0x03, 0xd2, 0xdd,
2614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe4, 0xf0, 0xb4, 0x20, 0x03, 0x74, 0x9b, 0xb8, 0x24, 0x23, 0xbb, 0xde,
2624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xd5, 0x53, 0x86, 0xaa, 0xc1, 0x5d, 0x65, 0xdd, 0xcf, 0xec, 0x8a, 0x59,
2634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x4a, 0x73, 0xca, 0xc5, 0x85, 0x02, 0x40, 0x00, 0xc4, 0x5e, 0x8d, 0xa4,
2644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xea, 0xbb, 0x6a, 0x9b, 0xe6, 0x3a, 0x4d, 0xc1, 0xdb, 0xe5, 0x52, 0x38,
2654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf9, 0x59, 0x91, 0x2d, 0x90, 0x82, 0xe3, 0x31, 0x1b, 0x48, 0xb7, 0x42,
2664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xfa, 0x1d, 0x83, 0xd5, 0x3d, 0x02, 0xc2, 0x12, 0x71, 0x10, 0x3a, 0xbd,
2674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x92, 0x8f, 0x9b, 0xa2, 0x6b, 0x2d, 0x21, 0xa4, 0x65, 0xe9, 0xfa, 0x8c,
2684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x30, 0x2a, 0x89, 0xce, 0xd0, 0xa7, 0x67, 0xd8, 0x45, 0x84, 0xb0};
2694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
2704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  const uint8_t short_integer_without_high_bit[] = {
2714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
2724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
2734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
2744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x00, 0xc3, 0x9e, 0x8d, 0xc4, 0x6d, 0x38, 0xe8, 0x0e, 0x9f, 0x84, 0x03,
2754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x40, 0x8e, 0x81, 0x2e, 0x56, 0x67, 0x78, 0x11, 0x85, 0x27, 0x81, 0x52,
2764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf2, 0x1b, 0x3e, 0x5b, 0xf8, 0xab, 0xfc, 0xaf, 0xca, 0x5c, 0x26, 0xd5,
2774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xfa, 0xd4, 0x55, 0x50, 0x38, 0xb9, 0x9d, 0x89, 0x92, 0x7e, 0x34, 0xcf,
2784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x37, 0x82, 0x48, 0x2d, 0xaa, 0xc4, 0x6a, 0x0e, 0x93, 0xea, 0xad, 0x8a,
2794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x33, 0xf0, 0x42, 0x23, 0xe0, 0x4c, 0x98, 0xbf, 0x01, 0x00, 0x1b, 0xfe,
2804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x06, 0x15, 0xc6, 0xe3, 0x80, 0x79, 0x6d, 0xfe, 0x48, 0xcd, 0x40, 0xbb,
2814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf9, 0x58, 0xe6, 0xbf, 0xd5, 0x4c, 0x29, 0x48, 0x53, 0x78, 0x06, 0x03,
2824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x0d, 0x59, 0xf5, 0x20, 0xe0, 0xe6, 0x8c, 0xb2, 0xf5, 0xd8, 0x61, 0x52,
2834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x7e, 0x40, 0x83, 0xd7, 0x69, 0xae, 0xd7, 0x75, 0x02, 0x2d, 0x49, 0xd5,
2844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x15, 0x5b, 0xf1, 0xd9, 0x4d, 0x60, 0x7d, 0x62, 0xa5, 0x02, 0x03, 0x01,
2854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x00, 0x01, 0x02, 0x7f, 0x6d, 0x45, 0x23, 0xeb, 0x95, 0x17, 0x34, 0x88,
2864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf6, 0x91, 0xc7, 0x3f, 0x48, 0x5a, 0xe0, 0x87, 0x63, 0x44, 0xae, 0x84,
2874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb2, 0x8c, 0x8a, 0xc8, 0xb2, 0x6f, 0x22, 0xf0, 0xc5, 0x21, 0x61, 0x10,
2884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xa8, 0x69, 0x09, 0x1e, 0x13, 0x7d, 0x94, 0x52, 0x1b, 0x5c, 0xe4, 0x7b,
2894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf0, 0x03, 0x8f, 0xbc, 0x72, 0x09, 0xdf, 0x78, 0x84, 0x3e, 0xb9, 0xe5,
2904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe6, 0x31, 0x0a, 0x01, 0xf9, 0x32, 0xf8, 0xd6, 0x57, 0xa3, 0x87, 0xe6,
2914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf5, 0x98, 0xbc, 0x8e, 0x41, 0xb9, 0x50, 0x17, 0x7b, 0xd3, 0x97, 0x5a,
2924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x44, 0x3a, 0xee, 0xff, 0x6b, 0xb3, 0x3a, 0x52, 0xe7, 0xa4, 0x96, 0x9a,
2934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf6, 0x83, 0xc8, 0x97, 0x1c, 0x63, 0xa1, 0xd6, 0xb3, 0xa8, 0xb2, 0xc7,
2944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x73, 0x25, 0x0f, 0x58, 0x36, 0xb9, 0x7a, 0x47, 0xa7, 0x4d, 0x30, 0xfe,
2954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x4d, 0x74, 0x56, 0xe8, 0xfb, 0xd6, 0x50, 0xe5, 0xe0, 0x28, 0x15, 0x02,
2964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x41, 0x00, 0xeb, 0x15, 0x62, 0xb6, 0x37, 0x41, 0x7c, 0xc5, 0x00, 0x22,
2974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x2c, 0x5a, 0x5e, 0xe4, 0xb2, 0x11, 0x87, 0x89, 0xad, 0xf4, 0x57, 0x68,
2984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x90, 0xb7, 0x9f, 0xe2, 0x79, 0x20, 0x6b, 0x98, 0x00, 0x0d, 0x3a, 0x3b,
2994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xc1, 0xcd, 0x36, 0xf9, 0x27, 0xda, 0x40, 0x36, 0x1d, 0xb8, 0x5c, 0x96,
3004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xeb, 0x04, 0x08, 0xe1, 0x3f, 0xfa, 0x94, 0x8b, 0x0f, 0xa0, 0xff, 0xc1,
3014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x51, 0xea, 0x90, 0xad, 0x15, 0xc7, 0x02, 0x41, 0x00, 0xd5, 0x06, 0x45,
3024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xd7, 0x55, 0x63, 0x1a, 0xf0, 0x89, 0x81, 0xae, 0x87, 0x23, 0xa2, 0x39,
3034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xfe, 0x3d, 0x82, 0xc7, 0xcb, 0x15, 0xb9, 0xe3, 0xe2, 0x5b, 0xc6, 0xd2,
3044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x55, 0xdd, 0xab, 0x55, 0x29, 0x7c, 0xda, 0x0e, 0x1c, 0x09, 0xfc, 0x73,
3054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x0d, 0x01, 0xed, 0x6d, 0x2f, 0x05, 0xd0, 0xd5, 0x1d, 0xce, 0x18, 0x7f,
3064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb0, 0xc8, 0x47, 0x77, 0xd2, 0xa9, 0x9e, 0xfc, 0x39, 0x4b, 0x3d, 0x94,
3074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x33, 0x02, 0x41, 0x00, 0x8f, 0x94, 0x09, 0x2d, 0x17, 0x44, 0x75, 0x0a,
3084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xf1, 0x10, 0xee, 0x1b, 0xe7, 0xd7, 0x2f, 0xf6, 0xca, 0xdc, 0x49, 0x15,
3094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x72, 0x09, 0x58, 0x51, 0xfe, 0x61, 0xd8, 0xee, 0xf7, 0x27, 0xe7, 0xe8,
3104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x2c, 0x47, 0xf1, 0x0f, 0x00, 0x63, 0x5e, 0x76, 0xcb, 0x3f, 0x02, 0x19,
3114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xe6, 0xda, 0xfa, 0x01, 0x05, 0xd7, 0x65, 0x37, 0x0b, 0x60, 0x7f, 0x94,
3124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x2a, 0x80, 0x8d, 0x22, 0x81, 0x68, 0x65, 0x63, 0x02, 0x41, 0x00, 0xc2,
3134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xd4, 0x18, 0xde, 0x47, 0x9e, 0xfb, 0x8d, 0x91, 0x05, 0xc5, 0x3c, 0x9d,
3144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xcf, 0x8a, 0x60, 0xc7, 0x9b, 0x2b, 0xe5, 0xc6, 0xba, 0x1b, 0xfc, 0xf3,
3154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xd9, 0x54, 0x97, 0xe9, 0xc4, 0x00, 0x80, 0x90, 0x4a, 0xd2, 0x6a, 0xbc,
3164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x8b, 0x62, 0x22, 0x3c, 0x68, 0x0c, 0xda, 0xdb, 0xe3, 0xd2, 0x76, 0x8e,
3174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xff, 0x03, 0x12, 0x09, 0x2a, 0xac, 0x21, 0x44, 0xb7, 0x3e, 0x91, 0x9c,
3184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x09, 0xf6, 0xd7, 0x02, 0x41, 0x00, 0xc0, 0xa1, 0xbb, 0x70, 0xdc, 0xf8,
3194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xeb, 0x17, 0x61, 0xd4, 0x8c, 0x7c, 0x3b, 0x82, 0x91, 0x58, 0xff, 0xf9,
3204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x19, 0xac, 0x3a, 0x73, 0xa7, 0x20, 0xe5, 0x22, 0x02, 0xc4, 0xf6, 0xb9,
3214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xb9, 0x43, 0x53, 0x35, 0x88, 0xe1, 0x05, 0xb6, 0x43, 0x9b, 0x39, 0xc8,
3224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0x04, 0x4d, 0x2b, 0x01, 0xf7, 0xe6, 0x1b, 0x8d, 0x7e, 0x89, 0xe3, 0x43,
3234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      0xd4, 0xf3, 0xab, 0x28, 0xd4, 0x5a, 0x1f, 0x20, 0xea, 0xbe};
3244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> input1;
3264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> input2;
3274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  input1.resize(sizeof(short_integer_with_high_bit));
3294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  input2.resize(sizeof(short_integer_without_high_bit));
3304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  memcpy(&input1.front(), short_integer_with_high_bit,
3324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath         sizeof(short_integer_with_high_bit));
3334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  memcpy(&input2.front(), short_integer_without_high_bit,
3344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath         sizeof(short_integer_without_high_bit));
3354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> keypair1(
3374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input1));
3384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> keypair2(
3394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input2));
3404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair1.get());
3414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair2.get());
3424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> output1;
3444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> output2;
3454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair1->ExportPrivateKey(&output1));
3464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(keypair2->ExportPrivateKey(&output2));
3474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(input1.size(), output1.size());
3494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(input2.size(), output2.size());
3504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(0, memcmp(&output1.front(), &input1.front(), input1.size()));
3514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(0, memcmp(&output2.front(), &input2.front(), input2.size()));
3524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
3534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3544c89023ef86f29fa9add7db2574f2169fe842577Narayan KamathTEST(RSAPrivateKeyUnitTest, CreateFromKeyTest) {
3554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key_pair(
3564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::Create(512));
3574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_pair.get());
3584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::unique_ptr<crypto::RSAPrivateKey> key_copy(
3604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath      crypto::RSAPrivateKey::CreateFromKey(key_pair->key()));
3614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_copy.get());
3624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey;
3644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> pubkey;
3654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_pair->ExportPrivateKey(&privkey));
3664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_pair->ExportPublicKey(&pubkey));
3674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> privkey_copy;
3694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  std::vector<uint8_t> pubkey_copy;
3704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_copy->ExportPrivateKey(&privkey_copy));
3714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_TRUE(key_copy->ExportPublicKey(&pubkey_copy));
3724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(privkey, privkey_copy);
3744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath  ASSERT_EQ(pubkey, pubkey_copy);
3754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath}
3764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath
3774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath