• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

android/H12-Nov-2021-692574

cmake/H12-Nov-2021-748645

dotnet/H12-Nov-2021-19,10410,415

native/H12-Nov-2021-64,21445,013

pipelines/H12-Nov-2021-922821

pkgconfig/H12-Nov-2021-4734

tools/H12-Nov-2021-11180

.clang-formatH A D12-Nov-20213.6 KiB127126

.gitignoreH A D12-Nov-202110.4 KiB640551

.pre-commit-config.yamlH A D12-Nov-2021356 1615

CHANGES.mdH A D12-Nov-202144.3 KiB730522

CODE_OF_CONDUCT.mdH A D12-Nov-2021444 106

CONTRIBUTING.mdH A D12-Nov-20211.6 KiB2819

ISSUES.mdH A D12-Nov-20211 KiB3021

LICENSEH A D12-Nov-20211.1 KiB2217

NOTICEH A D12-Nov-20212.7 KiB4937

README.mdH A D12-Nov-202142.8 KiB632474

SECURITY.mdH A D12-Nov-20213.4 KiB4527

README.md

1# Microsoft SEAL
2
3Microsoft SEAL is an easy-to-use open-source ([MIT licensed](LICENSE)) homomorphic encryption library developed by the Cryptography and Privacy Research Group at Microsoft.
4Microsoft SEAL is written in modern standard C++ and is easy to compile and run in many different environments.
5For more information about the Microsoft SEAL project, see [sealcrypto.org](https://www.microsoft.com/en-us/research/project/microsoft-seal).
6
7This document pertains to Microsoft SEAL version 3.7.
8Users of previous versions of the library should look at the [list of changes](CHANGES.md).
9
10## News
11
12Starting from version 3.7.2, Microsoft SEAL will push new changes to the `main`, `master`, and `contrib` branches without creating a new version.
13We adopt this approach to merge community contribution and resolve issues in a timely manner.
14These branches will stay ahead of the latest version branch/tag.
15New versions will be created when there are important bug fixes or new features.
16
17
18The [EVA compiler for CKKS](https://arxiv.org/abs/1912.11951) is available at [GitHub.com/Microsoft/EVA](https://GitHub.com/Microsoft/EVA). See [CKKS Programming with EVA](#ckks-programming-with-eva) below for more information.
19
20The [SEAL-Embedded for CKKS Encryption](https://tches.iacr.org/index.php/TCHES/article/view/8991) is available at [Github.com/Microsoft/SEAL-Embedded](https://github.com/microsoft/SEAL-Embedded).
21
22The [APSI library for Asymmetric PSI](https://eprint.iacr.org/2021/1116) is available at [Github.com/Microsoft/APSI](https://github.com/microsoft/APSI).
23
24## Contents
25
26- [Introduction](#introduction)
27  - [Core Concepts](#core-concepts)
28  - [Homomorphic Encryption](#homomorphic-encryption)
29  - [Microsoft SEAL](#microsoft-seal-1)
30- [Getting Started](#getting-started)
31  - [Optional Dependencies](#optional-dependencies)
32    - [Intel HEXL](#intel-hexl)
33    - [Microsoft GSL](#microsoft-gsl)
34    - [ZLIB and Zstandard](#zlib-and-zstandard)
35  - [Installing from NuGet Package](#installing-from-nuget-package-windows-linux-macos-android-ios)
36  - [Examples](#examples)
37  - [CKKS Programming with EVA](#ckks-programming-with-eva)
38- [Building Microsoft SEAL Manually](#building-microsoft-seal-manually)
39  - [Building C++ Components](#building-c-components)
40    - [Requirements](#requirements)
41    - [Building Microsoft SEAL](#building-microsoft-seal)
42    - [Installing Microsoft SEAL](#installing-microsoft-seal)
43    - [Building and Installing on Windows](#building-and-installing-on-windows)
44    - [Building for Android and iOS](#building-for-android-and-ios)
45    - [Building for WebAssembly](#building-for-webassembly)
46    - [Basic CMake Options](#basic-cmake-options)
47    - [Advanced CMake Options](#advanced-cmake-options)
48    - [Linking with Microsoft SEAL through CMake](#linking-with-microsoft-seal-through-cmake)
49    - [Examples, Tests, and Benchmark](#examples-tests-and-benchmark)
50  - [Building .NET Components](#building-net-components)
51    - [Windows, Linux, and macOS](#windows-linux-and-macos)
52    - [Android and iOS](#android-and-ios)
53    - [Using Microsoft SEAL for .NET](#using-microsoft-seal-for-net)
54    - [Building Your Own NuGet Package](#building-your-own-nuget-package)
55- [Contributing](#contributing)
56- [Citing Microsoft SEAL](#citing-microsoft-seal)
57- [Acknowledgments](#acknowledgments)
58
59## Introduction
60
61### Core Concepts
62
63Most encryption schemes consist of three functionalities: key generation, encryption, and decryption.
64Symmetric-key encryption schemes use the same secret key for both encryption and decryption; public-key encryption schemes use separately a public key for encryption and a secret key for decryption.
65Therefore, public-key encryption schemes allow anyone who knows the public key to encrypt data, but only those who know the secret key can decrypt and read the data.
66Symmetric-key encryption can be used for efficiently encrypting very large amounts of data, and enables secure outsourced cloud storage.
67Public-key encryption is a fundamental concept that enables secure online communication today, but is typically much less efficient than symmetric-key encryption.
68
69While traditional symmetric- and public-key encryption can be used for secure storage and communication, any outsourced computation will necessarily require such encryption layers to be removed before computation can take place.
70Therefore, cloud services providing outsourced computation capabilities must have access to the secret keys, and implement access policies to prevent unauthorized employees from getting access to these keys.
71
72### Homomorphic Encryption
73
74Homomorphic encryption refers to encryption schemes that allow the cloud to compute directly on the encrypted data, without requiring the data to be decrypted first.
75The results of such encrypted computations remain encrypted, and can be only decrypted with the secret key (by the data owner).
76Multiple homomorphic encryption schemes with different capabilities and trade-offs have been invented over the past decade; most of these are public-key encryption schemes, although the public-key functionality may not always be needed.
77
78Homomorphic encryption is not a generic technology: only some computations on encrypted data are possible.
79It also comes with a substantial performance overhead, so computations that are already very costly to perform on unencrypted data are likely to be infeasible on encrypted data.
80Moreover, data encrypted with homomorphic encryption is many times larger than unencrypted data, so it may not make sense to encrypt, e.g., entire large databases, with this technology.
81Instead, meaningful use-cases are in scenarios where strict privacy requirements prohibit unencrypted cloud computation altogether, but the computations themselves are fairly lightweight.
82
83Typically, homomorphic encryption schemes have a single secret key which is held by the data owner.
84For scenarios where multiple different private data owners wish to engage in collaborative computation, homomorphic encryption is probably not a reasonable solution.
85
86Homomorphic encryption cannot be used to enable data scientists to circumvent GDPR.
87For example, there is no way for a cloud service to use homomorphic encryption to draw insights from encrypted customer data.
88Instead, results of encrypted computations remain encrypted and can only be decrypted by the owner of the data, e.g., a cloud service customer.
89
90Most homomorphic encryption schemes provide weaker security guarantees than traditional encryption schemes. You need to read [SECURITY.md](SECURITY.md) if you are thinking of building production software using Microsoft SEAL.
91
92### Microsoft SEAL
93
94Microsoft SEAL is a homomorphic encryption library that allows additions and multiplications to be performed on encrypted integers or real numbers.
95Other operations, such as encrypted comparison, sorting, or regular expressions, are in most cases not feasible to evaluate on encrypted data using this technology.
96Therefore, only specific privacy-critical cloud computation parts of programs should be implemented with Microsoft SEAL.
97
98It is not always easy or straightfoward to translate an unencrypted computation into a computation on encrypted data, for example, it is not possible to branch on encrypted data.
99Microsoft SEAL itself has a steep learning curve and requires the user to understand many homomorphic encryption specific concepts, even though in the end the API is not too complicated.
100Even if a user is able to program and run a specific computation using Microsoft SEAL, the difference between efficient and inefficient implementations can be several orders of magnitude, and it can be hard for new users to know how to improve the performance of their computation.
101
102Microsoft SEAL comes with two different homomorphic encryption schemes with very different properties.
103The BFV scheme allows modular arithmetic to be performed on encrypted integers.
104The CKKS scheme allows additions and multiplications on encrypted real or complex numbers, but yields only approximate results.
105In applications such as summing up encrypted real numbers, evaluating machine learning models on encrypted data, or computing distances of encrypted locations CKKS is going to be by far the best choice.
106For applications where exact values are necessary, the BFV scheme is the only choice.
107
108## Getting Started
109
110There are multiple ways of installing Microsoft SEAL and starting to use it.
111The easiest way is to use a package manager to download, build, and install the library.
112For example, [vcpkg](https://github.com/microsoft/vcpkg) works on most platforms and will be up-to-date with the latest release of Microsoft SEAL (C++17 only).
113On macOS you can also use [Homebrew](https://formulae.brew.sh/formula/seal).
114The .NET library is available as a multiplatform [NuGet package](https://www.nuget.org/packages/Microsoft.Research.SEALNet).
115Finally, one can build Microsoft SEAL manually with a multiplatform CMake build system; see [Building Microsoft SEAL Manually](#building-microsoft-seal-manually) for details.
116
117### Optional Dependencies
118
119Microsoft SEAL has no required dependencies, but certain optional features can be enabled when compiling with support for specific third-party libraries.
120
121When [building manually](#building-microsoft-seal-manually), one can choose to have the Microsoft SEAL build system download and build the dependencies, or alternatively search the system directories for pre-installed dependencies.
122On the other extreme, the downloadable [NuGet package](https://www.nuget.org/packages/Microsoft.Research.SEALNet) cannot be configured at all, but it is always possible to [build a custom NuGet package](#building-your-own-nuget-package).
123Other package managers offer varying amounts of opportunities for configuring the dependencies and [other build options](#basic-cmake-options).
124
125The optional dependencies and their tested versions (other versions may work as well) are as follows:
126
127| Optional dependency                                    | Tested version | Use                                              |
128| ------------------------------------------------------ | -------------- | ------------------------------------------------ |
129| [Intel HEXL](https://github.com/intel/hexl)            | 1.2.3          | Acceleration of low-level kernels                |
130| [Microsoft GSL](https://github.com/microsoft/GSL)      | 3.1.0          | API extensions                                   |
131| [ZLIB](https://github.com/madler/zlib)                 | 1.2.11         | Compressed serialization                         |
132| [Zstandard](https://github.com/facebook/zstd)          | 1.4.5          | Compressed serialization (much faster than ZLIB) |
133| [GoogleTest](https://github.com/google/googletest)     | 1.10.0         | For running tests                                |
134| [GoogleBenchmark](https://github.com/google/benchmark) | 1.5.2          | For running benchmarks                           |
135
136#### Intel HEXL
137
138Intel HEXL is a library providing efficient implementations of cryptographic primitives common in homomorphic encryption. The acceleration is particularly evident on Intel processors with the Intel AVX512-IFMA52 instruction set.
139
140#### Microsoft GSL
141
142Microsoft GSL (Guidelines Support Library) is a header-only library that implements `gsl::span`: a *view type* that provides safe (bounds-checked) array access to memory.
143
144For example, if Microsoft GSL is available, Microsoft SEAL can allow `BatchEncoder` and `CKKSEncoder` to encode from and decode to a `gsl::span` instead of `std::vector`, which can in some cases have a significant performance benefit.
145
146#### ZLIB and Zstandard
147
148ZLIB and Zstandard are widely used compression libraries. Microsoft SEAL can optionally use these libraries to compress data that is serialized.
149
150One may ask how compression can help when ciphertext and key data is supposed to be indistinguishable from random.
151In Microsoft SEAL `Ciphertext` objects consist of a large number of integers modulo specific prime numbers (`coeff_modulus` primes).
152When using the CKKS scheme in particular, these prime numbers can be quite small (e.g., 30 bits), but the data is nevertheless serialized as 64-bit integers.
153Therefore, it is not uncommon that almost half of the ciphertext bytes are zeros, and applying a general-purpose compression algorithm is a convenient way of getting rid this wasted space.
154The BFV scheme benefits typically less from this technique, because the prime numbers used for the `coeff_modulus` encryption parameter tend to be larger, and integers modulo these prime numbers fill more of each 64-bit word.
155Compressed serialization can be applied to any serializable Microsoft SEAL object – not just to `Ciphertext` and keys .
156
157If Microsoft SEAL is compiled with ZLIB or Zstandard support, compression will automatically be used for serialization; see `Serialization::compr_mode_default` in [native/src/seal/serialization.h](native/src/seal/serialization.h).
158However, it is always possible to explicitly pass `compr_mode_type::none` to serialization methods to disable compression.
159If both ZLIB and Zstandard support are enabled, Zstandard is used by default due to its much better performance.
160
161**Note:** The compression rate for a `SecretKey` can (in theory at least) reveal information about the key.
162In most common applications of Microsoft SEAL the size of a `SecretKey` would not be deliberately revealed to untrusted parties.
163If this is a concern, one can always save the `SecretKey` in an uncompressed form.
164
165<!-- ### Installing with VCPKG (Windows, Unix-like) -->
166<!-- To install Microsoft SEAL with all dependencies enabled, run `./vcpkg install seal` or `./vcpkg install seal:x64-windows-static` on Windows. -->
167<!-- To install Microsoft SEAL with partial dependencies enabled, for example, only `ms-gsl`, run `./vcpkg install seal[core,ms-gsl]` or `./vcpkg install seal[core,ms-gsl]:x64-windows-static` on Windows. -->
168
169<!-- ### Installing with Homebrew (macOS) -->
170
171### Installing from NuGet Package (Windows, Linux, macOS, Android, iOS)
172
173For .NET developers the easiest way of installing Microsoft SEAL is by using the multiplatform NuGet package available at [NuGet.org](https://www.nuget.org/packages/Microsoft.Research.SEALNet).
174Simply add this package into your .NET project as a dependency and you are ready to go.
175
176To develop mobile applications using Microsoft SEAL and .NET for Android and iOS, just add this package to your [Xamarin](https://dotnet.microsoft.com/apps/xamarin) project. Unlike the Microsoft SEAL C++ library, the .NET wrapper library works only on 64-bit platforms, so only `arm64-v8a`/`x86_64` Android ABIs and `arm64`/`x86_64` iOS architectures are supported.
177
178### Examples
179
180Using Microsoft SEAL will require the user to invest some time in learning fundamental concepts in homomorphic encryption.
181The code comes with heavily commented examples that are designed to gradually teach such concepts as well as demonstrate a large fraction of the API.
182The examples are available (and identical) in C++ and C#, and are divided into several source files in `native/examples/` (C++) and `dotnet/examples/` (C#), as follows:
183
184| C++                   | C#                   | Description                                                                  |
185| --------------------- | -------------------- | ---------------------------------------------------------------------------- |
186| `examples.cpp`        | `Examples.cs`        | The example runner application                                               |
187| `1_bfv_basics.cpp`    | `1_BFV_Basics.cs`    | Encrypted modular arithmetic using the BFV scheme                            |
188| `2_encoders.cpp`      | `2_Encoders.cs`      | Encoding more complex data into Microsoft SEAL plaintext objects             |
189| `3_levels.cpp`        | `3_Levels.cs`        | Introduces the concept of levels; prerequisite for using the CKKS scheme     |
190| `4_ckks_basics.cpp`   | `4_CKKS_Basics.cs`   | Encrypted real number arithmetic using the CKKS scheme                       |
191| `5_rotation.cpp`      | `5_Rotation.cs`      | Performing cyclic rotations on encrypted vectors in the BFV and CKKS schemes |
192| `6_serialization.cpp` | `6_Serialization.cs` | Serializing objects in Microsoft SEAL                                        |
193| `7_performance.cpp`   | `7_Performance.cs`   | Performance tests                                                            |
194
195It is recommended to read the comments and the code snippets along with command line printout from running an example.
196For easier navigation, command line printout provides the line number in the associated source file where the associated code snippets start.
197To build the examples, see [Examples, Tests, and Benchmark](#examples-tests-and-benchmark) (C++) and [Building .NET Components](#building-net-components) (C#).
198
199**Note:** It is impossible to know how to use Microsoft SEAL correctly without studying examples 1&ndash;6.
200They are designed to provide the reader with the necessary conceptual background on homomorphic encryption.
201Reusing code directly from the examples will not work well, as the examples are often demonstrating individual pieces of functionality, and are not optimized for performance.
202Writing Microsoft SEAL code without studying the examples in depth will inevitably result in code that is vulnerable, malfunctioning, or extremely slow.
203
204### CKKS Programming with EVA
205
206When studying the examples above, it will become clear that the CKKS scheme can be unfriendly to beginners.
207Even relatively simple computations can be challenging to get to work due to the limitations of the rescaling operation and the requirement of aligning scales at different levels.
208
209We have created a new compiler tool called EVA that helps resolve these challenges to a large extent.
210EVA allows programmers to express desired encrypted computations in Python. It optimizes the computations for Microsoft SEAL, selects appropriate encryption parameters, and provides a convenient Python API for encrypting the input, executing the computation, and decrypting the result.
211EVA is available at [GitHub.com/Microsoft/EVA](https://GitHub.com/Microsoft/EVA).
212Try it out, and let us know what you think!
213
214**Note:** EVA only supports the CKKS scheme. There are no immediate plans to support the BFV scheme.
215
216## Building Microsoft SEAL Manually
217
218### Building C++ Components
219
220On all platforms Microsoft SEAL is built with CMake.
221We recommend using out-of-source build although in-source build works.
222Below we give instructions for how to configure, build, and install Microsoft SEAL either globally (system-wide), or locally (for a single user).
223A global install requires elevated (root or administrator) privileges.
224
225#### Requirements
226
227| System | Toolchain |
228|---|---|
229| Windows | Visual Studio 2019 with C++ CMake Tools for Windows |
230| Linux | Clang++ (>= 5.0) or GNU G++ (>= 6.0), CMake (>= 3.13) |
231| macOS/iOS | Xcode toolchain (>= 9.3), CMake (>= 3.13) |
232| Android | Android Studio |
233
234**Note:** Microsoft SEAL compiled with Clang++ has much better runtime performance than one compiled with GNU G++.
235
236#### Building Microsoft SEAL
237
238We assume that Microsoft SEAL has been cloned into a directory called `SEAL` and all commands presented below are assumed to be executed in the directory `SEAL`.
239
240You can build the Microsoft SEAL library (out-of-source) for your machine by executing the following commands:
241
242```PowerShell
243cmake -S . -B build
244cmake --build build
245```
246
247After the build completes, the output binaries can be found in `build/lib/` and `build/bin/` directories.
248
249Various configuration options can be specified and passed to the CMake build system.
250These are decribed below in sections [Basic CMake Options](#basic-cmake-options) and [Advanced CMake Options](#advanced-cmake-options).
251
252#### Installing Microsoft SEAL
253
254If you have root access to the system you can install Microsoft SEAL globally as follows:
255
256```PowerShell
257cmake -S . -B build
258cmake --build build
259sudo cmake --install build
260```
261
262To instead install Microsoft SEAL locally, e.g., to `~/mylibs/`, do the following:
263
264```PowerShell
265cmake -S . -B build -DCMAKE_INSTALL_PREFIX=~/mylibs
266cmake --build build
267sudo cmake --install build
268```
269
270#### Building and Installing on Windows
271
272On Windows the same scripts above work in a developer command prompt for Visual Studio using either the Ninja or "Visual Studio 16 2019" generators.
273
274When using the Ninja generator, please use the appropriate command prompt depending on the platform you want to build for. If you want to build for x64, please use the **x64 Native Tools Command Prompt for Visual Studio 2019** command prompt to configure and build the library. If you want to build for x86, please use the **x86 Native Tools Command Prompt for Visual Studio 2019** command prompt to configure and build the library. To build using Ninja, type
275
276```PowerShell
277cmake -S . -B build -G Ninja
278cmake --build build
279```
280
281When using the "Visual Studio 16 2019" generator you can use the **Developer Command Prompt for VS 2019** command prompt to configure and build the library. By default the generated platform will be x64. You can specify the desired platform using the architecture flag `-A <x64|Win32>` and the desired configuration using `--config <Debug|Release>`.
282
283```PowerShell
284# Generate and build for x64 in Release mode
285cmake -S . -B build -G "Visual Studio 16 2019" -A x64
286cmake --build build --config Release
287```
288
289```PowerShell
290# Generate and build for x86 in Release mode
291cmake -S . -B build -G "Visual Studio 16 2019" -A Win32
292cmake --build build --config Release
293```
294
295Installing the library in Windows works as well. Instead of using the `sudo` command, however, you need to run `cmake --install build` from a command prompt with Administrator permissions. Files will be installed by default to `C:\Program Files (x86)\SEAL\`.
296
297Visual Studio 2019 provides support for CMake-based projects. You can select the menu option `File / Open / Folder...` and navigate to the folder where the Microsoft SEAL repository is located. After opening the folder, Visual Studio will detect that this is a CMake-based project and will enable the menu command `Project / CMake settings for SEAL`. This will open the CMake settings editor that provides a user interface where you can create different configurations and set different CMake options.
298
299After the build completes, the output static library `seal-<version>.lib` can be found in `build\lib\` or `build\lib\Release\`.
300When linking with applications, using CMake as is explained in [Linking with Microsoft SEAL through CMake](#linking-with-microsoft-seal-through-cmake) is highly recommended.
301Alternatively, you need to add `native\src\` (full path) and `build\native\src\` as include directories to locate the Microsoft SEAL header files.
302
303#### Building for Android and iOS
304
305Microsoft SEAL can be compiled for Android and iOS.
306Under the [android/](android/) directory of the source tree you will find an [Android Studio](https://developer.android.com/studio) project that you can use to compile the library for Android.
307
308To build the library for iOS, use the following scripts:
309
310```PowerShell
311# Configure CMake
312cmake -S . -B build -GXcode -DSEAL_BUILD_SEAL_C=ON -DSEAL_BUILD_STATIC_SEAL_C=ON -DCMAKE_SYSTEM_NAME=iOS "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" -C cmake/memset_s.iOS.cmake
313
314# Build libseal*.a for x86_64
315xcodebuild -project build/SEAL.xcodeproj -sdk iphonesimulator -arch x86_64 -configuration Release clean build
316mkdir -p build/lib/x86_64
317cp build/lib/Release/libseal*.a build/lib/x86_64
318
319# Build libseal*.a for arm64
320xcodebuild -project SEAL.xcodeproj -sdk iphoneos -arch arm64 -configuration Release clean build
321mkdir -p build/lib/arm64
322cp build/lib/Release/libseal*.a build/lib/arm64
323
324# Combine libseal-*.a into libseal.a and libsealc-*.a into libsealc.a
325lipo -create -output build/lib/libseal.a build/lib/x86_64/libseal-*.a arm64/libseal-*.a
326lipo -create -output build/lib/libsealc.a build/lib/x86_64/libsealc-*.a build/lib/arm64/libsealc-*.a
327```
328
329The native libraries generated through these methods are meant to be called only through the .NET library described in the following sections.
330Specifically, they do not contain any wrappers that can be used from Java (for Android) or Objective C (for iOS).
331
332#### Building for WebAssembly
333
334Microsoft SEAL can be compiled for JavaScript and WebAssembly using [emscripten](https://emscripten.org) on Windows, Linux, and macOS.
335Building for the Web means SEAL can be run in any client/server environment such as all the major browsers (e.g. Edge, Chrome, Firefox, Safari) and NodeJS.
336
337Building for WebAssembly requires the emscripten toolchain to be installed.
338The easiest way to configure the toolchain is to clone [emsdk](https://github.com/emscripten-core/emsdk) and follow the [instructions](https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended) (with system-specific notes). For examples, on Linux and macOS, inside the `emsdk` repo, run the following:
339
340```PowerShell
341# Install the latest toolchain
342./emsdk install latest
343./emsdk activate latest
344# Source the environment
345source ./emsdk_env.sh
346```
347**On Windows, better run from a developer command prompt for Visual Studio; and replace `./emsdk` and `source ./emsdk_env.sh` with `emsdk` and `emsdk_env.bat`, respectively.**
348In other environments, `cmake` must be added to the path, and either "Ninja" or "MinGW Makefiles" should be specified as generator in the following configuration step.
349`emcmake` does not work with Visual Studio 16 2019 generator.
350
351Within the same shell, navigate to the root directory of Microsoft SEAL, run the following commands to build for WebAssembly:
352
353```PowerShell
354# Configure CMake. Example flags for a release build
355emcmake cmake -S . -B build \
356 -DBUILD_SHARED_LIBS=OFF \
357 -DCMAKE_BUILD_TYPE=Release \
358 -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG -flto -O3" \
359 -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -flto -O3" \
360 -DSEAL_BUILD_BENCH=OFF \ # Benchmark can be built for WASM. Change this to ON.
361 -DSEAL_BUILD_EXAMPLES=OFF \
362 -DSEAL_BUILD_TESTS=OFF \
363 -DSEAL_USE_CXX17=ON \
364 -DSEAL_USE_INTRIN=ON \
365 -DSEAL_USE_MSGSL=OFF \
366 -DSEAL_USE_ZLIB=ON \
367 -DSEAL_THROW_ON_TRANSPARENT_CIPHERTEXT=ON
368
369# Make the static library (shared libs are not supported with emscripten)
370emmake make -C build -j
371
372# Build the WebAssembly module
373emcc \
374 -Wall \
375 -flto \
376 -O3 \
377 build/lib/libseal-3.7.a \
378 --bind \
379 -o "build/bin/seal_wasm.js" \
380 -s WASM=1 \
381 -s ALLOW_MEMORY_GROWTH=1
382```
383
384**Note**: There are many flags to consider when building a WebAssembly module. Please refer to the [settings.js](https://github.com/emscripten-core/emscripten/blob/main/src/settings.js) file for advanced build flags.
385
386Building will generate two output files, `seal_wasm.js` and `seal_wasm.wasm`, in the `build/bin/` directory.
387The file sizes for the artifacts are very small.
388This is because that the optimization flags perform dead code elimination (DCE) as there are no bindings generated to JavaScript.
389Defining these bindings is **necessary** in order to call into WebAssembly from the JavaScript domain; however, Microsoft SEAL does not include any definitions at this time.
390The build flag `--bind` expects the bindings to be specified using the [embind](https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html) syntax.
391
392#### Basic CMake Options
393
394The following options can be used with CMake to configure the build. The default value for each option is denoted with boldface in the **Values** column.
395
396| CMake option           | Values                                                       | Information                                                                                                                                                                                            |
397| ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
398| CMAKE_BUILD_TYPE       | **Release**</br>Debug</br>RelWithDebInfo</br>MinSizeRel</br> | `Debug` and `MinSizeRel` have worse run-time performance. `Debug` inserts additional assertion code. Set to `Release` unless you are developing Microsoft SEAL itself or debugging some complex issue. |
399| SEAL_BUILD_EXAMPLES    | ON / **OFF**                                                 | Build the C++ examples in [native/examples](native/examples).                                                                                                                                          |
400| SEAL_BUILD_TESTS       | ON / **OFF**                                                 | Build the tests to check that Microsoft SEAL works correctly.                                                                                                                                          |
401| SEAL_BUILD_BENCH       | ON / **OFF**                                                 | Build the performance benchmark.                                                                                                                                                                       |
402| SEAL_BUILD_DEPS        | **ON** / OFF                                                 | Set to `ON` to automatically download and build [optional dependencies](#optional-dependencies); otherwise CMake will attempt to locate pre-installed dependencies.                                    |
403| SEAL_USE_INTEL_HEXL    | ON / **OFF**                                                 | Set to `ON` to use Intel HEXL for low-level kernels.                                                                                                                                            |
404| SEAL_USE_MSGSL         | **ON** / OFF                                                 | Build with Microsoft GSL support.                                                                                                                                                                      |
405| SEAL_USE_ZLIB          | **ON** / OFF                                                 | Build with ZLIB support.                                                                                                                                                                               |
406| SEAL_USE_ZSTD          | **ON** / OFF                                                 | Build with Zstandard support.                                                                                                                                                                          |
407| BUILD_SHARED_LIBS      | ON / **OFF**                                                 | Set to `ON` to build a shared library instead of a static library. Not supported in Windows.                                                                                                           |
408| SEAL_BUILD_SEAL_C      | ON / **OFF**                                                 | Build the C wrapper library SEAL_C. This is used by the C# wrapper and most users should have no reason to build it.                                                                                   |
409| SEAL_USE_CXX17         | **ON** / OFF                                                 | Set to `ON` to build Microsoft SEAL as C++17 for a positive performance impact.                                                                                                                        |
410| SEAL_USE_INTRIN        | **ON** / OFF                                                 | Set to `ON` to use compiler intrinsics for improved performance. CMake will automatically detect which intrinsics are available and enable them accordingly.                                           |
411
412As usual, these options can be passed to CMake with the `-D` flag.
413For example, one could run
414
415```PowerShell
416cmake -S . -B build -DSEAL_BUILD_EXAMPLES=ON
417```
418
419to configure a release build of a static Microsoft SEAL library and also build the examples.
420
421#### Advanced CMake Options
422
423The following options can be used with CMake to further configure the build. Most users should have no reason to change these, which is why they are marked as advanced.
424
425| CMake option                         | Values                    | Information                                                                                                                                                                                                                                                                                              |
426| ------------------------------------ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
427| SEAL_THROW_ON_TRANSPARENT_CIPHERTEXT | **ON** / OFF              | Set to `ON` to throw an exception when Microsoft SEAL produces a ciphertext with no key-dependent component. For example, subtracting a ciphertext from itself, or multiplying a ciphertext with a plaintext zero yield identically zero ciphertexts that should not be considered as valid ciphertexts. |
428| SEAL_BUILD_STATIC_SEAL_C             | ON / **OFF**              | Set to `ON` to build SEAL_C as a static library instead of a shared library.                                                                                                                                                                                                                             |
429| SEAL_DEFAULT_PRNG                    | **Blake2xb**</br>Shake256 | Microsoft SEAL supports both Blake2xb and Shake256 XOFs for generating random bytes. Blake2xb is much faster, but it is not standardized, whereas Shake256 is a FIPS standard.                                                                                                                           |
430| SEAL_USE_GAUSSIAN_NOISE              | ON / **OFF**              | Set to `ON` to use a non-constant time rounded continuous Gaussian for the error distribution; otherwise a centered binomial distribution &ndash; with slightly larger standard deviation &ndash; is used.                                                                                               |
431| SEAL_SECURE_COMPILE_OPTIONS          | ON / **OFF**              | Set to `ON` to compile/link with Control-Flow Guard (`/guard:cf`) and Spectre mitigations (`/Qspectre`). This has an effect only when compiling with MSVC.                                                                                                                                               |
432| SEAL_USE_ALIGNED_ALLOC                    | **ON** / OFF              | Set to `ON` to use 64-byte aligned memory allocations. This can improve performance of AVX512 primitives when Intel HEXL is enabled. This depends on C++17 and is disabled on Android.                                                                                               |
433
434#### Linking with Microsoft SEAL through CMake
435
436It is very easy to link your own applications and libraries with Microsoft SEAL if you use CMake.
437Simply add the following to your `CMakeLists.txt`:
438
439```PowerShell
440find_package(SEAL 3.7 REQUIRED)
441target_link_libraries(<your target> SEAL::seal)
442```
443
444If Microsoft SEAL was installed globally, the above `find_package` command will likely find the library automatically.
445To link with a Microsoft SEAL installed locally, e.g., installed in `~/mylibs` as described above, you may need to tell CMake where to look for Microsoft SEAL when you configure your application by running:
446
447```PowerShell
448cd <directory containing your CMakeLists.txt>
449cmake . -DCMAKE_PREFIX_PATH=~/mylibs
450```
451
452If Microsoft SEAL was installed using a package manager like vcpkg or Homebrew, please refer to their documentation for how to link with the installed library. For example, vcpkg requires you to specify the vcpkg CMake toolchain file when configuring your project.
453
454#### Examples, Tests, and Benchmarks
455
456When building Microsoft SEAL, examples, tests, and benchmarks can be built by setting `SEAL_BUILD_EXAMPLES=ON`, `SEAL_BUILD_TESTS=ON`, and `SEAL_BUILD_BENCH=ON`; see [Basic CMake Options](basic-cmake-options).
457Alternatively, [examples](native/examples/CMakeLists.txt), [tests](native/tests/CMakeLists.txt), and [benchmark](native/bench/CMakeLists.txt) can be built as standalone CMake projects linked with Microsoft SEAL (installed in `~/mylibs`), by following the commands below.
458Omit setting `SEAL_ROOT` if the library is installed globally.
459
460```PowerShell
461cd native/<examples|tests|bench>
462cmake -S . -B build -DSEAL_ROOT=~/mylibs
463cmake --build build
464```
465
466By default, benchmarks run for a vector of parameters and primitives, which can be overwelmingly informative.
467To execute a subset of benchmark cases, see [Google Benchmark README](https://github.com/google/benchmark/blob/master/README.md#running-a-subset-of-benchmarks).
468For advanced users, the `bm_parms_vec` variable in [native/bench/bench.cpp](native/bench/bench.cpp) can be overwritten with custom paramter sets.
469
470**Note**: The benchmark code is strictly for experimental purposes; it allows insecure parameters that must not be used in real applications.
471Do not follow the benchmarks as examples.
472
473### Building .NET Components
474
475Microsoft SEAL provides a .NET Standard library that wraps the functionality in Microsoft SEAL for use in .NET development.
476Using the existing [NuGet package](https://www.nuget.org/packages/Microsoft.Research.SEALNet) is highly recommended, unless development of Microsoft SEAL or building a custom NuGet package is intended.
477Prior to building .NET components, the C wrapper library SEAL_C must be built following [Building C++ Components](#building-c-components).
478The SEAL_C library is meant to be used only by the .NET library, not by end-users.
479
480**Note**: SEAL_C and the .NET library only support 64-bit platforms.
481
482#### Windows, Linux, and macOS
483
484For compiling .NET code you will need to install a [.NET Core SDK (>= 3.1)](https://dotnet.microsoft.com/download).
485Building the SEAL_C library with CMake will generate project files for the .NET wrapper library, examples, and unit tests.
486The SEAL_C library must be discoverable when running a .NET application, e.g., be present in the same directory as your executable, which is taken care of by the .NET examples and tests project files.
487Run the following scripts to build each project:
488
489```PowerShell
490dotnet build dotnet/src --configuration <Debug|Release> # Build .NET wrapper library
491dotnet test dotnet/tests # Build and run .NET unit tests
492dotnet run -p dotnet/examples # Build and run .NET examples
493```
494
495You can use `--configuration <Debug|Release>` to run `Debug` or `Release` examples and unit tests.
496You can use `--verbosity detailed` to print the list of unit tests that are being run.
497
498On Windows, you can also use the Microsoft Visual Studio 2019 solution file `dotnet/SEALNet.sln` to build all three projects.
499
500#### Android and iOS
501
502While it is possible to build your own custom NuGet package for Android or iOS (see [Building for Android and iOS](#building-for-android-and-ios) for the native component), this is not easy and is not recommended. Instead, please add a reference to the multiplatform [NuGet package](https://www.nuget.org/packages/Microsoft.Research.SEALNet) to your [Xamarin](https://dotnet.microsoft.com/apps/xamarin) project.
503
504#### Using Microsoft SEAL for .NET
505
506To use Microsoft SEAL for .NET in your own application you need to:
507
5081. Add a reference in your project to `SEALNet.dll`;
5091. Ensure the native shared library is available for your application when run.
510The easiest way to ensure this is to copy the native shared library to the same directory where your application's executable is located.
511
512#### Building Your Own NuGet Package
513
514You can build your own NuGet package for Microsoft SEAL by following the instructions in [NUGET.md](dotnet/nuget/NUGET.md).
515
516## Contributing
517
518For contributing to Microsoft SEAL, please see [CONTRIBUTING.md](CONTRIBUTING.md).
519
520## Citing Microsoft SEAL
521
522To cite Microsoft SEAL in academic papers, please use the following BibTeX entries.
523
524### Version 3.7
525
526```tex
527    @misc{sealcrypto,
528        title = {{M}icrosoft {SEAL} (release 3.7)},
529        howpublished = {\url{https://github.com/Microsoft/SEAL}},
530        month = sep,
531        year = 2021,
532        note = {Microsoft Research, Redmond, WA.},
533        key = {SEAL}
534    }
535```
536
537### Version 3.6
538
539```tex
540    @misc{sealcrypto,
541        title = {{M}icrosoft {SEAL} (release 3.6)},
542        howpublished = {\url{https://github.com/Microsoft/SEAL}},
543        month = nov,
544        year = 2020,
545        note = {Microsoft Research, Redmond, WA.},
546        key = {SEAL}
547    }
548```
549
550### Version 3.5
551
552```tex
553    @misc{sealcrypto,
554        title = {{M}icrosoft {SEAL} (release 3.5)},
555        howpublished = {\url{https://github.com/Microsoft/SEAL}},
556        month = apr,
557        year = 2020,
558        note = {Microsoft Research, Redmond, WA.},
559        key = {SEAL}
560    }
561```
562
563### Version 3.4
564
565```tex
566    @misc{sealcrypto,
567        title = {{M}icrosoft {SEAL} (release 3.4)},
568        howpublished = {\url{https://github.com/Microsoft/SEAL}},
569        month = oct,
570        year = 2019,
571        note = {Microsoft Research, Redmond, WA.},
572        key = {SEAL}
573    }
574```
575
576### Version 3.3
577
578```tex
579    @misc{sealcrypto,
580        title = {{M}icrosoft {SEAL} (release 3.3)},
581        howpublished = {\url{https://github.com/Microsoft/SEAL}},
582        month = jun,
583        year = 2019,
584        note = {Microsoft Research, Redmond, WA.},
585        key = {SEAL}
586    }
587```
588
589### Version 3.2
590
591```tex
592    @misc{sealcrypto,
593        title = {{M}icrosoft {SEAL} (release 3.2)},
594        howpublished = {\url{https://github.com/Microsoft/SEAL}},
595        month = feb,
596        year = 2019,
597        note = {Microsoft Research, Redmond, WA.},
598        key = {SEAL}
599    }
600```
601
602### Version 3.1
603
604```tex
605    @misc{sealcrypto,
606        title = {{M}icrosoft {SEAL} (release 3.1)},
607        howpublished = {\url{https://github.com/Microsoft/SEAL}},
608        month = dec,
609        year = 2018,
610        note = {Microsoft Research, Redmond, WA.},
611        key = {SEAL}
612    }
613```
614
615### Version 3.0
616
617```tex
618    @misc{sealcrypto,
619        title = {{M}icrosoft {SEAL} (release 3.0)},
620        howpublished = {\url{http://sealcrypto.org}},
621        month = oct,
622        year = 2018,
623        note = {Microsoft Research, Redmond, WA.},
624        key = {SEAL}
625    }
626```
627
628## Acknowledgments
629
630Many people have contributed substantially to Microsoft SEAL without being represented in the Git history.
631We wish to express special gratitude to [John Wernsing](https://github.com/wernsingj), [Hao Chen](https://github.com/haochenuw), [Yongsoo Song](https://yongsoosong.github.io), [Olli Saarikivi](https://github.com/olsaarik), [Rachel Player](https://github.com/rachelplayer), [Gizem S. Cetin](https://github.com/gizemscetin), [Peter Rindal](https://github.com/ladnir), [Amir Jalali](https://github.com/amirjalali65), [Kyoohyung Han](https://github.com/KyoohyungHan), [Sadegh Riazi](https://www.sadeghr.com), [Ilia Iliashenko](https://homes.esat.kuleuven.be/~ilia), [Roshan Dathathri](https://roshandathathri.github.io), [Pardis Emami-Naeini](https://homes.cs.washington.edu/~pemamina), [Sangeeta Chowdhary](https://github.com/sangeeta0201), [Deepika Natarajan](https://github.com/dnat112), and [Michael Rosenberg](https://github.com/rozbb).
632