/*############################################################################ # Copyright 2016-2017 Intel Corporation # # 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 * \brief FfElement unit tests. */ #include #include #include #include "epid/common-testhelper/epid_gtest-testhelper.h" #include "gtest/gtest.h" #include "epid/common-testhelper/bignum_wrapper-testhelper.h" #include "epid/common-testhelper/errors-testhelper.h" #include "epid/common-testhelper/ffelement_wrapper-testhelper.h" #include "epid/common-testhelper/finite_field_wrapper-testhelper.h" #include "epid/common-testhelper/octstr-testhelper.h" #include "epid/common-testhelper/prng-testhelper.h" extern "C" { #include "epid/common/math/finitefield.h" } #include "epid/common/types.h" #ifndef COUNT_OF #define COUNT_OF(a) (sizeof(a) / sizeof((a)[0])) #endif // COUNT_OF /// compares BigNumStr values bool operator==(BigNumStr const& lhs, BigNumStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares BigNumStr to FqElemStr values bool operator==(BigNumStr const& lhs, FqElemStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares FqElemStr to BigNumStr values bool operator==(FqElemStr const& lhs, BigNumStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares FqElemStr values bool operator==(FqElemStr const& lhs, FqElemStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares Fq2ElemStr values bool operator==(Fq2ElemStr const& lhs, Fq2ElemStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares Fq6ElemStr values bool operator==(Fq6ElemStr const& lhs, Fq6ElemStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares Fq12ElemStr values bool operator==(Fq12ElemStr const& lhs, Fq12ElemStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares FpElemStr values bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } /// compares FfElementObj values bool operator==(FfElementObj const& lhs, FfElementObj const& rhs) { auto lhs_data = lhs.data(); auto rhs_data = rhs.data(); return lhs_data.size() == rhs_data.size() && std::equal(lhs_data.begin(), lhs_data.end(), rhs_data.begin()); } namespace { class FfElementTest : public ::testing::Test { public: virtual void SetUp() { fq = FiniteFieldObj(bn_q_str); // construct Fq^2 finite field FfElementObj neg_beta(&fq); THROW_ON_EPIDERR(FfNeg(fq, FfElementObj(&fq, fq_qm1_str), neg_beta)); fq2 = FiniteFieldObj(fq, neg_beta, 2); // construct Fq^6 finite field FfElementObj neg_xi(&fq2); THROW_ON_EPIDERR(FfNeg(fq2, FfElementObj(&fq2, this->fq2_2_1_str), neg_xi)); fq6 = FiniteFieldObj(fq2, neg_xi, 3); // construct Fq^12 finite field FfElementObj neg_v(&fq6); THROW_ON_EPIDERR( FfNeg(fq6, FfElementObj(&fq6, this->fq6_0_0_1_0_0_0_str), neg_v)); fq12 = FiniteFieldObj(fq6, neg_v, 2); fq_0 = FfElementObj(&fq, &bn_0_str, sizeof(bn_0_str)); fq_2 = FfElementObj(&fq, &fq_2_str, sizeof(fq_2_str)); fq_qm2 = FfElementObj(&fq, &fq_qm2_str, sizeof(fq_qm2_str)); fq_3 = FfElementObj(&fq, &fq_3_str, sizeof(fq_3_str)); fq_4 = FfElementObj(&fq, &fq_4_str, sizeof(fq_4_str)); fq_5 = FfElementObj(&fq, &fq_5_str, sizeof(fq_5_str)); fq_a = FfElementObj(&fq, &bn_a_str, sizeof(bn_a_str)); // construct Intel(R) EPID 1.1 Fq finite field epid11_fq = FiniteFieldObj(bn_epid11_bn_q_str); // construct Intel(R) EPID 1.1 Fqd finite field epid11_fqd = FiniteFieldObj(epid11_fq, bn_epid11_fq_coeffs, COUNT_OF(bn_epid11_fq_coeffs)); // Fqk ground element is {-qnr, 0, 0} FfElementObj epid11_neg_qnr(&epid11_fq); THROW_ON_EPIDERR(FfNeg( epid11_fq, FfElementObj(&epid11_fq, fq_epid11_fq_qnr), epid11_neg_qnr)); Fq3ElemStr epid11_ground_element_str = {0}; THROW_ON_EPIDERR(WriteFfElement(epid11_fq, epid11_neg_qnr, &epid11_ground_element_str.a[0], sizeof(epid11_ground_element_str.a[0]))); // construct Intel(R) EPID 1.1 Fqk finite field epid11_GT = FiniteFieldObj( epid11_fqd, FfElementObj(&epid11_fqd, epid11_ground_element_str), 2); fq_0 = FfElementObj(&fq, &bn_0_str, sizeof((bn_0_str))); fq_1 = FfElementObj(&fq, &bn_1_str, sizeof(bn_1_str)); fq_a = FfElementObj(&fq, &bn_a_str, sizeof(bn_a_str)); fq_b = FfElementObj(&fq, &bn_b_str, sizeof(bn_b_str)); fq_result = FfElementObj(&fq); fq_sum_ab = FfElementObj(&fq, &fq_sum_ab_str, sizeof(fq_sum_ab_str)); fp = FiniteFieldObj(bn_p_str); bn_0 = BigNumObj(bn_0_str); bn_1 = BigNumObj(bn_1_str); bn_a = BigNumObj(bn_a_str); fq2_a = FfElementObj(&fq2, &fq2_a_str, sizeof(fq2_a_str)); fq2_result = FfElementObj(&fq2); fq12_g = FfElementObj(&fq12, &fq12_g_str, sizeof(fq12_g_str)); fq12_h = FfElementObj(&fq12, &fq12_h_str, sizeof(fq12_h_str)); fq12_i = FfElementObj(&fq12, &fq12_i_str, sizeof(fq12_i_str)); fq12_j = FfElementObj(&fq12, &fq12_j_str, sizeof(fq12_j_str)); fq12_k = FfElementObj(&fq12, &fq12_k_str, sizeof(fq12_k_str)); fq12_result = FfElementObj(&fq12); } FiniteFieldObj fq; FiniteFieldObj fq2; FiniteFieldObj fq6; FiniteFieldObj fq12; FiniteFieldObj epid11_fq; FiniteFieldObj epid11_fqd; FiniteFieldObj epid11_GT; FfElementObj fq_0; FfElementObj fq_1; FfElementObj fq_2; FfElementObj fq_qm2; // Intel(R) EPID 2.0 parameter q - 2 FfElementObj fq_3; FfElementObj fq_4; FfElementObj fq_5; FfElementObj fq_a; FfElementObj fq_b; FfElementObj fq_result; FfElementObj fq_sum_ab; FfElementObj fq2_a; FfElementObj fq2_result; FfElementObj fq12_g; FfElementObj fq12_h; FfElementObj fq12_i; FfElementObj fq12_j; FfElementObj fq12_k; FfElementObj fq12_result; FiniteFieldObj fp; BigNumObj bn_0; BigNumObj bn_1; BigNumObj bn_a; // Intel(R) EPID 2.0 parameter p static const BigNumStr bn_p_str; static const FpElemStr fp_p_str; // Intel(R) EPID 2.0 parameter p - 1 static const BigNumStr fp_pm1_str; // Intel(R) EPID 2.0 parameter q static const BigNumStr bn_q_str; // Intel(R) EPID 2.0 parameter q - 1 static const FqElemStr fq_qm1_str; static const BigNumStr bn_qm1_str; // Intel(R) EPID 2.0 parameter q - 2 static const FqElemStr fq_qm2_str; // Intel(R) EPID 2.0 parameter q + 1 static const BigNumStr bn_qp1_str; // Intel(R) EPID 2.0 parameter q - 0x3013 static const BigNumStr fq_qm0x3013_str; // Intel(R) EPID 1.1 parameter q static const BigNumStr bn_epid11_bn_q_str; // Intel(R) EPID 1.1 parameter qnr static const FqElemStr fq_epid11_fq_qnr; // Intel(R) EPID 1.1 parameter coeff static const BigNumStr bn_epid11_fq_coeffs[3]; // zero static const BigNumStr bn_0_str; static const FqElemStr fq_0_str; // one static const BigNumStr bn_1_str; static const FqElemStr fq_1_str; // two static const BigNumStr bn_2_str; static const FqElemStr fq_2_str; // three static const FqElemStr fq_3_str; // four static const FqElemStr fq_4_str; // five static const FqElemStr fq_5_str; // 0x0000FFFF static const BigNumStr bn_0xffff_str; // Fq2 element containing {2, 1} static const Fq2ElemStr fq2_2_1_str; // Fq6 element containing {0, 0, 1, 0, 0, 0} static const Fq6ElemStr fq6_0_0_1_0_0_0_str; // arbitrary constant a (256 bit value) static const BigNumStr bn_a_str; static const FqElemStr fq_a_str; static const Fq2ElemStr fq2_a_str; // arbitrary constant b (256 bit value) static const BigNumStr bn_b_str; static const FqElemStr fq_b_str; // a + b static const FqElemStr fq_sum_ab_str; static const Fq2ElemStr fq2_sum_ab_str; static const Fq6ElemStr fq6_sum_ab_str; static const Fq12ElemStr fq12_sum_ab_str; // a * b static const FqElemStr fq_mul_ab_str; static const Fq2ElemStr fq2_mul_ab_str; // 1/a static const FqElemStr fq_inv_a_str; // -a static const FqElemStr fq_neg_a_str; // pow(a, b), that is a raised to the power b static const FqElemStr fq_exp_ab_str; static const uint8_t sha_msg[3]; // predefined message for tests "abc" static const FqElemStr fq_abc_sha256_str; static const FqElemStr fq_abc_sha384_str; static const FqElemStr fq_abc_sha512_str; static const FqElemStr fq_abc_sha512256_str; // arbitrary Fq12 constant a (unrelated to a above) static const Fq12ElemStr fq12_g_str; // arbitrary Fq12 constant b (unrelated to a above) static const Fq12ElemStr fq12_h_str; // arbitrary Fq12 constant c static const Fq12ElemStr fq12_i_str; // arbitrary Fq12 constant d static const Fq12ElemStr fq12_j_str; // arbitrary Fq12 constant e static const Fq12ElemStr fq12_k_str; // c * d static const Fq12ElemStr fq12_mul_ij_str; // e * b static const Fq12ElemStr fq12_mul_gb_str; // Fq Multi Exp Data static const FqElemStr fq_multi_exp_base_1[1]; static const BigNumStr fq_multi_exp_exp_1[1]; static const FqElemStr fq_multi_exp_res_1; static const std::vector fq_multi_exp_exp_1_264; static const FqElemStr fq_multi_exp_res_1_264; static const FqElemStr fq_multi_exp_res_1_256_264; static const FqElemStr fq_multi_exp_base_2[2]; static const BigNumStr fq_multi_exp_exp_2[2]; static const FqElemStr fq_multi_exp_res_2; static const FqElemStr fq_multi_exp_base_3[3]; static const BigNumStr fq_multi_exp_exp_3[3]; static const FqElemStr fq_multi_exp_res_3; static const FqElemStr fq_multi_exp_base_4[4]; static const BigNumStr fq_multi_exp_exp_4[4]; static const FqElemStr fq_multi_exp_res_4; static const FqElemStr fq_multi_exp_base_5[5]; static const BigNumStr fq_multi_exp_exp_5[5]; static const FqElemStr fq_multi_exp_res_5; static const FqElemStr fq_multi_exp_base_6[6]; static const BigNumStr fq_multi_exp_exp_6[6]; static const FqElemStr fq_multi_exp_res_6; // Intel(R) EPID 1.1 GT Multi Exp Data static const Fq6ElemStr epid11_GT_multi_exp_base_3[3]; static const std::vector epid11_GT_multi_exp_exp_3[3]; static const Fq6ElemStr epid11_GT_multi_exp_res_3; // Fq12 Multi Exp Data static const Fq12ElemStr fq12_multi_exp_base_4[4]; static const BigNumStr fq12_multi_exp_exp_4[4]; static const Fq12ElemStr fq12_multi_exp_res_4; }; const Fq2ElemStr FfElementTest::fq2_2_1_str = { {{{{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, 0x02}}}, {{{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}}}}}; const Fq6ElemStr FfElementTest::fq6_0_0_1_0_0_0_str = { {{{{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}, {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}}}, {{{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}, {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}}}, {{{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}, {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}}}}}; // Intel(R) EPID 2.0 parameter p const BigNumStr FfElementTest::bn_p_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99, 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D}; // Intel(R) EPID 2.0 parameter p - 0x0D const FpElemStr FfElementTest::fp_p_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99, 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x00}; // Intel(R) EPID 2.0 parameter p - 1 const BigNumStr FfElementTest::fp_pm1_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99, 0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0C, }; // Intel(R) EPID 2.0 parameter q const BigNumStr FfElementTest::bn_q_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x13}; // Intel(R) EPID 2.0 parameter q - 1 const FqElemStr FfElementTest::fq_qm1_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}; const BigNumStr FfElementTest::bn_qm1_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}; // Intel(R) EPID 2.0 parameter q - 2 const FqElemStr FfElementTest::fq_qm2_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x11}; // Intel(R) EPID 2.0 parameter q + 1 const BigNumStr FfElementTest::bn_qp1_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x14}; // Intel(R) EPID 2.0 parameter q - 0x3013 const BigNumStr FfElementTest::fq_qm0x3013_str = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x00, 0x00}; // Intel(R) EPID 1.1 parameter q const BigNumStr FfElementTest::bn_epid11_bn_q_str = { 0x09, 0xF9, 0x24, 0xE5, 0xD9, 0xBC, 0x67, 0x7F, 0x81, 0x0D, 0xF0, 0x25, 0x58, 0xF7, 0x53, 0x13, 0xA9, 0x8A, 0xA6, 0x10, 0x47, 0x65, 0x5D, 0x73, 0x9E, 0xF1, 0x94, 0xEB, 0x05, 0xB1, 0xA7, 0x11}; // Intel(R) EPID 1.1 parameter qnr const FqElemStr FfElementTest::fq_epid11_fq_qnr = { {0x08, 0x66, 0xA7, 0x67, 0x36, 0x6E, 0x62, 0x71, 0xB7, 0xA6, 0x52, 0x94, 0x8F, 0xFB, 0x25, 0x9E, 0xE6, 0x4F, 0x25, 0xE5, 0x26, 0x9A, 0x2B, 0x6E, 0x7E, 0xF8, 0xA6, 0x39, 0xAE, 0x46, 0xAA, 0x24}}; // Intel(R) EPID 1.1 parameter coeff const BigNumStr FfElementTest::bn_epid11_fq_coeffs[3] = { {{{0x02, 0x16, 0x7A, 0x61, 0x53, 0xDD, 0xF6, 0xE2, 0x89, 0x15, 0xA0, 0x94, 0xF1, 0xB5, 0xDC, 0x65, 0x21, 0x15, 0x62, 0xE1, 0x7D, 0xC5, 0x43, 0x89, 0xEE, 0xB4, 0xEF, 0xC8, 0xA0, 0x8E, 0x34, 0x0F}}}, {{{0x04, 0x82, 0x27, 0xE1, 0xEB, 0x98, 0x64, 0xC2, 0x8D, 0x8F, 0xDD, 0x0E, 0x82, 0x40, 0xAE, 0xD4, 0x31, 0x63, 0xD6, 0x46, 0x32, 0x16, 0x85, 0x7A, 0xB7, 0x18, 0x68, 0xB8, 0x17, 0x02, 0x81, 0xA6}}}, {{{0x06, 0x20, 0x76, 0xE8, 0x54, 0x54, 0x53, 0xB4, 0xA9, 0xD8, 0x44, 0x4B, 0xAA, 0xFB, 0x1C, 0xFD, 0xAE, 0x15, 0xCA, 0x29, 0x79, 0xA6, 0x24, 0xA4, 0x0A, 0xF6, 0x1E, 0xAC, 0xED, 0xFB, 0x10, 0x41}}}}; // zero const BigNumStr FfElementTest::bn_0_str = { 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}; const FqElemStr FfElementTest::fq_0_str = { 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}; // one const BigNumStr FfElementTest::bn_1_str = { 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}; const FqElemStr FfElementTest::fq_1_str = { 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}; // two const BigNumStr FfElementTest::bn_2_str = { 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, 0x02}; const FqElemStr FfElementTest::fq_2_str = { 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, 0x02}; // three const FqElemStr FfElementTest::fq_3_str = { 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, 0x03}; // four const FqElemStr FfElementTest::fq_4_str = { 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, 0x04}; // five const FqElemStr FfElementTest::fq_5_str = { 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, 0x05}; const BigNumStr FfElementTest::bn_0xffff_str = { 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, 0xff, 0xff}; // arbitrary constant a (256 bit value) const BigNumStr FfElementTest::bn_a_str = { 0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D, 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A, 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}; const FqElemStr FfElementTest::fq_a_str = { 0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D, 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A, 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}; const Fq2ElemStr FfElementTest::fq2_a_str = { {{{{0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D, 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A, 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A}}}, {{{0xDD, 0x2B, 0xE9, 0x59, 0x24, 0xA5, 0xB3, 0xFD, 0xEB, 0xE1, 0x3C, 0xC0, 0x73, 0x4E, 0x99, 0xEE, 0x36, 0xF6, 0xC0, 0x1A, 0x76, 0x01, 0x0A, 0xF0, 0xCB, 0xB4, 0x71, 0x88, 0x95, 0xCB, 0x35, 0xBA}}}}}; // arbitrary constant b (256 bit value) const BigNumStr FfElementTest::bn_b_str = { 0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2, 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E, 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2}; const FqElemStr FfElementTest::fq_b_str = { 0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2, 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E, 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2}; // a + b const FqElemStr FfElementTest::fq_sum_ab_str = { 0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F, 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79, 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C}; const Fq2ElemStr FfElementTest::fq2_sum_ab_str = { {{{{0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F, 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79, 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C}}}, {{{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}}}}}; const Fq6ElemStr FfElementTest::fq6_sum_ab_str = { {{{{0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F, 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79, 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C}, {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}}}, {{{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}, {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}}}, {{{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}, {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}}}}}; const Fq12ElemStr FfElementTest::fq12_sum_ab_str = { {{{{{{0xF9, 0x0B, 0x7F, 0x72, 0x65, 0x94, 0x67, 0x2A, 0x9F, 0x0F, 0x2F, 0xBA, 0x3B, 0x2B, 0x26, 0x83, 0xBA, 0xD3, 0xFB, 0x7B, 0x9D, 0x79, 0x11, 0x78, 0xF6, 0x59, 0x23, 0x75, 0xEF, 0x7D, 0x46, 0x7C}, {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}}}, {{{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}, {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}}}, {{{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}, {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}}}}}, {{{{{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}, {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}}}, {{{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}, {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}}}, {{{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}, {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}}}}}}}; // a * b const FqElemStr FfElementTest::fq_mul_ab_str = { 0xE4, 0xAB, 0xE3, 0xE4, 0x08, 0xC3, 0x8A, 0x00, 0x78, 0x50, 0x01, 0xA9, 0x4A, 0xFC, 0x43, 0x15, 0xA2, 0x99, 0x51, 0x20, 0x6B, 0x9C, 0x00, 0xCF, 0x82, 0x88, 0xBD, 0x39, 0x0B, 0xA2, 0x0B, 0x58}; const Fq2ElemStr FfElementTest::fq2_mul_ab_str = { {{{{0xE4, 0xAB, 0xE3, 0xE4, 0x08, 0xC3, 0x8A, 0x00, 0x78, 0x50, 0x01, 0xA9, 0x4A, 0xFC, 0x43, 0x15, 0xA2, 0x99, 0x51, 0x20, 0x6B, 0x9C, 0x00, 0xCF, 0x82, 0x88, 0xBD, 0x39, 0x0B, 0xA2, 0x0B, 0x58}}}, {{{0xB4, 0xE4, 0x39, 0xEA, 0x70, 0xDE, 0x15, 0xC3, 0xC6, 0x91, 0xFD, 0x7F, 0xBE, 0x2B, 0xF5, 0xD2, 0xC0, 0xB7, 0x20, 0xFC, 0x1F, 0x02, 0x33, 0xC9, 0x39, 0x93, 0xB9, 0x5E, 0x55, 0x51, 0xB6, 0x46}}}}}; // 1/a const FqElemStr FfElementTest::fq_inv_a_str = { 0x15, 0x17, 0x1A, 0x1E, 0x93, 0x71, 0x1B, 0x39, 0xC5, 0x97, 0xEF, 0x78, 0xA5, 0x51, 0x34, 0x62, 0x44, 0xAD, 0x8D, 0x51, 0xDF, 0x90, 0x7C, 0x6F, 0x56, 0xB6, 0xAB, 0x63, 0x5A, 0x68, 0x6D, 0xF6}; // -a const FqElemStr FfElementTest::fq_neg_a_str = { 0xED, 0x59, 0xA4, 0x29, 0x6E, 0x6F, 0xA0, 0x25, 0xDF, 0xFA, 0x75, 0x0C, 0x0B, 0x31, 0x8D, 0x3E, 0x8C, 0xFC, 0xF9, 0x59, 0xE6, 0x7D, 0xD2, 0xA2, 0x40, 0x68, 0x36, 0x22, 0x38, 0x27, 0x7E, 0x89}; // pow(a, b) const FqElemStr FfElementTest::fq_exp_ab_str = { 0x29, 0x65, 0x68, 0x0E, 0x56, 0xB9, 0x8F, 0xBA, 0xA6, 0xEA, 0x8F, 0xE1, 0x13, 0x44, 0x3B, 0x12, 0x5C, 0xB9, 0xF8, 0x76, 0x42, 0x12, 0xCB, 0xB2, 0xED, 0xC0, 0x23, 0xA3, 0x5C, 0xAD, 0x38, 0xD1}; const uint8_t FfElementTest::sha_msg[] = {'a', 'b', 'c'}; const FqElemStr FfElementTest::fq_abc_sha256_str = { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23, 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C, 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD, }; const FqElemStr FfElementTest::fq_abc_sha384_str = { 0x10, 0xAC, 0xE4, 0xE8, 0x8F, 0xBB, 0x96, 0xBF, 0x53, 0xB6, 0xAF, 0xE4, 0x4E, 0x95, 0xDE, 0xA5, 0x98, 0x8F, 0x10, 0xBF, 0x59, 0xC4, 0x11, 0xFE, 0x1F, 0x7A, 0xA6, 0x1E, 0x57, 0x3E, 0xE3, 0x3C, }; const FqElemStr FfElementTest::fq_abc_sha512_str = { 0x14, 0xB4, 0x28, 0x89, 0xD2, 0x86, 0xA4, 0x79, 0xE3, 0x5B, 0xC4, 0x50, 0xD1, 0x3B, 0xF2, 0x35, 0xF7, 0x97, 0x91, 0x05, 0x3D, 0x64, 0xC0, 0x06, 0x45, 0x9F, 0xEC, 0xD8, 0xDB, 0x53, 0x3E, 0xC3, }; const FqElemStr FfElementTest::fq_abc_sha512256_str = { 0x53, 0x04, 0x8E, 0x26, 0x81, 0x94, 0x1E, 0xF9, 0x9B, 0x2E, 0x29, 0xB7, 0x6B, 0x4C, 0x7D, 0xAB, 0xE4, 0xC2, 0xD0, 0xC6, 0x34, 0xFC, 0x6D, 0x46, 0xE0, 0xE2, 0xF1, 0x31, 0x07, 0xE7, 0xAF, 0x23, }; const Fq12ElemStr FfElementTest::fq12_g_str = { {{{{{{0xBA, 0x10, 0x1F, 0xF6, 0x46, 0x8B, 0xE9, 0x32, 0x4F, 0xC0, 0xA5, 0x01, 0xAD, 0x5E, 0xE2, 0x31, 0x16, 0x29, 0x96, 0xED, 0xA7, 0xDE, 0x4C, 0xE1, 0xD2, 0x8D, 0x33, 0xCA, 0x50, 0xAB, 0x7B, 0xC6}, {0x15, 0xEB, 0x79, 0xF4, 0xEB, 0xDE, 0x30, 0xB6, 0xC4, 0x07, 0x7C, 0x42, 0xCB, 0x04, 0x54, 0xF2, 0x1F, 0x4D, 0x1F, 0xC0, 0xDF, 0xA2, 0x2B, 0x9E, 0x34, 0xC4, 0x4C, 0x84, 0x14, 0xD3, 0x62, 0x07}}}, {{{0xF1, 0x8B, 0x84, 0xD1, 0x46, 0x57, 0xB6, 0xE7, 0x80, 0xE1, 0x46, 0x49, 0x1C, 0x0D, 0xEF, 0x81, 0x31, 0xB0, 0xBE, 0x8C, 0xB9, 0x08, 0xD0, 0xD3, 0xC4, 0x56, 0xCA, 0xAD, 0xF9, 0x1D, 0x75, 0x19}, {0x3F, 0xEE, 0x7C, 0x43, 0xC1, 0xFA, 0x4E, 0x50, 0xB7, 0x19, 0x01, 0x00, 0x6F, 0xD5, 0x16, 0xB6, 0xF4, 0x85, 0xE0, 0xEB, 0x2E, 0x5F, 0x0A, 0x7E, 0xF8, 0xAC, 0xBC, 0x05, 0xEC, 0x73, 0xB5, 0x57}}}, {{{0xE3, 0xB3, 0x18, 0x29, 0xBB, 0xEF, 0x86, 0x50, 0x87, 0xCF, 0x70, 0xBA, 0x13, 0x8B, 0xB1, 0xB6, 0x2D, 0x6F, 0x65, 0x3D, 0xA1, 0x0B, 0xE3, 0x92, 0xC5, 0x72, 0x86, 0x6A, 0xB3, 0xEB, 0xE0, 0xE5}, {0xDA, 0x0E, 0x57, 0x87, 0xD5, 0xA9, 0x61, 0xA5, 0x1E, 0xCB, 0x04, 0x86, 0xCD, 0xC3, 0x18, 0x2A, 0x36, 0xA0, 0x81, 0x73, 0xE7, 0x13, 0x87, 0x80, 0x8D, 0x1A, 0xFE, 0x6E, 0x4B, 0xA3, 0x13, 0x03}}}}}, {{{{{0x66, 0x9E, 0x80, 0x4D, 0x8A, 0xAA, 0x00, 0x95, 0x72, 0xCE, 0xBB, 0x51, 0xE8, 0x01, 0x09, 0x41, 0xD3, 0x63, 0x28, 0x05, 0xA4, 0xBE, 0xD6, 0x41, 0xA6, 0x2F, 0x5F, 0xBF, 0x0B, 0x13, 0xB4, 0x54}, {0x5B, 0x50, 0x65, 0xDC, 0x6F, 0x29, 0xD6, 0xDA, 0xBF, 0xC2, 0x06, 0xEA, 0x3B, 0xB2, 0xF1, 0xD4, 0x26, 0x5C, 0x92, 0x6B, 0x95, 0x6D, 0x88, 0xAB, 0x8F, 0xC6, 0x9D, 0x31, 0xE4, 0x9B, 0x71, 0x49}}}, {{{0xE0, 0xCE, 0x97, 0x8F, 0xC9, 0x9F, 0xBC, 0xA8, 0x4A, 0xC6, 0xAA, 0x4A, 0xC8, 0x0D, 0x2A, 0x60, 0x1A, 0x43, 0x40, 0x03, 0xB3, 0x53, 0x30, 0x98, 0x1F, 0x3F, 0xDF, 0x5C, 0x0F, 0xF0, 0x84, 0x8E}, {0x5A, 0x5D, 0x41, 0xD2, 0x47, 0x78, 0x6D, 0x9F, 0x89, 0xCE, 0xF5, 0x8E, 0xB6, 0x54, 0xA2, 0x26, 0xE5, 0x40, 0x39, 0x5C, 0x59, 0x08, 0xB3, 0xDA, 0xF5, 0xF8, 0xA0, 0x18, 0x33, 0x57, 0xD1, 0x72}}}, {{{0xBB, 0xBA, 0x6C, 0xED, 0xE8, 0xA0, 0x5E, 0xC8, 0x81, 0xC5, 0xAC, 0x15, 0x1B, 0xD0, 0xE6, 0xC8, 0x92, 0xF9, 0x43, 0x03, 0x5A, 0x00, 0x42, 0xE3, 0x49, 0xA5, 0xF7, 0x19, 0x78, 0x8A, 0x39, 0x89}, {0x32, 0xAE, 0xBF, 0x4D, 0x4B, 0xB3, 0x33, 0x76, 0x16, 0xFD, 0x0B, 0xFE, 0x42, 0x1E, 0x17, 0x37, 0x2A, 0x04, 0xEA, 0x26, 0xBA, 0x6E, 0x2C, 0x36, 0xAF, 0x35, 0x1B, 0x75, 0x6D, 0x17, 0xDC, 0x8E}}}}}}}; const Fq12ElemStr FfElementTest::fq12_h_str = { {{{{{{0x41, 0xFB, 0xBE, 0xD2, 0x20, 0x95, 0xE5, 0xBA, 0x87, 0x54, 0x23, 0xCC, 0x04, 0x97, 0x38, 0x4B, 0x69, 0x28, 0x18, 0x6D, 0xAE, 0x19, 0xE3, 0x3D, 0xFE, 0x39, 0xE2, 0x1C, 0xC2, 0x53, 0x17, 0xF6}, {0xEA, 0xA3, 0x0F, 0x62, 0x6E, 0xBF, 0x6F, 0x8F, 0xBC, 0xFA, 0x6E, 0x07, 0xD3, 0xD3, 0xAE, 0x5C, 0xAA, 0xB5, 0x9C, 0xD7, 0xB8, 0x5B, 0x1B, 0x69, 0x52, 0x93, 0xBF, 0xDB, 0x87, 0x5C, 0x19, 0x07}}}, {{{0x1B, 0x03, 0xE1, 0x79, 0x3C, 0x10, 0x0B, 0x65, 0xBF, 0xD7, 0xF3, 0x45, 0x1A, 0xD4, 0xDD, 0xB8, 0x67, 0x1A, 0x8F, 0x41, 0x1A, 0xD4, 0x04, 0x3C, 0xD2, 0xA4, 0x3B, 0x47, 0xFE, 0xBD, 0xEA, 0x87}, {0xDF, 0x7F, 0x94, 0x9C, 0xB8, 0x65, 0x54, 0x8D, 0xD7, 0x0B, 0x33, 0x26, 0x25, 0x89, 0xD4, 0x60, 0x0C, 0x89, 0x5F, 0x2C, 0x00, 0x7F, 0xAF, 0x89, 0x35, 0xE5, 0xB9, 0x23, 0x7F, 0x79, 0x1A, 0x86}}}, {{{0xCE, 0x01, 0x4F, 0x24, 0x3C, 0x3A, 0xC3, 0x61, 0x5B, 0xD9, 0x2D, 0x87, 0x94, 0xA3, 0xD2, 0x8B, 0x57, 0xC4, 0x07, 0xF8, 0x29, 0x5E, 0x09, 0x23, 0xCA, 0xE9, 0x85, 0xA1, 0xDB, 0xF2, 0x0C, 0x8F}, {0xC2, 0xFB, 0x9A, 0xCC, 0xD9, 0x82, 0x63, 0x28, 0x83, 0xB7, 0x4F, 0x99, 0x3A, 0x19, 0x11, 0xB0, 0xB4, 0xE7, 0x73, 0x94, 0x35, 0x19, 0x6B, 0xC2, 0x5D, 0x2E, 0x8C, 0x33, 0xFF, 0x13, 0xCD, 0xBE}}}}}, {{{{{0x29, 0x43, 0xF6, 0xA0, 0xE9, 0xDC, 0x27, 0x27, 0x9B, 0x0A, 0x33, 0xBC, 0x85, 0x6A, 0xBF, 0x8B, 0xC5, 0x89, 0x10, 0x92, 0xAE, 0x73, 0xC9, 0x32, 0x46, 0x8D, 0x24, 0x1F, 0x32, 0x96, 0xED, 0x0B}, {0x44, 0x8C, 0x6D, 0xF6, 0x1A, 0x2F, 0xCA, 0x18, 0x8E, 0x84, 0xFF, 0x5F, 0x5F, 0xAF, 0xC0, 0x52, 0x35, 0xA1, 0xB3, 0xA0, 0xDE, 0xEE, 0x97, 0xBF, 0xB8, 0xFA, 0x8B, 0x9E, 0x00, 0x13, 0xE7, 0x26}}}, {{{0xFB, 0x78, 0xA1, 0x6D, 0x41, 0x92, 0xA6, 0xC6, 0x7F, 0xAD, 0xB7, 0xFC, 0x4F, 0x5F, 0x48, 0x94, 0x7D, 0xB7, 0xF5, 0xCC, 0xB5, 0x7E, 0x08, 0xCD, 0xBF, 0x58, 0xC9, 0x30, 0xEB, 0xE4, 0xA0, 0xBF}, {0x0C, 0x6A, 0x89, 0x18, 0x97, 0x37, 0x54, 0x76, 0x79, 0x3E, 0x8E, 0xA6, 0x5B, 0x77, 0xCE, 0x4A, 0xCB, 0xD9, 0x8B, 0x7B, 0x32, 0x1A, 0x30, 0x40, 0x49, 0xFF, 0x84, 0xE7, 0xBE, 0xD8, 0xCF, 0xFD}}}, {{{0x2D, 0x23, 0x54, 0xB5, 0x2E, 0x29, 0xE9, 0xC7, 0x62, 0x1B, 0x03, 0x34, 0x3A, 0xEB, 0xC9, 0x69, 0x38, 0x9F, 0xD1, 0x2B, 0xDA, 0x8B, 0x07, 0x58, 0x30, 0xF8, 0x38, 0x08, 0x09, 0x07, 0xCA, 0x5B}, {0x3A, 0x13, 0xED, 0xF4, 0x5D, 0xC9, 0x23, 0x66, 0x85, 0x8C, 0x6A, 0x7D, 0xE9, 0x11, 0x17, 0xE6, 0x43, 0x2F, 0x12, 0xC5, 0x07, 0x63, 0x84, 0x98, 0xA0, 0x1C, 0xDC, 0xF3, 0x91, 0x91, 0x11, 0x55}}}}}}}; const Fq12ElemStr FfElementTest::fq12_i_str = { {{{{{{0x0F, 0xD0, 0x1C, 0x59, 0x98, 0x52, 0x5A, 0x40, 0xFF, 0x26, 0x0A, 0xFD, 0x70, 0xEC, 0x23, 0x48, 0x1B, 0x4B, 0x70, 0xA0, 0x15, 0xC5, 0xB1, 0x8B, 0xA5, 0x75, 0xAC, 0xCE, 0xF3, 0x6C, 0xE8, 0xBA}, {0xA7, 0xFB, 0xF9, 0xEA, 0x18, 0x70, 0xD8, 0x9B, 0x3C, 0xC3, 0x66, 0x10, 0x38, 0xAC, 0x16, 0x32, 0xDC, 0x9D, 0xF0, 0xD4, 0x2C, 0xE7, 0xF6, 0x69, 0x47, 0x69, 0x84, 0xEE, 0x39, 0x5F, 0xD8, 0xCC}}}, {{{0x1B, 0xEF, 0x81, 0x13, 0x81, 0xB9, 0x56, 0xAE, 0xD0, 0xD4, 0xAE, 0xCB, 0x24, 0x7C, 0x7B, 0x7F, 0xC0, 0x41, 0x42, 0x0A, 0x9D, 0x90, 0x6B, 0x1E, 0x3A, 0xAD, 0x39, 0x7A, 0x1F, 0xEF, 0x56, 0x9E}, {0xBD, 0x84, 0x48, 0xAF, 0x65, 0x66, 0x33, 0xE5, 0x67, 0xF1, 0xC4, 0x48, 0xF0, 0xB6, 0x61, 0x06, 0xC7, 0x78, 0xB3, 0xC1, 0x12, 0xB8, 0x31, 0xD4, 0x69, 0x2E, 0x0E, 0xD3, 0xD4, 0x91, 0x81, 0x9A}}}, {{{0x23, 0x62, 0x9B, 0x83, 0x95, 0xF6, 0x7F, 0xF6, 0xCC, 0x6B, 0xEE, 0x84, 0xF0, 0x5B, 0x93, 0xA6, 0x90, 0x48, 0x1A, 0xA7, 0xA8, 0xE8, 0x10, 0xA5, 0x53, 0x7E, 0x4F, 0xD5, 0x0D, 0xB0, 0x86, 0xF7}, {0x1F, 0xB8, 0xB7, 0xD4, 0x2E, 0x41, 0x83, 0x2C, 0xFC, 0x62, 0x14, 0xB8, 0xC2, 0xF6, 0xC1, 0x5E, 0xC1, 0xC1, 0x40, 0x8B, 0x28, 0xB5, 0x1B, 0x85, 0xEE, 0x71, 0xC8, 0x14, 0x56, 0xB9, 0x3B, 0x90}}}}}, {{{{{0x4A, 0xFE, 0x73, 0xFA, 0xCF, 0x20, 0x67, 0x0E, 0x89, 0x1D, 0xCB, 0x05, 0x38, 0x27, 0x1C, 0xD5, 0x7A, 0x0C, 0xAC, 0x92, 0x17, 0x94, 0x7F, 0x10, 0x3E, 0xFF, 0x97, 0x23, 0x66, 0x8D, 0x70, 0xAE}, {0x80, 0x97, 0xFF, 0x88, 0xF8, 0x01, 0x2B, 0x99, 0x81, 0xEB, 0xF8, 0x19, 0xEF, 0xDA, 0xE3, 0xAE, 0xD9, 0x9B, 0x4C, 0x13, 0xFC, 0x9E, 0x18, 0xD6, 0xB0, 0xCF, 0x4E, 0x29, 0xA8, 0xCF, 0x01, 0xFA}}}, {{{0xDA, 0x22, 0x85, 0x18, 0x9A, 0x51, 0x17, 0xAC, 0x26, 0x57, 0xF6, 0x73, 0x59, 0x24, 0xD5, 0xC9, 0x4D, 0xAC, 0xB6, 0xE4, 0x51, 0xF7, 0x5E, 0x30, 0x5B, 0x25, 0x3D, 0x52, 0xA3, 0xE0, 0x4B, 0xA2}, {0xC3, 0x4C, 0x2F, 0x53, 0xD5, 0x92, 0x33, 0x7E, 0x8B, 0x66, 0x5F, 0x48, 0x48, 0xCA, 0xA8, 0x98, 0x0F, 0x73, 0xD3, 0x60, 0xAF, 0x25, 0x02, 0xEE, 0x64, 0xE7, 0x02, 0x89, 0x9A, 0xD2, 0x96, 0x45}}}, {{{0x04, 0xE1, 0x30, 0x9B, 0xD8, 0x85, 0xF0, 0x99, 0x7C, 0x01, 0xD5, 0x58, 0x5A, 0x74, 0x0B, 0xD4, 0xF2, 0xFA, 0xC7, 0x59, 0x36, 0xFD, 0x91, 0x07, 0x60, 0xF7, 0xDC, 0x11, 0x3E, 0x8A, 0xC6, 0x48}, {0x0D, 0x02, 0x30, 0x18, 0xD0, 0xB9, 0x6B, 0xD6, 0x39, 0x6A, 0x41, 0x82, 0xDD, 0xE3, 0xCE, 0xB8, 0xB6, 0xF5, 0x61, 0x80, 0x61, 0x16, 0xF4, 0x9A, 0xB8, 0x58, 0x1D, 0x3F, 0x4D, 0xC2, 0xCA, 0xCF}}}}}}}; const Fq12ElemStr FfElementTest::fq12_j_str = { {{{{{{0x3A, 0x30, 0x33, 0xA2, 0x14, 0xDF, 0xDC, 0x70, 0x48, 0xF3, 0xBA, 0x3F, 0xCE, 0xFC, 0x69, 0x24, 0xAE, 0xA1, 0xF3, 0xCF, 0xD8, 0x77, 0x69, 0x38, 0x38, 0xF4, 0x8E, 0xFB, 0x51, 0xFB, 0x10, 0x7C}, {0x73, 0xB4, 0xEE, 0xF9, 0x76, 0xBB, 0x45, 0xEC, 0x07, 0x24, 0x23, 0xA3, 0x38, 0x64, 0x39, 0x4C, 0x03, 0x94, 0xF5, 0xEE, 0x5F, 0xC9, 0x83, 0x4F, 0xD1, 0xA6, 0x4A, 0x05, 0x25, 0x0C, 0x46, 0x33}}}, {{{0xD4, 0x40, 0x47, 0xAE, 0xEC, 0xDA, 0x30, 0xF9, 0xE1, 0x28, 0xFB, 0xB1, 0x4C, 0x62, 0xFB, 0x6C, 0x90, 0x0D, 0xB1, 0xEC, 0xAF, 0x2D, 0x95, 0x64, 0x11, 0x93, 0xDA, 0x8E, 0xB8, 0x7D, 0xE4, 0xA3}, {0x8E, 0xA6, 0x9B, 0xAA, 0x58, 0xD5, 0xDC, 0x59, 0x1A, 0x51, 0x53, 0x47, 0x30, 0x1C, 0x2B, 0xB0, 0xBB, 0x57, 0x57, 0x0A, 0x8C, 0x5F, 0x62, 0x9C, 0x52, 0x28, 0xC0, 0x25, 0x27, 0xAE, 0xCD, 0x36}}}, {{{0xBF, 0x2D, 0x03, 0xB1, 0x33, 0xFD, 0x24, 0x81, 0x3C, 0x91, 0x43, 0x90, 0x0C, 0x20, 0xC4, 0xE3, 0x69, 0x3F, 0xA9, 0xA2, 0x7C, 0xC2, 0x48, 0x28, 0x1B, 0xF0, 0x81, 0x1F, 0x2B, 0x8F, 0x8D, 0x43}, {0x38, 0x18, 0x12, 0xA3, 0x89, 0xF1, 0xD7, 0x60, 0x89, 0x68, 0x6A, 0xC4, 0xCC, 0x5D, 0xF4, 0xCE, 0x43, 0x95, 0x84, 0xCD, 0x01, 0x55, 0xB8, 0x5D, 0x24, 0x50, 0xCD, 0xE3, 0x68, 0x1C, 0xFF, 0x59}}}}}, {{{{{0x0D, 0xAC, 0xCB, 0xE7, 0x9D, 0x68, 0x0F, 0x4A, 0xAF, 0xEB, 0xB5, 0xFB, 0xF9, 0xB1, 0x58, 0x80, 0xD5, 0x71, 0x53, 0x26, 0x2E, 0x9C, 0xCE, 0x10, 0xAC, 0xD2, 0x0A, 0xEB, 0xB4, 0x5C, 0xC8, 0xD7}, {0x16, 0x26, 0x66, 0x71, 0xDD, 0x67, 0xBA, 0xDB, 0x35, 0x76, 0x64, 0xC6, 0x0B, 0x0B, 0x07, 0x4B, 0x65, 0xA2, 0xF7, 0x68, 0x9E, 0xFE, 0xE8, 0xE3, 0xA7, 0x09, 0x79, 0xC5, 0xDF, 0x5E, 0x9C, 0xEC}}}, {{{0xEE, 0x83, 0x59, 0xB5, 0x89, 0x81, 0xA2, 0x87, 0xD7, 0x75, 0x65, 0x90, 0xDE, 0x78, 0x37, 0x59, 0x04, 0x9B, 0x50, 0xC3, 0xBA, 0x90, 0x09, 0x15, 0xAB, 0x17, 0xC5, 0xBF, 0x5B, 0xB9, 0xE4, 0x6C}, {0xA9, 0xB1, 0x49, 0x76, 0x25, 0x74, 0x5D, 0x9C, 0x78, 0xC5, 0x09, 0xEE, 0xEB, 0xEB, 0x9D, 0x1C, 0x6C, 0xC0, 0x27, 0x9D, 0x66, 0xE6, 0x7F, 0x31, 0xCD, 0xB0, 0x8A, 0xE4, 0x9E, 0xBD, 0x70, 0x18}}}, {{{0x88, 0xA1, 0x08, 0x39, 0xA2, 0x48, 0xA5, 0x98, 0xB6, 0xAD, 0x10, 0x54, 0x07, 0xCD, 0xFC, 0x6D, 0xB1, 0x02, 0xFF, 0xE3, 0x92, 0xD7, 0x9D, 0x48, 0xFB, 0xCE, 0x88, 0x46, 0x92, 0x07, 0x02, 0xBA}, {0xEE, 0xEB, 0xAE, 0x88, 0xB1, 0x4E, 0xD0, 0xF2, 0xCE, 0xD7, 0x57, 0x07, 0xD4, 0x39, 0xD2, 0x7D, 0x1A, 0x0C, 0xEF, 0xF2, 0x84, 0x84, 0x22, 0x8A, 0xB1, 0x80, 0x0D, 0xDC, 0x64, 0x86, 0xFD, 0x70}}}}}}}; const Fq12ElemStr FfElementTest::fq12_mul_ij_str = { {{{{{{0x4A, 0x0E, 0x83, 0x4F, 0x62, 0xCA, 0x56, 0x0B, 0x0F, 0x2E, 0xF3, 0x1A, 0xC6, 0xFC, 0x76, 0x4F, 0x4B, 0x85, 0x78, 0x6F, 0x9D, 0xB9, 0xBD, 0xC8, 0xBB, 0x7C, 0x73, 0x12, 0x28, 0xFF, 0xBC, 0x8F}, {0x18, 0x8E, 0x5E, 0x4B, 0x72, 0xA5, 0x4A, 0x99, 0xFC, 0xE7, 0x05, 0xE5, 0xD2, 0x2C, 0x06, 0x95, 0xF5, 0xE4, 0xA5, 0x87, 0xCB, 0x85, 0x25, 0xF8, 0xDA, 0x71, 0x7B, 0x9A, 0xF1, 0x52, 0xF9, 0x33}}}, {{{0x05, 0x5F, 0x15, 0x72, 0xA3, 0x61, 0xA6, 0x6C, 0xB8, 0x43, 0xBB, 0xCA, 0x33, 0xB2, 0xDB, 0x59, 0xCA, 0xAB, 0xAD, 0xA0, 0x4D, 0xE3, 0xB8, 0xF5, 0xC9, 0x8C, 0x06, 0x91, 0xE5, 0xE4, 0x5A, 0xAD}, {0xE7, 0x66, 0xCC, 0x2B, 0x2C, 0x11, 0x88, 0x29, 0xB1, 0x3C, 0x52, 0xFE, 0x50, 0xDF, 0x8F, 0x15, 0x6A, 0x6B, 0xB8, 0x32, 0x96, 0x90, 0x85, 0x03, 0x78, 0x88, 0x97, 0x7B, 0x5B, 0x50, 0x2E, 0xDE}}}, {{{0xE7, 0x53, 0x22, 0x11, 0xEB, 0xFF, 0x1B, 0x19, 0xAE, 0x5F, 0x58, 0x3A, 0x4F, 0x6F, 0x34, 0xFB, 0x2A, 0x49, 0xCA, 0x4B, 0x9C, 0x31, 0xFC, 0x74, 0x0F, 0x11, 0xCC, 0x45, 0xCD, 0xA2, 0x12, 0xCA}, {0xF4, 0x2F, 0x30, 0x9A, 0x6A, 0xCB, 0xEE, 0x88, 0x15, 0x56, 0x29, 0x2A, 0xBF, 0x33, 0x7B, 0xDB, 0x59, 0x74, 0x4D, 0xC0, 0x64, 0xF0, 0x0B, 0x9F, 0xF2, 0x65, 0xB7, 0x3A, 0xDA, 0xE2, 0xB5, 0x63}}}}}, {{{{{0x3A, 0x3E, 0x06, 0xEF, 0x73, 0xA3, 0xBC, 0xEA, 0xCC, 0x68, 0xD9, 0xF5, 0x6E, 0x94, 0x1C, 0x54, 0x47, 0xF1, 0x99, 0x2C, 0x44, 0x64, 0x45, 0x84, 0x50, 0x10, 0xFD, 0xC5, 0x16, 0x65, 0x89, 0xEC}, {0x72, 0xA6, 0x7E, 0x82, 0x7F, 0xE2, 0xE3, 0xEA, 0x82, 0xA3, 0x18, 0xF4, 0x9B, 0x93, 0x4D, 0x79, 0xA0, 0x2C, 0xBF, 0x90, 0x0E, 0xDB, 0x41, 0x09, 0x27, 0x44, 0x19, 0xD1, 0xB4, 0xE5, 0xC6, 0x8C}}}, {{{0xA5, 0xC7, 0x82, 0xBF, 0x00, 0x7B, 0x8D, 0x7A, 0x05, 0x7B, 0x7E, 0x33, 0x60, 0x28, 0x34, 0x9C, 0x86, 0x5A, 0x6B, 0xCE, 0xA5, 0xED, 0x26, 0x22, 0x63, 0x4A, 0xE9, 0x57, 0xCD, 0x55, 0xD2, 0xD3}, {0x0E, 0x73, 0x14, 0xE4, 0xEE, 0xE7, 0x3C, 0x43, 0xFC, 0xAE, 0x84, 0x59, 0x2F, 0xEA, 0x35, 0x84, 0xA5, 0x77, 0xCE, 0xA8, 0xC5, 0xAA, 0xB8, 0xDC, 0xB9, 0xD6, 0x71, 0x11, 0xE2, 0x95, 0x00, 0x97}}}, {{{0xBD, 0x50, 0xDA, 0x58, 0x1B, 0xDA, 0xB3, 0x25, 0x19, 0x2F, 0x9D, 0xFA, 0x2C, 0xFB, 0x96, 0x26, 0xBB, 0x4A, 0x41, 0x82, 0xA9, 0x45, 0x24, 0xEE, 0xEE, 0xEA, 0xD3, 0xC5, 0x94, 0xFC, 0x2A, 0x37}, {0x6A, 0x43, 0xB8, 0x6C, 0xBB, 0x98, 0xB7, 0x17, 0x03, 0xC0, 0x3D, 0x6D, 0x59, 0x56, 0x3D, 0x23, 0x42, 0x94, 0x25, 0x64, 0xB9, 0x62, 0xAD, 0x4D, 0x84, 0x9B, 0x3C, 0x05, 0x8C, 0xF0, 0xD3, 0xD3}}}}}}, }; const Fq12ElemStr FfElementTest::fq12_k_str = { {{{{{{0xE4, 0xCA, 0x0B, 0xA8, 0x9C, 0x70, 0xE2, 0x20, 0x24, 0xD9, 0x8F, 0x09, 0x12, 0x79, 0x55, 0x44, 0x8C, 0x58, 0x42, 0x8F, 0x18, 0x97, 0x0A, 0xC3, 0x0A, 0x40, 0x68, 0x0E, 0x1E, 0x21, 0x7F, 0xB4}, {0x73, 0xCF, 0x8D, 0x54, 0x68, 0xAE, 0x1C, 0xC4, 0x95, 0x01, 0xE3, 0x52, 0x33, 0xFE, 0x69, 0xB5, 0x23, 0x45, 0xEF, 0xFF, 0x79, 0x14, 0xEF, 0x98, 0xA8, 0x4E, 0xB1, 0x2E, 0xE1, 0x15, 0x81, 0x0C}}}, {{{0x9F, 0x65, 0x90, 0x6A, 0x53, 0xD7, 0xF6, 0x73, 0x08, 0xDA, 0x45, 0x11, 0xDE, 0xCF, 0xED, 0x4C, 0x8C, 0x21, 0x02, 0xF5, 0x3F, 0x97, 0xB6, 0xB2, 0xF5, 0xC6, 0x58, 0xFC, 0x9A, 0xA6, 0xBB, 0xF9}, {0x3C, 0xD8, 0xFC, 0x86, 0x09, 0x1C, 0x16, 0xA4, 0x6F, 0x5E, 0x7A, 0x81, 0x01, 0xF9, 0x8A, 0x6D, 0x38, 0xB5, 0xC9, 0x5F, 0xE9, 0x7D, 0x6F, 0x46, 0x92, 0x49, 0x5B, 0xB8, 0x61, 0x03, 0x6F, 0x5E}}}, {{{0xDA, 0x53, 0xCB, 0x62, 0xCD, 0x82, 0x63, 0x96, 0xC7, 0xC0, 0x39, 0xA4, 0x31, 0xEE, 0x15, 0x26, 0x1C, 0xE6, 0x4E, 0xE4, 0xB4, 0x40, 0xFA, 0x65, 0xA3, 0xF4, 0x73, 0x03, 0x85, 0x84, 0x41, 0xF9}, {0x77, 0xF3, 0x90, 0xDC, 0x88, 0x26, 0xBD, 0x27, 0x9A, 0x9D, 0x37, 0xF0, 0x80, 0xEE, 0x02, 0x1D, 0x3E, 0x4F, 0x88, 0xED, 0x8F, 0x89, 0x90, 0xF1, 0x6D, 0x5D, 0x70, 0x49, 0x99, 0x07, 0x61, 0x22}}}}}, {{{{{0x43, 0x52, 0xBA, 0xEE, 0xA8, 0xE9, 0x8E, 0x2E, 0x83, 0x30, 0x41, 0x85, 0xE3, 0x51, 0xB0, 0x8C, 0x86, 0x31, 0xEC, 0x02, 0x76, 0xE8, 0x41, 0x1F, 0x88, 0xBC, 0x39, 0xA2, 0xE4, 0xC1, 0x34, 0xA7}, {0x1D, 0x5F, 0x8C, 0x23, 0x0F, 0xF0, 0xDC, 0xCD, 0xBA, 0x67, 0xD5, 0x78, 0xD6, 0x8D, 0x32, 0x6A, 0xC1, 0x7F, 0x6F, 0x97, 0xCF, 0x46, 0xF0, 0x04, 0x7B, 0xE3, 0x5A, 0xEE, 0x31, 0xC4, 0xC0, 0x79}}}, {{{0x96, 0xBC, 0x01, 0x78, 0x9F, 0xBE, 0x8B, 0xBA, 0x59, 0x22, 0xFB, 0x64, 0x1B, 0x37, 0x5C, 0x33, 0x57, 0xAF, 0x83, 0x5A, 0x96, 0xEA, 0x56, 0xAA, 0x6E, 0x9C, 0xFA, 0xE6, 0xF9, 0xDF, 0xD8, 0x44}, {0xBB, 0x4E, 0xBF, 0xA8, 0xEC, 0x0F, 0x16, 0xA8, 0x59, 0x1F, 0x49, 0xF4, 0x8C, 0x80, 0x6C, 0x52, 0x7F, 0x74, 0x94, 0xC2, 0xE3, 0x29, 0x34, 0x9C, 0x97, 0xB9, 0x5E, 0xED, 0xFD, 0x59, 0x9D, 0xD4}}}, {{{0x83, 0xFB, 0xC2, 0xAD, 0x72, 0xE8, 0xF3, 0x68, 0x43, 0xD0, 0xD4, 0xDC, 0xB2, 0x36, 0xC1, 0xDB, 0x03, 0x29, 0xEE, 0x8C, 0x1A, 0x10, 0xD7, 0xFB, 0xC2, 0xEA, 0xDA, 0xBA, 0x42, 0x18, 0xE6, 0xE4}, {0x63, 0x41, 0x6E, 0x8C, 0xB3, 0x14, 0x68, 0x9A, 0x0F, 0x64, 0x87, 0x16, 0x02, 0xA3, 0x59, 0xF4, 0x60, 0x80, 0x04, 0x2B, 0xA4, 0xE6, 0x10, 0x2D, 0x61, 0x59, 0x14, 0xFE, 0xAF, 0x84, 0xA0, 0x67}}}}}}}; const Fq12ElemStr FfElementTest::fq12_mul_gb_str = { {{{{{{0xE4, 0xCA, 0x0B, 0xA8, 0x9C, 0x70, 0xE2, 0x20, 0x24, 0xD9, 0x8F, 0x09, 0x12, 0x79, 0x55, 0x44, 0x8C, 0x58, 0x42, 0x8F, 0x18, 0x97, 0x0A, 0xC3, 0x0A, 0x40, 0x68, 0x0E, 0x1E, 0x21, 0x7F, 0xB4}, {0x73, 0xCF, 0x8D, 0x54, 0x68, 0xAE, 0x1C, 0xC4, 0x95, 0x01, 0xE3, 0x52, 0x33, 0xFE, 0x69, 0xB5, 0x23, 0x45, 0xEF, 0xFF, 0x79, 0x14, 0xEF, 0x98, 0xA8, 0x4E, 0xB1, 0x2E, 0xE1, 0x15, 0x81, 0x0C}}}, {{{0x9F, 0x65, 0x90, 0x6A, 0x53, 0xD7, 0xF6, 0x73, 0x08, 0xDA, 0x45, 0x11, 0xDE, 0xCF, 0xED, 0x4C, 0x8C, 0x21, 0x02, 0xF5, 0x3F, 0x97, 0xB6, 0xB2, 0xF5, 0xC6, 0x58, 0xFC, 0x9A, 0xA6, 0xBB, 0xF9}, {0x3C, 0xD8, 0xFC, 0x86, 0x09, 0x1C, 0x16, 0xA4, 0x6F, 0x5E, 0x7A, 0x81, 0x01, 0xF9, 0x8A, 0x6D, 0x38, 0xB5, 0xC9, 0x5F, 0xE9, 0x7D, 0x6F, 0x46, 0x92, 0x49, 0x5B, 0xB8, 0x61, 0x03, 0x6F, 0x5E}}}, {{{0xDA, 0x53, 0xCB, 0x62, 0xCD, 0x82, 0x63, 0x96, 0xC7, 0xC0, 0x39, 0xA4, 0x31, 0xEE, 0x15, 0x26, 0x1C, 0xE6, 0x4E, 0xE4, 0xB4, 0x40, 0xFA, 0x65, 0xA3, 0xF4, 0x73, 0x03, 0x85, 0x84, 0x41, 0xF9}, {0x77, 0xF3, 0x90, 0xDC, 0x88, 0x26, 0xBD, 0x27, 0x9A, 0x9D, 0x37, 0xF0, 0x80, 0xEE, 0x02, 0x1D, 0x3E, 0x4F, 0x88, 0xED, 0x8F, 0x89, 0x90, 0xF1, 0x6D, 0x5D, 0x70, 0x49, 0x99, 0x07, 0x61, 0x22}}}}}, {{{{{0xBC, 0xAD, 0x45, 0x11, 0x57, 0x13, 0x62, 0x9E, 0xC3, 0xB5, 0xB0, 0xD9, 0x0B, 0x1F, 0xF4, 0x12, 0x86, 0xAA, 0x79, 0xF8, 0x9B, 0xAF, 0xC9, 0x63, 0x4A, 0x6C, 0xF4, 0x38, 0xCA, 0x11, 0xFB, 0x6C}, {0xE2, 0xA0, 0x73, 0xDC, 0xF0, 0x0C, 0x13, 0xFF, 0x8C, 0x7E, 0x1C, 0xE6, 0x17, 0xE4, 0x72, 0x34, 0x4B, 0x5C, 0xF6, 0x63, 0x43, 0x51, 0x1A, 0x7E, 0x57, 0x45, 0xD2, 0xED, 0x7D, 0x0E, 0x6F, 0x9A}}}, {{{0x69, 0x43, 0xFE, 0x87, 0x60, 0x3E, 0x65, 0x12, 0xED, 0xC2, 0xF6, 0xFA, 0xD3, 0x3A, 0x48, 0x6B, 0xB5, 0x2C, 0xE2, 0xA0, 0x7B, 0xAD, 0xB3, 0xD8, 0x64, 0x8C, 0x32, 0xF4, 0xB4, 0xF3, 0x57, 0xCF}, {0x44, 0xB1, 0x40, 0x57, 0x13, 0xED, 0xDA, 0x24, 0xED, 0xC6, 0xA8, 0x6A, 0x61, 0xF1, 0x38, 0x4C, 0x8D, 0x67, 0xD1, 0x38, 0x2F, 0x6E, 0xD5, 0xE6, 0x3B, 0x6F, 0xCE, 0xED, 0xB1, 0x79, 0x92, 0x3F}}}, {{{0x7C, 0x04, 0x3D, 0x52, 0x8D, 0x13, 0xFD, 0x65, 0x03, 0x15, 0x1D, 0x82, 0x3C, 0x3A, 0xE2, 0xC4, 0x09, 0xB2, 0x77, 0x6E, 0xF8, 0x87, 0x32, 0x87, 0x10, 0x3E, 0x53, 0x21, 0x6C, 0xBA, 0x49, 0x2F}, {0x9C, 0xBE, 0x91, 0x73, 0x4C, 0xE8, 0x88, 0x33, 0x37, 0x81, 0x6B, 0x48, 0xEB, 0xCE, 0x4A, 0xAA, 0xAC, 0x5C, 0x61, 0xCF, 0x6D, 0xB1, 0xFA, 0x55, 0x71, 0xD0, 0x18, 0xDC, 0xFF, 0x4E, 0x8F, 0xAC}}}}}}, }; const FqElemStr FfElementTest::fq_multi_exp_base_1[1] = {{ 0x12, 0xA6, 0x5B, 0xD6, 0x91, 0x8D, 0x50, 0xA7, 0x66, 0xEB, 0x7D, 0x52, 0xE3, 0x40, 0x17, 0x60, 0x7F, 0xDF, 0x6C, 0xA1, 0x2C, 0x1A, 0x37, 0xE0, 0x92, 0xC0, 0xF7, 0xB9, 0x76, 0xAB, 0xB1, 0x8A, }}; const BigNumStr FfElementTest::fq_multi_exp_exp_1[1] = {{ 0xFF, 0xFB, 0x3E, 0x5D, 0xFF, 0x9A, 0xFF, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xF2, 0xE1, 0x85, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFD, 0xFF, 0xEB, 0xFF, 0x29, 0xA7, 0xFF, }}; const FqElemStr FfElementTest::fq_multi_exp_res_1 = { 0x6A, 0x21, 0xEC, 0x89, 0xCC, 0x13, 0x2F, 0x6F, 0x29, 0x1B, 0x3A, 0x94, 0xF6, 0xE6, 0xA8, 0xBD, 0x98, 0x25, 0x43, 0x7A, 0xDC, 0xC1, 0x20, 0xBA, 0x30, 0xD8, 0x1C, 0x8E, 0x79, 0xFC, 0xDA, 0x67, }; const std::vector FfElementTest::fq_multi_exp_exp_1_264({ 0x08, 0xFF, 0xFB, 0x3E, 0x5D, 0xFF, 0x9A, 0xFF, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xF2, 0xE1, 0x85, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFD, 0xFF, 0xEB, 0xFF, 0x29, 0xA7, 0xFF, }); const FqElemStr FfElementTest::fq_multi_exp_res_1_264 = { 0x71, 0x41, 0xa1, 0xdb, 0xd1, 0xd1, 0x50, 0xc2, 0x73, 0x07, 0xc1, 0x93, 0xeb, 0xae, 0x89, 0x4c, 0x6e, 0x49, 0x74, 0xf7, 0x46, 0x23, 0x75, 0xca, 0xc8, 0x67, 0x82, 0xaf, 0xcf, 0x35, 0x34, 0x1c}; const FqElemStr FfElementTest::fq_multi_exp_res_1_256_264 = { 0x10, 0x2f, 0x3a, 0xe5, 0x6e, 0x95, 0x92, 0x8f, 0x98, 0x03, 0x67, 0x79, 0xec, 0x0c, 0xc9, 0x46, 0x07, 0xd9, 0xd9, 0x40, 0x46, 0x29, 0x99, 0xe9, 0x23, 0xf9, 0x6b, 0x10, 0x35, 0x7c, 0xf1, 0xa3}; const FqElemStr FfElementTest::fq_multi_exp_base_2[2] = { {0xE6, 0x65, 0x23, 0x9B, 0xD4, 0x07, 0x16, 0x83, 0x38, 0x23, 0xB2, 0x67, 0x57, 0xEB, 0x0F, 0x23, 0x3A, 0xF4, 0x8E, 0xDA, 0x71, 0x5E, 0xD9, 0x98, 0x63, 0x98, 0x2B, 0xBC, 0x78, 0xD1, 0x94, 0xF2}, {0xDD, 0x2B, 0xE9, 0x59, 0x24, 0xA5, 0xB3, 0xFD, 0xEB, 0xE1, 0x3C, 0xC0, 0x73, 0x4E, 0x99, 0xEE, 0x36, 0xF6, 0xC0, 0x1A, 0x76, 0x01, 0x0A, 0xF0, 0xCB, 0xB4, 0x71, 0x88, 0x95, 0xCB, 0x35, 0xBA}}; const BigNumStr FfElementTest::fq_multi_exp_exp_2[2] = { {0x11, 0xFF, 0xFF, 0xFF, 0x4F, 0x59, 0xB1, 0xD3, 0x6B, 0x08, 0xFF, 0xFF, 0x0B, 0xF3, 0xAF, 0x27, 0xFF, 0xB8, 0xFF, 0xFF, 0x98, 0xFF, 0xEB, 0xFF, 0xF2, 0x6A, 0xFF, 0xFF, 0xEA, 0x31, 0xFF, 0xFF}, {0xE2, 0xFF, 0x03, 0x1D, 0xFF, 0x19, 0x81, 0xCB, 0xFF, 0xFF, 0x6B, 0xD5, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xFF, 0x5A, 0xFF, 0x5C, 0x7C, 0xFF, 0x84, 0xFF, 0xFF, 0x8C, 0x03, 0xB2, 0x26, 0xFF}}; const FqElemStr FfElementTest::fq_multi_exp_res_2 = { 0x8A, 0xF7, 0x96, 0x53, 0x9C, 0xC3, 0x57, 0x89, 0x50, 0xE3, 0xAB, 0x12, 0x62, 0xEA, 0x0C, 0xE4, 0x65, 0xA6, 0x91, 0x09, 0x93, 0x81, 0xFC, 0xBB, 0x0E, 0xFA, 0xC1, 0xC4, 0xDC, 0x3F, 0x0A, 0xD1, }; const FqElemStr FfElementTest::fq_multi_exp_base_3[3] = { {0x24, 0x9D, 0xDD, 0x1A, 0xC0, 0x07, 0x1F, 0x65, 0xDF, 0xBB, 0xC7, 0x39, 0x99, 0x44, 0x63, 0x8E, 0x7E, 0xB2, 0x85, 0x82, 0xC6, 0x4E, 0x2D, 0x39, 0xA8, 0x3F, 0x12, 0xB4, 0xE9, 0x9D, 0x67, 0x28}, {0x6B, 0x51, 0x6B, 0x33, 0x0B, 0x2E, 0x2A, 0x94, 0x34, 0xCC, 0x7E, 0x97, 0xFA, 0x85, 0x51, 0x44, 0x30, 0xE5, 0xF2, 0x68, 0x23, 0x31, 0x84, 0xFF, 0xBB, 0x95, 0x9A, 0xB2, 0x80, 0x95, 0xC4, 0x91}, {0x77, 0xED, 0xA2, 0x53, 0xA3, 0xBF, 0x6C, 0x58, 0x16, 0x7D, 0xEF, 0x8A, 0x7D, 0x38, 0x65, 0x3F, 0x92, 0xA6, 0x85, 0xD7, 0x9F, 0x80, 0xA4, 0xA1, 0x70, 0x02, 0xE5, 0x66, 0xF2, 0xD8, 0xD7, 0xD2}}; const BigNumStr FfElementTest::fq_multi_exp_exp_3[3] = { {0xFF, 0xFF, 0xFF, 0xB4, 0x48, 0xFF, 0xFF, 0xFF, 0xA3, 0xFF, 0xE3, 0xFF, 0x61, 0xFF, 0xA2, 0x97, 0x9A, 0xFF, 0x6F, 0x04, 0xC6, 0xB9, 0xFF, 0x22, 0xFF, 0x20, 0x9E, 0xFF, 0x43, 0xFF, 0xFF, 0xFF}, {0xB1, 0x19, 0xBF, 0xFF, 0x74, 0x7F, 0xCC, 0x34, 0x1E, 0x30, 0x7D, 0xC5, 0xC4, 0xFF, 0xE7, 0xF8, 0xFF, 0x5F, 0xFF, 0x73, 0xFF, 0x58, 0xFF, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xFF, 0xFF}, {0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x26, 0xA8, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0xE0, 0x4F, 0xFF, 0xE3, 0xFF, 0xFF, 0xEB, 0x04, 0x4B, 0xFF, 0x5D, 0x55, 0xFF, 0x2D, 0xFF, 0xFF}}; const FqElemStr FfElementTest::fq_multi_exp_res_3 = { 0x04, 0x22, 0x21, 0xE7, 0x9F, 0xE3, 0x07, 0x2F, 0xA4, 0xBB, 0x56, 0x84, 0xD5, 0x93, 0x4A, 0xDA, 0x5B, 0x89, 0x07, 0xBE, 0xC5, 0x5F, 0xE6, 0x5C, 0x18, 0xF0, 0xF8, 0x8E, 0x8E, 0x00, 0xB9, 0x87, }; const FqElemStr FfElementTest::fq_multi_exp_base_4[4] = { {0x81, 0xEE, 0x78, 0x31, 0x4C, 0xC0, 0x3C, 0xDD, 0x16, 0x52, 0xC6, 0x7E, 0x07, 0x4C, 0xFE, 0xC4, 0x50, 0x63, 0x5A, 0x40, 0xC8, 0xDF, 0x94, 0x23, 0x1A, 0x90, 0xDD, 0x24, 0x61, 0x23, 0xDD, 0x87}, {0x76, 0xBB, 0x2C, 0x1C, 0xB3, 0x78, 0x93, 0x7E, 0x10, 0x29, 0xC3, 0xEC, 0xBD, 0xA3, 0x75, 0x3A, 0xF1, 0x0B, 0xE1, 0xCA, 0xEE, 0x02, 0x58, 0x74, 0xC7, 0xDC, 0xB8, 0x4F, 0x3F, 0x7B, 0xA2, 0xFC}, {0x3A, 0xD3, 0x04, 0xAA, 0x9D, 0x2A, 0xDE, 0x86, 0x56, 0x84, 0x80, 0x42, 0xA5, 0x68, 0xD8, 0x6E, 0x65, 0xC4, 0x08, 0x07, 0x87, 0x4B, 0xC1, 0x92, 0xCB, 0x68, 0x52, 0x6C, 0x5A, 0x4F, 0x7C, 0xFB}, {0x56, 0xE7, 0xBD, 0x59, 0x54, 0xCC, 0x20, 0x16, 0xAE, 0x36, 0xD1, 0xB0, 0xE4, 0x82, 0x47, 0x27, 0x32, 0xD1, 0x38, 0x7C, 0x53, 0x7F, 0xDD, 0xF4, 0xDE, 0xFA, 0xF7, 0x0F, 0xDD, 0xDF, 0x48, 0xA9}}; const BigNumStr FfElementTest::fq_multi_exp_exp_4[4] = { {0xFF, 0xA5, 0xC3, 0xFF, 0xFF, 0x09, 0x18, 0x18, 0x95, 0x40, 0xFF, 0xFF, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0xFF, 0x25, 0xFF, 0xFF, 0x42, 0x07, 0xB5, 0xFF, 0x26, 0xE0, 0x4F, 0xB5, 0xB4, 0xFF}, {0x1F, 0xFF, 0xAA, 0xF1, 0xFF, 0xFF, 0x7E, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xE7, 0xDF, 0xFF, 0xEE, 0xFF, 0x57, 0xFF, 0xFF, 0xFF, 0xB8, 0xB3, 0x9C, 0xFF, 0x8A, 0x89, 0xFF, 0xFE, 0x32, 0xFF, 0xC1}, {0x9A, 0xFF, 0xFF, 0x9B, 0xFF, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xF0, 0xC5, 0xAE, 0x87, 0x41, 0xFF, 0x5C, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0x59, 0xC9, 0xFF, 0x44, 0x5C, 0x58}, {0x00, 0xFF, 0x95, 0xFF, 0x21, 0xFF, 0xFF, 0x1D, 0x1A, 0x06, 0xD3, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xB0, 0x31, 0xFF, 0xFF, 0x1F, 0x61, 0x48, 0xFF, 0xFF, 0xFF, 0x17, 0xC9, 0x79}}; const FqElemStr FfElementTest::fq_multi_exp_res_4 = { 0x26, 0x2C, 0x23, 0x55, 0xD5, 0xBD, 0x7B, 0x67, 0x60, 0xFE, 0x06, 0x7B, 0xCC, 0xB8, 0x6B, 0xC9, 0x00, 0x81, 0xAE, 0xCB, 0xEC, 0x91, 0x6D, 0x1B, 0x9E, 0x1C, 0xD8, 0xC0, 0x8D, 0x3F, 0x1B, 0x20, }; const Fq12ElemStr FfElementTest::fq12_multi_exp_base_4[4] = { { {{{{{{0x2C, 0x86, 0xEE, 0x80, 0x61, 0x45, 0x8F, 0xFD, 0x96, 0xC2, 0x81, 0x11, 0xE8, 0x96, 0xE2, 0xCA, 0x21, 0x78, 0xF7, 0xA3, 0x4B, 0xBA, 0xDC, 0x0D, 0x34, 0x8A, 0x56, 0x12, 0x67, 0x8D, 0x72, 0x37}, {0xA8, 0xEB, 0x5F, 0x1A, 0x1B, 0xF0, 0x5C, 0xC6, 0x6F, 0xC2, 0xC5, 0x03, 0xC4, 0x19, 0x85, 0xA6, 0xE0, 0x64, 0xFE, 0x71, 0x51, 0x46, 0xDF, 0xC2, 0xD6, 0xF9, 0xA0, 0xD6, 0x84, 0xC1, 0x4A, 0x11}}}, {{{0xE0, 0x33, 0xA3, 0x1C, 0x73, 0x71, 0x62, 0x17, 0x10, 0x4C, 0xD8, 0x3E, 0xEE, 0xA1, 0x38, 0x9F, 0xA5, 0xFB, 0x1D, 0xC4, 0x9D, 0x2F, 0x08, 0x4A, 0xD3, 0x61, 0x37, 0x79, 0xAB, 0xC1, 0x37, 0x7E}, {0x90, 0xFD, 0xA3, 0x9D, 0x0C, 0x81, 0x52, 0xF4, 0x58, 0x24, 0x89, 0xC4, 0xF4, 0xD4, 0x82, 0x33, 0xCA, 0x5D, 0xB4, 0x58, 0xA6, 0x1E, 0xE6, 0x2B, 0x86, 0xEF, 0x56, 0xC4, 0x4F, 0x9B, 0x27, 0x3C}}}, {{{0x96, 0x54, 0xDA, 0xB5, 0x32, 0x23, 0x8A, 0x93, 0xCC, 0xA5, 0x7D, 0x28, 0x4A, 0x97, 0xA4, 0x30, 0xA8, 0x11, 0xBC, 0x43, 0x22, 0x7F, 0x02, 0x73, 0x0E, 0x5C, 0x63, 0x52, 0x2F, 0x4B, 0x5F, 0x7D}, {0xC3, 0x1E, 0x30, 0xAE, 0xAC, 0x8C, 0xE8, 0x93, 0xD6, 0xCE, 0x05, 0x4B, 0x6B, 0x21, 0x01, 0x14, 0x4A, 0x1D, 0xD9, 0x08, 0x0C, 0xA1, 0x4C, 0x0B, 0x44, 0x28, 0x9C, 0xB6, 0xD1, 0x96, 0xBD, 0x07}}}}}, {{{{{0x8B, 0x3D, 0x77, 0x4E, 0xBD, 0x7B, 0x9F, 0x65, 0x20, 0xDB, 0xA0, 0x95, 0x25, 0x44, 0x44, 0x7A, 0xE3, 0xDC, 0xDD, 0x2F, 0xBA, 0x75, 0x16, 0x19, 0xCB, 0x90, 0x31, 0x79, 0x38, 0xB6, 0x1A, 0x82}, {0xBC, 0xB6, 0x85, 0xCD, 0xEB, 0xB9, 0x13, 0x43, 0xEA, 0xC2, 0x78, 0xBE, 0x25, 0x97, 0x1C, 0x6E, 0x18, 0x55, 0xFD, 0xCB, 0xE6, 0x7E, 0x1E, 0x92, 0xAD, 0x48, 0xE7, 0xA7, 0x02, 0x87, 0x0B, 0x8F}}}, {{{0x16, 0xD7, 0x8E, 0x95, 0x8E, 0x62, 0x0A, 0xAD, 0x20, 0x2D, 0x6A, 0x2B, 0x4E, 0x6F, 0xC1, 0xC2, 0x63, 0xBA, 0x82, 0xF3, 0x8C, 0xD0, 0xA2, 0x09, 0xD3, 0xE5, 0xBA, 0x1F, 0x65, 0x35, 0xD0, 0x1C}, {0x09, 0x98, 0x47, 0x65, 0xF2, 0x90, 0xD4, 0xE2, 0xD0, 0x6F, 0x9E, 0xDB, 0xA2, 0x14, 0x9B, 0x4B, 0x3D, 0xAA, 0x75, 0x25, 0x67, 0xF4, 0x7D, 0x77, 0xE9, 0x24, 0xED, 0xEE, 0x1B, 0x07, 0x7F, 0xE0}}}, {{{0x7A, 0x34, 0xB7, 0x3C, 0x36, 0x0D, 0xCE, 0xF9, 0xBF, 0xF9, 0xE5, 0x09, 0x86, 0xEB, 0xB9, 0xD8, 0xC4, 0x67, 0xC5, 0xCD, 0xD4, 0xBC, 0xEE, 0x45, 0xF7, 0x11, 0x68, 0xD9, 0x23, 0x6D, 0xD6, 0x24}, {0x6E, 0x97, 0x83, 0x13, 0x76, 0x9F, 0x35, 0xEA, 0xB8, 0x47, 0x57, 0x9B, 0x74, 0x47, 0x1F, 0x19, 0xE7, 0x97, 0x74, 0x1B, 0xB1, 0xA0, 0xF3, 0x92, 0xDC, 0x35, 0xFD, 0x7F, 0x4F, 0x07, 0x22, 0xAC}}}}}}, }, {{{{{{{0xFD, 0x05, 0x41, 0x27, 0x00, 0x7A, 0xAD, 0x17, 0xBC, 0xBF, 0x22, 0x5E, 0xDA, 0xEB, 0x7D, 0xAA, 0xB5, 0x2D, 0xC8, 0x61, 0xFE, 0x2C, 0xBA, 0x9E, 0x54, 0x43, 0x94, 0xDC, 0xFD, 0x0E, 0x6D, 0x6D}, {0xA1, 0x5E, 0x05, 0xA5, 0x05, 0x55, 0xE7, 0x2A, 0xF7, 0x53, 0x37, 0x2C, 0xEF, 0x44, 0x95, 0xCA, 0x2C, 0xE8, 0xEB, 0xAE, 0x61, 0x05, 0x33, 0xE7, 0x0F, 0x30, 0x67, 0xBE, 0xCD, 0xB2, 0x93, 0x44}}}, {{{0x44, 0x31, 0x96, 0x4D, 0x72, 0x61, 0xCD, 0x23, 0x1F, 0x7B, 0x57, 0x33, 0x39, 0xAC, 0x57, 0x53, 0x3D, 0x70, 0x57, 0xB3, 0x6D, 0xD5, 0x8A, 0x89, 0x30, 0xBC, 0xED, 0x29, 0x19, 0x39, 0x6E, 0x6A}, {0x80, 0x21, 0x1E, 0xB7, 0x84, 0xB1, 0x0A, 0xA4, 0xD0, 0xFF, 0x59, 0x31, 0xE9, 0xBA, 0x39, 0xF7, 0x81, 0xDF, 0x1B, 0x7B, 0xD9, 0xDB, 0x02, 0x17, 0xBE, 0x97, 0x63, 0xBD, 0x37, 0x14, 0xB8, 0x8B}}}, {{{0x6C, 0xCC, 0x5B, 0xA3, 0xEE, 0xC8, 0x0B, 0x7B, 0xF5, 0xDE, 0xBC, 0xB7, 0xA8, 0x25, 0x35, 0xAE, 0x0B, 0x30, 0x96, 0x33, 0x52, 0x13, 0xA3, 0x89, 0x3A, 0x2E, 0xA4, 0x7E, 0x5F, 0x4E, 0xB1, 0xF7}, {0x87, 0xBA, 0x08, 0xB0, 0xFB, 0xCB, 0x31, 0xA6, 0x2B, 0x3E, 0xE7, 0xC4, 0xCC, 0xA5, 0x14, 0x61, 0xC9, 0x18, 0xFC, 0x74, 0x59, 0x06, 0xF4, 0xAD, 0xFC, 0x2D, 0x0C, 0x7D, 0xDB, 0x2A, 0xEC, 0xD4}}}}}, {{{{{0xE9, 0x31, 0x31, 0x50, 0x25, 0xB7, 0x0C, 0x48, 0x30, 0xD5, 0x78, 0xB1, 0x10, 0xEA, 0x5D, 0xAA, 0xAA, 0x03, 0xEC, 0xE3, 0x0F, 0x36, 0xA6, 0xBC, 0x18, 0x3A, 0x76, 0x87, 0xA3, 0xE9, 0x33, 0xDA}, {0x48, 0x78, 0x93, 0x64, 0x72, 0x9B, 0x2A, 0x1E, 0x0D, 0x50, 0x9F, 0x6F, 0xBD, 0xA5, 0x18, 0xB1, 0xA8, 0x14, 0x9A, 0x1B, 0xB9, 0xB4, 0x2C, 0x1F, 0x46, 0xB8, 0x9B, 0x7A, 0xC7, 0x84, 0xAE, 0x27}}}, {{{0xD1, 0xEC, 0x1C, 0xEC, 0x69, 0xF0, 0x35, 0x40, 0x77, 0x7E, 0x27, 0x22, 0x36, 0x38, 0xDF, 0x15, 0xC2, 0xB3, 0xB8, 0x63, 0x4A, 0x6E, 0x68, 0x8C, 0xC1, 0x39, 0x3C, 0x02, 0x4C, 0x2A, 0x31, 0x18}, {0x2E, 0x35, 0xF5, 0xCA, 0xA2, 0xE9, 0x24, 0x92, 0xD5, 0xE5, 0x2E, 0x5D, 0x1C, 0x94, 0xD9, 0xC7, 0xF0, 0x22, 0x16, 0x20, 0xA8, 0x37, 0xDD, 0x0E, 0xAB, 0x1B, 0x5E, 0x8B, 0xEE, 0x81, 0xC6, 0x17}}}, {{{0xF1, 0x29, 0x5D, 0x1D, 0x6F, 0x53, 0x5A, 0xB2, 0x20, 0x88, 0x3D, 0xA4, 0x98, 0x81, 0xA4, 0xEF, 0x11, 0x1B, 0x64, 0x9E, 0x2C, 0x95, 0xDD, 0xD7, 0x57, 0xB3, 0x95, 0xCA, 0x40, 0xB9, 0x0D, 0x62}, {0xDC, 0x86, 0x8B, 0xE6, 0xD3, 0x7B, 0x33, 0xEA, 0x50, 0x25, 0xE2, 0x77, 0xE3, 0x0B, 0x5A, 0xC8, 0x81, 0xFC, 0xAE, 0x74, 0x38, 0x69, 0x07, 0xF8, 0x4E, 0xD7, 0x85, 0xA6, 0x2F, 0x13, 0xB7, 0x0A}}}}}}}, {{{{{{{0xF4, 0xDC, 0xAC, 0x02, 0xC0, 0x95, 0x07, 0xDC, 0x12, 0x4F, 0x3A, 0x01, 0xA9, 0xEE, 0xF3, 0x07, 0x46, 0x94, 0x47, 0x15, 0x63, 0xA6, 0x8E, 0x0A, 0xC4, 0xC4, 0xE4, 0x23, 0x85, 0x63, 0xE4, 0x4E}, {0x9A, 0x9E, 0x9F, 0xC1, 0xED, 0x4E, 0x94, 0x10, 0xFE, 0x7D, 0x90, 0xEF, 0x82, 0x21, 0xAC, 0x67, 0x24, 0x99, 0x86, 0xC6, 0x85, 0x8B, 0x19, 0x9A, 0x9B, 0x90, 0x0B, 0xA4, 0x90, 0x78, 0x34, 0x53}}}, {{{0xB1, 0x4C, 0xBA, 0xB8, 0xC6, 0x40, 0x71, 0xC2, 0x17, 0x51, 0x05, 0xC2, 0xC9, 0xBC, 0x03, 0x10, 0x4E, 0xFE, 0x2F, 0x94, 0xED, 0x13, 0x35, 0x7B, 0x20, 0xA6, 0x59, 0x44, 0x81, 0xD0, 0xEC, 0x12}, {0x74, 0xA2, 0x4A, 0xFB, 0xD7, 0x28, 0x70, 0xAD, 0xDE, 0x86, 0x2F, 0xEF, 0xF9, 0x50, 0x5D, 0x1E, 0x46, 0x3B, 0x82, 0x1C, 0x6A, 0xC9, 0x3F, 0x32, 0xAE, 0xCD, 0x93, 0x2C, 0xA5, 0x70, 0x45, 0x24}}}, {{{0x38, 0x19, 0x79, 0xBF, 0x35, 0xF5, 0xC1, 0x53, 0x06, 0x42, 0xAA, 0x6B, 0xF3, 0xB7, 0x8F, 0xFB, 0xFC, 0x28, 0x46, 0x9A, 0x65, 0x2A, 0x45, 0x3D, 0x4C, 0x3C, 0x6B, 0x9C, 0x44, 0xC5, 0x82, 0xB8}, {0x80, 0xF9, 0xB3, 0x44, 0x95, 0x17, 0x39, 0x01, 0x6B, 0xD6, 0x1D, 0x73, 0x22, 0x94, 0xFF, 0x6F, 0x7B, 0x4E, 0xB6, 0xA4, 0xE4, 0x6C, 0xA8, 0xDB, 0x38, 0x74, 0x0B, 0xDB, 0xFA, 0x14, 0x99, 0x39}}}}}, {{{{{0x28, 0xEE, 0xFC, 0x62, 0xE5, 0x33, 0x9C, 0x63, 0xD5, 0x7F, 0x2C, 0x4C, 0xF4, 0x76, 0x4C, 0xF7, 0x7B, 0x27, 0x2C, 0xA9, 0xB9, 0x01, 0x3C, 0x58, 0xF7, 0xCE, 0xAA, 0x0A, 0x21, 0xC0, 0xA3, 0xA7}, {0xA1, 0x85, 0xBC, 0xFE, 0x55, 0xFC, 0x3B, 0x9B, 0x3D, 0xEF, 0x14, 0x85, 0x8A, 0x4E, 0x5E, 0x1F, 0x4F, 0xC9, 0x86, 0xB8, 0xF2, 0xB2, 0xE3, 0xE7, 0x7E, 0x87, 0xE2, 0x20, 0xD7, 0x85, 0x2C, 0xD1}}}, {{{0x13, 0xCB, 0x46, 0xAD, 0xD7, 0xEC, 0x66, 0xD5, 0x2B, 0x6E, 0x87, 0x92, 0x13, 0xB2, 0x7D, 0x18, 0x69, 0x35, 0xCB, 0xF1, 0xBE, 0xC2, 0x9D, 0xEB, 0xF5, 0x00, 0x0B, 0x73, 0xA3, 0xFD, 0x51, 0xDC}, {0x91, 0x0E, 0xE4, 0x46, 0x41, 0x23, 0xDD, 0x85, 0x53, 0x0C, 0xAE, 0xF9, 0x74, 0xCF, 0x1C, 0x32, 0x22, 0xDA, 0x4A, 0x14, 0x80, 0x71, 0x51, 0x23, 0xC3, 0xAB, 0x7E, 0xEC, 0x77, 0xCC, 0x59, 0x12}}}, {{{0x1C, 0x0F, 0x65, 0x6B, 0xD8, 0x41, 0xE0, 0x1B, 0x51, 0x9C, 0x89, 0x26, 0xAB, 0x88, 0x63, 0x5D, 0xBB, 0x95, 0x92, 0x5B, 0x2C, 0x1D, 0xDE, 0xC1, 0x88, 0xD6, 0xF1, 0x02, 0x48, 0xE0, 0xE2, 0xD1}, {0x40, 0x7F, 0xF1, 0x23, 0x4A, 0xCF, 0x36, 0xD5, 0xCF, 0x76, 0x0D, 0x00, 0x2A, 0xF7, 0x5F, 0x31, 0xBB, 0xCC, 0x46, 0x84, 0x07, 0x04, 0x98, 0x9C, 0xB4, 0x31, 0x15, 0x2D, 0x91, 0xF6, 0x29, 0x33}}}}}}}, {{{{{{{0xA8, 0x8E, 0x9A, 0xF9, 0x25, 0x12, 0x98, 0xE2, 0xC3, 0x61, 0x2E, 0xE8, 0xD6, 0xA6, 0x77, 0x16, 0x49, 0x04, 0x75, 0x69, 0xD1, 0x83, 0x2D, 0x3F, 0x2A, 0x79, 0xB6, 0x9B, 0xC9, 0x1D, 0x03, 0x90}, {0x2A, 0xD8, 0x11, 0x9F, 0x26, 0x36, 0xE7, 0xE9, 0x3A, 0x05, 0x4C, 0x15, 0x49, 0x93, 0xDA, 0xE9, 0xD0, 0x5A, 0xE4, 0x8D, 0x8A, 0xFA, 0x04, 0xF1, 0x20, 0x84, 0x56, 0xEC, 0x3C, 0x27, 0x19, 0x5C}}}, {{{0xF1, 0xAF, 0xBF, 0xF6, 0x0E, 0x58, 0x84, 0x2D, 0x94, 0x11, 0xF4, 0xB5, 0xF4, 0x14, 0x51, 0xB0, 0x90, 0x46, 0x1A, 0x81, 0xED, 0xCF, 0x91, 0x66, 0x58, 0xA6, 0x36, 0x3A, 0x52, 0x18, 0x5A, 0xC1}, {0x08, 0x4C, 0x99, 0xD3, 0xDC, 0xCE, 0x7F, 0xCE, 0x78, 0xE0, 0x38, 0x87, 0x32, 0xF1, 0x80, 0x3C, 0x7B, 0x67, 0xAA, 0x6F, 0xDD, 0xE0, 0xFC, 0xCB, 0xD0, 0xB0, 0x3A, 0x59, 0x52, 0x2A, 0x84, 0xE4}}}, {{{0xF8, 0x4A, 0xFF, 0x50, 0xA0, 0x65, 0xC4, 0xEE, 0xF4, 0x9C, 0xAA, 0x34, 0x46, 0xF9, 0xD2, 0x6C, 0xA1, 0x61, 0x71, 0x49, 0x32, 0x25, 0x84, 0x54, 0x90, 0x44, 0xBE, 0xA4, 0x0B, 0xF7, 0xFE, 0x26}, {0x81, 0x63, 0x73, 0xF7, 0x2F, 0xF2, 0xFA, 0x24, 0x52, 0xA4, 0xD9, 0x4C, 0xC1, 0xA7, 0xA5, 0xC3, 0x03, 0x36, 0x13, 0x9B, 0x16, 0x45, 0x16, 0xCB, 0x4B, 0x99, 0x38, 0xF3, 0x6D, 0xC8, 0x7E, 0xAB}}}}}, {{{{{0xB3, 0x53, 0xDF, 0xB6, 0x82, 0x60, 0x12, 0x11, 0x36, 0x69, 0x0E, 0x05, 0x31, 0x8E, 0xCF, 0xD7, 0x3F, 0x32, 0xE7, 0x95, 0x84, 0x1D, 0xC8, 0xB5, 0xBE, 0x49, 0x17, 0x9D, 0xCF, 0xA9, 0x5A, 0x2A}, {0xC4, 0x11, 0x86, 0xE8, 0x6C, 0x02, 0x56, 0xB0, 0x25, 0x2F, 0xA0, 0x06, 0xB3, 0x62, 0xB2, 0x11, 0xAF, 0xBE, 0xA4, 0xE8, 0x61, 0x64, 0x85, 0xFB, 0xEB, 0x1C, 0xF1, 0xBC, 0x2C, 0xAE, 0x10, 0x51}}}, {{{0x16, 0xA6, 0xC0, 0xB3, 0x86, 0x8E, 0x6D, 0x79, 0xB6, 0xBD, 0xDE, 0x1E, 0x26, 0x06, 0x46, 0x65, 0x82, 0x84, 0x5A, 0x97, 0xD3, 0xB7, 0x93, 0x78, 0x6B, 0x9D, 0x14, 0x33, 0x94, 0x43, 0x34, 0x04}, {0x45, 0xD1, 0x47, 0xD4, 0x2F, 0x17, 0xCF, 0xF1, 0xDD, 0xEA, 0x11, 0x52, 0xAE, 0x01, 0x88, 0x3A, 0x10, 0xEE, 0x5C, 0x16, 0xCD, 0xB5, 0x48, 0xE9, 0x16, 0x2C, 0x70, 0xB4, 0x1E, 0x19, 0x38, 0xE0}}}, {{{0x18, 0xE9, 0xAE, 0xC5, 0xDA, 0x74, 0x41, 0x2D, 0x70, 0x07, 0x60, 0x37, 0x27, 0x66, 0xF7, 0x00, 0xBB, 0x79, 0x51, 0xF3, 0x7C, 0x8A, 0x2B, 0xB5, 0x69, 0x6E, 0x10, 0x1F, 0xE0, 0x0A, 0x5E, 0xBE}, {0xB4, 0x4E, 0x0E, 0x02, 0x59, 0xB5, 0xCB, 0x4A, 0x6A, 0x86, 0x8B, 0xCC, 0xA2, 0x13, 0xA0, 0xE9, 0xF2, 0x5C, 0xB0, 0x23, 0xB2, 0x15, 0xF9, 0xBB, 0x43, 0xC1, 0x54, 0xF4, 0xC8, 0xAB, 0x16, 0xA6}}}}}}}, }; const BigNumStr FfElementTest::fq12_multi_exp_exp_4[4] = { { 0x14, 0x92, 0xD1, 0x1F, 0xAC, 0x90, 0x4D, 0xC3, 0x3E, 0xB8, 0xA7, 0xFE, 0x35, 0x98, 0xDA, 0x94, 0xD6, 0xF3, 0x27, 0x29, 0x4B, 0x70, 0xCF, 0x0F, 0xDA, 0x14, 0x97, 0xA1, 0x9B, 0x6B, 0x24, 0x08, }, { 0x76, 0x8D, 0xE5, 0xC2, 0xAB, 0x78, 0xD9, 0x76, 0x98, 0xFF, 0x92, 0xEA, 0x95, 0x58, 0xC5, 0x0C, 0x6F, 0x1B, 0x35, 0xC4, 0xBF, 0x4A, 0x9E, 0xC2, 0x6A, 0xEC, 0xE2, 0xF6, 0xAF, 0xEB, 0xAC, 0x06, }, { 0x50, 0x38, 0x60, 0x31, 0xAB, 0x05, 0xCC, 0xB1, 0xC2, 0x06, 0xA0, 0xD7, 0x92, 0x12, 0xBD, 0x17, 0x81, 0xB9, 0x7E, 0x07, 0x9B, 0xD4, 0x3B, 0x2D, 0x3C, 0x15, 0x3A, 0x5A, 0xF1, 0xC0, 0xC4, 0x75, }, { 0xA1, 0x3F, 0xEA, 0x99, 0x7E, 0xC7, 0x65, 0xF5, 0x41, 0xA6, 0xD6, 0xD3, 0x77, 0xEC, 0x27, 0xF8, 0x6C, 0x18, 0x28, 0x69, 0x97, 0x08, 0x0E, 0x63, 0x5A, 0xDA, 0xFE, 0x9F, 0xD1, 0x4A, 0x61, 0x4F, }, }; const Fq12ElemStr FfElementTest::fq12_multi_exp_res_4 = { {{{{{{0x3A, 0x30, 0x33, 0xA2, 0x14, 0xDF, 0xDC, 0x70, 0x48, 0xF3, 0xBA, 0x3F, 0xCE, 0xFC, 0x69, 0x24, 0xAE, 0xA1, 0xF3, 0xCF, 0xD8, 0x77, 0x69, 0x38, 0x38, 0xF4, 0x8E, 0xFB, 0x51, 0xFB, 0x10, 0x7C}, {0x73, 0xB4, 0xEE, 0xF9, 0x76, 0xBB, 0x45, 0xEC, 0x07, 0x24, 0x23, 0xA3, 0x38, 0x64, 0x39, 0x4C, 0x03, 0x94, 0xF5, 0xEE, 0x5F, 0xC9, 0x83, 0x4F, 0xD1, 0xA6, 0x4A, 0x05, 0x25, 0x0C, 0x46, 0x33}}}, {{{0xD4, 0x40, 0x47, 0xAE, 0xEC, 0xDA, 0x30, 0xF9, 0xE1, 0x28, 0xFB, 0xB1, 0x4C, 0x62, 0xFB, 0x6C, 0x90, 0x0D, 0xB1, 0xEC, 0xAF, 0x2D, 0x95, 0x64, 0x11, 0x93, 0xDA, 0x8E, 0xB8, 0x7D, 0xE4, 0xA3}, {0x8E, 0xA6, 0x9B, 0xAA, 0x58, 0xD5, 0xDC, 0x59, 0x1A, 0x51, 0x53, 0x47, 0x30, 0x1C, 0x2B, 0xB0, 0xBB, 0x57, 0x57, 0x0A, 0x8C, 0x5F, 0x62, 0x9C, 0x52, 0x28, 0xC0, 0x25, 0x27, 0xAE, 0xCD, 0x36}}}, {{{0xBF, 0x2D, 0x03, 0xB1, 0x33, 0xFD, 0x24, 0x81, 0x3C, 0x91, 0x43, 0x90, 0x0C, 0x20, 0xC4, 0xE3, 0x69, 0x3F, 0xA9, 0xA2, 0x7C, 0xC2, 0x48, 0x28, 0x1B, 0xF0, 0x81, 0x1F, 0x2B, 0x8F, 0x8D, 0x43}, {0x38, 0x18, 0x12, 0xA3, 0x89, 0xF1, 0xD7, 0x60, 0x89, 0x68, 0x6A, 0xC4, 0xCC, 0x5D, 0xF4, 0xCE, 0x43, 0x95, 0x84, 0xCD, 0x01, 0x55, 0xB8, 0x5D, 0x24, 0x50, 0xCD, 0xE3, 0x68, 0x1C, 0xFF, 0x59}}}}}, {{{{{0x0D, 0xAC, 0xCB, 0xE7, 0x9D, 0x68, 0x0F, 0x4A, 0xAF, 0xEB, 0xB5, 0xFB, 0xF9, 0xB1, 0x58, 0x80, 0xD5, 0x71, 0x53, 0x26, 0x2E, 0x9C, 0xCE, 0x10, 0xAC, 0xD2, 0x0A, 0xEB, 0xB4, 0x5C, 0xC8, 0xD7}, {0x16, 0x26, 0x66, 0x71, 0xDD, 0x67, 0xBA, 0xDB, 0x35, 0x76, 0x64, 0xC6, 0x0B, 0x0B, 0x07, 0x4B, 0x65, 0xA2, 0xF7, 0x68, 0x9E, 0xFE, 0xE8, 0xE3, 0xA7, 0x09, 0x79, 0xC5, 0xDF, 0x5E, 0x9C, 0xEC}}}, {{{0xEE, 0x83, 0x59, 0xB5, 0x89, 0x81, 0xA2, 0x87, 0xD7, 0x75, 0x65, 0x90, 0xDE, 0x78, 0x37, 0x59, 0x04, 0x9B, 0x50, 0xC3, 0xBA, 0x90, 0x09, 0x15, 0xAB, 0x17, 0xC5, 0xBF, 0x5B, 0xB9, 0xE4, 0x6C}, {0xA9, 0xB1, 0x49, 0x76, 0x25, 0x74, 0x5D, 0x9C, 0x78, 0xC5, 0x09, 0xEE, 0xEB, 0xEB, 0x9D, 0x1C, 0x6C, 0xC0, 0x27, 0x9D, 0x66, 0xE6, 0x7F, 0x31, 0xCD, 0xB0, 0x8A, 0xE4, 0x9E, 0xBD, 0x70, 0x18}}}, {{{0x88, 0xA1, 0x08, 0x39, 0xA2, 0x48, 0xA5, 0x98, 0xB6, 0xAD, 0x10, 0x54, 0x07, 0xCD, 0xFC, 0x6D, 0xB1, 0x02, 0xFF, 0xE3, 0x92, 0xD7, 0x9D, 0x48, 0xFB, 0xCE, 0x88, 0x46, 0x92, 0x07, 0x02, 0xBA}, {0xEE, 0xEB, 0xAE, 0x88, 0xB1, 0x4E, 0xD0, 0xF2, 0xCE, 0xD7, 0x57, 0x07, 0xD4, 0x39, 0xD2, 0x7D, 0x1A, 0x0C, 0xEF, 0xF2, 0x84, 0x84, 0x22, 0x8A, 0xB1, 0x80, 0x0D, 0xDC, 0x64, 0x86, 0xFD, 0x70}}}}}}}; const FqElemStr FfElementTest::fq_multi_exp_base_5[5] = { {0x7B, 0x26, 0x96, 0x84, 0x04, 0x0D, 0x6F, 0x10, 0xAA, 0x7F, 0xD0, 0x0C, 0x41, 0x3A, 0x68, 0x48, 0xBF, 0x3D, 0xB5, 0xCE, 0x3A, 0x9C, 0xA9, 0x10, 0xA4, 0x67, 0x7C, 0xC0, 0x41, 0x52, 0xCA, 0xE7}, {0x2E, 0xD9, 0xEF, 0x86, 0xB6, 0x32, 0x72, 0x89, 0x37, 0xCF, 0x16, 0xCE, 0x27, 0x15, 0x7A, 0x95, 0xCF, 0x94, 0x1B, 0xF3, 0xCE, 0x49, 0x20, 0x29, 0x9A, 0x61, 0x2E, 0x0A, 0xF5, 0xE1, 0xDC, 0x9F}, {0xE0, 0x19, 0x37, 0x44, 0xA7, 0x45, 0x49, 0x7E, 0x19, 0x02, 0x09, 0x78, 0xBE, 0xA4, 0x65, 0x60, 0x7A, 0xF5, 0xC8, 0xAF, 0x97, 0x5E, 0xDA, 0x3A, 0xB4, 0x16, 0x70, 0x31, 0xE3, 0xB4, 0x18, 0xA8}, {0xBC, 0x92, 0x29, 0x92, 0x14, 0xD3, 0x3F, 0xB8, 0xB8, 0x8C, 0x41, 0xDF, 0xC5, 0xA1, 0xCA, 0x77, 0xE5, 0x73, 0xFE, 0xA7, 0xAC, 0x81, 0x66, 0x11, 0x5A, 0x6D, 0x7D, 0x97, 0x13, 0x92, 0x8D, 0x1D}, {0xE1, 0xA0, 0x0D, 0xDC, 0x8F, 0x20, 0xF5, 0x2D, 0x1D, 0x1F, 0xBD, 0x24, 0x8C, 0xC2, 0x26, 0x06, 0x89, 0xE9, 0x46, 0xA9, 0xD2, 0x44, 0x8F, 0x1A, 0x8D, 0xAF, 0x20, 0x73, 0x60, 0x0B, 0x66, 0x9C}}; const BigNumStr FfElementTest::fq_multi_exp_exp_5[5] = { {0x78, 0xE6, 0x3F, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x6E, 0xE9, 0xFF, 0x4F, 0xFF, 0x23, 0xFF, 0x67, 0xB4, 0xED, 0xEE, 0xD7, 0xC6, 0xFF, 0x4B, 0x0B, 0x6F, 0x1F, 0xD6, 0xFD, 0x7F}, {0xA1, 0x87, 0xFF, 0x1B, 0xFF, 0x85, 0x68, 0xFF, 0x1C, 0xFF, 0xD5, 0xFF, 0x95, 0x73, 0xFF, 0xFF, 0xFF, 0x9E, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x9E, 0x62, 0xFF, 0xFF, 0x97, 0xFF, 0xFF, 0xF3}, {0x2E, 0xE8, 0x1E, 0x35, 0xFF, 0x82, 0x0B, 0x99, 0xEC, 0x30, 0x2B, 0xCE, 0xEC, 0x83, 0x05, 0xFF, 0x9E, 0x3C, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x57, 0x26, 0x5B, 0x6C, 0xFF, 0xE6, 0x94, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0xFF, 0xFF, 0x79, 0xFC, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xFF, 0x2F, 0x6B, 0xD1, 0xE7, 0xFF, 0xFF, 0xFF, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0x63, 0x53, 0x53, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xC0, 0xD8, 0x17, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x45, 0xFF, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x06}}; const FqElemStr FfElementTest::fq_multi_exp_res_5 = { 0x8F, 0x6D, 0x54, 0xCA, 0x00, 0x85, 0xD8, 0x78, 0xA4, 0x45, 0x36, 0x7C, 0x23, 0xD0, 0x3C, 0x2D, 0x20, 0x78, 0xD9, 0xD7, 0xF1, 0xC3, 0x99, 0xD9, 0xD3, 0x0A, 0x0E, 0x86, 0x98, 0xC2, 0xA7, 0x97, }; const FqElemStr FfElementTest::fq_multi_exp_base_6[6] = { {0x75, 0x18, 0x6A, 0x3D, 0xCC, 0x76, 0x33, 0x92, 0xD0, 0x57, 0xDA, 0xE0, 0x37, 0x6F, 0x71, 0xD5, 0x9E, 0x7E, 0x65, 0xED, 0xD7, 0xFD, 0x82, 0xC0, 0x6C, 0x83, 0x60, 0x30, 0xC1, 0xD3, 0x3D, 0x4D}, {0xF5, 0x3A, 0x20, 0xAB, 0x22, 0x47, 0x07, 0xAE, 0x71, 0xC1, 0x91, 0x73, 0xEF, 0x1F, 0x1D, 0x76, 0x2E, 0xEE, 0x0D, 0xDE, 0xD9, 0xF8, 0x5C, 0x85, 0xC7, 0x5B, 0x93, 0x88, 0xF6, 0xFF, 0x4C, 0xA5}, {0x21, 0xB3, 0x5E, 0xE8, 0xD2, 0xDA, 0x14, 0x1C, 0xB5, 0x2C, 0xFC, 0x61, 0x9D, 0xEB, 0x65, 0x87, 0xBB, 0x5B, 0xBC, 0xFD, 0x37, 0x54, 0x6B, 0xDC, 0xD9, 0xFA, 0x7A, 0xCD, 0x18, 0x7E, 0x8B, 0x89}, {0x70, 0xB7, 0x19, 0x42, 0xB4, 0x41, 0x2C, 0x1B, 0xBD, 0x7B, 0x25, 0x06, 0xA2, 0x95, 0xB5, 0xB6, 0x70, 0xDF, 0x58, 0x71, 0xCA, 0x09, 0x12, 0x66, 0x5A, 0x7B, 0xF0, 0x5F, 0x43, 0x69, 0x32, 0xF6}, {0x3D, 0x57, 0xE8, 0x3F, 0x1E, 0x39, 0x2B, 0xE5, 0xD0, 0xCF, 0xA9, 0xC8, 0x72, 0x10, 0x7F, 0xC5, 0x4F, 0xAE, 0xE9, 0x73, 0x28, 0x4C, 0xFC, 0x3F, 0xD5, 0xFF, 0xE8, 0xCF, 0x2C, 0xEB, 0x33, 0xD3}, {0x51, 0x80, 0x15, 0x1C, 0xE6, 0x9C, 0x4B, 0x80, 0x40, 0xBA, 0x40, 0x29, 0x3A, 0x86, 0xA8, 0xB2, 0x66, 0x08, 0x97, 0x8D, 0xEB, 0x8B, 0xA7, 0x93, 0xE3, 0x49, 0xC6, 0xC0, 0x46, 0x93, 0xC1, 0x75}}; const BigNumStr FfElementTest::fq_multi_exp_exp_6[6] = { {0xFF, 0xFF, 0xFF, 0x49, 0x50, 0xFF, 0x19, 0xFF, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x4A, 0x0E, 0xFF, 0x74, 0xFF, 0xC7, 0xFF, 0xD9, 0x81, 0xFF, 0xFF, 0xFF, 0xD5, 0x2C, 0xFF, 0xFF, 0xFF, 0xAE}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x03, 0xFF, 0x95, 0xFF, 0x11, 0x9D, 0xFF, 0x9B, 0xFF, 0xFF, 0x68, 0x44, 0xFF, 0xC9, 0xFF, 0x10, 0xC7, 0xBF}, {0x64, 0xFF, 0x89, 0x4A, 0xFF, 0x20, 0xFF, 0xE7, 0xFF, 0x36, 0x23, 0xDD, 0xFF, 0xFF, 0xFC, 0xFF, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0xD3, 0x59, 0xBE}, {0x0F, 0xFF, 0x76, 0xA5, 0x9E, 0x02, 0x9B, 0xFF, 0xA1, 0xFF, 0xC2, 0xFF, 0x9D, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0x6B, 0x81, 0x2A, 0xFF, 0x98, 0xFF, 0xFF, 0xB9, 0xFF, 0xB7, 0x78, 0xE6, 0xFF}, {0xAF, 0xF3, 0xFF, 0x3C, 0xA8, 0xFF, 0xB9, 0x3A, 0xFF, 0xFF, 0xFF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0xFF, 0xFF, 0x52, 0xFF, 0x41, 0x10, 0x62, 0xFF, 0x51, 0x35, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xC3, 0xD9, 0xFF, 0xFF, 0x3A, 0x44, 0x88, 0x04, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x64, 0xFF, 0xFF, 0x52, 0xFF, 0x7D, 0x6B, 0x24, 0x6E, 0xFF, 0xFF, 0xFF, 0xA7, 0x71}}; const FqElemStr FfElementTest::fq_multi_exp_res_6 = { 0xFB, 0x89, 0x4F, 0xBB, 0x91, 0xEE, 0xD6, 0x57, 0x2D, 0x34, 0xF9, 0x0B, 0xE3, 0xEB, 0x71, 0x1D, 0x63, 0x74, 0x96, 0x3B, 0xD4, 0x02, 0x2F, 0x08, 0xDB, 0x95, 0x6A, 0x40, 0x68, 0xD4, 0x55, 0x76, }; const Fq6ElemStr FfElementTest::epid11_GT_multi_exp_base_3[3] = { {0x02, 0x7C, 0xAC, 0xE1, 0x58, 0x08, 0x6A, 0x83, 0x50, 0xD8, 0xBA, 0xBA, 0x4B, 0x60, 0x6C, 0xEB, 0x51, 0xCE, 0x7E, 0x6D, 0x8E, 0xA8, 0x56, 0x41, 0x33, 0xF3, 0xB0, 0xA6, 0xFC, 0xCD, 0xC8, 0x41, 0x05, 0x9E, 0xCC, 0x4F, 0x51, 0x77, 0xD9, 0xEC, 0x57, 0x34, 0x48, 0x47, 0x22, 0x7A, 0x7C, 0xA1, 0x14, 0xB8, 0x2A, 0xC9, 0x16, 0x0A, 0xB4, 0xB3, 0x5D, 0x44, 0x28, 0x23, 0x80, 0x7A, 0x3E, 0xDA, 0x02, 0x6D, 0x03, 0x47, 0xCD, 0x2A, 0xAB, 0xA4, 0xCE, 0x63, 0x0B, 0x5E, 0x3A, 0xF2, 0x96, 0x86, 0xA9, 0x9F, 0x2A, 0x9A, 0xFF, 0x8F, 0x94, 0x91, 0xC8, 0x3C, 0xF2, 0x5A, 0xAA, 0xDA, 0x6B, 0x8E, 0x02, 0xFC, 0x42, 0x4B, 0xFE, 0xF3, 0x23, 0x0A, 0xF8, 0x1A, 0x5C, 0x9A, 0x5C, 0x0D, 0x71, 0xEF, 0x85, 0x64, 0xA6, 0x4D, 0x6A, 0x8B, 0x82, 0x58, 0x2E, 0xBC, 0xFB, 0xB9, 0xDF, 0xB8, 0xCE, 0x3D, 0x03, 0xF3, 0x07, 0x18, 0x4A, 0x13, 0x82, 0x8A, 0xEA, 0x24, 0x57, 0x72, 0xE2, 0x33, 0x9D, 0xB3, 0x0C, 0x57, 0xCF, 0xAB, 0xDD, 0xEE, 0xF8, 0xD7, 0x2A, 0x75, 0xF5, 0xD7, 0x28, 0xED, 0x0F, 0xB7, 0x02, 0xEC, 0x5F, 0xED, 0x50, 0xAE, 0x6B, 0xF3, 0x80, 0x29, 0x7B, 0xA2, 0x75, 0x61, 0xFD, 0x20, 0x01, 0x2B, 0xDF, 0x8B, 0x3C, 0x2A, 0xB9, 0x1D, 0x92, 0xED, 0x0F, 0xAD, 0x73, 0x74, 0x1E, 0xD8}, {0x06, 0xA6, 0x4A, 0x6B, 0x89, 0xD0, 0x07, 0x2A, 0xE6, 0x0B, 0x56, 0xD3, 0x48, 0x17, 0xF6, 0x99, 0x31, 0x41, 0x21, 0x99, 0x51, 0xF6, 0xB1, 0x6C, 0x02, 0xCD, 0x11, 0xE7, 0xCC, 0xD3, 0xC5, 0x6C, 0x06, 0xF4, 0x39, 0x62, 0x37, 0x88, 0x37, 0xAD, 0x1F, 0x36, 0x81, 0xFA, 0xD7, 0x4B, 0x9F, 0x57, 0x0F, 0x5B, 0xC3, 0x53, 0x14, 0x53, 0x41, 0x3A, 0x2B, 0xAB, 0x6E, 0xF4, 0xD8, 0x7F, 0xC5, 0x67, 0x08, 0x70, 0xD7, 0x9B, 0x59, 0xE1, 0xE0, 0x57, 0xE2, 0xF4, 0x04, 0x82, 0x06, 0x6A, 0xD5, 0xA2, 0x76, 0x64, 0x41, 0x7F, 0x3B, 0xE6, 0x33, 0xB9, 0x39, 0x68, 0xDA, 0x0D, 0x13, 0x03, 0x63, 0xC8, 0x07, 0x94, 0x70, 0xF9, 0xFB, 0xD8, 0x99, 0x31, 0xA1, 0x53, 0x1C, 0x20, 0x43, 0x12, 0xEB, 0xFF, 0xA4, 0x5D, 0x64, 0x7C, 0x24, 0x9E, 0xE0, 0x03, 0x80, 0x8E, 0xFB, 0xDC, 0xEE, 0xFD, 0x1F, 0xEF, 0x03, 0x43, 0x07, 0x44, 0xEF, 0xB3, 0x71, 0x39, 0x77, 0x61, 0x5C, 0xA9, 0x32, 0x54, 0x33, 0x98, 0xA2, 0x14, 0x6A, 0x13, 0x53, 0x22, 0x94, 0xA2, 0xCE, 0x15, 0xE7, 0xD0, 0x30, 0xF2, 0x6B, 0x07, 0x02, 0x56, 0x28, 0xC3, 0xB1, 0x39, 0xF9, 0xC7, 0xDA, 0xE2, 0xFD, 0xD0, 0xA8, 0x1B, 0xE8, 0xB2, 0xE3, 0x75, 0x02, 0xB8, 0x90, 0xA4, 0xA5, 0x8F, 0x23, 0xA1, 0xCD, 0x75, 0xE7, 0x51, 0x37, 0xE5}, {0x09, 0x27, 0x38, 0x30, 0x06, 0x44, 0x13, 0xEF, 0xFE, 0x70, 0x5C, 0x4A, 0x21, 0xFF, 0xF8, 0xF5, 0xBB, 0xC9, 0x6E, 0xA8, 0x7E, 0x00, 0xB1, 0xD7, 0x5E, 0x55, 0xCF, 0xC7, 0x34, 0x6B, 0x8D, 0xD5, 0x04, 0xCE, 0x6E, 0xCA, 0x11, 0x5A, 0xB3, 0x0C, 0x33, 0x79, 0x5F, 0xDE, 0xD9, 0xDB, 0x8C, 0xFA, 0x73, 0x4E, 0x1E, 0xFA, 0xA1, 0x21, 0x6D, 0xA3, 0x6D, 0xE8, 0x69, 0x02, 0x9E, 0xCC, 0x4D, 0x14, 0x09, 0xB5, 0x7C, 0xBA, 0x98, 0xC2, 0xE3, 0xAA, 0x82, 0x6A, 0x0F, 0x1E, 0x4C, 0x6C, 0x9E, 0xB8, 0xB6, 0xA3, 0x5D, 0x06, 0xFE, 0x99, 0x5C, 0x62, 0xA9, 0x19, 0x4E, 0x84, 0x61, 0xC7, 0xF9, 0x78, 0x04, 0x39, 0xDA, 0xB4, 0x79, 0x32, 0x63, 0x60, 0xA6, 0x69, 0x86, 0x5C, 0xFF, 0xB0, 0x71, 0xD0, 0xF5, 0x5E, 0x3C, 0xB2, 0x5D, 0x81, 0x4F, 0x9F, 0xE4, 0xF7, 0x3B, 0xC7, 0xC5, 0x80, 0x5E, 0x8E, 0x01, 0x23, 0xFA, 0xFC, 0x09, 0xAE, 0x12, 0x55, 0xF2, 0xD0, 0x50, 0x5C, 0xED, 0xC6, 0xD6, 0x81, 0x9A, 0xA7, 0x93, 0xA3, 0xF4, 0xAC, 0xE5, 0x3E, 0xDB, 0x5A, 0x05, 0xB7, 0x0B, 0x80, 0xAD, 0xA9, 0x08, 0xF1, 0x5A, 0xB5, 0x09, 0x23, 0x52, 0x65, 0x46, 0x64, 0x79, 0xF2, 0x47, 0x04, 0x72, 0x48, 0x4E, 0x01, 0x55, 0x4A, 0x67, 0x8D, 0x1E, 0x07, 0xC7, 0x46, 0x87, 0xF6, 0x50, 0xC3, 0xA6, 0x6B}}; const std::vector FfElementTest::epid11_GT_multi_exp_exp_3[3] = { {0x00, 0x00, 0xAF, 0x5B, 0x22, 0x71, 0x98, 0xB6, 0xEB, 0x67, 0x3D, 0x94, 0x4A, 0xB6, 0x5E, 0x99, 0x81, 0xC5, 0x96, 0x91, 0x55, 0xBA, 0x2F, 0x16, 0x01, 0x4E, 0xE1, 0x25, 0xAD, 0xCA, 0x94, 0x88, 0x60, 0x3B, 0xA2, 0x56, 0x0A, 0x94, 0x0B, 0x2C, 0x3E, 0xD0, 0x8F, 0x15, 0x07, 0x3D, 0xD5, 0xBE, 0x72, 0x3E, 0x2D, 0x06, 0x74, 0xFF, 0x06, 0xED, 0x47, 0x28, 0x08, 0x0C, 0xA0, 0x6F, 0xDB, 0x75, 0x55, 0x32, 0xDC, 0x97, 0x47, 0x60, 0x4E, 0x6F, 0xB4, 0x29, 0x89, 0x0C}, {0x00, 0x00, 0x01, 0xB8, 0x40, 0xBB, 0xE1, 0x1C, 0x84, 0x8E, 0x02, 0xC0, 0xEF, 0x69, 0x84, 0x90, 0xED, 0xEB, 0x99, 0x94, 0xBC, 0x79, 0x48, 0xC8, 0x08, 0x3C, 0x25, 0xDA, 0xAC, 0xFF, 0x3A, 0xDD}, {0x00, 0x00, 0x37, 0x1E, 0xCD, 0x0F, 0x66, 0x09, 0x7D, 0x33, 0x9A, 0xDC, 0x47, 0x28, 0xF7, 0x91, 0xF3, 0xC2, 0xBC, 0x3A, 0xA9, 0x05, 0x62, 0xFC, 0xDD, 0x8C, 0x65, 0xC2, 0xA8, 0x14, 0x55, 0x52}, }; const Fq6ElemStr FfElementTest::epid11_GT_multi_exp_res_3 = { 0x09, 0xCF, 0x1D, 0xB6, 0x97, 0x14, 0x58, 0xAA, 0x29, 0x7E, 0x03, 0x96, 0xD2, 0xDC, 0xD4, 0x2C, 0x1F, 0x2F, 0xB0, 0xC1, 0x5E, 0x71, 0xFB, 0x0C, 0x8D, 0xDB, 0xBD, 0x1D, 0x20, 0xD9, 0x9A, 0xA5, 0x02, 0x69, 0x62, 0x1C, 0x5C, 0xE8, 0x12, 0x11, 0xB1, 0x49, 0x93, 0x29, 0x23, 0xAF, 0xB4, 0xFF, 0x77, 0x1E, 0xC9, 0xA6, 0xA0, 0x6D, 0xD9, 0x38, 0x89, 0x1A, 0xC7, 0xB9, 0xF9, 0x66, 0x25, 0xD3, 0x00, 0x59, 0xE1, 0xAC, 0x0D, 0xDE, 0xCF, 0xC0, 0xCF, 0x50, 0x48, 0x6B, 0xCE, 0x32, 0x15, 0x79, 0x13, 0x71, 0x12, 0x9B, 0x63, 0x09, 0x4D, 0x20, 0xD9, 0x4A, 0xCD, 0x4F, 0x00, 0x7F, 0x8A, 0x19, 0x06, 0x3F, 0x0F, 0x3E, 0x83, 0xA3, 0xEE, 0x0F, 0xAB, 0x72, 0xC9, 0x9A, 0x5D, 0xD1, 0x67, 0xBF, 0xF1, 0x0E, 0xAB, 0x9C, 0xE8, 0x50, 0x04, 0xA7, 0x20, 0xAA, 0xF6, 0xB9, 0x8E, 0x2F, 0x69, 0x44, 0x02, 0x68, 0x7A, 0x2E, 0x70, 0xD4, 0x7E, 0x83, 0x8F, 0xAB, 0x58, 0x3E, 0xD2, 0x95, 0xA0, 0x1A, 0x61, 0xC8, 0x93, 0xA0, 0xCC, 0xA4, 0x90, 0xFB, 0x73, 0xC2, 0xD2, 0x91, 0x70, 0x34, 0x6A, 0x67, 0x03, 0x67, 0x49, 0x84, 0xEE, 0x3B, 0x9E, 0x8B, 0x6D, 0x47, 0x95, 0xBD, 0x0E, 0x47, 0x97, 0x9E, 0x0A, 0x87, 0x61, 0x83, 0x80, 0xEF, 0x4F, 0x91, 0xA8, 0xA6, 0xB7, 0xC0, 0x44, 0xE2, 0x21, 0x8D}; //////////////////////////////////////////////// // NewFfElement TEST_F(FfElementTest, NewFailsGivenNullPointer) { FfElement* ff_elem = nullptr; EXPECT_EQ(kEpidBadArgErr, NewFfElement(nullptr, &ff_elem)); EXPECT_EQ(kEpidBadArgErr, NewFfElement(this->fq, nullptr)); DeleteFfElement(&ff_elem); } TEST_F(FfElementTest, NewSucceedsGiven256BitFiniteField) { FfElement* ff_elem = nullptr; EXPECT_EQ(kEpidNoErr, NewFfElement(this->fq, &ff_elem)); DeleteFfElement(&ff_elem); } TEST_F(FfElementTest, Default256BitElementIsZero) { FfElement* ff_elem = nullptr; THROW_ON_EPIDERR(NewFfElement(this->fq, &ff_elem)); FqElemStr ff_elem_str; EpidStatus sts = WriteFfElement(this->fq, ff_elem, &ff_elem_str, sizeof(ff_elem_str)); DeleteFfElement(&ff_elem); THROW_ON_EPIDERR(sts); FqElemStr fq_zero_str = {0}; EXPECT_EQ(fq_zero_str, ff_elem_str); } //////////////////////////////////////////////// // DeleteFfElement TEST_F(FfElementTest, DeleteNullsPointer) { FfElement* ff_elem = nullptr; EpidStatus sts = NewFfElement(this->fq, &ff_elem); DeleteFfElement(&ff_elem); THROW_ON_EPIDERR(sts); EXPECT_EQ(nullptr, ff_elem); } TEST_F(FfElementTest, DeleteWorksGivenNullPointer) { EXPECT_NO_THROW(DeleteFfElement(nullptr)); FfElement* ff_elem = nullptr; EXPECT_NO_THROW(DeleteFfElement(&ff_elem)); } //////////////////////////////////////////////// // ReadFfElement TEST_F(FfElementTest, ReadFailsGivenArgumentsMismatch) { uint8_t buf[sizeof(Fq12ElemStr)] = {0}; EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq12, buf, sizeof(Fq12ElemStr), this->fq_a)); EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, buf, sizeof(FqElemStr), this->fq12_result)); } TEST_F(FfElementTest, ReadFailsGivenNullPointer) { FqElemStr ff_elem_str; EXPECT_EQ(kEpidBadArgErr, ReadFfElement(nullptr, &ff_elem_str, sizeof(ff_elem_str), this->fq_a)); EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, nullptr, sizeof(ff_elem_str), this->fq_a)); EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, &ff_elem_str, sizeof(ff_elem_str), nullptr)); } TEST_F(FfElementTest, ReadFailsGivenInvalidBufferSize) { EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, &this->fq_qm1_str, 0, this->fq_a)); EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, &this->fq_qm1_str, std::numeric_limits::max(), this->fq_a)); } TEST_F(FfElementTest, ReadFailsGivenElementDoesNotBelongToFF) { // q does not belong to Fq EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq, &this->bn_q_str, sizeof(this->bn_q_str), this->fq_a)); } TEST_F(FfElementTest, Read256BitElementCorrectly) { // q-1 is valid element of Fq ASSERT_EQ(kEpidNoErr, ReadFfElement(this->fq, &this->fq_qm1_str, sizeof(this->fq_qm1_str), this->fq_a)); FqElemStr buf; EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, this->fq_a, &buf, sizeof(buf))); EXPECT_EQ(this->fq_qm1_str, buf); } TEST_F(FfElementTest, ReadIgnoreLeadingZerosForPrimeField) { // q-1 is valid element of Fq std::vector ff_elem_str = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2, 0x5E, 0xEE, 0x71, 0xA4, 0x9F, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x98, 0x0A, 0x82, 0xD3, 0x29, 0x2D, 0xDB, 0xAE, 0xD3, 0x30, 0x12}; ASSERT_EQ(kEpidNoErr, ReadFfElement(this->fq, ff_elem_str.data(), ff_elem_str.size(), this->fq_a)); FqElemStr buf; EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, this->fq_a, &buf, sizeof(buf))); EXPECT_EQ(this->fq_qm1_str, buf); } TEST_F(FfElementTest, ReadExpectExactSizeForFieldExtensions) { uint8_t buf[sizeof(Fq2ElemStr) + 1] = {0}; EXPECT_EQ(kEpidBadArgErr, ReadFfElement(this->fq2, buf, sizeof(buf), this->fq2_a)); } /////////////////////////////////////////////////////////////////////// // InitFfElementFromBn TEST_F(FfElementTest, InitFromBnFailsGivenNonPrimeField) { BigNumStr str = {0x01}; FfElementObj ffe(&this->fq2); BigNumObj bn(sizeof(str), str); EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(this->fq2, bn, ffe)); } TEST_F(FfElementTest, InitFromBnFailsGivenNullPointer) { BigNumStr str = {0x01}; FfElementObj ffe(&this->fq); BigNumObj bn(sizeof(str), str); EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(nullptr, bn, ffe)); EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(this->fq, nullptr, ffe)); EXPECT_EQ(kEpidBadArgErr, InitFfElementFromBn(this->fq, bn, nullptr)); } TEST_F(FfElementTest, InitFromBnInFieldElementCorrectly) { FfElementObj ffe(&this->fq); BigNumObj qm1_bn(this->bn_qm1_str); FqElemStr buf; EXPECT_EQ(kEpidNoErr, InitFfElementFromBn(this->fq, qm1_bn, ffe)); EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, ffe, &buf, sizeof(buf))); EXPECT_EQ(this->fq_qm1_str, buf); } TEST_F(FfElementTest, InitFromBnOutOfFieldElementCorrectly) { FfElementObj ffe(&this->fq); BigNumObj q_bn(this->bn_q_str); BigNumObj qp1_bn(this->bn_qp1_str); FqElemStr buf; EXPECT_EQ(kEpidNoErr, InitFfElementFromBn(this->fq, q_bn, ffe)); EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, ffe, &buf, sizeof(buf))); EXPECT_EQ(this->bn_0_str, buf); EXPECT_EQ(kEpidNoErr, InitFfElementFromBn(this->fq, qp1_bn, ffe)); EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, ffe, &buf, sizeof(buf))); EXPECT_EQ(this->bn_1_str, buf); } /////////////////////////////////////////////////////////////////////// // FfIsEqual TEST_F(FfElementTest, FfIsEqualFailsGivenArgumentsMismatch) { bool result; EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq12, this->fq_a, this->fq_b, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, this->fq12_g, this->fq_b, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, this->fq_a, this->fq12_h, &result)); } TEST_F(FfElementTest, FfIsEqualFailsGivenNullPointer) { bool result; EXPECT_EQ(kEpidBadArgErr, FfIsEqual(nullptr, this->fq_a, this->fq_a, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, nullptr, this->fq_a, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, this->fq_a, nullptr, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsEqual(this->fq, this->fq_a, this->fq_a, nullptr)); } TEST_F(FfElementTest, FfIsEqualCanCompareElementWithItself) { bool result; EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq, this->fq_a, this->fq_a, &result)); EXPECT_TRUE(result); } TEST_F(FfElementTest, Different256BitFiniteFieldElementsAreNotEqual) { bool result; EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq, this->fq_a, this->fq_b, &result)); EXPECT_FALSE(result); } TEST_F(FfElementTest, Same256BitFiniteFieldElementsAreEqual) { FfElementObj fq_a_local(&this->fq, &this->fq_a_str, sizeof(this->fq_a_str)); bool result; EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq, this->fq_a, fq_a_local, &result)); EXPECT_TRUE(result); } TEST_F(FfElementTest, DifferentFq12ElementsAreNotEqual) { bool result; EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq12, this->fq12_g, this->fq12_h, &result)); EXPECT_FALSE(result); } TEST_F(FfElementTest, SameFq12ElementsAreEqual) { FfElementObj fq12_g_local(&this->fq12, &this->fq12_g_str, sizeof(this->fq12_g_str)); bool result; EXPECT_EQ(kEpidNoErr, FfIsEqual(this->fq12, this->fq12_g, fq12_g_local, &result)); EXPECT_TRUE(result); } //////////////////////////////////////////////// // WriteFfElement TEST_F(FfElementTest, WriteFailsGivenArgumentsMismatch) { uint8_t buf[sizeof(Fq12ElemStr)] = {0}; EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq12, this->fq_a, buf, sizeof(Fq12ElemStr))); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq12_g, buf, sizeof(Fq12ElemStr))); } TEST_F(FfElementTest, WriteFailsGivenNullPointer) { FqElemStr ff_elem_str; EXPECT_EQ(kEpidBadArgErr, WriteFfElement(nullptr, this->fq_a, &ff_elem_str, sizeof(ff_elem_str))); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, nullptr, &ff_elem_str, sizeof(ff_elem_str))); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq_a, nullptr, sizeof(ff_elem_str))); } TEST_F(FfElementTest, WriteFailsGivenInvalidBufferSize) { FqElemStr ff_elem_str; EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str, 0)); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str, sizeof(ff_elem_str) - 1)); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str, std::numeric_limits::max())); } TEST_F(FfElementTest, WriteWorksGiven256BitElement) { FqElemStr ff_elem_str; EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str, sizeof(ff_elem_str))); EXPECT_EQ(this->fq_a_str, ff_elem_str); } TEST_F(FfElementTest, WritePadPrimeFieldElement) { FqElemStr ff_elem_str[2] = {0xcd}; EXPECT_EQ(kEpidNoErr, WriteFfElement(this->fq, this->fq_a, &ff_elem_str[0], sizeof(ff_elem_str))); EXPECT_EQ(this->fq_0_str, ff_elem_str[0]); EXPECT_EQ(this->fq_a_str, ff_elem_str[1]); } TEST_F(FfElementTest, WriteExpectExactSizeForFieldExtensions) { uint8_t buf[sizeof(Fq12ElemStr) + 1] = {0}; EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq12, this->fq12_g, buf, sizeof(Fq12ElemStr) + 1)); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq12, this->fq12_g, buf, sizeof(Fq12ElemStr) - 1)); EXPECT_EQ(kEpidBadArgErr, WriteFfElement(this->fq12, this->fq12_g, buf, sizeof(FqElemStr))); } /////////////////////////////////////////////////////////////////////// // FfNeg TEST_F(FfElementTest, FfNegFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq12, this->fq_a, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, this->fq12_g, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, this->fq_a, this->fq12_result)); } TEST_F(FfElementTest, FfNegFailsGivenNullPointer) { EXPECT_EQ(kEpidBadArgErr, FfNeg(nullptr, this->fq_a, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, nullptr, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfNeg(this->fq, this->fq_a, nullptr)); } TEST_F(FfElementTest, FfNegSucceedsGivenElementZero) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfNeg(this->fq, this->fq_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str) << "FfNeg: Negate element does not match to reference neg zero value"; } TEST_F(FfElementTest, FfNegSucceedsGivenNonZeroElement) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfNeg(this->fq, this->fq_a, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_neg_a_str, fq_r_str) << "FfNeg: Negate element does not match to reference neg value"; } //////////////////////////////////////////////// // FfIsZero TEST_F(FfElementTest, FfIsZeroFailsGivenNullPointer) { bool result = false; EXPECT_EQ(kEpidBadArgErr, FfIsZero(nullptr, this->fq_0, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq, nullptr, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq, this->fq_0, nullptr)); } TEST_F(FfElementTest, FfIsZeroFailsGivenArgumentsMismatch) { bool result; EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq12, this->fq_a, &result)); EXPECT_EQ(kEpidBadArgErr, FfIsZero(this->fq, this->fq12_g, &result)); } TEST_F(FfElementTest, FfIsZeroSucceedsGivenZeroElement) { bool result = false; EXPECT_EQ(kEpidNoErr, FfIsZero(this->fq, this->fq_0, &result)); EXPECT_TRUE(result); } TEST_F(FfElementTest, FfIsZeroSucceedsGivenNonZeroElement) { bool result = false; EXPECT_EQ(kEpidNoErr, FfIsZero(this->fq, this->fq_1, &result)); EXPECT_FALSE(result); } //////////////////////////////////////////////// // FfMul TEST_F(FfElementTest, FfMulFailsGivenNullPointer) { EXPECT_EQ(kEpidBadArgErr, FfMul(nullptr, this->fq_a, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, nullptr, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, this->fq_a, nullptr, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, this->fq_a, this->fq_b, nullptr)); } TEST_F(FfElementTest, FfMulFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq12, this->fq_a, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, this->fq12_g, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, this->fq_a, this->fq12_h, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq, this->fq_a, this->fq_b, this->fq12_result)); EXPECT_EQ(kEpidBadArgErr, FfMul(this->fq2, this->fq_a, this->fq2_a, this->fq2_result)); } TEST_F(FfElementTest, FfMulSucceedsGivenElementZero) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfMul(this->fq, this->fq_0, this->fq_b, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str); EXPECT_EQ(kEpidNoErr, FfMul(this->fq, this->fq_a, this->fq_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str); } TEST_F(FfElementTest, FfMulSucceedsGivenElementOne) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfMul(this->fq, this->fq_1, this->fq_b, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_b_str, fq_r_str); EXPECT_EQ(kEpidNoErr, FfMul(this->fq, this->fq_a, this->fq_1, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_a_str, fq_a_str); } TEST_F(FfElementTest, FfMulSucceedsGivenTwoElements) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfMul(this->fq, this->fq_a, this->fq_b, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_mul_ab_str, fq_r_str); Fq2ElemStr fq2_r_str; THROW_ON_EPIDERR( ReadFfElement(this->fq, &(fq_b_str), sizeof(fq_b_str), this->fq_b)); EXPECT_EQ(kEpidNoErr, FfMul(this->fq2, this->fq2_a, this->fq_b, this->fq2_result)); THROW_ON_EPIDERR(WriteFfElement(this->fq2, this->fq2_result, &fq2_r_str, sizeof(fq2_r_str))); EXPECT_EQ(this->fq2_mul_ab_str, fq2_r_str); Fq12ElemStr fq12_r_str; THROW_ON_EPIDERR(ReadFfElement(this->fq12, &(this->fq12_i_str), sizeof(this->fq12_i_str), this->fq12_i)); THROW_ON_EPIDERR(ReadFfElement(this->fq12, &(fq12_j_str), sizeof(fq12_j_str), this->fq12_j)); EXPECT_EQ(kEpidNoErr, FfMul(this->fq12, this->fq12_i, this->fq12_j, this->fq12_result)); THROW_ON_EPIDERR(WriteFfElement(this->fq12, this->fq12_result, &fq12_r_str, sizeof(fq12_r_str))); EXPECT_EQ(fq12_mul_ij_str, fq12_r_str); } //////////////////////////////////////////////// // FfSub TEST_F(FfElementTest, FfSubFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq12, this->fq_a, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, this->fq12_g, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, this->fq_a, this->fq12_h, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, this->fq_a, this->fq_b, this->fq12_result)); } TEST_F(FfElementTest, FfSubFailsGivenNullPtr) { EXPECT_EQ(kEpidBadArgErr, FfSub(nullptr, this->fq_a, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, nullptr, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, this->fq_a, nullptr, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSub(this->fq, this->fq_a, this->fq_b, nullptr)); } TEST_F(FfElementTest, FfSubSucceedsGivenElementZero) { FqElemStr fq_r_str = {0x0}; // additive identity EXPECT_EQ(kEpidNoErr, FfSub(this->fq, this->fq_a, this->fq_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_a_str, fq_r_str); EXPECT_EQ(kEpidNoErr, FfSub(this->fq, this->fq_0, this->fq_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str); } TEST_F(FfElementTest, FfSubSucceedsGivenTwoEqualElements) { FqElemStr fq_r_str = {0x0}; EXPECT_EQ(kEpidNoErr, FfSub(this->fq, this->fq_a, this->fq_a, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str); } TEST_F(FfElementTest, FfSubSucceedsGivenTwoElements) { FqElemStr fq_r_str = {0x0}; EXPECT_EQ(kEpidNoErr, FfSub(this->fq, this->fq_sum_ab, this->fq_b, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_a_str, fq_r_str); } TEST_F(FfElementTest, FfSubSucceedsGivenTwoElementsFq2) { FfElementObj a(&this->fq2, &this->bn_a_str, sizeof(this->bn_a_str)); FfElementObj b(&this->fq2, &this->bn_b_str, sizeof(this->bn_b_str)); FfElementObj sum_ab(&this->fq2, this->fq2_sum_ab_str); FfElementObj r(&this->fq2); EXPECT_EQ(kEpidNoErr, FfSub(this->fq2, sum_ab, b, r)); EXPECT_EQ(a, r); } TEST_F(FfElementTest, FfSubSucceedsGivenTwoElementsFq6) { FfElementObj a(&this->fq6, &this->bn_a_str, sizeof(this->bn_a_str)); FfElementObj b(&this->fq6, &this->bn_b_str, sizeof(this->bn_b_str)); FfElementObj sum_ab(&this->fq6, this->fq6_sum_ab_str); FfElementObj r(&this->fq6); EXPECT_EQ(kEpidNoErr, FfSub(this->fq6, sum_ab, b, r)); EXPECT_EQ(a, r); } TEST_F(FfElementTest, FfSubSucceedsGivenTwoElementsFq12) { FfElementObj a(&this->fq12, &this->bn_a_str, sizeof(this->bn_a_str)); FfElementObj b(&this->fq12, &this->bn_b_str, sizeof(this->bn_b_str)); FfElementObj sum_ab(&this->fq12, this->fq12_sum_ab_str); FfElementObj r(&this->fq12); EXPECT_EQ(kEpidNoErr, FfSub(this->fq12, sum_ab, b, r)); EXPECT_EQ(a, r); } //////////////////////////////////////////////// // FfAdd TEST_F(FfElementTest, FfAddFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq12, this->fq_a, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, this->fq12_g, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, this->fq_a, this->fq12_h, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, this->fq_a, this->fq_b, this->fq12_result)); } TEST_F(FfElementTest, FfAddFailsGivenNullPtr) { EXPECT_EQ(kEpidBadArgErr, FfAdd(nullptr, this->fq_a, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, nullptr, this->fq_b, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, this->fq_a, nullptr, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfAdd(this->fq, this->fq_a, this->fq_b, nullptr)); } TEST_F(FfElementTest, FfAddSucceedsGivenElementZero) { FqElemStr fq_r_str = {0x0}; // additive identity EXPECT_EQ(kEpidNoErr, FfAdd(this->fq, this->fq_a, this->fq_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_a_str, fq_r_str); EXPECT_EQ(kEpidNoErr, FfAdd(this->fq, this->fq_0, this->fq_b, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_b_str, fq_r_str); EXPECT_EQ(kEpidNoErr, FfAdd(this->fq, this->fq_0, this->fq_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str); } TEST_F(FfElementTest, FfAddSucceedsGivenTwoElements) { FqElemStr fq_r_str = {0x0}; EXPECT_EQ(kEpidNoErr, FfAdd(this->fq, this->fq_a, this->fq_b, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_sum_ab_str, fq_r_str); } TEST_F(FfElementTest, FfAddSucceedsGivenTwoElementsFq2) { FfElementObj a(&this->fq2, &this->bn_a_str, sizeof(this->bn_a_str)); FfElementObj b(&this->fq2, &this->bn_b_str, sizeof(this->bn_b_str)); FfElementObj r(&this->fq2); EXPECT_EQ(kEpidNoErr, FfAdd(this->fq2, a, b, r)); EXPECT_EQ(FfElementObj(&this->fq2, this->fq2_sum_ab_str), r); } TEST_F(FfElementTest, FfAddSucceedsGivenTwoElementsFq6) { FfElementObj a(&this->fq6, &this->bn_a_str, sizeof(this->bn_a_str)); FfElementObj b(&this->fq6, &this->bn_b_str, sizeof(this->bn_b_str)); FfElementObj r(&this->fq6); EXPECT_EQ(kEpidNoErr, FfAdd(this->fq6, a, b, r)); EXPECT_EQ(FfElementObj(&this->fq6, this->fq6_sum_ab_str), r); } TEST_F(FfElementTest, FfAddSucceedsGivenTwoElementsFq12) { FfElementObj a(&this->fq12, &this->bn_a_str, sizeof(this->bn_a_str)); FfElementObj b(&this->fq12, &this->bn_b_str, sizeof(this->bn_b_str)); FfElementObj r(&this->fq12); EXPECT_EQ(kEpidNoErr, FfAdd(this->fq12, a, b, r)); EXPECT_EQ(FfElementObj(&this->fq12, this->fq12_sum_ab_str), r); } //////////////////////////////////////////////// // FfInv TEST_F(FfElementTest, FfInvFailsGivenNullPointer) { EXPECT_EQ(kEpidBadArgErr, FfInv(nullptr, (this->fq_a), this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, nullptr, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, this->fq_a, nullptr)); } TEST_F(FfElementTest, FfInvFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq12, this->fq_a, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, this->fq12_g, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfInv(this->fq, this->fq_a, this->fq12_result)); } TEST_F(FfElementTest, FfInvFailsGivenElementZero) { EXPECT_EQ(kEpidDivByZeroErr, FfInv(this->fq, this->fq_0, this->fq_result)); } TEST_F(FfElementTest, FfInvSucceedsGivenElementOne) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfInv(this->fq, this->fq_1, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_1_str, fq_r_str); } TEST_F(FfElementTest, FfInvSucceedsGivenAnElement) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfInv(this->fq, this->fq_a, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_inv_a_str, fq_r_str); } //////////////////////////////////////////////// // FfExp TEST_F(FfElementTest, FfExpFailsGivenNullPointer) { EXPECT_EQ(kEpidBadArgErr, FfExp(nullptr, this->fq_a, this->bn_a, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq, nullptr, this->bn_a, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq, this->fq_a, nullptr, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq, this->fq_a, this->bn_a, nullptr)); } TEST_F(FfElementTest, FfExpFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq12, this->fq_a, this->bn_0, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq, this->fq12_g, this->bn_0, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfExp(this->fq, this->fq_a, this->bn_0, this->fq12_result)); } TEST_F(FfElementTest, FfExpSucceedsGivenElementZero) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfExp(this->fq, this->fq_0, this->bn_a, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_0_str, fq_r_str); } TEST_F(FfElementTest, FfExpSucceedsGivenExponentZero) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfExp(this->fq, this->fq_a, this->bn_0, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_1_str, fq_r_str); } TEST_F(FfElementTest, FfExpSucceedsGivenElementOne) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfExp(this->fq, this->fq_1, this->bn_a, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_1_str, fq_r_str); } TEST_F(FfElementTest, FfExpSucceedsGivenExponentOne) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfExp(this->fq, this->fq_a, this->bn_1, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_a_str, fq_r_str); } TEST_F(FfElementTest, FfExpSucceedsGivenAnElement) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfExp(this->fq, this->fq_a, this->bn_a, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_exp_ab_str, fq_r_str); Fq12ElemStr fq12_r_str; BigNumObj bn_pm1(sizeof(this->fp_pm1_str), this->fp_pm1_str); EXPECT_EQ(kEpidNoErr, FfExp(this->fq12, this->fq12_k, bn_pm1, this->fq12_result)); THROW_ON_EPIDERR(WriteFfElement(this->fq12, this->fq12_result, &fq12_r_str, sizeof(fq12_r_str))); EXPECT_EQ(this->fq12_mul_gb_str, fq12_r_str); } //////////////////////////////////////////////// // FfHash TEST_F(FfElementTest, FfHashFailsGivenArgumentsMismatch) { EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq12, this->sha_msg, sizeof(this->sha_msg), kSha256, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, this->sha_msg, sizeof(this->sha_msg), kSha256, this->fq12_result)); } TEST_F(FfElementTest, FfHashFailsGivenNullPointer) { uint8_t const msg[] = {0}; EXPECT_EQ(kEpidBadArgErr, FfHash(nullptr, msg, sizeof(msg), kSha256, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, nullptr, sizeof(msg), kSha256, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, msg, sizeof(msg), kSha256, nullptr)); } TEST_F(FfElementTest, FfHashFailsGivenUnsupportedHashAlg) { uint8_t const msg[] = {0}; EXPECT_EQ(kEpidHashAlgorithmNotSupported, FfHash(this->fq, msg, sizeof(msg), kSha3_256, this->fq_result)); EXPECT_EQ(kEpidHashAlgorithmNotSupported, FfHash(this->fq, msg, sizeof(msg), kSha3_384, this->fq_result)); EXPECT_EQ(kEpidHashAlgorithmNotSupported, FfHash(this->fq, msg, sizeof(msg), kSha3_512, this->fq_result)); } TEST_F(FfElementTest, FfHashFailsGivenIncorrectMsgLen) { uint8_t const msg[] = {0}; size_t len_greater_int_max = (size_t)INT_MAX + 1; EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, msg, 0, kSha256, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, msg, std::numeric_limits::max(), kSha256, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfHash(this->fq, msg, len_greater_int_max, kSha256, this->fq_result)); } TEST_F(FfElementTest, FfHashWorksGivenSHA256HashAlg) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha256, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_abc_sha256_str, fq_r_str) << "FfHash: Hash element does not match to reference value"; } TEST_F(FfElementTest, FfHashWorksGivenSHA384HashAlg) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha384, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_abc_sha384_str, fq_r_str) << "FfHash: Hash element does not match to reference value"; } TEST_F(FfElementTest, FfHashWorksGivenSHA512HashAlg) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha512, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_abc_sha512_str, fq_r_str) << "FfHash: Hash element does not match to reference value"; } TEST_F(FfElementTest, FfHashWorksGivenSHA512256HashAlg) { FqElemStr fq_r_str; EXPECT_EQ(kEpidNoErr, FfHash(this->fq, sha_msg, sizeof(sha_msg), kSha512_256, this->fq_result)); THROW_ON_EPIDERR( WriteFfElement(this->fq, this->fq_result, &fq_r_str, sizeof(fq_r_str))); EXPECT_EQ(this->fq_abc_sha512256_str, fq_r_str) << "FfHash: Hash element does not match to reference value"; } //////////////////////////////////////////////// // FfMultiExp TEST_F(FfElementTest, FfMultiExpFailsGivenArgumentsMismatch) { FfElement const* p[] = {this->fq_a, this->fq_b}; FfElement const* p12[] = {this->fq12_g, this->fq12_h}; BigNumStr const* b[] = {&this->bn_0_str, &this->bn_0_str}; EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq12, p, b, 2, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p12, b, 2, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, 2, this->fq12_result)); } TEST_F(FfElementTest, FfMultiExpFailsGivenNullPointer) { FfElement const* p[] = {this->fq_a, this->fq_b}; FfElement const* p_withnull[] = {nullptr, this->fq_b}; BigNumStr const* b[] = {&fq_multi_exp_exp_2[0], &this->fq_multi_exp_exp_2[1]}; BigNumStr const* b_withnull[] = {nullptr, &this->fq_multi_exp_exp_2[1]}; size_t m = 2; EXPECT_EQ(kEpidBadArgErr, FfMultiExp(nullptr, p, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, nullptr, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, nullptr, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, m, nullptr)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p_withnull, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b_withnull, m, this->fq_result)); } TEST_F(FfElementTest, FfMultiExpFailsGivenIncorrectMLen) { FfElement const* p[] = {this->fq_a, this->fq_b}; BigNumStr const* b[] = {&this->fq_multi_exp_exp_2[0], &this->fq_multi_exp_exp_2[1]}; size_t len_greater_int_max = (size_t)INT_MAX + 1; EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, 0, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, std::numeric_limits::max(), this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExp(this->fq, p, b, len_greater_int_max, this->fq_result)); } TEST_F(FfElementTest, FfMultiExpWorksGivenOneExponent) { FfElementObj r(&this->fq); FfElementObj fq_exp[1]; FfElement const* p[1]; BigNumStr const* b[1]; int m = 0; // prepare data for test for (m = 0; m < 1; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_1[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_1[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 1, r)); // verify calculation is correct EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_1), r) << "FfMultiExp: Finite field element does not match with reference value"; } TEST_F(FfElementTest, FfMultiExpWorksGivenTwoExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[2]; FfElement const* p[2]; BigNumStr const* b[2]; int m = 0; // prepare data for test for (m = 0; m < 2; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_2[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_2[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 2, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_2), r) << "FfMultiExp: Finite field element does not match with reference value"; } TEST_F(FfElementTest, FfMultiExpWorksGivenThreeExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[3]; FfElement const* p[3]; BigNumStr const* b[3]; int m = 0; // prepare data for test for (m = 0; m < 3; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_3[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_3[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 3, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_3), r) << "FfMultiExp: Finite field element does not match with reference value"; } TEST_F(FfElementTest, FfMultiExpWorksGivenFourExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[4]; FfElement const* p[4]; BigNumStr const* b[4]; int m = 0; // prepare data for test for (m = 0; m < 4; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_4[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_4[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 4, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_4), r) << "FfMultiExp: Finite field element does not match with reference value"; } TEST_F(FfElementTest, FfMultiExpWorksGivenFourFq12Exponents) { FfElementObj r12(&this->fq12); FfElementObj fq12_exp[4]; FfElement const* p[4]; BigNumStr const* b[4]; int m = 0; // prepare data for test for (m = 0; m < 4; m++) { fq12_exp[m] = FfElementObj(&this->fq12, this->fq12_multi_exp_base_4[m]); // initialize data for test p[m] = fq12_exp[m]; b[m] = &this->fq12_multi_exp_exp_4[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq12, p, b, 4, r12)); EXPECT_EQ(FfElementObj(&this->fq12, this->fq12_multi_exp_res_4), r12) << "FfMultiExp: Finite field element does not match with reference value"; } TEST_F(FfElementTest, FfMultiExpWorksGivenFiveExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[5]; FfElement const* p[5]; BigNumStr const* b[5]; int m = 0; // prepare data for test for (m = 0; m < 5; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_5[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_5[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 5, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_5), r) << "FfMultiExp: Finite field element does not match with reference value"; } TEST_F(FfElementTest, FfMultiExpWorksGivenSixExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[6]; FfElement const* p[6]; BigNumStr const* b[6]; int m = 0; // prepare data for test for (m = 0; m < 6; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_6[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_6[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExp(this->fq, p, b, 6, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_6), r) << "FfMultiExp: Finite field element does not match with reference value"; } /////////////////////////////////////////////////////////////////////// // FfMultiExpBn TEST_F(FfElementTest, FfMultiExpBnFailsGivenArgumentsMismatch) { FfElement const* p[] = {this->fq_a, this->fq_b}; FfElement const* p12[] = {this->fq12_g, this->fq12_h}; BigNum const* b[] = {bn_0, bn_0}; EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq12, p, b, 2, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p12, b, 2, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, 2, this->fq12_result)); } TEST_F(FfElementTest, FfMultiExpBnFailsGivenNullPointer) { FfElement const* p[] = {this->fq_a, this->fq_b}; FfElement const* p_withnull[] = {nullptr, this->fq_b}; BigNumObj bn_exp_0(this->fq_multi_exp_exp_2[0]); BigNumObj bn_exp_1(this->fq_multi_exp_exp_2[1]); BigNum const* b[] = {bn_exp_0, bn_exp_1}; BigNum const* b_withnull[] = {nullptr, bn_exp_1}; size_t m = 2; EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(nullptr, p, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, nullptr, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, nullptr, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, m, nullptr)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p_withnull, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b_withnull, m, this->fq_result)); } TEST_F(FfElementTest, FfMultiExpBnFailsGivenIncorrectMLen) { FfElement const* p[] = {this->fq_a, this->fq_b}; BigNumObj bn_exp_0(this->fq_multi_exp_exp_2[0]); BigNumObj bn_exp_1(this->fq_multi_exp_exp_2[1]); BigNum const* b[] = {bn_exp_0, bn_exp_1}; size_t len_greater_int_max = (size_t)INT_MAX + 1; EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, 0, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, std::numeric_limits::max(), this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfMultiExpBn(this->fq, p, b, len_greater_int_max, this->fq_result)); } TEST_F(FfElementTest, FfMultiExpBnWorksGivenOneExponent) { const int items = 1; FfElementObj r(&this->fq); FfElementObj fq_base[1]; BigNumObj bn_exp[1]; FfElement const* p[1]; BigNum const* b[1]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_1[m]); bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_1[m]); // initialize data for test p[m] = fq_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_1), r) << "FfMultiExpBn: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, FfMultiExpBnWorksGivenTwoExponents) { const int items = 2; FfElementObj r(&this->fq); FfElementObj fq_base[2]; BigNumObj bn_exp[2]; FfElement const* p[2]; BigNum const* b[2]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_2[m]); bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_2[m]); // initialize data for test p[m] = fq_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_2), r) << "FfMultiExpBn: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, FfMultiExpBnWorksGivenThreeExponents) { const int items = 3; FfElementObj r(&this->fq); FfElementObj fq_base[3]; BigNumObj bn_exp[3]; FfElement const* p[3]; BigNum const* b[3]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_3[m]); bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_3[m]); // initialize data for test p[m] = fq_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_3), r) << "FfMultiExpBn: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, FfMultiExpBnWorksGivenFourExponents) { const int items = 4; FfElementObj r(&this->fq); FfElementObj fq_base[4]; BigNumObj bn_exp[4]; FfElement const* p[4]; BigNum const* b[4]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_4[m]); bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_4[m]); // initialize data for test p[m] = fq_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_4), r) << "FfMultiExpBn: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, DISABLED_FfMultiExpBnWorksGivenFourFq12Exponents) { const int items = 4; FfElementObj fq12_r(&this->fq12); FfElementObj fq12_base[4]; BigNumObj fq12_bn_exp[4]; FfElement const* fq12_p[4]; BigNum const* fq12_b[4]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq12_base[m] = FfElementObj(&this->fq12, this->fq12_multi_exp_base_4[m]); fq12_bn_exp[m] = BigNumObj(this->fq12_multi_exp_exp_4[m]); // initialize data for test fq12_p[m] = fq12_base[m]; fq12_b[m] = fq12_bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq12, fq12_p, fq12_b, items, fq12_r)); EXPECT_EQ(FfElementObj(&this->fq12, this->fq_multi_exp_res_4), fq12_r) << "FfMultiExpBn: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, FfMultiExpBnWorksGivenFiveExponents) { const int items = 5; FfElementObj r(&this->fq); FfElementObj fq_base[5]; BigNumObj bn_exp[5]; FfElement const* p[5]; BigNum const* b[5]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_5[m]); bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_5[m]); // initialize data for test p[m] = fq_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_5), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, FfMultiExpBnWorksGivenSixExponents) { const int items = 6; FfElementObj r(&this->fq); FfElementObj fq_base[6]; BigNumObj bn_exp[6]; FfElement const* p[6]; BigNum const* b[6]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { fq_base[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_6[m]); bn_exp[m] = BigNumObj(this->fq_multi_exp_exp_6[m]); // initialize data for test p[m] = fq_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->fq, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_6), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, FfMultiExpBnWorksOverEpid11GT) { const int items = 3; FfElementObj r(&this->epid11_GT); FfElementObj ff_base[3]; BigNumObj bn_exp[3]; FfElement const* p[3]; BigNum const* b[3]; int m = 0; // prepare data for test for (m = 0; m < items; m++) { ff_base[m] = FfElementObj(&this->epid11_GT, this->epid11_GT_multi_exp_base_3[m]); bn_exp[m] = BigNumObj(this->epid11_GT_multi_exp_exp_3[m]); // initialize data for test p[m] = ff_base[m]; b[m] = bn_exp[m]; } // do test EXPECT_EQ(kEpidNoErr, FfMultiExpBn(this->epid11_GT, p, b, items, r)); EXPECT_EQ(FfElementObj(&this->epid11_GT, this->epid11_GT_multi_exp_res_3), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } /////////////////////////////////////////////////////////////////////// // FfSscmMultiExp TEST_F(FfElementTest, SscmFfMultiExpFailsGivenArgumentsMismatch) { FfElement const* p[] = {this->fq_a, this->fq_b}; FfElement const* p12[] = {this->fq12_g, this->fq12_h}; BigNumStr const* b[] = {&this->bn_0_str, &this->bn_0_str}; EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq12, p, b, 2, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p12, b, 2, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, 2, this->fq12_result)); } TEST_F(FfElementTest, SscmFfMultiExpFailsGivenNullPointer) { FfElement const* p[] = {this->fq_a, this->fq_b}; FfElement const* p_withnull[] = {nullptr, this->fq_b}; BigNumStr const* b[] = {&this->fq_multi_exp_exp_2[0], &this->fq_multi_exp_exp_2[1]}; BigNumStr const* b_withnull[] = {nullptr, &this->fq_multi_exp_exp_2[1]}; size_t m = 2; EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(nullptr, p, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, nullptr, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, nullptr, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, m, nullptr)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p_withnull, b, m, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b_withnull, m, this->fq_result)); } TEST_F(FfElementTest, SscmFfMultiExpFailsGivenIncorrectMLen) { FfElement const* p[] = {this->fq_a, this->fq_b}; BigNumStr const* b[] = {&this->fq_multi_exp_exp_2[0], &this->fq_multi_exp_exp_2[1]}; size_t len_greater_int_max = (size_t)INT_MAX + 1; EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, 0, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, std::numeric_limits::max(), this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfSscmMultiExp(this->fq, p, b, len_greater_int_max, this->fq_result)); } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenOneExponent) { FfElementObj r(&this->fq); FfElementObj fq_exp[1]; FfElement const* p[1]; BigNumStr const* b[1]; int m = 0; // prepare data for test for (m = 0; m < 1; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_1[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_1[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 1, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_1), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenTwoExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[2]; FfElement const* p[2]; BigNumStr const* b[2]; int m = 0; // prepare data for test for (m = 0; m < 2; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_2[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_2[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 2, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_2), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenThreeExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[3]; FfElement const* p[3]; BigNumStr const* b[3]; int m = 0; // prepare data for test for (m = 0; m < 3; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_3[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_3[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 3, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_3), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenFourExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[4]; FfElement const* p[4]; BigNumStr const* b[4]; int m = 0; // prepare data for test for (m = 0; m < 4; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_4[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_4[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 4, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_4), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenFourFq12Exponents) { FfElementObj r12(&this->fq12); FfElementObj fq12_exp[4]; FfElement const* p[4]; BigNumStr const* b[4]; int m = 0; // prepare data for test for (m = 0; m < 4; m++) { fq12_exp[m] = FfElementObj(&this->fq12, this->fq12_multi_exp_base_4[m]); // initialize data for test p[m] = fq12_exp[m]; b[m] = &this->fq12_multi_exp_exp_4[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq12, p, b, 4, r12)); EXPECT_EQ(FfElementObj(&this->fq12, this->fq12_multi_exp_res_4), r12) << "FfSscmMultiExp: Finite field element does not match with reference " "value"; } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenFiveExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[5]; FfElement const* p[5]; BigNumStr const* b[5]; int m = 0; // prepare data for test for (m = 0; m < 5; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_5[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_5[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 5, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_5), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } TEST_F(FfElementTest, SscmFfMultiExpWorksGivenSixExponents) { FfElementObj r(&this->fq); FfElementObj fq_exp[6]; FfElement const* p[6]; BigNumStr const* b[6]; int m = 0; // prepare data for test for (m = 0; m < 6; m++) { fq_exp[m] = FfElementObj(&this->fq, this->fq_multi_exp_base_6[m]); // initialize data for test p[m] = fq_exp[m]; b[m] = &this->fq_multi_exp_exp_6[m]; } // do test EXPECT_EQ(kEpidNoErr, FfSscmMultiExp(this->fq, p, b, 6, r)); EXPECT_EQ(FfElementObj(&this->fq, this->fq_multi_exp_res_6), r) << "FfSscmMultiExp: Finite field element does not " "match with reference value"; } //////////////////////////////////////////////// // FfGetRandom TEST_F(FfElementTest, FfGetRandomFailsGivenArgumentsMismatch) { Prng my_prng; EXPECT_EQ(kEpidBadArgErr, FfGetRandom(this->fq12, &this->bn_1_str, &Prng::Generate, &my_prng, this->fq_result)); EXPECT_EQ(kEpidBadArgErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate, &my_prng, this->fq12_result)); } TEST_F(FfElementTest, FfGetRandomFailsGivenNullPtr) { Prng my_prng; FfElementObj r(&this->fq); EXPECT_EQ(kEpidBadArgErr, FfGetRandom(nullptr, &this->bn_1_str, &Prng::Generate, &my_prng, r)); EXPECT_EQ(kEpidBadArgErr, FfGetRandom(this->fq, nullptr, &Prng::Generate, &my_prng, r)); EXPECT_EQ(kEpidBadArgErr, FfGetRandom(this->fq, &this->bn_1_str, nullptr, &my_prng, r)); EXPECT_EQ(kEpidBadArgErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate, &my_prng, nullptr)); } TEST_F(FfElementTest, FfGetRandomSucceedsGivenFq2) { Prng my_prng; FfElementObj r(&this->fq2); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq2, &this->bn_1_str, &Prng::Generate, &my_prng, r)); } TEST_F(FfElementTest, FfGetRandomSucceedsGivenFq6) { Prng my_prng; FfElementObj r(&this->fq6); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq6, &this->bn_1_str, &Prng::Generate, &my_prng, r)); } TEST_F(FfElementTest, FfGetRandomSucceedsGivenFq12) { Prng my_prng; FfElementObj r(&this->fq12); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq12, &this->bn_1_str, &Prng::Generate, &my_prng, r)); } TEST_F(FfElementTest, FfGetRandomSuccedsGivenLowBound) { Prng my_prng; FfElementObj r(&this->fq); FqElemStr buf; unsigned int result; EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate, &my_prng, r)); THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf))); THROW_ON_EPIDERR(Cmp_OctStr256(&this->bn_1_str.data, &buf.data, &result)); EXPECT_EQ(result, (unsigned int)2); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_2_str, &Prng::Generate, &my_prng, r)); THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf))); THROW_ON_EPIDERR(Cmp_OctStr256(&this->bn_2_str.data, &buf.data, &result)); EXPECT_EQ(result, (unsigned int)2); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_0xffff_str, &Prng::Generate, &my_prng, r)); THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf))); THROW_ON_EPIDERR( Cmp_OctStr256(&this->bn_0xffff_str.data, &buf.data, &result)); EXPECT_EQ(result, (unsigned int)2); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_0xffff_str, &Prng::Generate, &my_prng, r)); THROW_ON_EPIDERR(WriteFfElement(this->fq, r, &buf, sizeof(buf))); THROW_ON_EPIDERR( Cmp_OctStr256(&this->bn_0xffff_str.data, &buf.data, &result)); EXPECT_EQ(result, (unsigned int)2); } TEST_F(FfElementTest, FfGetRandomGeneratesDifferentNumbers) { Prng my_prng; FfElementObj r1(&this->fq); FfElementObj r2(&this->fq); bool result; EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate, &my_prng, r1)); EXPECT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_1_str, &Prng::Generate, &my_prng, r2)); THROW_ON_EPIDERR(FfIsEqual(this->fq, r1, r2, &result)); EXPECT_FALSE(result); } TEST_F(FfElementTest, FfGetRandomFailsOnMaxIterGivenLargeLowBound) { Prng my_prng; FfElementObj r(&this->fq); // FfGetRandom generates random data between [low_bound, modulus-1] // modulus in this case is Intel(R) EPID 2.0 parameter q // giving low_bound = modulus - {0x30, 0x13} should get kEpidRandMaxIterErr EXPECT_EQ(kEpidRandMaxIterErr, FfGetRandom(this->fq, &this->fq_qm0x3013_str, &Prng::Generate, &my_prng, r)); } //////////////////////////////////////////////// // FfSqrt TEST_F(FfElementTest, FfSqrtFailsGivenNullPtr) { FfElementObj r(&this->fq); EXPECT_EQ(kEpidBadArgErr, FfSqrt(nullptr, this->fq_4, r)); EXPECT_EQ(kEpidBadArgErr, FfSqrt(this->fq, nullptr, r)); EXPECT_EQ(kEpidBadArgErr, FfSqrt(this->fq, this->fq_4, nullptr)); } TEST_F(FfElementTest, FfSqrtWorksForOne) { FfElementObj r(&this->fq); FfElementObj s(&this->fq); EXPECT_EQ(kEpidNoErr, FfSqrt(this->fq, this->fq_1, r)); EXPECT_EQ(this->fq_1, r); } TEST_F(FfElementTest, FfSqrtFailsForTwo) { FfElementObj r(&this->fq); EXPECT_EQ(kEpidMathQuadraticNonResidueError, FfSqrt(this->fq, this->fq_2, r)); } TEST_F(FfElementTest, FfSqrtFailsForThree) { FfElementObj r(&this->fq); EXPECT_EQ(kEpidMathQuadraticNonResidueError, FfSqrt(this->fq, this->fq_3, r)); } TEST_F(FfElementTest, FfSqrtWorksForFour) { FfElementObj r(&this->fq); EXPECT_EQ(kEpidNoErr, FfSqrt(this->fq, this->fq_4, r)); EXPECT_EQ(this->fq_qm2, r); } TEST_F(FfElementTest, FfSqrtFailsForFive) { FfElementObj r(&this->fq); EXPECT_EQ(kEpidMathQuadraticNonResidueError, FfSqrt(this->fq, this->fq_5, r)); } TEST_F(FfElementTest, FfSqrtWorksForEpid11Prime) { // given b_str value ensure sqrt algorithm step 7 if clause is triggered const BigNumStr b_str = {0x06, 0xc1, 0x26, 0xe8, 0xa5, 0xa5, 0x21, 0x19, 0x07, 0x42, 0x49, 0x77, 0x7c, 0x5c, 0x98, 0x7f, 0xd4, 0x0c, 0x42, 0xf5, 0x25, 0x2c, 0xac, 0xb9, 0x7e, 0x09, 0x70, 0xf0, 0x84, 0x3b, 0x81, 0x46}; FfElementObj b(&this->epid11_fq, &b_str, sizeof((b_str))); FfElementObj r(&this->epid11_fq); FfElementObj s(&this->epid11_fq); FfElementObj r2(&this->epid11_fq); EXPECT_EQ(kEpidNoErr, FfMul(this->epid11_fq, b, b, s)); EXPECT_EQ(kEpidNoErr, FfSqrt(this->epid11_fq, s, r)); EXPECT_EQ(kEpidNoErr, FfMul(this->epid11_fq, r, r, r2)); EXPECT_EQ(s, r2); } TEST_F(FfElementTest, FfSqrtReturnsARoot) { Prng my_prng; FfElementObj r(&this->fq); FfElementObj b(&this->fq); FfElementObj s(&this->fq); FfElementObj r2(&this->fq); unsigned int i; for (i = 0; i < 1000; i++) { ASSERT_EQ(kEpidNoErr, FfGetRandom(this->fq, &this->bn_2_str, &Prng::Generate, &my_prng, b)); ASSERT_EQ(kEpidNoErr, FfMul(this->fq, b, b, s)); ASSERT_EQ(kEpidNoErr, FfSqrt(this->fq, s, r)); ASSERT_EQ(kEpidNoErr, FfMul(this->fq, r, r, r2)); ASSERT_EQ(s, r2); } } TEST_F(FfElementTest, FfSqrtReturnsARootInEpid11) { Prng my_prng; FfElementObj r(&this->epid11_fq); FfElementObj b(&this->epid11_fq); FfElementObj s(&this->epid11_fq); FfElementObj r2(&this->epid11_fq); unsigned int i; for (i = 0; i < 1000; i++) { ASSERT_EQ(kEpidNoErr, FfGetRandom(this->epid11_fq, &this->bn_2_str, &Prng::Generate, &my_prng, b)); ASSERT_EQ(kEpidNoErr, FfMul(this->epid11_fq, b, b, s)); ASSERT_EQ(kEpidNoErr, FfSqrt(this->epid11_fq, s, r)); ASSERT_EQ(kEpidNoErr, FfMul(this->epid11_fq, r, r, r2)); ASSERT_EQ(s, r2); } } TEST_F(FfElementTest, FfSqrtReturnsARoot224Prime) { const BigNumStr prime_224r1 = { 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; FiniteFieldObj f_q(prime_224r1); Prng my_prng; FfElementObj r(&f_q); FfElementObj b(&f_q); FfElementObj s(&f_q); FfElementObj r2(&f_q); unsigned int i; for (i = 0; i < 100; i++) { EXPECT_EQ(kEpidNoErr, FfGetRandom(f_q, &this->bn_2_str, &Prng::Generate, &my_prng, b)); EXPECT_EQ(kEpidNoErr, FfMul(f_q, b, b, s)); EXPECT_EQ(kEpidNoErr, FfSqrt(f_q, s, r)); EXPECT_EQ(kEpidNoErr, FfMul(f_q, r, r, r2)); EXPECT_EQ(s, r2); } } } // namespace