blob: 4576942229d1bd7fae960421d327c8997abe65bd [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2017-2019, Regents of the University of California.
*
* This file is part of ndncert, a certificate management system based on NDN.
*
* ndncert is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received copies of the GNU General Public License along with
* ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndncert authors and contributors.
*/
#include "crypto-support/crypto-helper.hpp"
#include "test-common.hpp"
#include <iostream>
namespace ndn {
namespace ndncert {
namespace tests {
BOOST_AUTO_TEST_SUITE(TestCryptoHelper)
BOOST_AUTO_TEST_CASE(Test0)
{
ECDHState aliceState;
auto alicePub = aliceState.getRawSelfPubKey();
BOOST_CHECK(aliceState.context->publicKeyLen != 0);
ECDHState bobState;
auto bobPub = bobState.getRawSelfPubKey();
BOOST_CHECK(bobState.context->publicKeyLen != 0);
auto aliceResult = aliceState.deriveSecret(
bobPub, bobState.context->publicKeyLen);
BOOST_CHECK(aliceState.context->sharedSecretLen != 0);
auto bobResult = bobState.deriveSecret(
alicePub, aliceState.context->publicKeyLen);
BOOST_CHECK(bobState.context->sharedSecretLen != 0);
BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult, aliceResult + 32,
bobResult, bobResult + 32);
}
BOOST_AUTO_TEST_CASE(Test1)
{
ECDHState aliceState;
auto alicePub = aliceState.getBase64PubKey();
BOOST_CHECK(alicePub != "");
ECDHState bobState;
auto bobPub = bobState.getBase64PubKey();
BOOST_CHECK(bobPub != "");
auto aliceResult = aliceState.deriveSecret(bobPub);
BOOST_CHECK(aliceState.context->sharedSecretLen != 0);
auto bobResult = bobState.deriveSecret(alicePub);
BOOST_CHECK(bobState.context->sharedSecretLen != 0);
BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult, aliceResult + 32,
bobResult, bobResult + 32);
}
BOOST_AUTO_TEST_CASE(NDN_COMPUTE_HMAC_SHA256_TEST1)
{
uint8_t secret[] = {0x00,0x01,0x02,0x03,0x04,0x05,
0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c};
uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b};
uint8_t result[32];
uint8_t expected[] = {0x07,0x77,0x09,0x36,0x2c,0x2e,0x32,
0xdf,0x0d,0xdc,0x3f,0x0d,0xc4,0x7b,
0xba,0x63,0x90,0xb6,0xc7,0x3b,0xb5,
0x0f,0x9c,0x31,0x22,0xec,0x84,0x4a,
0xd7,0xc2,0xb3,0xe5};
ndn_compute_hmac_sha256(salt, sizeof(salt), secret, sizeof(secret), result);
BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0);
}
BOOST_AUTO_TEST_CASE(IETF_TEST_1)
{
uint8_t secret[] = {0x00,0x01,0x02,0x03,0x04,0x05,
0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c};
uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b};
uint8_t info[] = {0xf0,0xf1,0xf2,0xf3,0xf4,
0xf5,0xf6,0xf7,0xf8,0xf9};
uint8_t result[42];
uint8_t expected[] = {0x3c,0xb2,0x5f,0x25,0xfa,0xac,0xd5,0x7a,0x90,0x43,
0x4f,0x64,0xd0,0x36,0x2f,0x2a,0x2d,0x2d,0x0a,0x90,
0xcf,0x1a,0x5a,0x4c,0x5d,0xb0,0x2d,0x56,0xec,0xc4,
0xc5,0xbf,0x34,0x00,0x72,0x08,0xd5,0xb8,0x87,0x18,
0x58,0x65};
auto resultLen = hkdf(secret, sizeof(secret),
salt,sizeof(salt),
result, sizeof(result),
info, sizeof(info));
BOOST_CHECK(resultLen != 0);
BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0);
}
BOOST_AUTO_TEST_CASE(IETF_TEST_2)
{
uint8_t secret[] = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf};
uint8_t salt[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
uint8_t info[] = {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
uint8_t result[82];
uint8_t expected[] = {0xb1,0x1e,0x39,0x8d,0xc8,0x03,0x27,
0xa1,0xc8,0xe7,0xf7,0x8c,0x59,0x6a,
0x49,0x34,0x4f,0x01,0x2e,0xda,0x2d,
0x4e,0xfa,0xd8,0xa0,0x50,0xcc,0x4c,
0x19,0xaf,0xa9,0x7c,0x59,0x04,0x5a,
0x99,0xca,0xc7,0x82,0x72,0x71,0xcb,
0x41,0xc6,0x5e,0x59,0x0e,0x09,0xda,
0x32,0x75,0x60,0x0c,0x2f,0x09,0xb8,
0x36,0x77,0x93,0xa9,0xac,0xa3,0xdb,
0x71,0xcc,0x30,0xc5,0x81,0x79,0xec,
0x3e,0x87,0xc1,0x4c,0x01,0xd5,0xc1,
0xf3,0x43,0x4f,0x1d,0x87};
auto resultLen = hkdf(secret, sizeof(secret),
salt,sizeof(salt),
result, sizeof(result),
info, sizeof(info));
BOOST_CHECK(resultLen != 0);
BOOST_CHECK(memcmp(expected, result, 42) == 0);
}
BOOST_AUTO_TEST_CASE(IETF_TEST_3)
{
//uint8_t secret[] = {}; secret is empty in this test
uint8_t salt[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,0x0b};
//uint8_t info[] = {}; info is empty in this test
uint8_t result[42];
uint8_t expected[] = {0x8d,0xa4,0xe7,0x75,0xa5,0x63,0xc1,0x8f,
0x71,0x5f,0x80,0x2a,0x06,0x3c,0x5a,0x31,
0xb8,0xa1,0x1f,0x5c,0x5e,0xe1,0x87,0x9e,
0xc3,0x45,0x4e,0x5f,0x3c,0x73,0x8d,0x2d,
0x9d,0x20,0x13,0x95,0xfa,0xa4,0xb6,0x1a,
0x96,0xc8};
auto resultLen = hkdf(nullptr, 0,
salt,sizeof(salt),
result, sizeof(result),
nullptr, 0);
BOOST_CHECK(resultLen != 0);
BOOST_CHECK(memcmp(expected, result, sizeof(result)) == 0);
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests
} // namespace ndncert
} // namespace ndn