/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *
 *    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 contains read / write field element test vectors.
 */

#pragma once

namespace chip {
namespace Crypto {

struct spake2p_fe_rw_tv
{
    const uint8_t * fe_in;
    size_t fe_in_len;
    const uint8_t * fe_out;
    size_t fe_out_len;
};

static const uint8_t chiptest_53ea71b7cccd_fe_in_1[]  = {};
static const uint8_t chiptest_53ea71b7cccd_fe_out_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_3 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_1,
    .fe_in_len  = 0,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_2,
    .fe_out_len = 32,
};
static const uint8_t chiptest_53ea71b7cccd_fe_in_4[]  = { 0x01 };
static const uint8_t chiptest_53ea71b7cccd_fe_out_5[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_6 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_4,
    .fe_in_len  = 1,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_5,
    .fe_out_len = 32,
};
static const uint8_t chiptest_53ea71b7cccd_fe_in_7[]  = { 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const uint8_t chiptest_53ea71b7cccd_fe_out_8[] = { 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_9 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_7,
    .fe_in_len  = 32,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_8,
    .fe_out_len = 32,
};
static const uint8_t chiptest_53ea71b7cccd_fe_in_10[]  = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
                                                           0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17,
                                                           0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x50 };
static const uint8_t chiptest_53ea71b7cccd_fe_out_11[] = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
                                                           0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17,
                                                           0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x50 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_12 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_10,
    .fe_in_len  = 32,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_11,
    .fe_out_len = 32,
};
static const uint8_t chiptest_53ea71b7cccd_fe_in_13[]  = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
                                                           0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17,
                                                           0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51 };
static const uint8_t chiptest_53ea71b7cccd_fe_out_14[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_15 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_13,
    .fe_in_len  = 32,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_14,
    .fe_out_len = 32,
};
static const uint8_t chiptest_53ea71b7cccd_fe_in_16[]  = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
                                                           0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17,
                                                           0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x52 };
static const uint8_t chiptest_53ea71b7cccd_fe_out_17[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_18 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_16,
    .fe_in_len  = 32,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_17,
    .fe_out_len = 32,
};
static const uint8_t chiptest_53ea71b7cccd_fe_in_19[]  = { 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
                                                           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xcd, 0xf5, 0x5b, 0x4e,
                                                           0x2f, 0x3d, 0x09, 0xe7, 0x73, 0x95, 0x85, 0xf8, 0xc6, 0x4a, 0xa1 };
static const uint8_t chiptest_53ea71b7cccd_fe_out_20[] = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
                                                           0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17,
                                                           0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x50 };
static const struct spake2p_fe_rw_tv chiptest_53ea71b7cccd_test_vector_21 = {
    .fe_in      = chiptest_53ea71b7cccd_fe_in_19,
    .fe_in_len  = 33,
    .fe_out     = chiptest_53ea71b7cccd_fe_out_20,
    .fe_out_len = 32,
};
static const struct spake2p_fe_rw_tv * fe_rw_tvs[] = { &chiptest_53ea71b7cccd_test_vector_3,  &chiptest_53ea71b7cccd_test_vector_6,
                                                       &chiptest_53ea71b7cccd_test_vector_9,  &chiptest_53ea71b7cccd_test_vector_12,
                                                       &chiptest_53ea71b7cccd_test_vector_15, &chiptest_53ea71b7cccd_test_vector_18,
                                                       &chiptest_53ea71b7cccd_test_vector_21 };

} // namespace Crypto
} // namespace chip
