/*
 *
 *    Copyright (c) 2013-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file implements interface to Weave Crypto HKDF Tests library.
 *
 */

#include <string.h>

#include <nltest.h>

#include <Weave/Support/crypto/HKDF.h>

#include "WeaveCryptoTests.h"

using namespace nl::Weave::Crypto;
using namespace nl::Weave::Platform::Security;

static void Check_HKDF_Test1(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR err;
    HKDFSHA1 hkdf;

    // This is Test Case 4 from RFC-5869

    static uint8_t IKM[] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
    static uint8_t salt[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c };
    static uint8_t info[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9 };
    static uint8_t PRK[] = { 0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f, 0x0e, 0x71, 0xc8, 0xeb, 0x88, 0xf4, 0xb3, 0x0b, 0xaa, 0x2b, 0xa2, 0x43 };
    static uint8_t OKM[]  = { 0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69, 0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad,
                            0x81, 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15, 0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55,
                            0xfd, 0xa2, 0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3, 0xf8, 0x96 };

    hkdf.BeginExtractKey(salt, sizeof(salt));
    hkdf.AddKeyMaterial(IKM, sizeof(IKM));
    err = hkdf.FinishExtractKey();

    // HKDFSHA1::FinishExtractKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid PRK computed by HKDFSHA1::FinishExtractKey()
    NL_TEST_ASSERT(inSuite, memcmp(hkdf.PseudoRandomKey, PRK, sizeof(PRK)) == 0);

    uint8_t derivedKey[sizeof(OKM)];
    err = hkdf.ExpandKey(info, sizeof(info), sizeof(OKM), derivedKey);

    // HKDFSHA1::ExpandKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid OKM computed by HKDFSHA1::ExpandKey
    NL_TEST_ASSERT(inSuite, memcmp(derivedKey, OKM, sizeof(OKM)) == 0);
}

static void Check_HKDF_Test2(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR err;
    HKDFSHA1 hkdf;

    // This is Test Case 5 from RFC-5869

    static uint8_t IKM[]  = { 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 };
    static uint8_t salt[] = { 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 };
    static 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 };
    static uint8_t PRK[]  = { 0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59, 0x47, 0x8d, 0x30, 0x9b, 0x26, 0xc4, 0x11, 0x5a, 0x22, 0x4c, 0xfa, 0xf6 };
    static uint8_t OKM[]  = { 0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7, 0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb,
                              0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19, 0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe,
                              0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3, 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c,
                              0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed, 0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e,
                              0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43, 0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52,
                              0xd3, 0xb4, };

    hkdf.BeginExtractKey(salt, sizeof(salt));
    hkdf.AddKeyMaterial(IKM, sizeof(IKM));
    err = hkdf.FinishExtractKey();

    // HKDFSHA1::FinishExtractKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid PRK computed by HKDFSHA1::FinishExtractKey()
    NL_TEST_ASSERT(inSuite, memcmp(hkdf.PseudoRandomKey, PRK, sizeof(PRK)) == 0);

    uint8_t derivedKey[sizeof(OKM)];
    err = hkdf.ExpandKey(info, sizeof(info), sizeof(OKM), derivedKey);

    // HKDFSHA1::ExpandKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid OKM computed by HKDFSHA1::ExpandKey
    NL_TEST_ASSERT(inSuite, memcmp(derivedKey, OKM, sizeof(OKM)) == 0);
}

static void Check_HKDF_Test3(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR err;
    HKDFSHA1 hkdf;

    // This is Test Case 6 from RFC-5869

    static uint8_t IKM[]  = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
    static uint8_t salt[] = { };
    static uint8_t info[] = { };
    static uint8_t PRK[]  = { 0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28, 0x8e, 0xc6, 0xf5, 0xe7, 0xc2, 0x97, 0x78, 0x6a, 0xa0, 0xd3, 0x2d, 0x01 };
    static uint8_t OKM[]  = { 0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61, 0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06, 0xb9, 0xae, 0x52, 0x05,
                              0x72, 0x20, 0xa3, 0x06, 0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0, 0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3,
                              0x49, 0x18 };

    hkdf.BeginExtractKey(salt, sizeof(salt));
    hkdf.AddKeyMaterial(IKM, sizeof(IKM));
    err = hkdf.FinishExtractKey();

    // HKDFSHA1::FinishExtractKey()
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid PRK computed by HKDFSHA1::FinishExtractKey()
    NL_TEST_ASSERT(inSuite, memcmp(hkdf.PseudoRandomKey, PRK, sizeof(PRK)) == 0);

    uint8_t derivedKey[sizeof(OKM)];
    err = hkdf.ExpandKey(info, sizeof(info), sizeof(OKM), derivedKey);

    // HKDFSHA1::ExpandKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid OKM computed by HKDFSHA1::ExpandKey
    NL_TEST_ASSERT(inSuite, memcmp(derivedKey, OKM, sizeof(OKM)) == 0);
}

static void Check_HKDF_Test4(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR err;
    HKDFSHA1 hkdf;

    // This is Test Case 7 from RFC-5869

    static uint8_t IKM[]  = { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c };
    static uint8_t info[] = { };
    static uint8_t PRK[]  = { 0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c, 0x20, 0x77, 0xad, 0x2e, 0xb1, 0x9d, 0x3f, 0x3e, 0x73, 0x13, 0x85, 0xdd };
    static uint8_t OKM[]  = { 0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3, 0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a,
                              0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23, 0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5,
                              0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac, 0xfc, 0x48 };

    hkdf.BeginExtractKey(NULL, 0);
    hkdf.AddKeyMaterial(IKM, sizeof(IKM));
    err = hkdf.FinishExtractKey();

    // HKDFSHA1::FinishExtractKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid PRK computed by HKDFSHA1::FinishExtractKey()
    NL_TEST_ASSERT(inSuite, memcmp(hkdf.PseudoRandomKey, PRK, sizeof(PRK)) == 0);

    uint8_t derivedKey[sizeof(OKM)];
    err = hkdf.ExpandKey(info, sizeof(info), sizeof(OKM), derivedKey);

    // HKDFSHA1::ExpandKey() failed
    NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR);

    // Invalid OKM computed by HKDFSHA1::ExpandKey
    NL_TEST_ASSERT(inSuite, memcmp(derivedKey, OKM, sizeof(OKM)) == 0);
}

static const nlTest sTests[] = {
    NL_TEST_DEF("HKDF Test1",          Check_HKDF_Test1),
    NL_TEST_DEF("HKDF Test2",          Check_HKDF_Test2),
    NL_TEST_DEF("HKDF Test3",          Check_HKDF_Test3),
    NL_TEST_DEF("HKDF Test4",          Check_HKDF_Test4),
    NL_TEST_SENTINEL()
};

int WeaveCryptoHKDFTests(void)
{
    nlTestSuite theSuite = {
        "Weave Crypto HKDF Tests",
        &sTests[0]
    };

    nl_test_set_output_style(OUTPUT_CSV);

    nlTestRunner(&theSuite, NULL);

    return nlTestRunnerStats(&theSuite);
}
