blob: eda32d153fe853fb165eb0be46c01c8a02baf8a1 [file] [log] [blame]
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento914d05f2019-07-13 16:20:19 -04002/*
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -07003 * Copyright (c) 2017-2019, Regents of the University of California.
4 *
5 * This file is part of ndncert, a certificate management system based on NDN.
6 *
7 * ndncert is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
10 *
11 * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License along with
16 * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ndncert authors and contributors.
19 */
20
21#include "crypto-support/crypto-helper.hpp"
Zhiyi Zhang42d992d2019-07-07 16:46:50 -070022#include "identity-management-fixture.hpp"
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070023
24namespace ndn {
25namespace ndncert {
26namespace tests {
27
28BOOST_AUTO_TEST_SUITE(TestCryptoHelper)
29
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070030BOOST_AUTO_TEST_CASE(EcdhWithRawKey)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070031{
32 ECDHState aliceState;
33 auto alicePub = aliceState.getRawSelfPubKey();
34 BOOST_CHECK(aliceState.context->publicKeyLen != 0);
35
36 ECDHState bobState;
37 auto bobPub = bobState.getRawSelfPubKey();
38 BOOST_CHECK(bobState.context->publicKeyLen != 0);
39
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070040 auto aliceResult = aliceState.deriveSecret(bobPub, bobState.context->publicKeyLen);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070041
42 BOOST_CHECK(aliceState.context->sharedSecretLen != 0);
43
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070044 auto bobResult = bobState.deriveSecret(alicePub, aliceState.context->publicKeyLen);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070045
46 BOOST_CHECK(bobState.context->sharedSecretLen != 0);
47
48 BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult, aliceResult + 32,
49 bobResult, bobResult + 32);
50}
51
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070052BOOST_AUTO_TEST_CASE(EcdhWithBase64Key)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070053{
54 ECDHState aliceState;
55 auto alicePub = aliceState.getBase64PubKey();
56 BOOST_CHECK(alicePub != "");
57
58 ECDHState bobState;
59 auto bobPub = bobState.getBase64PubKey();
60 BOOST_CHECK(bobPub != "");
61
62 auto aliceResult = aliceState.deriveSecret(bobPub);
63 BOOST_CHECK(aliceState.context->sharedSecretLen != 0);
64
65 auto bobResult = bobState.deriveSecret(alicePub);
66 BOOST_CHECK(bobState.context->sharedSecretLen != 0);
67
68 BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult, aliceResult + 32,
69 bobResult, bobResult + 32);
70}
71
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070072BOOST_AUTO_TEST_CASE(HmacSha256)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070073{
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070074 // RFC5869 appendix A.1, IKM, Salt -> PRK
75 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
76 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
77 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
78 const uint8_t salt[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
79 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
80 const uint8_t expected[] = {0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
81 0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
82 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
83 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5};
84 uint8_t result[32];
85 ndn_compute_hmac_sha256(ikm, sizeof(ikm), salt, sizeof(salt), result);
86 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
87 expected + sizeof(expected));
88}
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070089
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070090BOOST_AUTO_TEST_CASE(Hkdf1)
91{
92 // RFC5869 appendix A.1
93 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
94 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
95 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
96 const uint8_t salt[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
97 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
98 const uint8_t info[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4,
99 0xf5, 0xf6, 0xf7, 0xf8, 0xf9};
100 const uint8_t expected[] = {
101 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f,
102 0x64, 0xd0, 0x36, 0x2f, 0x2a, 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a,
103 0x5a, 0x4c, 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, 0x34,
104 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18, 0x58, 0x65};
105 uint8_t result[42];
106 auto resultLen = hkdf(ikm, sizeof(ikm), salt, sizeof(salt), result,
107 sizeof(result), info, sizeof(info));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700108
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -0700109 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
110 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
111 expected + sizeof(expected));
112}
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700113
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -0700114BOOST_AUTO_TEST_CASE(Hkdf2)
115{
116 // RFC5869 appendix A.2
117 const uint8_t ikm[] = {
118 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
119 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
120 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
121 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
122 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
123 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
124 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f};
125 const uint8_t salt[] = {
126 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
127 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
128 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
129 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
130 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
131 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
132 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf};
133 const uint8_t info[] = {
134 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
135 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
136 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
137 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
138 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
139 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
140 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff};
141 const uint8_t expected[] = {
142 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, 0xc8, 0xe7, 0xf7, 0x8c,
143 0x59, 0x6a, 0x49, 0x34, 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
144 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, 0x59, 0x04, 0x5a, 0x99,
145 0xca, 0xc7, 0x82, 0x72, 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
146 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, 0x36, 0x77, 0x93, 0xa9,
147 0xac, 0xa3, 0xdb, 0x71, 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
148 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, 0x1d, 0x87};
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700149
Davide Pesavento368341b2019-08-13 23:57:50 -0400150 uint8_t result[82];
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -0700151 auto resultLen = hkdf(ikm, sizeof(ikm), salt, sizeof(salt), result,
152 sizeof(result), info, sizeof(info));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700153
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -0700154 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
155 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
156 expected + sizeof(expected));
157}
158
159BOOST_AUTO_TEST_CASE(Hkdf3)
160{
161 // RFC5869 appendix A.3
162 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
163 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
164 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
165 const uint8_t expected[] = {
166 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, 0x71, 0x5f, 0x80,
167 0x2a, 0x06, 0x3c, 0x5a, 0x31, 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1,
168 0x87, 0x9e, 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, 0x9d,
169 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, 0x96, 0xc8};
170 uint8_t result[42];
171
172 auto resultLen = hkdf(ikm, sizeof(ikm), nullptr, 0, result,
173 sizeof(result), nullptr, 0);
174
175 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
176 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
177 expected + sizeof(expected));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700178}
179
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700180BOOST_AUTO_TEST_SUITE_END()
181
182} // namespace tests
183} // namespace ndncert
184} // namespace ndn