1f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
3f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// found in the LICENSE file.
4f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
5f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#include "crypto/rsa_private_key.h"
6f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko#include <stdint.h>
824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko
994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <memory>
1094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
11f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#include "testing/gtest/include/gtest/gtest.h"
12f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
13f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenkonamespace {
14f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
1524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenkoconst uint8_t kTestPrivateKeyInfo[] = {
1624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x30, 0x82, 0x02, 0x78, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
1724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
1824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x02, 0x62, 0x30, 0x82, 0x02, 0x5e, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
1924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b, 0x0c, 0xdc, 0x51, 0x61,
2024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08, 0x55, 0x84, 0xd5, 0x3a,
2124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04, 0x13, 0x3f, 0x8d, 0xf4,
2224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a, 0xb0, 0x40, 0x53, 0x3a,
2324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30, 0xda, 0x8a, 0x31, 0x4f,
2424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17, 0xde, 0x4e, 0xb9, 0x57,
2524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89, 0x4e, 0xb6, 0x47, 0xff,
2624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85, 0x84, 0x32, 0x33, 0xf3,
2724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14, 0x6f, 0x13, 0x8d, 0xc5,
2824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18, 0x53, 0x56, 0xa6, 0x83,
2924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6, 0x0f, 0x02, 0x03, 0x01,
3024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x00, 0x01, 0x02, 0x81, 0x80, 0x03, 0x61, 0x89, 0x37, 0xcb, 0xf2, 0x98,
3124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xa0, 0xce, 0xb4, 0xcb, 0x16, 0x13, 0xf0, 0xe6, 0xaf, 0x5c, 0xc5, 0xa7,
3224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x69, 0x71, 0xca, 0xba, 0x8d, 0xe0, 0x4d, 0xdd, 0xed, 0xb8, 0x48, 0x8b,
3324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x16, 0x93, 0x36, 0x95, 0xc2, 0x91, 0x40, 0x65, 0x17, 0xbd, 0x7f, 0xd6,
3424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xad, 0x9e, 0x30, 0x28, 0x46, 0xe4, 0x3e, 0xcc, 0x43, 0x78, 0xf9, 0xfe,
3524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x1f, 0x33, 0x23, 0x1e, 0x31, 0x12, 0x9d, 0x3c, 0xa7, 0x08, 0x82, 0x7b,
3624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x7d, 0x25, 0x4e, 0x5e, 0x19, 0xa8, 0x9b, 0xed, 0x86, 0xb2, 0xcb, 0x3c,
3724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xfe, 0x4e, 0xa1, 0xfa, 0x62, 0x87, 0x3a, 0x17, 0xf7, 0x60, 0xec, 0x38,
3824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x29, 0xe8, 0x4f, 0x34, 0x9f, 0x76, 0x9d, 0xee, 0xa3, 0xf6, 0x85, 0x6b,
3924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x84, 0x43, 0xc9, 0x1e, 0x01, 0xff, 0xfd, 0xd0, 0x29, 0x4c, 0xfa, 0x8e,
4024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x57, 0x0c, 0xc0, 0x71, 0xa5, 0xbb, 0x88, 0x46, 0x29, 0x5c, 0xc0, 0x4f,
4124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x01, 0x02, 0x41, 0x00, 0xf5, 0x83, 0xa4, 0x64, 0x4a, 0xf2, 0xdd, 0x8c,
4224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x2c, 0xed, 0xa8, 0xd5, 0x60, 0x5a, 0xe4, 0xc7, 0xcc, 0x61, 0xcd, 0x38,
4324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x42, 0x20, 0xd3, 0x82, 0x18, 0xf2, 0x35, 0x00, 0x72, 0x2d, 0xf7, 0x89,
4424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x80, 0x67, 0xb5, 0x93, 0x05, 0x5f, 0xdd, 0x42, 0xba, 0x16, 0x1a, 0xea,
4524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x15, 0xc6, 0xf0, 0xb8, 0x8c, 0xbc, 0xbf, 0x54, 0x9e, 0xf1, 0xc1, 0xb2,
4624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xb3, 0x8b, 0xb6, 0x26, 0x02, 0x30, 0xc4, 0x81, 0x02, 0x41, 0x00, 0xc0,
4724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x60, 0x62, 0x80, 0xe1, 0x22, 0x78, 0xf6, 0x9d, 0x83, 0x18, 0xeb, 0x72,
4824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x45, 0xd7, 0xc8, 0x01, 0x7f, 0xa9, 0xca, 0x8f, 0x7d, 0xd6, 0xb8, 0x31,
4924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x2b, 0x84, 0x7f, 0x62, 0xd9, 0xa9, 0x22, 0x17, 0x7d, 0x06, 0x35, 0x6c,
5024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xf3, 0xc1, 0x94, 0x17, 0x85, 0x5a, 0xaf, 0x9c, 0x5c, 0x09, 0x3c, 0xcf,
5124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x2f, 0x44, 0x9d, 0xb6, 0x52, 0x68, 0x5f, 0xf9, 0x59, 0xc8, 0x84, 0x2b,
5224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x39, 0x22, 0x8f, 0x02, 0x41, 0x00, 0xb2, 0x04, 0xe2, 0x0e, 0x56, 0xca,
5324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x03, 0x1a, 0xc0, 0xf9, 0x12, 0x92, 0xa5, 0x6b, 0x42, 0xb8, 0x1c, 0xda,
5424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x4d, 0x93, 0x9d, 0x5f, 0x6f, 0xfd, 0xc5, 0x58, 0xda, 0x55, 0x98, 0x74,
5524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xfc, 0x28, 0x17, 0x93, 0x1b, 0x75, 0x9f, 0x50, 0x03, 0x7f, 0x7e, 0xae,
5624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xc8, 0x95, 0x33, 0x75, 0x2c, 0xd6, 0xa4, 0x35, 0xb8, 0x06, 0x03, 0xba,
5724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x08, 0x59, 0x2b, 0x17, 0x02, 0xdc, 0x4c, 0x7a, 0x50, 0x01, 0x02, 0x41,
5824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x00, 0x9d, 0xdb, 0x39, 0x59, 0x09, 0xe4, 0x30, 0xa0, 0x24, 0xf5, 0xdb,
5924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x2f, 0xf0, 0x2f, 0xf1, 0x75, 0x74, 0x0d, 0x5e, 0xb5, 0x11, 0x73, 0xb0,
6024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x0a, 0xaa, 0x86, 0x4c, 0x0d, 0xff, 0x7e, 0x1d, 0xb4, 0x14, 0xd4, 0x09,
6124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x91, 0x33, 0x5a, 0xfd, 0xa0, 0x58, 0x80, 0x9b, 0xbe, 0x78, 0x2e, 0x69,
6224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x82, 0x15, 0x7c, 0x72, 0xf0, 0x7b, 0x18, 0x39, 0xff, 0x6e, 0xeb, 0xc6,
6324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x86, 0xf5, 0xb4, 0xc7, 0x6f, 0x02, 0x41, 0x00, 0x8d, 0x1a, 0x37, 0x0f,
6424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x76, 0xc4, 0x82, 0xfa, 0x5c, 0xc3, 0x79, 0x35, 0x3e, 0x70, 0x8a, 0xbf,
6524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x27, 0x49, 0xb0, 0x99, 0x63, 0xcb, 0x77, 0x5f, 0xa8, 0x82, 0x65, 0xf6,
6624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x03, 0x52, 0x51, 0xf1, 0xae, 0x2e, 0x05, 0xb3, 0xc6, 0xa4, 0x92, 0xd1,
6724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0xce, 0x6c, 0x72, 0xfb, 0x21, 0xb3, 0x02, 0x87, 0xe4, 0xfd, 0x61, 0xca,
6824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    0x00, 0x42, 0x19, 0xf0, 0xda, 0x5a, 0x53, 0xe3, 0xb1, 0xc5, 0x15, 0xf3};
69f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
70f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}  // namespace
71f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
72f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Generate random private keys with two different sizes. Reimport, then
73f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// export them again. We should get back the same exact bytes.
74f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, InitRandomTest) {
7594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> keypair1(
76f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::Create(1024));
7794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> keypair2(
78f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::Create(2048));
79f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair1.get());
80f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair2.get());
81f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
8224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey1;
8324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey2;
8424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> pubkey1;
8524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> pubkey2;
86f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
87f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair1->ExportPrivateKey(&privkey1));
88f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair2->ExportPrivateKey(&privkey2));
89f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair1->ExportPublicKey(&pubkey1));
90f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair2->ExportPublicKey(&pubkey2));
91f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
9294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> keypair3(
93f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(privkey1));
9494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> keypair4(
95f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(privkey2));
96f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair3.get());
97f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair4.get());
98f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
9924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey3;
10024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey4;
101f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair3->ExportPrivateKey(&privkey3));
102f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair4->ExportPrivateKey(&privkey4));
103f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
104f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(privkey1.size(), privkey3.size());
105f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(privkey2.size(), privkey4.size());
1063a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  ASSERT_EQ(0, memcmp(&privkey1.front(), &privkey3.front(), privkey1.size()));
1073a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  ASSERT_EQ(0, memcmp(&privkey2.front(), &privkey4.front(), privkey2.size()));
108f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
109f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
110f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Test Copy() method.
111f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, CopyTest) {
11224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> input(kTestPrivateKeyInfo,
11324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko                             kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
114f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
11594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key(
116f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
117f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
11894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key_copy(key->Copy());
119f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_copy.get());
120f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
12124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey_copy;
122f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_copy->ExportPrivateKey(&privkey_copy));
123f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(input, privkey_copy);
124f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
125f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
126f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Test that CreateFromPrivateKeyInfo fails if there is extra data after the RSA
127f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// key.
128f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, ExtraData) {
12924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> input(kTestPrivateKeyInfo,
13024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko                             kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
131f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  input.push_back(0);
132f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
13394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key(
134f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
135f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
136f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Import should fail.
137f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  EXPECT_FALSE(key);
138f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
139f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
140f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, NotRsaKey) {
141f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Defines a valid P-256 private key.
14224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  const uint8_t kTestEcPrivateKeyInfo[] = {
143f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
144f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
145f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
146f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x1F, 0xE3, 0x39, 0x50, 0xC5, 0xF4, 0x61, 0x12, 0x4A, 0xE9, 0x92, 0xC2,
147f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0xBD, 0xFD, 0xF1, 0xC7, 0x3B, 0x16, 0x15, 0xF5, 0x71, 0xBD, 0x56, 0x7E,
148f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x60, 0xD1, 0x9A, 0xA1, 0xF4, 0x8C, 0xDF, 0x42, 0xA1, 0x44, 0x03, 0x42,
149f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x00, 0x04, 0x7C, 0x11, 0x0C, 0x66, 0xDC, 0xFD, 0xA8, 0x07, 0xF6, 0xE6,
150f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x9E, 0x45, 0xDD, 0xB3, 0xC7, 0x4F, 0x69, 0xA1, 0x48, 0x4D, 0x20, 0x3E,
151f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x8D, 0xC5, 0xAD, 0xA8, 0xE9, 0xA9, 0xDD, 0x7C, 0xB3, 0xC7, 0x0D, 0xF4,
152f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x48, 0x98, 0x6E, 0x51, 0xBD, 0xE5, 0xD1, 0x57, 0x6F, 0x99, 0x90, 0x1F,
153f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      0x9C, 0x2C, 0x6A, 0x80, 0x6A, 0x47, 0xFD, 0x90, 0x76, 0x43, 0xA7, 0x2B,
15424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x83, 0x55, 0x97, 0xEF, 0xC8, 0xC6};
155f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
15624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> input(
157f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      kTestEcPrivateKeyInfo,
158f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      kTestEcPrivateKeyInfo + sizeof(kTestEcPrivateKeyInfo));
159f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
16094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key(
161f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
162f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
163f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Import should fail as the given PKCS8 bytes were for an EC key not RSA key.
164f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  EXPECT_FALSE(key);
165f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
166f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
167f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Verify that generated public keys look good. This test data was generated
168f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// with the openssl command line tool.
169f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, PublicKeyTest) {
17024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  const uint8_t expected_public_key_info[] = {
17124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
17224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81,
17324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x89, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b,
17424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x0c, 0xdc, 0x51, 0x61, 0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08,
17524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x55, 0x84, 0xd5, 0x3a, 0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04,
17624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x13, 0x3f, 0x8d, 0xf4, 0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a,
17724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb0, 0x40, 0x53, 0x3a, 0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30,
17824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xda, 0x8a, 0x31, 0x4f, 0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17,
17924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xde, 0x4e, 0xb9, 0x57, 0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89,
18024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x4e, 0xb6, 0x47, 0xff, 0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85,
18124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x84, 0x32, 0x33, 0xf3, 0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14,
18224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x6f, 0x13, 0x8d, 0xc5, 0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18,
18324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x53, 0x56, 0xa6, 0x83, 0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6,
18424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x0f, 0x02, 0x03, 0x01, 0x00, 0x01};
18524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko
18624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> input(kTestPrivateKeyInfo,
18724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko                             kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
188f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
18994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key(
190f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
191f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key.get());
192f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
19324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> output;
194f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key->ExportPublicKey(&output));
195f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
1963a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  ASSERT_EQ(0,
1973a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli            memcmp(expected_public_key_info, &output.front(), output.size()));
198f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
199f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
200f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// These two test keys each contain an integer that has 0x00 for its most
201f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// significant byte. When encoded as ASN.1, this byte is dropped and there are
202f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// two interesting sub-cases. When the sign bit of the integer is set, an extra
203f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// null byte is added back to force the encoded value to be positive. When the
204f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// sign bit is not set, the encoded integer is just left shorter than usual.
205f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// See also: http://code.google.com/p/chromium/issues/detail?id=14877.
206f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko//
207f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Before we were handling this correctly, we would see one of two failures:
208f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// * RSAPrivateKey::CreateFromPrivateKeyInfo would return null because the
209f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko//   underlying windows API failed to import the key.
210f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// * The import would succeed, but incorrectly interpret the data. On export,
211f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko//   the key would contain different values.
212f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko//
213f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// This test case verifies these two failures modes don't occur.
214f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, ShortIntegers) {
21524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  const uint8_t short_integer_with_high_bit[] = {
21624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x30, 0x82, 0x02, 0x77, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
21724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
21824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x02, 0x61, 0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
21924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x00, 0x92, 0x59, 0x32, 0x7d, 0x8e, 0xaf, 0x2e, 0xd5, 0xb2, 0x5c, 0x67,
22024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xc8, 0x7d, 0x48, 0xb7, 0x84, 0x12, 0xd0, 0x76, 0xda, 0xe1, 0xa3, 0x1e,
22124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x40, 0x01, 0x14, 0x5c, 0xef, 0x26, 0x6e, 0x28, 0xa2, 0xf7, 0xa5, 0xb4,
22224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x02, 0x37, 0xd0, 0x53, 0x10, 0xcb, 0x7c, 0x6a, 0xf4, 0x53, 0x9f, 0xb8,
22324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe0, 0x83, 0x93, 0xd1, 0x19, 0xd8, 0x28, 0xd1, 0xd1, 0xd8, 0x87, 0x8f,
22424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x92, 0xfd, 0x73, 0xc0, 0x4d, 0x3e, 0x07, 0x22, 0x1f, 0xc1, 0x20, 0xb0,
22524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x70, 0xb2, 0x3b, 0xea, 0xb1, 0xe5, 0x0a, 0xfd, 0x56, 0x49, 0x5e, 0x39,
22624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x90, 0x91, 0xce, 0x04, 0x83, 0x29, 0xaa, 0xfd, 0x12, 0xa4, 0x42, 0x26,
22724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x6c, 0x6e, 0x79, 0x70, 0x77, 0x03, 0xb2, 0x07, 0x01, 0x3d, 0x85, 0x81,
22824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x95, 0x9e, 0xda, 0x5a, 0xa3, 0xf4, 0x2d, 0x38, 0x04, 0x58, 0xf5, 0x6b,
22924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xc9, 0xf1, 0xb5, 0x65, 0xfe, 0x66, 0x0d, 0xa2, 0xd5, 0x02, 0x03, 0x01,
23024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x00, 0x01, 0x02, 0x81, 0x80, 0x5e, 0x01, 0x5f, 0xb6, 0x59, 0x1d, 0xdc,
23124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x36, 0xb6, 0x60, 0x36, 0xe6, 0x08, 0xdb, 0xd9, 0xcd, 0xc3, 0x8c, 0x16,
23224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x9c, 0x98, 0x8d, 0x7f, 0xd3, 0xdb, 0x1d, 0xaa, 0x68, 0x8f, 0xc5, 0xf8,
23324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe2, 0x5d, 0xb3, 0x19, 0xc2, 0xc6, 0xf9, 0x51, 0x32, 0x1b, 0x93, 0x6a,
23424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xdc, 0x50, 0x8e, 0xeb, 0x61, 0x84, 0x03, 0x42, 0x30, 0x98, 0xb1, 0xf7,
23524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xbd, 0x14, 0x9a, 0x57, 0x36, 0x33, 0x09, 0xd4, 0x3e, 0x90, 0xda, 0xef,
23624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x09, 0x6e, 0xef, 0x49, 0xb6, 0x60, 0x68, 0x5e, 0x54, 0x17, 0x25, 0x5b,
23724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x37, 0xe3, 0x35, 0x63, 0x5b, 0x60, 0x3c, 0xbd, 0x50, 0xdf, 0x46, 0x43,
23824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x08, 0xa4, 0x71, 0x21, 0xf1, 0x30, 0x71, 0xdc, 0xda, 0xd7, 0x6f, 0xd2,
23924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x18, 0xbd, 0x39, 0xf1, 0xe1, 0xbe, 0xa8, 0x8d, 0x62, 0xdf, 0xa2, 0x3e,
24024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb6, 0x15, 0x26, 0xb6, 0x57, 0xbd, 0x63, 0xdb, 0xc1, 0x91, 0xec, 0xb8,
24124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x01, 0x02, 0x41, 0x00, 0xc6, 0x1a, 0x06, 0x48, 0xf2, 0x12, 0x1c, 0x9f,
24224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x74, 0x20, 0x5c, 0x85, 0xa2, 0xda, 0xe5, 0x62, 0x96, 0x8d, 0x22, 0x7b,
24324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x78, 0x73, 0xea, 0xbb, 0x9f, 0x59, 0x42, 0x13, 0x15, 0xc8, 0x11, 0x50,
24424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x6c, 0x55, 0xf6, 0xdf, 0x8b, 0xfe, 0xc7, 0xdd, 0xa8, 0xca, 0x54, 0x41,
24524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe8, 0xce, 0xbe, 0x7d, 0xbd, 0xe2, 0x13, 0x4b, 0x5b, 0x61, 0xeb, 0x69,
24624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x6c, 0xb1, 0x9b, 0x28, 0x68, 0x5b, 0xd6, 0x01, 0x02, 0x41, 0x00, 0xbd,
24724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x1e, 0xfe, 0x51, 0x99, 0xb6, 0xe3, 0x84, 0xfe, 0xf1, 0x9e, 0xfd, 0x9c,
24824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe7, 0x86, 0x43, 0x68, 0x7f, 0x2f, 0x6a, 0x2a, 0x4c, 0xae, 0xa6, 0x41,
24924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x1c, 0xf0, 0x10, 0x37, 0x54, 0x23, 0xba, 0x05, 0x0d, 0x18, 0x27, 0x8d,
25024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb8, 0xe4, 0x8f, 0xf2, 0x25, 0x73, 0x8a, 0xd7, 0x05, 0x98, 0x6b, 0x3d,
25124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x55, 0xb7, 0x6f, 0x7c, 0xec, 0x77, 0x61, 0x54, 0x7b, 0xb6, 0x6b, 0x31,
25224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xec, 0x94, 0xd5, 0x02, 0x41, 0x00, 0x90, 0xa2, 0xa5, 0x9e, 0x12, 0xa7,
25324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x68, 0xa0, 0x7e, 0xdf, 0xb5, 0xcd, 0x98, 0x26, 0xab, 0xbd, 0xbc, 0x5f,
25424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xd5, 0x22, 0x42, 0xc2, 0x97, 0x4a, 0x5f, 0x40, 0x82, 0xfe, 0x7e, 0x33,
25524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb1, 0x78, 0x7f, 0x70, 0x90, 0x2b, 0x8d, 0x01, 0xfb, 0x18, 0xfa, 0x48,
25624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xa7, 0x15, 0xec, 0x0d, 0x2e, 0x85, 0x8d, 0xe2, 0x86, 0xe5, 0xc9, 0x15,
25724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x88, 0x14, 0x53, 0xd8, 0xa4, 0x88, 0xef, 0x10, 0xc6, 0x01, 0x02, 0x41,
25824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x00, 0xba, 0xe4, 0xaf, 0x14, 0xfa, 0xdf, 0xf6, 0xd5, 0xce, 0x8f, 0xfe,
25924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xbb, 0xc8, 0x5c, 0x30, 0x9d, 0xda, 0xdd, 0x9d, 0x80, 0xc0, 0x0e, 0x89,
26024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xa5, 0xb8, 0xc1, 0x1d, 0x28, 0x19, 0x55, 0x67, 0xfd, 0x03, 0xd2, 0xdd,
26124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe4, 0xf0, 0xb4, 0x20, 0x03, 0x74, 0x9b, 0xb8, 0x24, 0x23, 0xbb, 0xde,
26224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xd5, 0x53, 0x86, 0xaa, 0xc1, 0x5d, 0x65, 0xdd, 0xcf, 0xec, 0x8a, 0x59,
26324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x4a, 0x73, 0xca, 0xc5, 0x85, 0x02, 0x40, 0x00, 0xc4, 0x5e, 0x8d, 0xa4,
26424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xea, 0xbb, 0x6a, 0x9b, 0xe6, 0x3a, 0x4d, 0xc1, 0xdb, 0xe5, 0x52, 0x38,
26524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf9, 0x59, 0x91, 0x2d, 0x90, 0x82, 0xe3, 0x31, 0x1b, 0x48, 0xb7, 0x42,
26624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xfa, 0x1d, 0x83, 0xd5, 0x3d, 0x02, 0xc2, 0x12, 0x71, 0x10, 0x3a, 0xbd,
26724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x92, 0x8f, 0x9b, 0xa2, 0x6b, 0x2d, 0x21, 0xa4, 0x65, 0xe9, 0xfa, 0x8c,
26824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x30, 0x2a, 0x89, 0xce, 0xd0, 0xa7, 0x67, 0xd8, 0x45, 0x84, 0xb0};
26924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko
27024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  const uint8_t short_integer_without_high_bit[] = {
27124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
27224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
27324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
27424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x00, 0xc3, 0x9e, 0x8d, 0xc4, 0x6d, 0x38, 0xe8, 0x0e, 0x9f, 0x84, 0x03,
27524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x40, 0x8e, 0x81, 0x2e, 0x56, 0x67, 0x78, 0x11, 0x85, 0x27, 0x81, 0x52,
27624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf2, 0x1b, 0x3e, 0x5b, 0xf8, 0xab, 0xfc, 0xaf, 0xca, 0x5c, 0x26, 0xd5,
27724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xfa, 0xd4, 0x55, 0x50, 0x38, 0xb9, 0x9d, 0x89, 0x92, 0x7e, 0x34, 0xcf,
27824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x37, 0x82, 0x48, 0x2d, 0xaa, 0xc4, 0x6a, 0x0e, 0x93, 0xea, 0xad, 0x8a,
27924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x33, 0xf0, 0x42, 0x23, 0xe0, 0x4c, 0x98, 0xbf, 0x01, 0x00, 0x1b, 0xfe,
28024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x06, 0x15, 0xc6, 0xe3, 0x80, 0x79, 0x6d, 0xfe, 0x48, 0xcd, 0x40, 0xbb,
28124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf9, 0x58, 0xe6, 0xbf, 0xd5, 0x4c, 0x29, 0x48, 0x53, 0x78, 0x06, 0x03,
28224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x0d, 0x59, 0xf5, 0x20, 0xe0, 0xe6, 0x8c, 0xb2, 0xf5, 0xd8, 0x61, 0x52,
28324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x7e, 0x40, 0x83, 0xd7, 0x69, 0xae, 0xd7, 0x75, 0x02, 0x2d, 0x49, 0xd5,
28424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x15, 0x5b, 0xf1, 0xd9, 0x4d, 0x60, 0x7d, 0x62, 0xa5, 0x02, 0x03, 0x01,
28524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x00, 0x01, 0x02, 0x7f, 0x6d, 0x45, 0x23, 0xeb, 0x95, 0x17, 0x34, 0x88,
28624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf6, 0x91, 0xc7, 0x3f, 0x48, 0x5a, 0xe0, 0x87, 0x63, 0x44, 0xae, 0x84,
28724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb2, 0x8c, 0x8a, 0xc8, 0xb2, 0x6f, 0x22, 0xf0, 0xc5, 0x21, 0x61, 0x10,
28824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xa8, 0x69, 0x09, 0x1e, 0x13, 0x7d, 0x94, 0x52, 0x1b, 0x5c, 0xe4, 0x7b,
28924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf0, 0x03, 0x8f, 0xbc, 0x72, 0x09, 0xdf, 0x78, 0x84, 0x3e, 0xb9, 0xe5,
29024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe6, 0x31, 0x0a, 0x01, 0xf9, 0x32, 0xf8, 0xd6, 0x57, 0xa3, 0x87, 0xe6,
29124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf5, 0x98, 0xbc, 0x8e, 0x41, 0xb9, 0x50, 0x17, 0x7b, 0xd3, 0x97, 0x5a,
29224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x44, 0x3a, 0xee, 0xff, 0x6b, 0xb3, 0x3a, 0x52, 0xe7, 0xa4, 0x96, 0x9a,
29324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf6, 0x83, 0xc8, 0x97, 0x1c, 0x63, 0xa1, 0xd6, 0xb3, 0xa8, 0xb2, 0xc7,
29424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x73, 0x25, 0x0f, 0x58, 0x36, 0xb9, 0x7a, 0x47, 0xa7, 0x4d, 0x30, 0xfe,
29524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x4d, 0x74, 0x56, 0xe8, 0xfb, 0xd6, 0x50, 0xe5, 0xe0, 0x28, 0x15, 0x02,
29624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x41, 0x00, 0xeb, 0x15, 0x62, 0xb6, 0x37, 0x41, 0x7c, 0xc5, 0x00, 0x22,
29724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x2c, 0x5a, 0x5e, 0xe4, 0xb2, 0x11, 0x87, 0x89, 0xad, 0xf4, 0x57, 0x68,
29824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x90, 0xb7, 0x9f, 0xe2, 0x79, 0x20, 0x6b, 0x98, 0x00, 0x0d, 0x3a, 0x3b,
29924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xc1, 0xcd, 0x36, 0xf9, 0x27, 0xda, 0x40, 0x36, 0x1d, 0xb8, 0x5c, 0x96,
30024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xeb, 0x04, 0x08, 0xe1, 0x3f, 0xfa, 0x94, 0x8b, 0x0f, 0xa0, 0xff, 0xc1,
30124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x51, 0xea, 0x90, 0xad, 0x15, 0xc7, 0x02, 0x41, 0x00, 0xd5, 0x06, 0x45,
30224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xd7, 0x55, 0x63, 0x1a, 0xf0, 0x89, 0x81, 0xae, 0x87, 0x23, 0xa2, 0x39,
30324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xfe, 0x3d, 0x82, 0xc7, 0xcb, 0x15, 0xb9, 0xe3, 0xe2, 0x5b, 0xc6, 0xd2,
30424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x55, 0xdd, 0xab, 0x55, 0x29, 0x7c, 0xda, 0x0e, 0x1c, 0x09, 0xfc, 0x73,
30524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x0d, 0x01, 0xed, 0x6d, 0x2f, 0x05, 0xd0, 0xd5, 0x1d, 0xce, 0x18, 0x7f,
30624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb0, 0xc8, 0x47, 0x77, 0xd2, 0xa9, 0x9e, 0xfc, 0x39, 0x4b, 0x3d, 0x94,
30724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x33, 0x02, 0x41, 0x00, 0x8f, 0x94, 0x09, 0x2d, 0x17, 0x44, 0x75, 0x0a,
30824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xf1, 0x10, 0xee, 0x1b, 0xe7, 0xd7, 0x2f, 0xf6, 0xca, 0xdc, 0x49, 0x15,
30924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x72, 0x09, 0x58, 0x51, 0xfe, 0x61, 0xd8, 0xee, 0xf7, 0x27, 0xe7, 0xe8,
31024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x2c, 0x47, 0xf1, 0x0f, 0x00, 0x63, 0x5e, 0x76, 0xcb, 0x3f, 0x02, 0x19,
31124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xe6, 0xda, 0xfa, 0x01, 0x05, 0xd7, 0x65, 0x37, 0x0b, 0x60, 0x7f, 0x94,
31224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x2a, 0x80, 0x8d, 0x22, 0x81, 0x68, 0x65, 0x63, 0x02, 0x41, 0x00, 0xc2,
31324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xd4, 0x18, 0xde, 0x47, 0x9e, 0xfb, 0x8d, 0x91, 0x05, 0xc5, 0x3c, 0x9d,
31424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xcf, 0x8a, 0x60, 0xc7, 0x9b, 0x2b, 0xe5, 0xc6, 0xba, 0x1b, 0xfc, 0xf3,
31524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xd9, 0x54, 0x97, 0xe9, 0xc4, 0x00, 0x80, 0x90, 0x4a, 0xd2, 0x6a, 0xbc,
31624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x8b, 0x62, 0x22, 0x3c, 0x68, 0x0c, 0xda, 0xdb, 0xe3, 0xd2, 0x76, 0x8e,
31724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xff, 0x03, 0x12, 0x09, 0x2a, 0xac, 0x21, 0x44, 0xb7, 0x3e, 0x91, 0x9c,
31824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x09, 0xf6, 0xd7, 0x02, 0x41, 0x00, 0xc0, 0xa1, 0xbb, 0x70, 0xdc, 0xf8,
31924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xeb, 0x17, 0x61, 0xd4, 0x8c, 0x7c, 0x3b, 0x82, 0x91, 0x58, 0xff, 0xf9,
32024854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x19, 0xac, 0x3a, 0x73, 0xa7, 0x20, 0xe5, 0x22, 0x02, 0xc4, 0xf6, 0xb9,
32124854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xb9, 0x43, 0x53, 0x35, 0x88, 0xe1, 0x05, 0xb6, 0x43, 0x9b, 0x39, 0xc8,
32224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0x04, 0x4d, 0x2b, 0x01, 0xf7, 0xe6, 0x1b, 0x8d, 0x7e, 0x89, 0xe3, 0x43,
32324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko      0xd4, 0xf3, 0xab, 0x28, 0xd4, 0x5a, 0x1f, 0x20, 0xea, 0xbe};
32424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko
32524854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> input1;
32624854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> input2;
327f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
328f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  input1.resize(sizeof(short_integer_with_high_bit));
329f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  input2.resize(sizeof(short_integer_without_high_bit));
330f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
331f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  memcpy(&input1.front(), short_integer_with_high_bit,
332f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko         sizeof(short_integer_with_high_bit));
333f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  memcpy(&input2.front(), short_integer_without_high_bit,
334f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko         sizeof(short_integer_without_high_bit));
335f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
33694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> keypair1(
337f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input1));
33894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> keypair2(
339f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input2));
340f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair1.get());
341f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair2.get());
342f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
34324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> output1;
34424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> output2;
345f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair1->ExportPrivateKey(&output1));
346f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(keypair2->ExportPrivateKey(&output2));
347f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
348f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(input1.size(), output1.size());
349f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(input2.size(), output2.size());
3503a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  ASSERT_EQ(0, memcmp(&output1.front(), &input1.front(), input1.size()));
3513a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  ASSERT_EQ(0, memcmp(&output2.front(), &input2.front(), input2.size()));
352f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
353f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
354f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(RSAPrivateKeyUnitTest, CreateFromKeyTest) {
35594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key_pair(
356f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::Create(512));
357f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_pair.get());
358f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
35994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<crypto::RSAPrivateKey> key_copy(
360f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      crypto::RSAPrivateKey::CreateFromKey(key_pair->key()));
361f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_copy.get());
362f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
36324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey;
36424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> pubkey;
365f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_pair->ExportPrivateKey(&privkey));
366f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_pair->ExportPublicKey(&pubkey));
367f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
36824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> privkey_copy;
36924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  std::vector<uint8_t> pubkey_copy;
370f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_copy->ExportPrivateKey(&privkey_copy));
371f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_TRUE(key_copy->ExportPublicKey(&pubkey_copy));
372f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
373f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(privkey, privkey_copy);
374f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(pubkey, pubkey_copy);
375f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
376f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
377