Skip to content

Releases: microsoft/SEAL

Release 3.6.1

Choose a tag to compare

@kimlaine kimlaine released this 08 Dec 23:24
  • Fixed a bug reported in (Issue 248) and (Issue 249): in in-place Zstandard compression the input buffer head location was not correctly updated, resulting in huge memory use.

Release 3.6.0

Choose a tag to compare

@kimlaine kimlaine released this 03 Dec 16:55

Hotfix - 12/2/2020

  • Fixed an issue with CMake system where a shared Zstandard was not correctly handled (it is not supported).

Hotfix - 11/17/2020

  • Fixed issue with CMake system where BUILD_SHARED_LIBS=ON and SEAL_BUILD_DEPS=ON resulted in Zstandard header files not being visible to the build (Issue 242).

Hotfix - 11/16/2020

  • Fixed issues with CMake system overwriting existing FETCHCONTENT_BASE_DIR (Issue 242).
  • Corrected mistakes and typos in README.md.

New Features

  • Added support for Zstandard compression as a much more efficient alternative to ZLIB.
    The performance improvement is around 20–30x.
  • Added support for iOS in the NuGet package of Microsoft SEAL.
  • The build system is unified for all platforms.
    There is no longer a Visual Studio solution file (seal.sln) for Windows.
    There is a separate solution file for the dotnet library (dotnet/SEALNet.sln).
  • Added support for Shake256 (FIPS-202) XOF for pseudo-random number generation in addition to the default Blake2xb (faster).
  • Microsoft SEAL 3.6 is backwards compatible with 3.4 and 3.5 when deserializing, but it does not support serializing in the old formats.

