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