xref: /aosp_15_r20/external/libchrome/crypto/symmetric_key_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "crypto/symmetric_key.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <memory>
8*635a8641SAndroid Build Coastguard Worker #include <string>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
12*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*635a8641SAndroid Build Coastguard Worker 
TEST(SymmetricKeyTest,GenerateRandomKey)14*635a8641SAndroid Build Coastguard Worker TEST(SymmetricKeyTest, GenerateRandomKey) {
15*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key(
16*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::GenerateRandomKey(crypto::SymmetricKey::AES, 256));
17*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key);
18*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(32U, key->key().size());
19*635a8641SAndroid Build Coastguard Worker 
20*635a8641SAndroid Build Coastguard Worker   // Do it again and check that the keys are different.
21*635a8641SAndroid Build Coastguard Worker   // (Note: this has a one-in-10^77 chance of failure!)
22*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key2(
23*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::GenerateRandomKey(crypto::SymmetricKey::AES, 256));
24*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key2);
25*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(32U, key2->key().size());
26*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(key->key(), key2->key());
27*635a8641SAndroid Build Coastguard Worker }
28*635a8641SAndroid Build Coastguard Worker 
TEST(SymmetricKeyTest,ImportGeneratedKey)29*635a8641SAndroid Build Coastguard Worker TEST(SymmetricKeyTest, ImportGeneratedKey) {
30*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key1(
31*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::GenerateRandomKey(crypto::SymmetricKey::AES, 256));
32*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key1);
33*635a8641SAndroid Build Coastguard Worker 
34*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key2(
35*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::Import(crypto::SymmetricKey::AES, key1->key()));
36*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key2);
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(key1->key(), key2->key());
39*635a8641SAndroid Build Coastguard Worker }
40*635a8641SAndroid Build Coastguard Worker 
TEST(SymmetricKeyTest,ImportDerivedKey)41*635a8641SAndroid Build Coastguard Worker TEST(SymmetricKeyTest, ImportDerivedKey) {
42*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key1(
43*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::DeriveKeyFromPassword(
44*635a8641SAndroid Build Coastguard Worker           crypto::SymmetricKey::HMAC_SHA1, "password", "somesalt", 1024, 160));
45*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key1);
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key2(crypto::SymmetricKey::Import(
48*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::HMAC_SHA1, key1->key()));
49*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key2);
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(key1->key(), key2->key());
52*635a8641SAndroid Build Coastguard Worker }
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker struct PBKDF2TestVector {
55*635a8641SAndroid Build Coastguard Worker   crypto::SymmetricKey::Algorithm algorithm;
56*635a8641SAndroid Build Coastguard Worker   const char* password;
57*635a8641SAndroid Build Coastguard Worker   const char* salt;
58*635a8641SAndroid Build Coastguard Worker   unsigned int rounds;
59*635a8641SAndroid Build Coastguard Worker   unsigned int key_size_in_bits;
60*635a8641SAndroid Build Coastguard Worker   const char* expected;  // ASCII encoded hex bytes
61*635a8641SAndroid Build Coastguard Worker };
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker class SymmetricKeyDeriveKeyFromPasswordTest
64*635a8641SAndroid Build Coastguard Worker     : public testing::TestWithParam<PBKDF2TestVector> {
65*635a8641SAndroid Build Coastguard Worker };
66*635a8641SAndroid Build Coastguard Worker 
TEST_P(SymmetricKeyDeriveKeyFromPasswordTest,DeriveKeyFromPassword)67*635a8641SAndroid Build Coastguard Worker TEST_P(SymmetricKeyDeriveKeyFromPasswordTest, DeriveKeyFromPassword) {
68*635a8641SAndroid Build Coastguard Worker   PBKDF2TestVector test_data(GetParam());
69*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<crypto::SymmetricKey> key(
70*635a8641SAndroid Build Coastguard Worker       crypto::SymmetricKey::DeriveKeyFromPassword(
71*635a8641SAndroid Build Coastguard Worker           test_data.algorithm, test_data.password, test_data.salt,
72*635a8641SAndroid Build Coastguard Worker           test_data.rounds, test_data.key_size_in_bits));
73*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(key);
74*635a8641SAndroid Build Coastguard Worker 
75*635a8641SAndroid Build Coastguard Worker   const std::string& raw_key = key->key();
76*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(test_data.key_size_in_bits / 8, raw_key.size());
77*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(test_data.expected,
78*635a8641SAndroid Build Coastguard Worker             base::ToLowerASCII(base::HexEncode(raw_key.data(),
79*635a8641SAndroid Build Coastguard Worker                                                raw_key.size())));
80*635a8641SAndroid Build Coastguard Worker }
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker static const PBKDF2TestVector kTestVectors[] = {
83*635a8641SAndroid Build Coastguard Worker   // These tests come from
84*635a8641SAndroid Build Coastguard Worker   // http://www.ietf.org/id/draft-josefsson-pbkdf2-test-vectors-00.txt
85*635a8641SAndroid Build Coastguard Worker   {
86*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
87*635a8641SAndroid Build Coastguard Worker     "password",
88*635a8641SAndroid Build Coastguard Worker     "salt",
89*635a8641SAndroid Build Coastguard Worker     1,
90*635a8641SAndroid Build Coastguard Worker     160,
91*635a8641SAndroid Build Coastguard Worker     "0c60c80f961f0e71f3a9b524af6012062fe037a6",
92*635a8641SAndroid Build Coastguard Worker   },
93*635a8641SAndroid Build Coastguard Worker   {
94*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
95*635a8641SAndroid Build Coastguard Worker     "password",
96*635a8641SAndroid Build Coastguard Worker     "salt",
97*635a8641SAndroid Build Coastguard Worker     2,
98*635a8641SAndroid Build Coastguard Worker     160,
99*635a8641SAndroid Build Coastguard Worker     "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957",
100*635a8641SAndroid Build Coastguard Worker   },
101*635a8641SAndroid Build Coastguard Worker   {
102*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
103*635a8641SAndroid Build Coastguard Worker     "password",
104*635a8641SAndroid Build Coastguard Worker     "salt",
105*635a8641SAndroid Build Coastguard Worker     4096,
106*635a8641SAndroid Build Coastguard Worker     160,
107*635a8641SAndroid Build Coastguard Worker     "4b007901b765489abead49d926f721d065a429c1",
108*635a8641SAndroid Build Coastguard Worker   },
109*635a8641SAndroid Build Coastguard Worker   // This test takes over 30s to run on the trybots.
110*635a8641SAndroid Build Coastguard Worker #if 0
111*635a8641SAndroid Build Coastguard Worker   {
112*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
113*635a8641SAndroid Build Coastguard Worker     "password",
114*635a8641SAndroid Build Coastguard Worker     "salt",
115*635a8641SAndroid Build Coastguard Worker     16777216,
116*635a8641SAndroid Build Coastguard Worker     160,
117*635a8641SAndroid Build Coastguard Worker     "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984",
118*635a8641SAndroid Build Coastguard Worker   },
119*635a8641SAndroid Build Coastguard Worker #endif
120*635a8641SAndroid Build Coastguard Worker 
121*635a8641SAndroid Build Coastguard Worker   // These tests come from RFC 3962, via BSD source code at
122*635a8641SAndroid Build Coastguard Worker   // http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/bioctl/pbkdf2.c?rev=HEAD&content-type=text/plain
123*635a8641SAndroid Build Coastguard Worker   {
124*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
125*635a8641SAndroid Build Coastguard Worker     "password",
126*635a8641SAndroid Build Coastguard Worker     "ATHENA.MIT.EDUraeburn",
127*635a8641SAndroid Build Coastguard Worker     1,
128*635a8641SAndroid Build Coastguard Worker     160,
129*635a8641SAndroid Build Coastguard Worker     "cdedb5281bb2f801565a1122b25635150ad1f7a0",
130*635a8641SAndroid Build Coastguard Worker   },
131*635a8641SAndroid Build Coastguard Worker   {
132*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
133*635a8641SAndroid Build Coastguard Worker     "password",
134*635a8641SAndroid Build Coastguard Worker     "ATHENA.MIT.EDUraeburn",
135*635a8641SAndroid Build Coastguard Worker     2,
136*635a8641SAndroid Build Coastguard Worker     160,
137*635a8641SAndroid Build Coastguard Worker     "01dbee7f4a9e243e988b62c73cda935da05378b9",
138*635a8641SAndroid Build Coastguard Worker   },
139*635a8641SAndroid Build Coastguard Worker   {
140*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
141*635a8641SAndroid Build Coastguard Worker     "password",
142*635a8641SAndroid Build Coastguard Worker     "ATHENA.MIT.EDUraeburn",
143*635a8641SAndroid Build Coastguard Worker     1200,
144*635a8641SAndroid Build Coastguard Worker     160,
145*635a8641SAndroid Build Coastguard Worker     "5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddb",
146*635a8641SAndroid Build Coastguard Worker   },
147*635a8641SAndroid Build Coastguard Worker   {
148*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
149*635a8641SAndroid Build Coastguard Worker     "password",
150*635a8641SAndroid Build Coastguard Worker     "\022" "4VxxV4\022", /* 0x1234567878563412 */
151*635a8641SAndroid Build Coastguard Worker     5,
152*635a8641SAndroid Build Coastguard Worker     160,
153*635a8641SAndroid Build Coastguard Worker     "d1daa78615f287e6a1c8b120d7062a493f98d203",
154*635a8641SAndroid Build Coastguard Worker   },
155*635a8641SAndroid Build Coastguard Worker   {
156*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
157*635a8641SAndroid Build Coastguard Worker     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
158*635a8641SAndroid Build Coastguard Worker     "pass phrase equals block size",
159*635a8641SAndroid Build Coastguard Worker     1200,
160*635a8641SAndroid Build Coastguard Worker     160,
161*635a8641SAndroid Build Coastguard Worker     "139c30c0966bc32ba55fdbf212530ac9c5ec59f1",
162*635a8641SAndroid Build Coastguard Worker   },
163*635a8641SAndroid Build Coastguard Worker   {
164*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
165*635a8641SAndroid Build Coastguard Worker     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
166*635a8641SAndroid Build Coastguard Worker     "pass phrase exceeds block size",
167*635a8641SAndroid Build Coastguard Worker     1200,
168*635a8641SAndroid Build Coastguard Worker     160,
169*635a8641SAndroid Build Coastguard Worker     "9ccad6d468770cd51b10e6a68721be611a8b4d28",
170*635a8641SAndroid Build Coastguard Worker   },
171*635a8641SAndroid Build Coastguard Worker   {
172*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::HMAC_SHA1,
173*635a8641SAndroid Build Coastguard Worker     "\360\235\204\236", /* g-clef (0xf09d849e) */
174*635a8641SAndroid Build Coastguard Worker     "EXAMPLE.COMpianist",
175*635a8641SAndroid Build Coastguard Worker     50,
176*635a8641SAndroid Build Coastguard Worker     160,
177*635a8641SAndroid Build Coastguard Worker     "6b9cf26d45455a43a5b8bb276a403b39e7fe37a0",
178*635a8641SAndroid Build Coastguard Worker   },
179*635a8641SAndroid Build Coastguard Worker 
180*635a8641SAndroid Build Coastguard Worker   // Regression tests for AES keys, derived from the Linux NSS implementation.
181*635a8641SAndroid Build Coastguard Worker   {
182*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::AES,
183*635a8641SAndroid Build Coastguard Worker     "A test password",
184*635a8641SAndroid Build Coastguard Worker     "saltsalt",
185*635a8641SAndroid Build Coastguard Worker     1,
186*635a8641SAndroid Build Coastguard Worker     256,
187*635a8641SAndroid Build Coastguard Worker     "44899a7777f0e6e8b752f875f02044b8ac593de146de896f2e8a816e315a36de",
188*635a8641SAndroid Build Coastguard Worker   },
189*635a8641SAndroid Build Coastguard Worker   {
190*635a8641SAndroid Build Coastguard Worker     crypto::SymmetricKey::AES,
191*635a8641SAndroid Build Coastguard Worker     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
192*635a8641SAndroid Build Coastguard Worker     "pass phrase exceeds block size",
193*635a8641SAndroid Build Coastguard Worker     20,
194*635a8641SAndroid Build Coastguard Worker     256,
195*635a8641SAndroid Build Coastguard Worker     "e0739745dc28b8721ba402e05214d2ac1eab54cf72bee1fba388297a09eb493c",
196*635a8641SAndroid Build Coastguard Worker   },
197*635a8641SAndroid Build Coastguard Worker };
198*635a8641SAndroid Build Coastguard Worker 
199*635a8641SAndroid Build Coastguard Worker INSTANTIATE_TEST_CASE_P(, SymmetricKeyDeriveKeyFromPasswordTest,
200*635a8641SAndroid Build Coastguard Worker                         testing::ValuesIn(kTestVectors));
201