/* -*- 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 "identity-management-fixture.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
