SEAL Versions Save

Microsoft SEAL is an easy-to-use and powerful homomorphic encryption library.

v3.6.3

3 years ago

New Features

Other

  • Improved the error message when attempting to configure with BUILD_SHARED_LIBS=ON and SEAL_BUILD_SEAL_C=ON (Issue 284).
  • Added seal::random_bytes function in randomgen.h.
  • Removed redundant is_metadata_valid_for invocations reported in (Issue 313).
  • Minor bug fixes

File Changes

v3.6.2

3 years ago

Hotfix - 2/18/2021

  • Merged pull request (PR 282) with typo and minor bug fixes.

Bug Fixes

  • Fixed an issue (Issue 278) in finding ZLIB header files when building SEAL with BUILD_SHARED_LIBS=ON.
  • Fixed a member variable initialization order bug in SafeByteBuffer.

New Features

  • Added benchmarks that depend on Google Benchmark in native/bench.

Other

  • Changed low-level code that reduces the runtime difference among code generated by msvc, gcc, and clang.
  • Using ARM64 intrinsics for better performance (PR 269).

v3.6.1

3 years ago
  • 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.

v3.6.0

3 years ago

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

v3.5.9

3 years ago

Bug fixes

v3.5.8

3 years ago

Other

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

v3.5.7

3 years ago

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.

v3.5.6

3 years ago

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.

v3.5.5

3 years ago

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.

v3.5.4

3 years ago

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.