/* -*- 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);
}

// Test case 2 from RFC 5869
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 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};

  uint8_t result[82];
  auto resultLen = hkdf(secret, sizeof(secret),
                        salt,sizeof(salt),
                        result, sizeof(result),
                        info, sizeof(info));

  BOOST_CHECK_EQUAL(resultLen, 82);
  BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result),
                                expected, expected + sizeof(expected));
}

BOOST_AUTO_TEST_SUITE_END()

} // namespace tests
} // namespace ndncert
} // namespace ndn
