/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * 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.
 */

#define LOG_TAG "scrypt_test"
#include <nativehelper/UniquePtr.h>
#include <utils/Log.h>

#include <gtest/gtest.h>

#include <fstream>
#include <iostream>

extern "C" {
#include <crypto_scrypt.h>
}

namespace android {

typedef struct scrypt_test_setting_t {
        const char *pw, *salt;
        uint32_t Nfactor, rfactor, pfactor;
} scrypt_test_setting;

static const scrypt_test_setting post_settings[] = {
        {"", "", 16, 1, 1},
        {"password", "NaCl", 1024, 8, 16},
        {"pleaseletmein", "SodiumChloride", 16384, 8, 1},
        {0, 0, 0, 0, 0}
};

static const uint8_t post_vectors[][64] = {
        {0x77,0xd6,0x57,0x62,0x38,0x65,0x7b,0x20,0x3b,0x19,0xca,0x42,0xc1,0x8a,0x04,0x97,
         0xf1,0x6b,0x48,0x44,0xe3,0x07,0x4a,0xe8,0xdf,0xdf,0xfa,0x3f,0xed,0xe2,0x14,0x42,
         0xfc,0xd0,0x06,0x9d,0xed,0x09,0x48,0xf8,0x32,0x6a,0x75,0x3a,0x0f,0xc8,0x1f,0x17,
         0xe8,0xd3,0xe0,0xfb,0x2e,0x0d,0x36,0x28,0xcf,0x35,0xe2,0x0c,0x38,0xd1,0x89,0x06},
        {0xfd,0xba,0xbe,0x1c,0x9d,0x34,0x72,0x00,0x78,0x56,0xe7,0x19,0x0d,0x01,0xe9,0xfe,
         0x7c,0x6a,0xd7,0xcb,0xc8,0x23,0x78,0x30,0xe7,0x73,0x76,0x63,0x4b,0x37,0x31,0x62,
         0x2e,0xaf,0x30,0xd9,0x2e,0x22,0xa3,0x88,0x6f,0xf1,0x09,0x27,0x9d,0x98,0x30,0xda,
         0xc7,0x27,0xaf,0xb9,0x4a,0x83,0xee,0x6d,0x83,0x60,0xcb,0xdf,0xa2,0xcc,0x06,0x40},
        {0x70,0x23,0xbd,0xcb,0x3a,0xfd,0x73,0x48,0x46,0x1c,0x06,0xcd,0x81,0xfd,0x38,0xeb,
         0xfd,0xa8,0xfb,0xba,0x90,0x4f,0x8e,0x3e,0xa9,0xb5,0x43,0xf6,0x54,0x5d,0xa1,0xf2,
         0xd5,0x43,0x29,0x55,0x61,0x3f,0x0f,0xcf,0x62,0xd4,0x97,0x05,0x24,0x2a,0x9a,0xf9,
         0xe6,0x1e,0x85,0xdc,0x0d,0x65,0x1e,0x40,0xdf,0xcf,0x01,0x7b,0x45,0x57,0x58,0x87},
};

class ScryptTest : public ::testing::Test {
};

TEST_F(ScryptTest, TestVectors) {
    int i;

    for (i = 0; post_settings[i].pw != NULL; i++) {
        uint8_t output[64];

        scrypt_test_setting_t s = post_settings[i];
        ASSERT_EQ(0,
                crypto_scrypt((const uint8_t*) s.pw, strlen(s.pw), (const uint8_t*) s.salt,
                        strlen(s.salt), s.Nfactor, s.rfactor, s.pfactor, output, sizeof(output)))
                << "scrypt call should succeed for " << i << "; error=" << strerror(errno);
        ASSERT_EQ(0, memcmp(post_vectors[i], output, sizeof(output)))
                << "Should match expected output";
    }
}

}
