|
8 | 8 | * @copyright MIT license (see LICENSE file)
|
9 | 9 | *****************************************************************************/
|
10 | 10 | #include "libff/algebra/field_utils/bigint.hpp"
|
| 11 | +#include "libff/algebra/field_utils/field_utils.hpp" |
11 | 12 | #include "libff/algebra/field_utils/algorithms.hpp"
|
12 | 13 | #include "libff/algebra/fields/binary/gf64.hpp"
|
| 14 | +#include "libff/algebra/curves/edwards/edwards_fields.hpp" |
13 | 15 | #include <gtest/gtest.h>
|
14 | 16 |
|
15 | 17 | using namespace libff;
|
16 | 18 |
|
| 19 | +using std::size_t; |
| 20 | + |
17 | 21 | template<typename FieldT>
|
18 | 22 | FieldT power_naive(const FieldT &base, const std::size_t exponent)
|
19 | 23 | {
|
@@ -98,3 +102,56 @@ TEST(FieldUtilsTest, BigintTest)
|
98 | 102 | x.clear();
|
99 | 103 | EXPECT_EQ(x, zero);
|
100 | 104 | }
|
| 105 | + |
| 106 | +TEST(FieldUtilsTest, FieldVectorConversionTest) |
| 107 | +{ |
| 108 | + init_edwards_fields(); |
| 109 | + |
| 110 | + // pack_bit_vector_into_field_element_vector |
| 111 | + |
| 112 | + bit_vector vec; |
| 113 | + for (size_t i = 0; i < 12 + edwards_Fq::ceil_size_in_bits(); i++) |
| 114 | + vec.push_back(0); |
| 115 | + vec.push_back(1); |
| 116 | + vec.push_back(0); |
| 117 | + vec.push_back(1); |
| 118 | + |
| 119 | + std::vector<edwards_Fq> field_vec = pack_bit_vector_into_field_element_vector<edwards_Fq>(vec); |
| 120 | + |
| 121 | + EXPECT_EQ(field_vec.size(), 2); |
| 122 | + EXPECT_EQ(field_vec[0], edwards_Fq::zero()); |
| 123 | + EXPECT_EQ(field_vec[1], edwards_Fq(40960)); // 5 * 2**13 |
| 124 | + |
| 125 | + // convert_bit_vector_to_field_element_vector |
| 126 | + |
| 127 | + bit_vector vec2; |
| 128 | + vec2.push_back(0); |
| 129 | + vec2.push_back(0); |
| 130 | + vec2.push_back(1); |
| 131 | + vec2.push_back(0); |
| 132 | + vec2.push_back(1); |
| 133 | + |
| 134 | + field_vec = convert_bit_vector_to_field_element_vector<edwards_Fq>(vec2); |
| 135 | + |
| 136 | + EXPECT_EQ(field_vec.size(), 5); |
| 137 | + EXPECT_EQ(field_vec[0], edwards_Fq::zero()); |
| 138 | + EXPECT_EQ(field_vec[1], edwards_Fq::zero()); |
| 139 | + EXPECT_EQ(field_vec[2], edwards_Fq::one()); |
| 140 | + EXPECT_EQ(field_vec[3], edwards_Fq::zero()); |
| 141 | + EXPECT_EQ(field_vec[4], edwards_Fq::one()); |
| 142 | + |
| 143 | + // convert_field_element_vector_to_bit_vector |
| 144 | + |
| 145 | + std::vector<edwards_Fq> field_vec2; |
| 146 | + field_vec2.push_back(edwards_Fq(edwards_Fq(5))); |
| 147 | + field_vec2.push_back(edwards_Fq::zero()); |
| 148 | + |
| 149 | + bit_vector vec3 = convert_field_element_vector_to_bit_vector(field_vec2); |
| 150 | + |
| 151 | + EXPECT_EQ(vec3.size(), edwards_Fq::ceil_size_in_bits() * 2); |
| 152 | + EXPECT_EQ(vec3[0], 1); |
| 153 | + EXPECT_EQ(vec3[1], 0); |
| 154 | + EXPECT_EQ(vec3[2], 1); |
| 155 | + for (size_t i = 3; i < vec3.size(); i++) |
| 156 | + EXPECT_EQ(vec3[i], 0); |
| 157 | +} |
0 commit comments