Zhiyi Zhang | af7c290 | 2019-03-14 22:13:21 -0700 | [diff] [blame] | 1 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
| 2 | /** |
| 3 | * 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" |
| 22 | #include "test-common.hpp" |
| 23 | #include <iostream> |
| 24 | |
| 25 | namespace ndn { |
| 26 | namespace ndncert { |
| 27 | namespace tests { |
| 28 | |
| 29 | BOOST_AUTO_TEST_SUITE(TestCryptoHelper) |
| 30 | |
| 31 | BOOST_AUTO_TEST_CASE(Test0) |
| 32 | { |
| 33 | ECDHState aliceState; |
| 34 | auto alicePub = aliceState.getRawSelfPubKey(); |
| 35 | BOOST_CHECK(aliceState.context->publicKeyLen != 0); |
| 36 | |
| 37 | ECDHState bobState; |
| 38 | auto bobPub = bobState.getRawSelfPubKey(); |
| 39 | BOOST_CHECK(bobState.context->publicKeyLen != 0); |
| 40 | |
| 41 | auto aliceResult = aliceState.deriveSecret( |
| 42 | bobPub, bobState.context->publicKeyLen); |
| 43 | |
| 44 | BOOST_CHECK(aliceState.context->sharedSecretLen != 0); |
| 45 | |
| 46 | auto bobResult = bobState.deriveSecret( |
| 47 | alicePub, aliceState.context->publicKeyLen); |
| 48 | |
| 49 | BOOST_CHECK(bobState.context->sharedSecretLen != 0); |
| 50 | |
| 51 | BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult, aliceResult + 32, |
| 52 | bobResult, bobResult + 32); |
| 53 | } |
| 54 | |
| 55 | BOOST_AUTO_TEST_CASE(Test1) |
| 56 | { |
| 57 | ECDHState aliceState; |
| 58 | auto alicePub = aliceState.getBase64PubKey(); |
| 59 | BOOST_CHECK(alicePub != ""); |
| 60 | |
| 61 | ECDHState bobState; |
| 62 | auto bobPub = bobState.getBase64PubKey(); |
| 63 | BOOST_CHECK(bobPub != ""); |
| 64 | |
| 65 | auto aliceResult = aliceState.deriveSecret(bobPub); |
| 66 | BOOST_CHECK(aliceState.context->sharedSecretLen != 0); |
| 67 | |
| 68 | auto bobResult = bobState.deriveSecret(alicePub); |
| 69 | BOOST_CHECK(bobState.context->sharedSecretLen != 0); |
| 70 | |
| 71 | BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult, aliceResult + 32, |
| 72 | bobResult, bobResult + 32); |
| 73 | } |
| 74 | |
| 75 | |
| 76 | BOOST_AUTO_TEST_CASE(NDN_COMPUTE_HMAC_SHA256_TEST1) |
| 77 | { |
| 78 | uint8_t secret[] = {0x00,0x01,0x02,0x03,0x04,0x05, |
| 79 | 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c}; |
| 80 | |
| 81 | uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 82 | 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 83 | 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 84 | 0x0b}; |
| 85 | |
| 86 | uint8_t result[32]; |
| 87 | |
| 88 | uint8_t expected[] = {0x07,0x77,0x09,0x36,0x2c,0x2e,0x32, |
| 89 | 0xdf,0x0d,0xdc,0x3f,0x0d,0xc4,0x7b, |
| 90 | 0xba,0x63,0x90,0xb6,0xc7,0x3b,0xb5, |
| 91 | 0x0f,0x9c,0x31,0x22,0xec,0x84,0x4a, |
| 92 | 0xd7,0xc2,0xb3,0xe5}; |
| 93 | |
| 94 | ndn_compute_hmac_sha256(salt, sizeof(salt), secret, sizeof(secret), result); |
| 95 | BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0); |
| 96 | } |
| 97 | |
| 98 | BOOST_AUTO_TEST_CASE(IETF_TEST_1) |
| 99 | { |
| 100 | uint8_t secret[] = {0x00,0x01,0x02,0x03,0x04,0x05, |
| 101 | 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c}; |
| 102 | |
| 103 | uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 104 | 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 105 | 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 106 | 0x0b,0x0b,0x0b,0x0b}; |
| 107 | |
| 108 | uint8_t info[] = {0xf0,0xf1,0xf2,0xf3,0xf4, |
| 109 | 0xf5,0xf6,0xf7,0xf8,0xf9}; |
| 110 | |
| 111 | uint8_t result[42]; |
| 112 | uint8_t expected[] = {0x3c,0xb2,0x5f,0x25,0xfa,0xac,0xd5,0x7a,0x90,0x43, |
| 113 | 0x4f,0x64,0xd0,0x36,0x2f,0x2a,0x2d,0x2d,0x0a,0x90, |
| 114 | 0xcf,0x1a,0x5a,0x4c,0x5d,0xb0,0x2d,0x56,0xec,0xc4, |
| 115 | 0xc5,0xbf,0x34,0x00,0x72,0x08,0xd5,0xb8,0x87,0x18, |
| 116 | 0x58,0x65}; |
| 117 | |
| 118 | auto resultLen = hkdf(secret, sizeof(secret), |
| 119 | salt,sizeof(salt), |
| 120 | result, sizeof(result), |
| 121 | info, sizeof(info)); |
| 122 | |
| 123 | BOOST_CHECK(resultLen != 0); |
| 124 | BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0); |
| 125 | } |
| 126 | |
| 127 | BOOST_AUTO_TEST_CASE(IETF_TEST_2) |
| 128 | { |
| 129 | uint8_t secret[] = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, |
| 130 | 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, |
| 131 | 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, |
| 132 | 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, |
| 133 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, |
| 134 | 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, |
| 135 | 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, |
| 136 | 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, |
| 137 | 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, |
| 138 | 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf}; |
| 139 | |
| 140 | uint8_t salt[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, |
| 141 | 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, |
| 142 | 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, |
| 143 | 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, |
| 144 | 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, |
| 145 | 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, |
| 146 | 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, |
| 147 | 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, |
| 148 | 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, |
| 149 | 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f}; |
| 150 | |
| 151 | uint8_t info[] = {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, |
| 152 | 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, |
| 153 | 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, |
| 154 | 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, |
| 155 | 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, |
| 156 | 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, |
| 157 | 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, |
| 158 | 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, |
| 159 | 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, |
| 160 | 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; |
| 161 | |
| 162 | uint8_t result[82]; |
| 163 | uint8_t expected[] = {0xb1,0x1e,0x39,0x8d,0xc8,0x03,0x27, |
| 164 | 0xa1,0xc8,0xe7,0xf7,0x8c,0x59,0x6a, |
| 165 | 0x49,0x34,0x4f,0x01,0x2e,0xda,0x2d, |
| 166 | 0x4e,0xfa,0xd8,0xa0,0x50,0xcc,0x4c, |
| 167 | 0x19,0xaf,0xa9,0x7c,0x59,0x04,0x5a, |
| 168 | 0x99,0xca,0xc7,0x82,0x72,0x71,0xcb, |
| 169 | 0x41,0xc6,0x5e,0x59,0x0e,0x09,0xda, |
| 170 | 0x32,0x75,0x60,0x0c,0x2f,0x09,0xb8, |
| 171 | 0x36,0x77,0x93,0xa9,0xac,0xa3,0xdb, |
| 172 | 0x71,0xcc,0x30,0xc5,0x81,0x79,0xec, |
| 173 | 0x3e,0x87,0xc1,0x4c,0x01,0xd5,0xc1, |
| 174 | 0xf3,0x43,0x4f,0x1d,0x87}; |
| 175 | |
| 176 | auto resultLen = hkdf(secret, sizeof(secret), |
| 177 | salt,sizeof(salt), |
| 178 | result, sizeof(result), |
| 179 | info, sizeof(info)); |
| 180 | |
| 181 | BOOST_CHECK(resultLen != 0); |
| 182 | BOOST_CHECK(memcmp(expected, result, 42) == 0); |
| 183 | } |
| 184 | |
| 185 | BOOST_AUTO_TEST_CASE(IETF_TEST_3) |
| 186 | { |
| 187 | //uint8_t secret[] = {}; secret is empty in this test |
| 188 | |
| 189 | uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 190 | 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, |
| 191 | 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b}; |
| 192 | |
| 193 | //uint8_t info[] = {}; info is empty in this test |
| 194 | |
| 195 | uint8_t result[42]; |
| 196 | uint8_t expected[] = {0x8d,0xa4,0xe7,0x75,0xa5,0x63,0xc1,0x8f, |
| 197 | 0x71,0x5f,0x80,0x2a,0x06,0x3c,0x5a,0x31, |
| 198 | 0xb8,0xa1,0x1f,0x5c,0x5e,0xe1,0x87,0x9e, |
| 199 | 0xc3,0x45,0x4e,0x5f,0x3c,0x73,0x8d,0x2d, |
| 200 | 0x9d,0x20,0x13,0x95,0xfa,0xa4,0xb6,0x1a, |
| 201 | 0x96,0xc8}; |
| 202 | |
| 203 | auto resultLen = hkdf(nullptr, 0, |
| 204 | salt,sizeof(salt), |
| 205 | result, sizeof(result), |
| 206 | nullptr, 0); |
| 207 | |
| 208 | BOOST_CHECK(resultLen != 0); |
| 209 | BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0); |
| 210 | } |
| 211 | |
| 212 | |
| 213 | BOOST_AUTO_TEST_SUITE_END() |
| 214 | |
| 215 | } // namespace tests |
| 216 | } // namespace ndncert |
| 217 | } // namespace ndn |