From f8b9977bdb9c086b0167f1501530bff33be52f42 Mon Sep 17 00:00:00 2001 From: Kim Laine Date: Mon, 27 Jan 2020 22:21:56 -0800 Subject: [PATCH] Switched to dynamic sampling of baseconverter primes --- native/src/seal/util/baseconverter.cpp | 19 ++++++++--- native/src/seal/util/globals.cpp | 46 +------------------------- native/src/seal/util/globals.h | 16 --------- 3 files changed, 15 insertions(+), 66 deletions(-) diff --git a/native/src/seal/util/baseconverter.cpp b/native/src/seal/util/baseconverter.cpp index e740ee3a..5873df49 100644 --- a/native/src/seal/util/baseconverter.cpp +++ b/native/src/seal/util/baseconverter.cpp @@ -15,6 +15,7 @@ #include "seal/util/polyarithsmallmod.h" #include "seal/util/smallntt.h" #include "seal/util/globals.h" +#include "seal/util/numth.h" #include "seal/smallmodulus.h" using namespace std; @@ -57,9 +58,6 @@ namespace seal */ reset(); - m_sk_ = global_variables::internal_mods::m_sk; - m_tilde_ = global_variables::internal_mods::m_tilde; - gamma_ = global_variables::internal_mods::gamma; small_plain_mod_ = small_plain_mod; coeff_count_ = coeff_count; coeff_base_mod_count_ = coeff_base.size(); @@ -97,6 +95,18 @@ namespace seal throw logic_error("invalid parameters"); } + // Sample auxiliary primes; the aux base has size aux_base_mod_count_ and + // we need two more primes: one for m_sk and one for gamma. + auto baseconv_primes = get_primes( + coeff_count_, + SEAL_USER_MOD_BIT_COUNT_MAX + 1, + aux_base_mod_count_ + 2); + + auto baseconv_primes_iter = baseconv_primes.cbegin(); + m_sk_ = *baseconv_primes_iter++; + gamma_ = *baseconv_primes_iter++; + m_tilde_ = uint64_t(1) << 32; + // We use a reversed order here for performance reasons coeff_base_products_mod_aux_bsk_array_ = allocate>(bsk_base_mod_count_, pool_); @@ -126,8 +136,7 @@ namespace seal bsk_base_array_ = allocate(bsk_base_mod_count_, pool_); copy(coeff_base.cbegin(), coeff_base.cend(), coeff_base_array_.get()); - copy_n(global_variables::internal_mods::aux_small_mods.cbegin(), - aux_base_mod_count_, aux_base_array_.get()); + copy_n(baseconv_primes_iter, aux_base_mod_count_, aux_base_array_.get()); copy_n(aux_base_array_.get(), aux_base_mod_count_, bsk_base_array_.get()); bsk_base_array_[bsk_base_mod_count_ - 1] = m_sk_; diff --git a/native/src/seal/util/globals.cpp b/native/src/seal/util/globals.cpp index ca27f8a9..aba16251 100644 --- a/native/src/seal/util/globals.cpp +++ b/native/src/seal/util/globals.cpp @@ -205,50 +205,6 @@ namespace seal 0x1fffffffb90001, 0x1fffffffb60001, 0x1fffffffa50001 } } }; - - namespace internal_mods - { - const SmallModulus m_sk(0x1fffffffffe00001); - - const SmallModulus m_tilde(uint64_t(1) << 32); - - const SmallModulus gamma(0x1fffffffffc80001); - - const vector aux_small_mods{ - 0x1fffffffffb40001, 0x1fffffffff500001, 0x1fffffffff380001, 0x1fffffffff000001, - 0x1ffffffffef00001, 0x1ffffffffee80001, 0x1ffffffffeb40001, 0x1ffffffffe780001, - 0x1ffffffffe600001, 0x1ffffffffe4c0001, 0x1ffffffffdf40001, 0x1ffffffffdac0001, - 0x1ffffffffda40001, 0x1ffffffffc680001, 0x1ffffffffc000001, 0x1ffffffffb880001, - 0x1ffffffffb7c0001, 0x1ffffffffb300001, 0x1ffffffffb1c0001, 0x1ffffffffadc0001, - 0x1ffffffffa400001, 0x1ffffffffa140001, 0x1ffffffff9d80001, 0x1ffffffff9140001, - 0x1ffffffff8ac0001, 0x1ffffffff8a80001, 0x1ffffffff81c0001, 0x1ffffffff7800001, - 0x1ffffffff7680001, 0x1ffffffff7080001, 0x1ffffffff6c80001, 0x1ffffffff6140001, - 0x1ffffffff5f40001, 0x1ffffffff5700001, 0x1ffffffff4bc0001, 0x1ffffffff4380001, - 0x1ffffffff3240001, 0x1ffffffff2dc0001, 0x1ffffffff1a40001, 0x1ffffffff11c0001, - 0x1ffffffff0fc0001, 0x1ffffffff0d80001, 0x1ffffffff0c80001, 0x1ffffffff08c0001, - 0x1fffffffefd00001, 0x1fffffffef9c0001, 0x1fffffffef600001, 0x1fffffffeef40001, - 0x1fffffffeed40001, 0x1fffffffeed00001, 0x1fffffffeebc0001, 0x1fffffffed540001, - 0x1fffffffed440001, 0x1fffffffed2c0001, 0x1fffffffed200001, 0x1fffffffec940001, - 0x1fffffffec6c0001, 0x1fffffffebe80001, 0x1fffffffebac0001, 0x1fffffffeba40001, - 0x1fffffffeb4c0001, 0x1fffffffeb280001, 0x1fffffffea780001, 0x1fffffffea440001, - 0x1fffffffe9f40001, 0x1fffffffe97c0001, 0x1fffffffe9300001, 0x1fffffffe8d00001, - 0x1fffffffe8400001, 0x1fffffffe7cc0001, 0x1fffffffe7bc0001, 0x1fffffffe7a80001, - 0x1fffffffe7600001, 0x1fffffffe7500001, 0x1fffffffe6fc0001, 0x1fffffffe6d80001, - 0x1fffffffe6ac0001, 0x1fffffffe6000001, 0x1fffffffe5d40001, 0x1fffffffe5a00001, - 0x1fffffffe5940001, 0x1fffffffe54c0001, 0x1fffffffe5340001, 0x1fffffffe4bc0001, - 0x1fffffffe4a40001, 0x1fffffffe3fc0001, 0x1fffffffe3540001, 0x1fffffffe2b00001, - 0x1fffffffe2680001, 0x1fffffffe0480001, 0x1fffffffe00c0001, 0x1fffffffdfd00001, - 0x1fffffffdfc40001, 0x1fffffffdf700001, 0x1fffffffdf340001, 0x1fffffffdef80001, - 0x1fffffffdea80001, 0x1fffffffde680001, 0x1fffffffde000001, 0x1fffffffdde40001, - 0x1fffffffddd80001, 0x1fffffffddd00001, 0x1fffffffddb40001, 0x1fffffffdd780001, - 0x1fffffffdd4c0001, 0x1fffffffdcb80001, 0x1fffffffdca40001, 0x1fffffffdc380001, - 0x1fffffffdc040001, 0x1fffffffdbb40001, 0x1fffffffdba80001, 0x1fffffffdb9c0001, - 0x1fffffffdb740001, 0x1fffffffdb380001, 0x1fffffffda600001, 0x1fffffffda340001, - 0x1fffffffda180001, 0x1fffffffd9700001, 0x1fffffffd9680001, 0x1fffffffd9440001, - 0x1fffffffd9080001, 0x1fffffffd8c80001, 0x1fffffffd8800001, 0x1fffffffd82c0001, - 0x1fffffffd7cc0001, 0x1fffffffd7b80001, 0x1fffffffd7840001, 0x1fffffffd73c0001 - }; - } } } -} \ No newline at end of file +} diff --git a/native/src/seal/util/globals.h b/native/src/seal/util/globals.h index 479dfe21..79693a90 100644 --- a/native/src/seal/util/globals.h +++ b/native/src/seal/util/globals.h @@ -68,22 +68,6 @@ For .NET Framework wrapper support (C++/CLI) we need to it easy for non-expert users to select secure parameters. */ extern const std::map> default_coeff_modulus_256; - - // For internal use only, do not modify - namespace internal_mods - { - // Prime, 61 bits, and congruent to 1 mod 2^18 - extern const SmallModulus m_sk; - - // Non-prime; 2^32 - extern const SmallModulus m_tilde; - - // Prime, 61 bits, and congruent to 1 mod 2^18 - extern const SmallModulus gamma; - - // For internal use only, all primes 61 bits and congruent to 1 mod 2^18 - extern const std::vector aux_small_mods; - } } } }