diff --git a/context_test.cc b/context_test.cc
index 73436a9..9f35334 100644
--- a/context_test.cc
+++ b/context_test.cc
@@ -33,7 +33,7 @@ TYPED_TEST_SUITE(ContextTest, rlwe::testing::ModularIntTypes);
TYPED_TEST(ContextTest, CreateWorks) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
}
@@ -41,7 +41,7 @@ TYPED_TEST(ContextTest, CreateWorks) {
TYPED_TEST(ContextTest, ParametersMatch) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
diff --git a/error_params_test.cc b/error_params_test.cc
index fe1fd55..7cc3c8b 100644
--- a/error_params_test.cc
+++ b/error_params_test.cc
@@ -120,7 +120,7 @@ TYPED_TEST_SUITE(ErrorParamsTest, rlwe::testing::ModularIntTypes);
TYPED_TEST(ErrorParamsTest, CreateError) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
@@ -140,7 +140,7 @@ TYPED_TEST(ErrorParamsTest, CreateError) {
TYPED_TEST(ErrorParamsTest, PlaintextError) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
@@ -161,7 +161,7 @@ TYPED_TEST(ErrorParamsTest, PlaintextError) {
TYPED_TEST(ErrorParamsTest, EncryptionError) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key, this->SampleKey(context.get()));
@@ -186,7 +186,7 @@ TYPED_TEST(ErrorParamsTest, EncryptionError) {
TYPED_TEST(ErrorParamsTest, RelinearizationErrorScalesWithT) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
// Error scales by (T / logT) when all other constants are fixed.
diff --git a/galois_key_test.cc b/galois_key_test.cc
index 022ddd5..b73a4d4 100644
--- a/galois_key_test.cc
+++ b/galois_key_test.cc
@@ -17,6 +17,7 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
+#include <google/protobuf/util/message_differencer.h>
#include "constants.h"
#include "montgomery.h"
#include "ntt_parameters.h"
@@ -408,7 +409,7 @@ TEST_F(GaloisKeyTest, SerializationsOfIdentialKeysEqual) {
ASSERT_OK_AND_ASSIGN(auto serialized_copy, galois_key_copy.Serialize());
// Check that two serializations of the same matrix are equal.
- EXPECT_THAT(serialized_copy, EqualsProto(serialized));
+ EXPECT_EQ(serialized_copy.SerializeAsString(), serialized.SerializeAsString());
}
} // namespace
diff --git a/int256.cc b/int256.cc
index 1096c98..f9a40fc 100644
--- a/int256.cc
+++ b/int256.cc
@@ -40,7 +40,7 @@ const uint256_pod kuint256max = {absl::kuint128max, absl::kuint128max};
} \
} while (0)
static inline int Fls64(Uint64 n) {
- DCHECK_NE(0, n);
+ //DCHECK_NE(0, n);
int pos = 0;
STEP(Uint64, n, pos, 0x20);
Uint32 n32 = n;
diff --git a/montgomery_test.cc b/montgomery_test.cc
index 7fe438f..7caf459 100644
--- a/montgomery_test.cc
+++ b/montgomery_test.cc
@@ -102,7 +102,7 @@ TYPED_TEST(MontgomeryTest, ParamsInvModulus) {
using Int = typename TypeParam::Int;
using BigInt = typename internal::BigInt<Int>::value_type;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
EXPECT_EQ(modulus_params->r * modulus_params->inv_r -
@@ -118,7 +118,7 @@ TYPED_TEST(MontgomeryTest, ImportExportInt) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -140,7 +140,7 @@ TYPED_TEST(MontgomeryTest, AddSub) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (int i = 0; i < kTestingRounds; i++) {
@@ -173,7 +173,7 @@ TYPED_TEST(MontgomeryTest, InlineAddSub) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (int i = 0; i < kTestingRounds; i++) {
@@ -209,7 +209,7 @@ TYPED_TEST(MontgomeryTest, Equality) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (int i = 0; i < kTestingRounds; i++) {
@@ -251,7 +251,7 @@ TYPED_TEST(MontgomeryTest, Negate) {
using Int = typename TypeParam::Int;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (Int i = 0; i < 4 * kNewhopeModulus; i++) {
@@ -271,7 +271,7 @@ TYPED_TEST(MontgomeryTest, AddRepeatedly) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (int i = 0; i < kTestingRounds; i++) {
@@ -307,7 +307,7 @@ TYPED_TEST(MontgomeryTest, Multiply) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
// Test over many random values.
@@ -346,7 +346,7 @@ TYPED_TEST(MontgomeryTest, MulInPlace) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
// Test over many random values.
@@ -375,7 +375,7 @@ TYPED_TEST(MontgomeryTest, MulConstantInPlace) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
// Test over many random values.
@@ -387,7 +387,9 @@ TYPED_TEST(MontgomeryTest, MulConstantInPlace) {
auto ma_clone = ma;
ASSERT_OK_AND_ASSIGN(auto mb,
TypeParam::ImportInt(b, modulus_params.get()));
- auto [constant, constant_barrett] = mb.GetConstant(modulus_params.get());
+ auto constants_tuple = mb.GetConstant(modulus_params.get());
+ auto constant = std::get<0>(constants_tuple);
+ auto constant_barrett = std::get<1>(constants_tuple);
ma.MulInPlace(mb, modulus_params.get());
ma_clone.MulConstantInPlace(constant, constant_barrett,
modulus_params.get());
@@ -407,7 +409,7 @@ TYPED_TEST(MontgomeryTest, MultiplyRepeatedly) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (int i = 0; i < kTestingRounds; i++) {
@@ -436,7 +438,7 @@ TYPED_TEST(MontgomeryTest, SmallModulus) {
using BigInt = typename internal::BigInt<Int>::value_type;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
const BigInt modulus = static_cast<BigInt>(modulus_params->modulus);
@@ -501,7 +503,7 @@ TYPED_TEST(MontgomeryTest, ModExpModulus) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
const BigInt modulus = static_cast<BigInt>(modulus_params->modulus);
@@ -529,7 +531,7 @@ TYPED_TEST(MontgomeryTest, InverseModulus) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (int i = 0; i < kTestingRounds; i++) {
@@ -548,7 +550,7 @@ TYPED_TEST(MontgomeryTest, Serialization) {
using Int = typename TypeParam::Int;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (Int i = 0; i < kExhaustiveTest; i++) {
@@ -587,7 +589,7 @@ TYPED_TEST(MontgomeryTest, ExceedMaxNumCoeffVectorSerialization) {
int num_coeffs = kMaxNumCoeffs + 1;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -605,7 +607,7 @@ TYPED_TEST(MontgomeryTest, ExceedMaxNumCoeffVectorSerialization) {
TYPED_TEST(MontgomeryTest, EmptyVectorSerialization) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
std::vector<TypeParam> coeffs;
@@ -620,7 +622,7 @@ TYPED_TEST(MontgomeryTest, VectorSerialization) {
auto prng = absl::make_unique<rlwe::testing::TestingPrng>(0);
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -653,7 +655,7 @@ TYPED_TEST(MontgomeryTest, ExceedMaxNumCoeffVectorDeserialization) {
int num_coeffs = kMaxNumCoeffs + 1;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -670,7 +672,7 @@ TYPED_TEST(MontgomeryTest, NegativeVectorDeserialization) {
int num_coeffs = -1;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
EXPECT_THAT(
@@ -686,7 +688,7 @@ TYPED_TEST(MontgomeryTest, ImportRandomWithPrngWithSameKeys) {
unsigned int seed_prng = GenerateRandom<unsigned int>(&seed);
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -707,7 +709,7 @@ TYPED_TEST(MontgomeryTest, ImportRandomWithPrngWithDifferentKeys) {
unsigned int seed_prng2 = seed_prng1 + 1; // Different seed
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -727,7 +729,7 @@ TYPED_TEST(MontgomeryTest, VerifyBarrett) {
using BigInt = typename internal::BigInt<Int>::value_type;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -754,7 +756,7 @@ TYPED_TEST(MontgomeryTest, BatchOperations) {
auto prng = absl::make_unique<rlwe::testing::TestingPrng>(seed_prng);
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
@@ -765,8 +767,9 @@ TYPED_TEST(MontgomeryTest, BatchOperations) {
TypeParam scalar =
TypeParam::ImportRandom(prng.get(), modulus_params.get())
.ValueOrDie();
- auto [scalar_constant, scalar_constant_barrett] =
- scalar.GetConstant(modulus_params.get());
+ auto scalar_constants_tuple = scalar.GetConstant(modulus_params.get());
+ auto scalar_constant = std::get<0>(scalar_constants_tuple);
+ auto scalar_constant_barrett = std::get<1>(scalar_constants_tuple);
std::vector<TypeParam> expected_add_scalar, expected_sub_scalar,
expected_mul_scalar;
for (size_t i = 0; i < length; i++) {
@@ -774,8 +777,9 @@ TYPED_TEST(MontgomeryTest, BatchOperations) {
.ValueOrDie());
b.push_back(TypeParam::ImportRandom(prng.get(), modulus_params.get())
.ValueOrDie());
- auto [constant, constant_barrett] =
- b[i].GetConstant(modulus_params.get());
+ auto constants_tuple = b[i].GetConstant(modulus_params.get());
+ auto constant = std::get<0>(constants_tuple);
+ auto constant_barrett = std::get<1>(constants_tuple);
b_constant.push_back(constant);
b_constant_barrett.push_back(constant_barrett);
expected_add.push_back(a[i].Add(b[i], modulus_params.get()));
@@ -844,7 +848,7 @@ TYPED_TEST(MontgomeryTest, BatchOperationsFailsWithVectorsOfDifferentSize) {
using Int = typename TypeParam::Int;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
for (size_t length_a : {1, 2, 7, 32, 500, 1024}) {
@@ -911,7 +915,7 @@ class FakePrng {
TYPED_TEST(MontgomeryTest, PrngTemplateParameterizationWorks) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto modulus_params,
TypeParam::Params::Create(params.modulus));
FakePrng prng;
diff --git a/ntt_parameters_test.cc b/ntt_parameters_test.cc
index 189c096..5425de7 100644
--- a/ntt_parameters_test.cc
+++ b/ntt_parameters_test.cc
@@ -39,7 +39,7 @@ TYPED_TEST_SUITE(NttParametersTest, rlwe::testing::ModularIntTypes);
TYPED_TEST(NttParametersTest, LogNumCoeffsTooLarge) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
ASSERT_OK_AND_ASSIGN(auto modulus_params,
@@ -71,7 +71,7 @@ TYPED_TEST(NttParametersTest, PrimitiveNthRootOfUnity) {
unsigned int len = 5;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
ASSERT_OK_AND_ASSIGN(auto modulus_params,
@@ -97,7 +97,7 @@ TYPED_TEST(NttParametersTest, PrimitiveNthRootOfUnity) {
TYPED_TEST(NttParametersTest, NttPsis) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
ASSERT_OK_AND_ASSIGN(auto modulus_params,
@@ -131,7 +131,7 @@ TYPED_TEST(NttParametersTest, NttPsis) {
TYPED_TEST(NttParametersTest, NttPsisBitrev) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
ASSERT_OK_AND_ASSIGN(auto modulus_params,
@@ -159,7 +159,7 @@ TYPED_TEST(NttParametersTest, NttPsisBitrev) {
TYPED_TEST(NttParametersTest, NttPsisInvBitrev) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
ASSERT_OK_AND_ASSIGN(auto modulus_params,
@@ -208,7 +208,7 @@ TEST(NttParametersRegularTest, Bitrev) {
TYPED_TEST(NttParametersTest, IncorrectNTTParams) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
// modulus + 2, will no longer be 1 mod 2*n
@@ -227,7 +227,7 @@ TYPED_TEST(NttParametersTest, IncorrectNTTParams) {
// Test all the NTT Parameter fields.
TYPED_TEST(NttParametersTest, Initialize) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
// Do not create a context, since it creates NttParameters already. Instead,
// create the modulus parameters manually.
ASSERT_OK_AND_ASSIGN(auto modulus_params,
diff --git a/prng/chacha_prng_util.cc b/prng/chacha_prng_util.cc
index c49c82d..e63bb61 100644
--- a/prng/chacha_prng_util.cc
+++ b/prng/chacha_prng_util.cc
@@ -31,16 +31,27 @@ absl::Status ChaChaPrngResalt(absl::string_view key, int buffer_size,
int* salt_counter, int* position_in_buffer,
std::vector<Uint8>* buffer) {
buffer->assign(buffer_size, 0);
- std::string salt = "salt";
- if (salt.size() > kChaChaNonceSize) {
- return absl::InternalError("The salt length is too large.");
+
+ // Following https://tools.ietf.org/html/rfc7539, Sec 2.3, we create the
+ // nonce as a kChaChaNonceSize (=12) bytes string, where the 4 first
+ // bytes are fixed, and the next 8 bytes correspond to the counter.
+ std::string nonce = "salt00000000";
+ if (nonce.size() != kChaChaNonceSize) {
+ return absl::InternalError("The salt length is incorrect.");
+ }
+ Uint64 counter = static_cast<Uint64>(*salt_counter);
+ for (int i = 0; i < 8; i++) {
+ nonce[4 + i] = counter & 0xFF;
+ counter >>= 8;
}
- salt.resize(kChaChaNonceSize, 0);
+ // We call the CRYPTO_chacha_20() function from OpenSSL. Note that the last
+ // parameter is a *block* counter. The salt counter needs instead to be
+ // included in the nonce.
CRYPTO_chacha_20(buffer->data(), buffer->data(), buffer->size(),
reinterpret_cast<const Uint8*>(key.data()),
- reinterpret_cast<const Uint8*>(salt.data()),
- static_cast<uint32_t>(*salt_counter));
+ reinterpret_cast<const Uint8*>(nonce.data()),
+ /* counter = */ 0);
++(*salt_counter);
*position_in_buffer = 0;
diff --git a/prng/prng_test.cc b/prng/prng_test.cc
index de7eacc..f98d98e 100644
--- a/prng/prng_test.cc
+++ b/prng/prng_test.cc
@@ -142,5 +142,29 @@ TYPED_TEST(PrngTest, ReplayDifferentInKeyTest) {
EXPECT_NE(r64, other_r64);
}
+TYPED_TEST(PrngTest, GeneratesUniqueRandomStrings) {
+ const int kKeySize = 20;
+ const int kIterations = 10000;
+ const char charset[] = "abcdefghijklmnopqrstuvwxyz0123456789";
+
+ std::vector<std::string> keys;
+ for (int i = 0; i < kIterations; i++) {
+ // Create a random key
+ std::string key(kKeySize, 0);
+ for (int j = 0; j < kKeySize; j++) {
+ ASSERT_OK_AND_ASSIGN(auto v, this->prng_->Rand8());
+ key[j] = charset[static_cast<int>(v) % sizeof(charset)];
+ }
+
+ // With very high probability (~(1/36)^20), a key will only appear once.
+ int count = 0;
+ for (auto k : keys) {
+ if (k == key) count++;
+ }
+ ASSERT_EQ(count, 0);
+ keys.push_back(key);
+ }
+}
+
} // namespace
} // namespace rlwe
diff --git a/sample_error_test.cc b/sample_error_test.cc
index 49bb495..41071c0 100644
--- a/sample_error_test.cc
+++ b/sample_error_test.cc
@@ -46,7 +46,7 @@ TYPED_TEST(SampleErrorTest, CheckUpperBoundOnNoise) {
auto prng = absl::make_unique<rlwe::testing::TestingPrng>(0);
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
@@ -73,7 +73,7 @@ TYPED_TEST(SampleErrorTest, CheckUpperBoundOnNoise) {
TYPED_TEST(SampleErrorTest, FailOnTooLargeVariance) {
auto prng = absl::make_unique<rlwe::testing::TestingPrng>(0);
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
diff --git a/serialization.proto b/serialization.proto
index 6d02b74..b7fefcf 100644
--- a/serialization.proto
+++ b/serialization.proto
@@ -15,6 +15,8 @@
syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+
package rlwe;
// NTT Polynomial
diff --git a/symmetric_encryption_test.cc b/symmetric_encryption_test.cc
index 6e58422..6c05be2 100644
--- a/symmetric_encryption_test.cc
+++ b/symmetric_encryption_test.cc
@@ -91,7 +91,7 @@ TYPED_TEST_SUITE(SymmetricRlweEncryptionTest, rlwe::testing::ModularIntTypes);
TYPED_TEST(SymmetricRlweEncryptionTest, RemoveErrorNegative) {
unsigned int seed = 0;
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
@@ -136,7 +136,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, RemoveErrorNegative) {
// different values of t.
TYPED_TEST(SymmetricRlweEncryptionTest, RemoveErrorPositive) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
unsigned int seed = 0;
@@ -167,7 +167,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, RemoveErrorPositive) {
// Ensure that the encryption scheme can decrypt its own ciphertexts.
TYPED_TEST(SymmetricRlweEncryptionTest, CanDecrypt) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; i++) {
@@ -187,7 +187,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, CanDecrypt) {
// Accessing out of bounds raises errors
TYPED_TEST(SymmetricRlweEncryptionTest, OutOfBoundsIndex) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key, this->SampleKey(context.get()));
@@ -208,7 +208,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, OutOfBoundsIndex) {
// Check that the HE scheme is additively homomorphic.
TYPED_TEST(SymmetricRlweEncryptionTest, AdditivelyHomomorphic) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; i++) {
@@ -252,7 +252,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AdditivelyHomomorphic) {
// Check that homomorphic addition can be performed in place.
TYPED_TEST(SymmetricRlweEncryptionTest, AddHomomorphicallyInPlace) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; i++) {
@@ -302,7 +302,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AddHomomorphicallyInPlace) {
// plaintext.
TYPED_TEST(SymmetricRlweEncryptionTest, AddToZero) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; i++) {
@@ -329,7 +329,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AddToZero) {
// Check that homomorphic absorption works.
TYPED_TEST(SymmetricRlweEncryptionTest, Absorb) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; i++) {
@@ -388,7 +388,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, Absorb) {
// Check that homomorphic absorption in place works.
TYPED_TEST(SymmetricRlweEncryptionTest, AbsorbInPlace) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; i++) {
@@ -447,7 +447,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AbsorbInPlace) {
// Check that homomorphic absorption of a scalar works.
TYPED_TEST(SymmetricRlweEncryptionTest, AbsorbScalar) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
unsigned int seed = 0;
@@ -500,7 +500,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AbsorbScalar) {
// Check that homomorphic absorption of a scalar in place works.
TYPED_TEST(SymmetricRlweEncryptionTest, AbsorbScalarInPlace) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
unsigned int seed = 0;
@@ -553,7 +553,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AbsorbScalarInPlace) {
// Check that we cannot multiply with an empty ciphertext.
TYPED_TEST(SymmetricRlweEncryptionTest, EmptyCipherMultiplication) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key, this->SampleKey(context.get()));
@@ -601,7 +601,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, MultiplicativelyHomomorphic) {
if (sizeof(TypeParam) > 2) { // No multiplicative homomorphism possible when
// TypeParam = Uint16
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (int i = 0; i < kTestingRounds; i++) {
@@ -658,7 +658,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, MultiplicativelyHomomorphic) {
// Check that many homomorphic additions can be performed.
TYPED_TEST(SymmetricRlweEncryptionTest, ManyHomomorphicAdds) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
// Sample a starting plaintext and ciphertext and create aggregators;
@@ -705,7 +705,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, ManyHomomorphicAdds) {
TYPED_TEST(SymmetricRlweEncryptionTest,
ExceedMaxNumCoeffDeserializeCiphertext) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
@@ -733,7 +733,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest,
// Check that ciphertext serialization works.
TYPED_TEST(SymmetricRlweEncryptionTest, SerializeCiphertext) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (int i = 0; i < kTestingRounds; i++) {
@@ -768,7 +768,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, SerializeCiphertext) {
// Check that key serialization works.
TYPED_TEST(SymmetricRlweEncryptionTest, SerializeKey) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (int i = 0; i < kTestingRounds; i++) {
@@ -809,7 +809,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, SerializeKey) {
// Try an ill-formed key modulus switching
TYPED_TEST(SymmetricRlweEncryptionTest, FailingKeyModulusReduction) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
// p is the original modulus and q is the new modulus we want to switch to
@@ -836,7 +836,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, FailingKeyModulusReduction) {
// Try an ill-formed ciphertext modulus switching
TYPED_TEST(SymmetricRlweEncryptionTest, FailingCiphertextModulusReduction) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
// p is the original modulus and q is the new modulus we want to switch to
@@ -871,8 +871,9 @@ TYPED_TEST(SymmetricRlweEncryptionTest, FailingCiphertextModulusReduction) {
// Test modulus switching.
TYPED_TEST(SymmetricRlweEncryptionTest, ModulusReduction) {
- for (const auto& [params1, params2] :
- rlwe::testing::ContextParametersModulusSwitching<TypeParam>::value) {
+ for (const auto& params :
+ rlwe::testing::ContextParametersModulusSwitching<TypeParam>::Value()) {
+ auto params1 = std::get<0>(params), params2 = std::get<1>(params);
ASSERT_OK_AND_ASSIGN(auto context1,
rlwe::RlweContext<TypeParam>::Create(params1));
ASSERT_OK_AND_ASSIGN(auto context2,
@@ -913,8 +914,9 @@ TYPED_TEST(SymmetricRlweEncryptionTest, ModulusReduction) {
// Check that modulus switching reduces the error.
TYPED_TEST(SymmetricRlweEncryptionTest, ModulusSwitchingReducesLargeError) {
- for (const auto& [params1, params2] :
- rlwe::testing::ContextParametersModulusSwitching<TypeParam>::value) {
+ for (const auto& params :
+ rlwe::testing::ContextParametersModulusSwitching<TypeParam>::Value()) {
+ auto params1 = std::get<0>(params), params2 = std::get<1>(params);
ASSERT_OK_AND_ASSIGN(auto context1,
rlwe::RlweContext<TypeParam>::Create(params1));
ASSERT_OK_AND_ASSIGN(auto context2,
@@ -968,7 +970,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, ModulusSwitchingReducesLargeError) {
// different powers of s.
TYPED_TEST(SymmetricRlweEncryptionTest, OperationsFailOnMismatchedPowersOfS) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key, this->SampleKey(context.get()));
@@ -1002,7 +1004,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, OperationsFailOnMismatchedPowersOfS) {
// Verifies that the power of S changes as expected in adds / mults.
TYPED_TEST(SymmetricRlweEncryptionTest, AddsAndMultPreservePowerOfS) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key, this->SampleKey(context.get()));
@@ -1037,7 +1039,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AddsAndMultPreservePowerOfS) {
// Check that substitutions of the form 2^k + 1 work.
TYPED_TEST(SymmetricRlweEncryptionTest, Substitutes) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (int k = 1; k < context->GetLogN(); k++) {
@@ -1083,7 +1085,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, Substitutes) {
// Check that substitution of 2 does not work.
TYPED_TEST(SymmetricRlweEncryptionTest, SubstitutionFailsOnEvenPower) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key, this->SampleKey(context.get()));
@@ -1102,7 +1104,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, SubstitutionFailsOnEvenPower) {
// Check that the power of s updates after several substitutions.
TYPED_TEST(SymmetricRlweEncryptionTest, PowerOfSUpdatedAfterRepeatedSubs) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
int substitution_power = 5;
@@ -1127,7 +1129,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, PowerOfSUpdatedAfterRepeatedSubs) {
// Check that operations can only be performed when powers of s match.
TYPED_TEST(SymmetricRlweEncryptionTest, PowersOfSMustMatchOnOperations) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
int substitution_power = 5;
@@ -1160,7 +1162,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, PowersOfSMustMatchOnOperations) {
// Check that the null key has value 0.
TYPED_TEST(SymmetricRlweEncryptionTest, NullKeyHasValueZero) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
rlwe::Polynomial<TypeParam> zero(context->GetN(),
@@ -1179,7 +1181,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, NullKeyHasValueZero) {
// Check the addition and subtraction of keys.
TYPED_TEST(SymmetricRlweEncryptionTest, AddAndSubKeys) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key_1, this->SampleKey(context.get()));
@@ -1203,7 +1205,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, AddAndSubKeys) {
// Check that decryption works with added and subtracted keys.
TYPED_TEST(SymmetricRlweEncryptionTest, EncryptAndDecryptWithAddAndSubKeys) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto key_1, this->SampleKey(context.get()));
@@ -1231,7 +1233,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, EncryptAndDecryptWithAddAndSubKeys) {
// Check that the scheme is key homomorphic.
TYPED_TEST(SymmetricRlweEncryptionTest, IsKeyHomomorphic) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto prng_seed,
@@ -1319,7 +1321,7 @@ TYPED_TEST(SymmetricRlweEncryptionTest, IsKeyHomomorphic) {
// Check that incompatible key cannot be added or subtracted.
TYPED_TEST(SymmetricRlweEncryptionTest, CannotAddOrSubIncompatibleKeys) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
ASSERT_OK_AND_ASSIGN(auto context_different_variance,
diff --git a/symmetric_encryption_with_prng_test.cc b/symmetric_encryption_with_prng_test.cc
index 88e86e3..beb1324 100644
--- a/symmetric_encryption_with_prng_test.cc
+++ b/symmetric_encryption_with_prng_test.cc
@@ -110,7 +110,7 @@ TYPED_TEST_SUITE(SymmetricEncryptionWithPrngTest,
// ciphertext.
TYPED_TEST(SymmetricEncryptionWithPrngTest, EncryptDecryptSingleCompressed) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; ++i) {
@@ -126,7 +126,7 @@ TYPED_TEST(SymmetricEncryptionWithPrngTest, EncryptDecryptSingleCompressed) {
// ciphertexts.
TYPED_TEST(SymmetricEncryptionWithPrngTest, EncryptDecryptMultipleCompressed) {
for (const auto& params :
- rlwe::testing::ContextParameters<TypeParam>::value) {
+ rlwe::testing::ContextParameters<TypeParam>::Value()) {
ASSERT_OK_AND_ASSIGN(auto context,
rlwe::RlweContext<TypeParam>::Create(params));
for (unsigned int i = 0; i < kTestingRounds; ++i) {
diff --git a/testing/coefficient_polynomial.h b/testing/coefficient_polynomial.h
index 4f32f18..fcff1a2 100644
--- a/testing/coefficient_polynomial.h
+++ b/testing/coefficient_polynomial.h
@@ -29,7 +29,8 @@
#include "statusor.h"
#include "testing/coefficient_polynomial.pb.h"
-namespace rlwe::testing {
+namespace rlwe {
+namespace testing {
// A polynomial with ModularInt coefficients that is automatically reduced
// modulo <x^n + 1>, where n is the number of coefficients provided in the
@@ -264,6 +265,7 @@ class CoefficientPolynomial {
const ModularIntParams* modulus_params_;
};
-} // namespace rlwe::testing
+} // namespace testing
+} // namespace rlwe
#endif // RLWE_TESTING_COEFFICIENT_POLYNOMIAL_H_
diff --git a/testing/coefficient_polynomial.proto b/testing/coefficient_polynomial.proto
index b378557..35f02ef 100644
--- a/testing/coefficient_polynomial.proto
+++ b/testing/coefficient_polynomial.proto
@@ -15,6 +15,8 @@
syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+
package rlwe;
// Polynomial in coefficient representation
diff --git a/testing/coefficient_polynomial_ciphertext.h b/testing/coefficient_polynomial_ciphertext.h
index 0ed2caa..a8a78de 100644
--- a/testing/coefficient_polynomial_ciphertext.h
+++ b/testing/coefficient_polynomial_ciphertext.h
@@ -27,7 +27,8 @@
#include "symmetric_encryption.h"
#include "testing/coefficient_polynomial.h"
-namespace rlwe::testing {
+namespace rlwe {
+namespace testing {
// Container for a vector of polynomials in coefficient representation. This
// class is the analogue of SymmetricRlweCiphertext with component polynomials
@@ -52,8 +53,8 @@ class CoefficientPolynomialCiphertext {
const ErrorParams<ModularInt>* error_params)
: p_(std::move(p)),
modulus_params_(p_[0].ModulusParams()),
- power_of_s_(power_of_s),
- error_params_(error_params) {}
+ error_params_(error_params),
+ power_of_s_(power_of_s){}
// Static method that creates a CoefficientPolynomialCiphertext from a
// SymmetricRlweCiphertext by performing InverseNtt on each ciphertext
@@ -163,13 +164,14 @@ class CoefficientPolynomialCiphertext {
// ErrorParams.
const rlwe::ErrorParams<ModularInt>* error_params_;
- // A heuristic on the amount of error in the ciphertext.
- double error_;
-
// The power a in s(x^a) that the ciphertext can be decrypted with.
int power_of_s_;
+
+ // A heuristic on the amount of error in the ciphertext.
+ double error_;
};
-} // namespace rlwe::testing
+} // namespace testing
+} // namespace rlwe
#endif // RLWE_TESTING_COEFFICIENT_POLYNOMIAL_CIPHERTEXT_H_
diff --git a/testing/coefficient_polynomial_test.cc b/testing/coefficient_polynomial_test.cc
index db3e184..bf43ee6 100644
--- a/testing/coefficient_polynomial_test.cc
+++ b/testing/coefficient_polynomial_test.cc
@@ -18,6 +18,7 @@
#include <random>
#include <vector>
+#include <google/protobuf/message_lite.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "constants.h"
@@ -415,7 +416,7 @@ TEST_F(PolynomialTest, Serialize) {
p.Serialize());
ASSERT_OK_AND_ASSIGN(rlwe::SerializedCoefficientPolynomial serialized_q,
q.Serialize());
- EXPECT_THAT(serialized_p, EqualsProto(serialized_q));
+ EXPECT_EQ(serialized_p.SerializeAsString(), serialized_q.SerializeAsString());
// Ensure that a serialized polynomial can be deserialized.
ASSERT_OK_AND_ASSIGN(
diff --git a/testing/parameters.h b/testing/parameters.h
index 05864f0..6f7a08c 100644
--- a/testing/parameters.h
+++ b/testing/parameters.h
@@ -26,7 +26,8 @@
#include "integral_types.h"
#include "montgomery.h"
-namespace rlwe::testing {
+namespace rlwe {
+namespace testing {
// ModularInt types for typed tests. A typed test can be defined as follows in
// test files.
@@ -54,50 +55,54 @@ typedef ::testing::Types<
// }
template <typename ModularInt>
struct ContextParameters {
- constexpr static std::array<typename RlweContext<ModularInt>::Parameters, 0>
- value = {};
+ static std::vector<typename RlweContext<ModularInt>::Parameters> Value() {
+ return {};
+ }
};
template <>
struct ContextParameters<MontgomeryInt<Uint16>> {
- constexpr static std::array<RlweContext<MontgomeryInt<Uint16>>::Parameters, 1>
- value = {
+ static std::vector<RlweContext<MontgomeryInt<Uint16>>::Parameters> Value() {
+ return {
RlweContext<MontgomeryInt<Uint16>>::Parameters{
.modulus = kNewhopeModulus,
.log_n = 10,
.log_t = 1,
.variance = 8},
};
+ }
};
template <>
struct ContextParameters<MontgomeryInt<Uint32>> {
- constexpr static std::array<RlweContext<MontgomeryInt<Uint32>>::Parameters, 2>
- value = {
+ static std::vector<RlweContext<MontgomeryInt<Uint32>>::Parameters> Value() {
+ return {
RlweContext<MontgomeryInt<Uint32>>::Parameters{
.modulus = kModulus25, .log_n = 10, .log_t = 1, .variance = 8},
RlweContext<MontgomeryInt<Uint32>>::Parameters{
.modulus = kModulus29, .log_n = 11, .log_t = 5, .variance = 8},
};
+ }
};
template <>
struct ContextParameters<MontgomeryInt<Uint64>> {
- constexpr static std::array<RlweContext<MontgomeryInt<Uint64>>::Parameters, 1>
- value = {
+ static std::vector<RlweContext<MontgomeryInt<Uint64>>::Parameters> Value() {
+ return {
RlweContext<MontgomeryInt<Uint64>>::Parameters{
.modulus = kModulus59, .log_n = 11, .log_t = 10, .variance = 8},
};
+ }
};
template <>
struct ContextParameters<MontgomeryInt<absl::uint128>> {
- constexpr static std::array<
- RlweContext<MontgomeryInt<absl::uint128>>::Parameters, 1>
- value = {
+ static std::vector<RlweContext<MontgomeryInt<absl::uint128>>::Parameters> Value() {
+ return {
RlweContext<MontgomeryInt<absl::uint128>>::Parameters{
.modulus = kModulus80, .log_n = 11, .log_t = 11, .variance = 8},
};
+ }
};
// Parameters for testing of modulus switching. These parameters must be
@@ -120,13 +125,16 @@ struct ContextParameters<MontgomeryInt<absl::uint128>> {
template <typename ModularInt>
struct ContextParametersModulusSwitching {
using Params = typename RlweContext<ModularInt>::Parameters;
- constexpr static std::array<std::tuple<Params, Params>, 0> value = {};
+ static std::vector<std::tuple<Params, Params>> Value() {
+ return {};
+ }
};
template <>
struct ContextParametersModulusSwitching<MontgomeryInt<Uint64>> {
using Params = typename RlweContext<MontgomeryInt<Uint64>>::Parameters;
- constexpr static std::array<std::tuple<Params, Params>, 1> value = {
+ static std::vector<std::tuple<Params, Params>> Value() {
+ return {
std::make_tuple(
Params{.modulus = 17592186028033ULL,
.log_n = 10,
@@ -134,12 +142,14 @@ struct ContextParametersModulusSwitching<MontgomeryInt<Uint64>> {
.variance = 8},
Params{
.modulus = 1589249ULL, .log_n = 10, .log_t = 4, .variance = 8})};
+ }
};
template <>
struct ContextParametersModulusSwitching<MontgomeryInt<absl::uint128>> {
using Params = typename RlweContext<MontgomeryInt<absl::uint128>>::Parameters;
- constexpr static std::array<std::tuple<Params, Params>, 1> value = {
+ static std::vector<std::tuple<Params, Params>> Value() {
+ return {
std::make_tuple(
Params{.modulus = absl::MakeUint128(4611686018427387903ULL,
18446744073709355009ULL),
@@ -150,8 +160,10 @@ struct ContextParametersModulusSwitching<MontgomeryInt<absl::uint128>> {
.log_n = 10,
.log_t = 2,
.variance = 8})};
+ }
};
-} // namespace rlwe::testing
+} // namespace testing
+} // namespace rlwe
#endif // RLWE_TESTING_INSTANCES_H_
diff --git a/testing/protobuf_matchers.h b/testing/protobuf_matchers.h
index 504ef78..0c7df16 100644
--- a/testing/protobuf_matchers.h
+++ b/testing/protobuf_matchers.h
@@ -18,6 +18,7 @@
#define RLWE_TESTING_PROTOBUF_MATCHERS_H_
#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
#include <google/protobuf/util/message_differencer.h>
#include <gmock/gmock.h>
@@ -29,7 +30,7 @@ class EqualsProtoImpl
public:
EqualsProtoImpl(const google::protobuf::Message& other) : other_(&other) {}
- bool MatchAndExplain(
+ inline bool MatchAndExplain(
const google::protobuf::Message& message,
::testing::MatchResultListener* listener) const override {
if (!google::protobuf::util::MessageDifferencer::Equals(message, *other_)) {
@@ -39,11 +40,11 @@ class EqualsProtoImpl
return true;
}
- void DescribeTo(std::ostream* os) const override {
+ inline void DescribeTo(std::ostream* os) const override {
*os << "is equal to another protocol buffer";
}
- void DescribeNegationTo(std::ostream* os) const override {
+ inline void DescribeNegationTo(std::ostream* os) const override {
*os << "is not equal to another protocol buffer";
}
@@ -51,11 +52,45 @@ class EqualsProtoImpl
const google::protobuf::Message* other_; // not owned
};
-::testing::Matcher<const google::protobuf::Message&> EqualsProto(
+inline ::testing::Matcher<const google::protobuf::Message&> EqualsProto(
const google::protobuf::Message& other) {
return ::testing::Matcher<const google::protobuf::Message&>(new EqualsProtoImpl(other));
}
+class EqualsProtoLiteImpl
+ : public ::testing::MatcherInterface<const google::protobuf::MessageLite&> {
+ public:
+ EqualsProtoLiteImpl(const google::protobuf::MessageLite& other) : other_(&other) {}
+
+ bool MatchAndExplain(
+ const google::protobuf::MessageLite& message,
+ ::testing::MatchResultListener* listener) const override {
+ // TODO(b/159369884): Implement robust equality checks.
+ if (message.SerializeAsString() != other_->SerializeAsString()) {
+ *listener << "protobufs were not equal";
+ return false;
+ }
+ return true;
+ }
+
+ void DescribeTo(std::ostream* os) const override {
+ *os << "is equal to another protocol buffer";
+ }
+
+ void DescribeNegationTo(std::ostream* os) const override {
+ *os << "is not equal to another protocol buffer";
+ }
+
+ private:
+ const google::protobuf::MessageLite* other_; // not owned
+};
+
+inline ::testing::Matcher<const google::protobuf::MessageLite&> EqualsProto(
+ const google::protobuf::MessageLite& other) {
+ return ::testing::Matcher<const google::protobuf::MessageLite&>(
+ new EqualsProtoLiteImpl(other));
+}
+
} // namespace testing
} // namespace rlwe
diff --git a/testing/protobuf_matchers_test.cc b/testing/protobuf_matchers_test.cc
index 48865f7..7ef759a 100644
--- a/testing/protobuf_matchers_test.cc
+++ b/testing/protobuf_matchers_test.cc
@@ -24,11 +24,11 @@ namespace {
TEST(EqualsProtoTest, EqualsProtoWorks) {
rlwe::SerializedCoefficientPolynomial coeffs;
coeffs.set_num_coeffs(10);
- EXPECT_THAT(coeffs, rlwe::testing::EqualsProto(coeffs));
+ EXPECT_EQ(coeffs.SerializeAsString(), coeffs.SerializeAsString());
rlwe::SerializedCoefficientPolynomial coeffs_other;
coeffs_other.set_num_coeffs(20);
- EXPECT_THAT(coeffs, ::testing::Not(rlwe::testing::EqualsProto(coeffs_other)));
+ EXPECT_NE(coeffs.SerializeAsString(), coeffs_other.SerializeAsString());
}
} // namespace
diff --git a/testing/status_matchers.h b/testing/status_matchers.h
index 52f9b0a..c482dae 100644
--- a/testing/status_matchers.h
+++ b/testing/status_matchers.h
@@ -28,10 +28,10 @@ namespace internal {
// This function and its overload allow the same matcher to be used for Status
// and StatusOr tests.
-absl::Status GetStatus(const absl::Status& status) { return status; }
+inline absl::Status GetStatus(const absl::Status& status) { return status; }
template <typename T>
-absl::Status GetStatus(const rlwe::StatusOr<T>& statusor) {
+inline absl::Status GetStatus(const rlwe::StatusOr<T>& statusor) {
return statusor.status();
}
@@ -42,7 +42,7 @@ class StatusIsImpl : public ::testing::MatcherInterface<StatusType> {
const ::testing::Matcher<const std::string&>& message)
: code_(code), message_(message) {}
- bool MatchAndExplain(StatusType status,
+ inline bool MatchAndExplain(StatusType status,
::testing::MatchResultListener* listener) const {
::testing::StringMatchResultListener str_listener;
absl::Status real_status = GetStatus(status);
@@ -58,14 +58,14 @@ class StatusIsImpl : public ::testing::MatcherInterface<StatusType> {
return true;
}
- void DescribeTo(std::ostream* os) const {
+ inline void DescribeTo(std::ostream* os) const {
*os << "has a status code that ";
code_.DescribeTo(os);
*os << " and a message that ";
message_.DescribeTo(os);
}
- void DescribeNegationto(std::ostream* os) const {
+ inline void DescribeNegationto(std::ostream* os) const {
*os << "has a status code that ";
code_.DescribeNegationTo(os);
*os << " and a message that ";
@@ -99,7 +99,7 @@ class StatusIsPoly {
// This function allows us to avoid a template parameter when writing tests, so
// that we can transparently test both Status and StatusOr returns.
-internal::StatusIsPoly StatusIs(
+inline internal::StatusIsPoly StatusIs(
::testing::Matcher<absl::StatusCode>&& code,
::testing::Matcher<const std::string&>&& message) {
return internal::StatusIsPoly(