/* -*- 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"

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(HmacSha256)
{
  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(HkdfIetf1)
{
  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(HkdfIetf2)
{
  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(HkdfIetf3)
{
  //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