Major API Changes

  • All C++ enum labels are consistently in lowercase. Most importantly, scheme_type::BFV and scheme_type::CKKS are changed to scheme_type::bfv and scheme_type::ckks.
  • Changed seal::SEAL_BYTE to seal::seal_byte; all uppercase names are used only for preprocessor macros.
  • Removed BatchEncoder API for encoding and decoding Plaintext objects inplace.
    This is because a Plaintext object with slot-data written into the coefficients is (confusingly) not valid to be used for encryption.
  • Removed IntegerEncoder and BigUInt classes.
    IntegerEncoder results in inefficient homomorphic evaluation and lacks sane correctness properties, so it was basically impossible to use in real applications.
    The BigUInt class was only used by the IntegerEncoder.
  • All Encryptor::encrypt variants have now two overloads: one that takes a Ciphertext out-parameter, and one that returns a Serializable<Ciphertext>.
  • Changed the names of the public key generation functions to clearly express that a new key is created each time, e.g., KeyGenerator::create_public_key.
  • Removed the KeyGenerator::relin_keys_local and KeyGenerator::galois_keys_local functions.
    These were poorly named and have been replaced with overloads of KeyGenerator::create_relin_keys and KeyGenerator::create_galois_keys that take an out-parameter of type RelinKeys or GaloisKeys.
  • Renamed IntArray to DynArray (dynamic array) and removed unnecessary limitations on the object type template parameter.
  • Added public API for modular reduction to the Modulus class.
  • Added API for creating DynArray and Plaintext objects from a gsl::span<std::uint64_t> (C++) or IEnumerable<ulong> (C#).

Minor API Changes

  • Added std::hash implementation for EncryptionParameters (in addition to parms_id_type) so it is possible to create e.g. std::unordered_map of EncryptionParameters.
  • Added API to UniformRandomGeneratorFactory to find whether the factory uses a default seed and to retrieve that seed.
  • Added const overloads for DynArray::begin and DynArray::end.
  • Added a Shake256PRNG and Shake256PRNGFactory classes.
    Renamed BlakePRNG class to Blake2xbPRNG, and BlakePRNGFactory class to Blake2xbPRNGFactory.
  • Added a serializable UniformRandomGeneratorInfo class that represents the type of an extendable output function and a seed value.
  • Added native/src/seal/version.h defining a struct SEALVersion.
    This is used internally to route deserialization logic to correct functions depending on loaded SEALHeader version.

New Build Options

  • SEAL_BUILD_DEPS controls whether dependencies are downloaded and built into Microsoft SEAL or searched from the system.
  • Only a shared library will be built when BUILD_SHARED_LIBS is set to ON. Previously a static library was always built.
  • Encryption error is sampled from a Centered Binomial Distribution (CBD) by default unless SEAL_USE_GAUSSIAN_NOISE is set to ON.
    Sampling from a CBD is constant-time and faster than sampling from a Gaussian distribution, which is why it is used by many of the NIST PQC finalists.
  • SEAL_DEFAULT_PRNG controls which XOF is used for pseudo-random number generation.
    The available values are Blake2xb (default) and Shake256.

Other

  • The pkg-config system has been improved.
    All files related to pkg-config have been moved to pkgconfig/.
    CMake creates now also a pkg-config file seal_shared.pc for compiling against a shared Microsoft SEAL if BUILD_SHARED_LIBS is set to ON.
  • Added .pre-commit-config.yaml (check out pre-commit if you are not familiar with this tool).
  • Added seal::util::DWTHandler and seal::util::Arithmetic class templates that unify the implementation of FFT (used by CKKSEncoder) and NTT (used by polynomial arithmetic).
  • The performance of encoding and decoding in CKKS are improved.
  • The performance of randomness generation for ciphertexts and keys (RLWE samples) is improved.

File Changes

Renamed files and directories

New files

Removed files

  • dotnet/src/BigUInt.cs
  • dotnet/src/IntegerEncoder.cs
  • dotnet/tests/BigUIntTests.cs
  • dotnet/tests/IntegerEncoderTests.cs
  • native/examples/SEALExamples.vcxproj
  • native/examples/SEALExamples.vcxproj.filters
  • native/src/CMakeConfig.cmd
  • native/src/SEAL_C.vcxproj
  • native/src/SEAL_C.vcxproj.filters
  • native/src/SEAL.vcxproj
  • native/src/SEAL.vcxproj.filters
  • native/src/seal/biguint.h
  • native/src/seal/biguint.cpp
  • native/src/seal/intencoder.h
  • native/src/seal/intencoder.cpp
  • native/tests/packages.config
  • native/tests/SEALTest.vcxproj
  • native/tests/SEALTest.vcxproj.filters
  • native/tests/seal/biguint.cpp
  • native/tests/seal/intencoder.cpp
  • thirdparty/
  • SEAL.sln

Release 3.5.9

Choose a tag to compare

@kimlaine kimlaine released this 17 Sep 04:02

Bug fixes

Release 3.5.8

Choose a tag to compare

@kimlaine kimlaine released this 28 Aug 19:09

Other

  • The bug fixed in (PR 209) also affects Android. Changed version to 3.5.8 where this is fixed.

Release 3.5.7

Choose a tag to compare

@kimlaine kimlaine released this 28 Aug 18:49

Hotfix - 8/28/2020

Bug fixes

  • Fixed an omission in input validation in decryption: the size of the ciphertext was not checked to be non-zero.

Other

  • In Windows switch to using RtlGenRandom if the BCrypt API fails.
  • Improved performance in serialization: data clearing memory pools were always used before, but now are only used for the secret key.
  • Use native APIs for memory clearing, when available, instead of for-loop.

Release 3.5.6

Choose a tag to compare

@kimlaine kimlaine released this 15 Jul 22:28

Bug fixes

  • Fixed a bug where setting a PRNG factory to use a constant seed did not result in deterministic ciphertexts or public keys.
    The problem was that the specified PRNG factory was not used to sample the uniform part of the RLWE sample(s), but instead a fresh (secure) PRNG was always created and used.
  • Fixed a bug where the parms_id of a Plaintext was not cleared correctly before resizing in Decryptor::bfv_decrypt.
    As a result, a plaintext in NTT form could not be used as the destination for decrypting a BFV ciphertext.

Other

  • Merged pull request (Issue 190) to replace global statics with function-local statics to avoid creating these objects unless they are actually used.

Release 3.5.5

Choose a tag to compare

@kimlaine kimlaine released this 07 Jul 06:25

Hotfix -- 7/6/2020

New features

  • Added a struct seal::util::MultiplyUIntModOperand in native/src/seal/util/uintarithsmallmod.h.
    This struct handles precomputation data for Barrett style modular multiplication.
  • Added new overloads for modular arithmetic in native/src/seal/util/uintarithsmallmod.h where one operand is replaced by a MultiplyUIntModOperand instance for improved performance when the same operand is used repeatedly.
  • Changed the name of seal::util::barrett_reduce_63 to seal::util::barrett_reduce_64; the name was misleading and only referred to the size of the modulus.
  • Added seal::util::StrideIter in native/src/seal/util/iterator.h.
  • Added macros SEAL_ALLOCATE_GET_PTR_ITER and SEAL_ALLOCATE_GET_STRIDE_ITER in native/src/seal/util/defines.h.

Other

  • Significant performance improvements from merging pull request (PR 185) and implementing other improvements of the same style (see above).
  • Removed a lot of old and unused code.

Release 3.5.4

Choose a tag to compare

@kimlaine kimlaine released this 16 Jun 23:09

Bug fixes

  • std::void_t was introduced only in C++17; switched to using a custom implementation (Issue 180).
  • Fixed two independent bugs in native/src/CMakeConfig.cmd: The first prevented SEAL to be built in a directory with spaces in the path due to missing quotation marks. Another issue caused MSVC to fail when building SEAL for multiple architectures.
  • RNSBase::decompose_array had incorrect semantics that caused Evaluator::multiply_plain_normal and Evaluator::transform_to_ntt_inplace (for Plaintext) to behave incorrectly for some plaintexts.

Other

  • Added pkg-config support (PR 181).
  • seal::util::PtrIter<T *> now dereferences correctly to T & instead of T *.
    This results in simpler code, where inside SEAL_ITERATE lambda functions dereferences of seal::util::PtrIter<T *> do not need to be dereferenced a second time, as was particularly common when iterating over ModulusIter and NTTTablesIter types.
  • seal::util::IterTuple now dereferences to an std::tuple of dereferences of its component iterators, so it is no longer possible to directly pass a dereferenced seal::util::IterTuple to an inner lambda function in nested SEAL_ITERATE calls.
    Instead, the outer lambda function parameter should be wrapped inside another call to seal::util::iter before passed on to the inner SEAL_ITERATE to produce an appropriate seal::util::IterTuple.

Release 3.5.3

Choose a tag to compare

@kimlaine kimlaine released this 31 May 06:07

Bug fixes

  • Fixed a bug in seal::util::IterTuple<...> where a part of the value_type was constructed incorrectly.
  • Fixed a bug in Evaluator::mod_switch_drop_to_next that caused non-inplace modulus switching to fail (Issue 179). Thanks s0l0ist!

Release 3.5.2

Choose a tag to compare

@kimlaine kimlaine released this 30 May 08:05

Bug fixes

  • Merged pull request PR 178 to fix a lambda capture issue when building on GCC 7.5.
  • Fixed issue where SEAL.vcxproj could not be compiled with MSBuild outside the solution (Issue 171).
  • SEAL 3.5.1 required CMake 3.13 instead of 3.12; this has now been fixed and 3.12 works again (Issue 167).
  • Fixed issue in NuSpec file that made local NuGet package generation fail.
  • Fixed issue in NuSpec where XML documentation was not included into the package.

New features

  • Huge improvements to SEAL iterators, including seal::util::iter and seal::util::reverse_iter functions that can create any type of iterator from appropriate parameters.
  • Added seal::util::SeqIter<T> iterator for iterating a sequence of numbers for convenient iteration indexing.
  • Switched functions in seal/util/polyarithsmallmod.* to use iterators; this is to reduce the layers of iteration in higher level code.
  • Added macro SEAL_ITERATE that should be used instead of for_each_n.

Other

  • Added note in README.md about known performance issues when compiling with GNU G++ compared to Clang++ (Issue 173).
  • Merged pull requests that improve the performance of keyswitching (PR #177) and rescale (PR #176) in CKKS.