blob: 5834382d18003ece60a579142a7ffe0f8593d65a [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 Zhanga67fa462020-04-19 13:48:03 -07003 * Copyright (c) 2017-2020, Regents of the University of California.
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -07004 *
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
Zhiyi Zhangdc25ddf2020-10-20 14:28:55 -070021#include "detail/crypto-helpers.hpp"
Zhiyi Zhang5d80e1e2020-09-25 11:34:54 -070022#include "test-common.hpp"
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070023
24namespace ndn {
25namespace ndncert {
26namespace tests {
27
Zhiyi Zhangb40027f2020-10-20 18:35:27 -070028BOOST_AUTO_TEST_SUITE(TestCryptoHelpers)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070029
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070030BOOST_AUTO_TEST_CASE(EcdhWithRawKey)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070031{
32 ECDHState aliceState;
Zhiyi Zhangbed854c2020-10-20 18:25:35 -070033 auto alicePub = aliceState.getSelfPubKey();
34 BOOST_CHECK(!alicePub.empty());
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070035
36 ECDHState bobState;
Zhiyi Zhangbed854c2020-10-20 18:25:35 -070037 auto bobPub = bobState.getSelfPubKey();
38 BOOST_CHECK(!bobPub.empty());
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070039
Zhiyi Zhangbed854c2020-10-20 18:25:35 -070040 auto aliceResult = aliceState.deriveSecret(bobPub);
41 BOOST_CHECK(!aliceResult.empty());
42 auto bobResult = bobState.deriveSecret(alicePub);
43 BOOST_CHECK(!bobResult.empty());
44 BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult.begin(), aliceResult.end(), bobResult.begin(), bobResult.end());
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070045}
46
Zhiyi Zhang8da54d62019-11-21 00:03:05 -080047BOOST_AUTO_TEST_CASE(EcdhWithRawKeyWrongInput)
48{
49 ECDHState aliceState;
Zhiyi Zhangbed854c2020-10-20 18:25:35 -070050 auto alicePub = aliceState.getSelfPubKey();
51 BOOST_CHECK(!alicePub.empty());
Zhiyi Zhang0eb74242020-10-20 18:33:22 -070052 std::vector<uint8_t> fakePub(10, 0x0b);
53 BOOST_CHECK_THROW(aliceState.deriveSecret(fakePub), std::runtime_error);
Zhiyi Zhang8da54d62019-11-21 00:03:05 -080054}
55
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070056BOOST_AUTO_TEST_CASE(HmacSha256)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070057{
Zhiyi Zhangdd308932020-10-16 21:59:06 -070058 const uint8_t input[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
59 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
60 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
tylerliu00de2c32020-10-20 17:33:08 -070061 const uint8_t key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070062 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
63 const uint8_t expected[] = {0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
64 0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
65 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
66 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5};
67 uint8_t result[32];
tylerliu00de2c32020-10-20 17:33:08 -070068 hmacSha256(input, sizeof(input), key, sizeof(key), result);
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070069 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
70 expected + sizeof(expected));
71}
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070072
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070073BOOST_AUTO_TEST_CASE(Hkdf1)
74{
75 // RFC5869 appendix A.1
76 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
77 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
78 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
79 const uint8_t salt[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
80 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
81 const uint8_t info[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4,
82 0xf5, 0xf6, 0xf7, 0xf8, 0xf9};
83 const uint8_t expected[] = {
84 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f,
85 0x64, 0xd0, 0x36, 0x2f, 0x2a, 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a,
86 0x5a, 0x4c, 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, 0x34,
87 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18, 0x58, 0x65};
88 uint8_t result[42];
89 auto resultLen = hkdf(ikm, sizeof(ikm), salt, sizeof(salt), result,
90 sizeof(result), info, sizeof(info));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070091
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070092 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
93 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
94 expected + sizeof(expected));
95}
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070096
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -070097BOOST_AUTO_TEST_CASE(Hkdf2)
98{
99 // RFC5869 appendix A.2
100 const uint8_t ikm[] = {
101 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
102 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
103 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
104 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
105 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
106 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
107 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f};
108 const uint8_t salt[] = {
109 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
110 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
111 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
112 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
113 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
114 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
115 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf};
116 const uint8_t info[] = {
117 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
118 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
119 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
120 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
121 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
122 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
123 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff};
124 const uint8_t expected[] = {
125 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, 0xc8, 0xe7, 0xf7, 0x8c,
126 0x59, 0x6a, 0x49, 0x34, 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
127 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, 0x59, 0x04, 0x5a, 0x99,
128 0xca, 0xc7, 0x82, 0x72, 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
129 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, 0x36, 0x77, 0x93, 0xa9,
130 0xac, 0xa3, 0xdb, 0x71, 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
131 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, 0x1d, 0x87};
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700132
Davide Pesavento368341b2019-08-13 23:57:50 -0400133 uint8_t result[82];
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -0700134 auto resultLen = hkdf(ikm, sizeof(ikm), salt, sizeof(salt), result,
135 sizeof(result), info, sizeof(info));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700136
Zhiyi Zhanga2ce5992019-08-14 17:35:00 -0700137 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
138 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
139 expected + sizeof(expected));
140}
141
142BOOST_AUTO_TEST_CASE(Hkdf3)
143{
144 // RFC5869 appendix A.3
145 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
146 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
147 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
148 const uint8_t expected[] = {
149 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, 0x71, 0x5f, 0x80,
150 0x2a, 0x06, 0x3c, 0x5a, 0x31, 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1,
151 0x87, 0x9e, 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, 0x9d,
152 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, 0x96, 0xc8};
153 uint8_t result[42];
154
155 auto resultLen = hkdf(ikm, sizeof(ikm), nullptr, 0, result,
156 sizeof(result), nullptr, 0);
157
158 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
159 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
160 expected + sizeof(expected));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700161}
162
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700163BOOST_AUTO_TEST_CASE(AesGcm1)
164{
165 // Test case from NIST Cryptographic Algorithm Validation Program
166 // https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES
167 // Count = 0
168 // Key = cf063a34d4a9a76c2c86787d3f96db71
169 // IV = 113b9785971864c83b01c787
170 // CT =
171 // AAD =
172 // Tag = 72ac8493e3a5228b5d130a69d2510e42
173 // PT =
174 const uint8_t key[] = {0xcf, 0x06, 0x3a, 0x34, 0xd4, 0xa9, 0xa7, 0x6c,
175 0x2c, 0x86, 0x78, 0x7d, 0x3f, 0x96, 0xdb, 0x71};
176 const uint8_t iv[] = {0x11, 0x3b, 0x97, 0x85, 0x97, 0x18,
177 0x64, 0xc8, 0x3b, 0x01, 0xc7, 0x87};
178 const uint8_t expected_tag[] = {0x72, 0xac, 0x84, 0x93, 0xe3, 0xa5,
179 0x22, 0x8b, 0x5d, 0x13, 0x0a, 0x69,
180 0xd2, 0x51, 0x0e, 0x42};
181
182 uint8_t ciphertext[256] = {0};
183 uint8_t tag[16] = {0};
tylerliu06aa3682020-10-12 22:03:42 -0700184 const uint8_t empty_buffer[1] = {0};
Zhiyi Zhang11cf7eb2020-10-20 15:43:36 -0700185 int size = aesGcm128Encrypt(empty_buffer, 0, empty_buffer, 0, key, iv, ciphertext, tag);
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700186 BOOST_CHECK(size == 0);
187 BOOST_CHECK_EQUAL_COLLECTIONS(tag, tag + 16, expected_tag, expected_tag + sizeof(expected_tag));
188
189 uint8_t decrypted[256] = {0};
Zhiyi Zhang11cf7eb2020-10-20 15:43:36 -0700190 size = aesGcm128Decrypt(ciphertext, size, empty_buffer, 0, tag, key, iv, decrypted);
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700191 BOOST_CHECK(size == 0);
192}
193
194BOOST_AUTO_TEST_CASE(AesGcm2)
195{
196 // Test case from NIST Cryptographic Algorithm Validation Program
197 // https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES
198 // Count = 1
199 // Key = 2370e320d4344208e0ff5683f243b213
200 // IV = 04dbb82f044d30831c441228
201 // CT =
202 // AAD = d43a8e5089eea0d026c03a85178b27da
203 // Tag = 2a049c049d25aa95969b451d93c31c6e
204 // PT =
205 const uint8_t key[] = {0x23, 0x70, 0xe3, 0x20, 0xd4, 0x34, 0x42, 0x08,
206 0xe0, 0xff, 0x56, 0x83, 0xf2, 0x43, 0xb2, 0x13};
207 const uint8_t iv[] = {0x04, 0xdb, 0xb8, 0x2f, 0x04, 0x4d,
208 0x30, 0x83, 0x1c, 0x44, 0x12, 0x28};
209 const uint8_t aad[] = {0xd4, 0x3a, 0x8e, 0x50, 0x89, 0xee, 0xa0, 0xd0,
210 0x26, 0xc0, 0x3a, 0x85, 0x17, 0x8b, 0x27, 0xda};
211 const uint8_t expected_tag[] = {0x2a, 0x04, 0x9c, 0x04, 0x9d, 0x25,
212 0xaa, 0x95, 0x96, 0x9b, 0x45, 0x1d,
213 0x93, 0xc3, 0x1c, 0x6e};
214
215 uint8_t ciphertext[256] = {0};
216 uint8_t tag[16] = {0};
tylerliu06aa3682020-10-12 22:03:42 -0700217 const uint8_t empty_buffer[1] = {0};
Zhiyi Zhang11cf7eb2020-10-20 15:43:36 -0700218 int size = aesGcm128Encrypt(empty_buffer, 0, aad, sizeof(aad), key, iv, ciphertext, tag);
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700219 BOOST_CHECK(size == 0);
220 BOOST_CHECK_EQUAL_COLLECTIONS(tag, tag + 16, expected_tag, expected_tag + sizeof(expected_tag));
221
222 uint8_t decrypted[256] = {0};
Zhiyi Zhang11cf7eb2020-10-20 15:43:36 -0700223 size = aesGcm128Decrypt(ciphertext, size, aad, sizeof(aad), tag, key, iv, decrypted);
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700224 BOOST_CHECK(size == 0);
225}
226
227BOOST_AUTO_TEST_CASE(AesGcm3)
228{
229 // Test case from NIST Cryptographic Algorithm Validation Program
230 // https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES
231 // Count = 0
232 // Key = bc22f3f05cc40db9311e4192966fee92
233 // IV = 134988e662343c06d3ab83db
234 // CT = 4c0168ab95d3a10ef25e5924108389365c67d97778995892d9fd46897384af61fc559212b3267e90fe4df7bfd1fbed46f4b9ee
235 // AAD = 10087e6ed81049b509c31d12fee88c64
236 // Tag = 771357958a316f166bd0dacc98ea801a
237 // PT = 337c1bc992386cf0f957617fe4d5ec1218ae1cc40369305518eb177e9b15c1646b142ff71237efaa58790080cd82e8848b295c
238 const uint8_t key[] = {0xbc, 0x22, 0xf3, 0xf0, 0x5c, 0xc4, 0x0d, 0xb9,
239 0x31, 0x1e, 0x41, 0x92, 0x96, 0x6f, 0xee, 0x92};
240 const uint8_t iv[] = {0x13, 0x49, 0x88, 0xe6, 0x62, 0x34,
241 0x3c, 0x06, 0xd3, 0xab, 0x83, 0xdb};
242 const uint8_t aad[] = {0x10, 0x08, 0x7e, 0x6e, 0xd8, 0x10, 0x49, 0xb5,
243 0x09, 0xc3, 0x1d, 0x12, 0xfe, 0xe8, 0x8c, 0x64};
244 const uint8_t expected_ciphertext[] = {
245 0x4c, 0x01, 0x68, 0xab, 0x95, 0xd3, 0xa1, 0x0e, 0xf2, 0x5e, 0x59,
246 0x24, 0x10, 0x83, 0x89, 0x36, 0x5c, 0x67, 0xd9, 0x77, 0x78, 0x99,
247 0x58, 0x92, 0xd9, 0xfd, 0x46, 0x89, 0x73, 0x84, 0xaf, 0x61, 0xfc,
248 0x55, 0x92, 0x12, 0xb3, 0x26, 0x7e, 0x90, 0xfe, 0x4d, 0xf7, 0xbf,
249 0xd1, 0xfb, 0xed, 0x46, 0xf4, 0xb9, 0xee};
250 const uint8_t expected_tag[] = {0x77, 0x13, 0x57, 0x95, 0x8a, 0x31,
251 0x6f, 0x16, 0x6b, 0xd0, 0xda, 0xcc,
252 0x98, 0xea, 0x80, 0x1a};
253 const uint8_t plaintext[] = {
254 0x33, 0x7c, 0x1b, 0xc9, 0x92, 0x38, 0x6c, 0xf0, 0xf9, 0x57, 0x61,
255 0x7f, 0xe4, 0xd5, 0xec, 0x12, 0x18, 0xae, 0x1c, 0xc4, 0x03, 0x69,
256 0x30, 0x55, 0x18, 0xeb, 0x17, 0x7e, 0x9b, 0x15, 0xc1, 0x64, 0x6b,
257 0x14, 0x2f, 0xf7, 0x12, 0x37, 0xef, 0xaa, 0x58, 0x79, 0x00, 0x80,
258 0xcd, 0x82, 0xe8, 0x84, 0x8b, 0x29, 0x5c};
259
260 uint8_t ciphertext[256] = {0};
261 uint8_t tag[16] = {0};
Zhiyi Zhang11cf7eb2020-10-20 15:43:36 -0700262 int size = aesGcm128Encrypt(plaintext, sizeof(plaintext), aad, sizeof(aad), key, iv, ciphertext, tag);
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700263 BOOST_CHECK_EQUAL_COLLECTIONS(ciphertext, ciphertext + size,
264 expected_ciphertext, expected_ciphertext + sizeof(expected_ciphertext));
265 BOOST_CHECK_EQUAL_COLLECTIONS(tag, tag + 16, expected_tag, expected_tag + sizeof(expected_tag));
266
267 uint8_t decrypted[256] = {0};
Zhiyi Zhang11cf7eb2020-10-20 15:43:36 -0700268 size = aesGcm128Decrypt(ciphertext, size, aad, sizeof(aad), tag, key, iv, decrypted);
Zhiyi Zhang82e0c722020-10-14 17:51:29 -0700269 BOOST_CHECK_EQUAL_COLLECTIONS(decrypted, decrypted + size,
270 plaintext, plaintext + sizeof(plaintext));
Zhiyi Zhanga67fa462020-04-19 13:48:03 -0700271}
272
Zhiyi Zhang222810b2020-10-16 21:50:35 -0700273BOOST_AUTO_TEST_CASE(AesIV)
274{
275 const uint8_t key[] = {0xbc, 0x22, 0xf3, 0xf0, 0x5c, 0xc4, 0x0d, 0xb9,
276 0x31, 0x1e, 0x41, 0x92, 0x96, 0x6f, 0xee, 0x92};
277 const std::string plaintext = "alongstringalongstringalongstringalongstringalongstringalongstringalongstringalongstring";
278 const std::string associatedData = "test";
279 uint32_t counter = 0;
280 auto block = encodeBlockWithAesGcm128(ndn::tlv::Content, key, (uint8_t*)plaintext.c_str(), plaintext.size(),
281 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
282 block.parse();
283 auto ivBlock = block.get(tlv::InitializationVector);
284 Buffer ivBuf(ivBlock.value(), ivBlock.value_size());
285 BOOST_CHECK_EQUAL(ivBuf.size(), 12);
286 BOOST_CHECK(ivBuf[0] >= 128);
287 BOOST_CHECK_EQUAL(ivBuf[8] + ivBuf[9] + ivBuf[10] + ivBuf[11], 0);
Zhiyi Zhang159ba632020-10-20 15:09:12 -0700288 BOOST_CHECK_EQUAL(counter, 6);
Zhiyi Zhang222810b2020-10-16 21:50:35 -0700289 counter = 300;
290 block = encodeBlockWithAesGcm128(ndn::tlv::ApplicationParameters, key, (uint8_t*)plaintext.c_str(), plaintext.size(),
291 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
292 block.parse();
293 ivBlock = block.get(tlv::InitializationVector);
294 Buffer ivBuf2(ivBlock.value(), ivBlock.value_size());
295 BOOST_CHECK_EQUAL(ivBuf2.size(), 12);
296 BOOST_CHECK(ivBuf2[0] < 128);
297 BOOST_CHECK_EQUAL(ivBuf2[8] + ivBuf2[9], 0);
298 BOOST_CHECK_EQUAL(ivBuf2[10], 1);
299 BOOST_CHECK_EQUAL(ivBuf2[11], 44);
Zhiyi Zhang159ba632020-10-20 15:09:12 -0700300 BOOST_CHECK_EQUAL(counter, 306);
Zhiyi Zhang222810b2020-10-16 21:50:35 -0700301}
302
Zhiyi Zhangc5d93a92020-10-14 17:07:35 -0700303BOOST_AUTO_TEST_CASE(BlockEncodingDecoding)
304{
305 const uint8_t key[] = {0xbc, 0x22, 0xf3, 0xf0, 0x5c, 0xc4, 0x0d, 0xb9,
306 0x31, 0x1e, 0x41, 0x92, 0x96, 0x6f, 0xee, 0x92};
307 const std::string plaintext = "alongstringalongstringalongstringalongstringalongstringalongstringalongstringalongstring";
Zhiyi Zhangdd308932020-10-16 21:59:06 -0700308 const std::string associatedData = "right";
309 const std::string wrongAssociatedData = "wrong";
Zhiyi Zhang222810b2020-10-16 21:50:35 -0700310 uint32_t counter = 0;
Zhiyi Zhangc5d93a92020-10-14 17:07:35 -0700311 auto block = encodeBlockWithAesGcm128(ndn::tlv::Content, key, (uint8_t*)plaintext.c_str(), plaintext.size(),
Zhiyi Zhang222810b2020-10-16 21:50:35 -0700312 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
Zhiyi Zhangc5d93a92020-10-14 17:07:35 -0700313 auto decoded = decodeBlockWithAesGcm128(block, key, (uint8_t*)associatedData.c_str(), associatedData.size());
Zhiyi Zhangdd308932020-10-16 21:59:06 -0700314 BOOST_CHECK_EQUAL(plaintext, std::string(decoded.get<char>(), decoded.size()));
Zhiyi Zhang199508a2020-10-21 10:45:50 -0700315 BOOST_CHECK_THROW(decodeBlockWithAesGcm128(block, key,
316 (uint8_t*)wrongAssociatedData.c_str(),
317 wrongAssociatedData.size()), std::runtime_error);
Zhiyi Zhangc5d93a92020-10-14 17:07:35 -0700318}
319
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700320BOOST_AUTO_TEST_SUITE_END()
321
322} // namespace tests
323} // namespace ndncert
324} // namespace ndn