Lattigo v6 for Lattice-Based Multiparty Homomorphic Encryption in Go
A library for lattice-based multiparty homomorphic encryption in Go
At a glance
- What is it?
- Lattigo is a pure Go library for RLWE-based homomorphic encryption, threshold key generation, and secure computation across BFV, BGV, and CKKS. It fits Go-based services that need programmable ciphertext operations, but its cryptographic scope is much broader than a general-purpose encryption library.
- Who is it for?
- Lattigo is appropriate for Go engineers designing distributed or threshold homomorphic systems that need explicit control over RLWE parameters, ciphertext operations, or CKKS bootstrapping. It is a poor fit for ordinary payload encryption or teams unwilling to manage cryptographic schemas and parameter choices.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Go, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Lattigo's Distributed Computation Boundary
Lattigo addresses computation on encrypted data, not merely storage or transport encryption. Its goal is to let a program represent and evaluate computations while ciphertexts remain in an encrypted form. This matters when an application cannot reveal its inputs to the component performing the calculation, such as a distributed service that evaluates data supplied by several participants.
The intended audience is Go engineers working with distributed systems and microservices, as the README states. The project offers single-party primitives, multiparty or threshold protocols, and higher-level circuits for two important scheme families. It is aimed at developers who understand homomorphic encryption concepts and need control over ring parameters, key switching, rescaling, rotations, or protocol participants. A team looking for transparent encryption between services will not find that use case described here.
Lattigo covers several different numeric models. BFV and BGV perform modular integer arithmetic, while CKKS performs approximate fixed-point arithmetic over complex or real numbers. The choice affects plaintext encoding, evaluation depth, rescaling behavior, and circuit availability. BFV is implemented through a BGV wrapper. CKKS also supplies circuits for comparisons, inverse evaluation, polynomial evaluation, `mod1`, discrete Fourier transforms, and bootstrapping. That breadth makes Lattigo more than a basic encrypt-and-decrypt package, but it also means adoption requires selecting the scheme first rather than treating the library as a single encryption API.
From RNS Arithmetic to Ciphertext Evaluation
The repository is organized as a strict dependency chain. At the bottom, `ring` implements polynomial arithmetic in the RNS basis. Its documented responsibilities include RNS basis extension, rescaling, NTT operations, and uniform, Gaussian, and ternary sampling. Power-of-two cyclotomic rings receive specialized arithmetic support.
The `core` layer builds cryptographic behavior on those operations. The `rlwe` package contains scheme-independent plaintext and ciphertext types, encryption, decryption, key generation, key switching, and RLWE repacking. The `rgsw` layer adds Full-RNS Ring-GSW ciphertexts and the external product. These primitives support operations such as programmable multiplication and LMKCDEY blind rotations, which are needed for rotations within encrypted vectors.
Above `core`, `schemes/bfv`, `schemes/bgv`, and `schemes/ckks` instantiate the corresponding RLWE-based systems. The `circuits` tree contains higher-level evaluations built on those schemes. The `multiparty` layer adds distributed key generation, interactive ciphertext bootstrapping, and conversion between linear secret-sharing shares and ciphertexts for `mpbgv` and `mpckks`.
That layering is the main architectural decision. Scheme-independent work remains in `core`, while scheme-specific behavior stays in `schemes`. It reduces duplication and gives developers explicit control over low-level operations. The cost is a substantial API surface, and the README does not provide one compact application recipe that connects all these layers.
Publishing Lattigo Documentation as a First Use
The README does not document a standalone installer or provide a one-command application initialization. Lattigo is a Go module, and the documented local workflow installs the official documentation renderer, changes into a local Lattigo checkout, and launches package documentation. The `go.mod` module path includes the major version, so consumers must account for `/v6` in import paths.
Use this workflow to inspect the actual APIs before writing an encryption service:
$ go install golang.org/x/pkgsite/cmd/pkgsite@latest
$ cd lattigo
$ pkgsite -open .The first command installs `pkgsite`. The next two commands operate on a local `lattigo` directory and open its rendered documentation in a browser. The generated documentation should expose the package hierarchy from `ring` through `circuits` and `multiparty`.
For a first code-oriented use, the repository places executable programs in `examples`, including `examples/singleparty` and `examples/multiparty`. Each example subpackage also includes test files demonstrating primitives. The README excerpt does not provide exact commands or code for a particular example, so this review does not invent a program that could depend on an incorrect API call. The concrete starting points available in the repository are `examples/params.go`, `examples/examples.go`, and the subpackages beneath those two example directories.
The module declares `go 1.26.0`, which is a hard adoption constraint rather than a routine detail. A development environment based on an older Go release would need to be aligned before the module can be used as declared.
CKKS Bootstrapping and Multiparty Costs
Lattigo's expensive features also create its largest implementation and parameter burdens. CKKS bootstrapping supports real and complex fixed-point arithmetic, conjugate-invariant rings, batch processing with automatic packing and unpacking of sparse or smaller ring-degree ciphertexts, arbitrary precision bootstrapping, and configurable circuit components. These are specialized evaluations, not automatic benefits available to every CKKS program.
The multiparty packages add another layer. Their documented responsibilities include homomorphic decryption and re-encryption to and from linear secret-sharing shares, as well as interactive bootstrapping with secret-shared secret keys. A deployment therefore has to consider not only ciphertext computation but also how keys are distributed among participants and how interactive protocol steps are coordinated. The README does not document deployment topology, network transport, participant recovery, or rollback behavior, so those operational questions cannot be resolved from the project overview.
The strict package hierarchy is convenient when every layer is needed. For a narrowly scoped service, it can also mean substantial API study. Developers should move from `ring` or `core` only when they need lower-level control, select a scheme package for encoding and ciphertext operations, and add `circuits` or `multiparty` only when their protocol requires those facilities.
Pure Go Portability Versus C++ Library Scope
Lattigo's clearest alternative is a C++ homomorphic encryption implementation used through foreign-language bindings or a service boundary. The approaches differ in language integration, deployment shape, and the code an application must own. Lattigo keeps cryptographic primitives, circuits, and multiparty operations inside one Go module, uses Go's concurrency and portability model, and can compile to WebAssembly. A C++ library may fit an existing native cryptographic toolchain, although the README does not document performance results or compatibility for a named project, so no stronger comparison is justified.
There is also a simpler boundary: use ordinary encryption and perform computation only after authorized decryption. That approach avoids homomorphic circuit design, rotation keys, rescaling, and threshold protocol coordination when the threat model permits it. Lattigo is the wrong tool when intermediate plaintext values are acceptable, when the required CKKS bootstrapping configuration is not understood, or when a simple message encryption protocol is sufficient.
Pure Go also does not remove cryptographic responsibility. Parameter selection, secret handling, encoding choices, and protocol design remain application concerns. The README claims comparable performance with state-of-the-art C++ libraries, but it does not publish the measurements behind that statement, so performance should not be treated as an established adoption result.
Lattigo v6 Maintenance, Modules, and Licensing
The repository is not archived, and the last push was on 2026-09-28. The most recent listed release is `v6.2.0`, dated 2026-02-02, following `v6.1.1` from 2025-03-17 and `v6.1.0` from 2024-10-14. These facts indicate current repository activity, but they do not by themselves establish the security properties of a particular release.
Lattigo uses Go's semantic import versioning. The module is named `github.com/tuneinsight/lattigo/v6`, and the README says imports for a major version X must use `github.com/tuneinsight/lattigo/v[X]/`. Older modules requiring `github.com/ldsec/lattigo/v2` are described as still building correctly. Consumers upgrading across major versions must therefore change import paths and assess API changes; the excerpt does not provide a migration procedure.
The repository is licensed under `Apache-2.0`, with `LICENSE`, `NOTICE`, and `SECURITY.md` present. The README states that development was originally by the EPFL Laboratory for Data Security through version 2.4.0, while Tune Insight SA has maintained and supported it since version 3.0.0. License obligations and security-reporting procedures should be reviewed directly in those repository files rather than inferred from the general license identifier.
Verification Boundaries for a Lattigo Adoption
Lattigo is a serious fit for Go developers who need lattice-based homomorphic computation and can work at the RLWE scheme level. Its Full-RNS implementation, BFV, BGV, CKKS, circuit collection, and multiparty packages provide a substantial scope without requiring a native C++ toolchain. The pure Go structure and documented WASM compilation also make it relevant to browser-facing Go builds.
Adoption should be narrower when the requirement is ordinary encryption, when plaintext can safely be recovered before computation, or when nobody will own parameter selection and cryptographic key handling. CKKS bootstrapping and threshold protocols need especially careful review because they add protocol and configuration complexity beyond basic ciphertext arithmetic.
The first verification point is concrete: open the generated package documentation, inspect the exact `v6` APIs in `schemes` and `multiparty`, and compare them with the example subpackages under `examples/singleparty` and `examples/multiparty`. Then confirm the application uses the declared Go toolchain and the intended major-version import path.
Editorial conclusion
Lattigo is appropriate for Go engineers designing distributed or threshold homomorphic systems that need explicit control over RLWE parameters, ciphertext operations, or CKKS bootstrapping. It is a poor fit for ordinary payload encryption or teams unwilling to manage cryptographic schemas and parameter choices. Before adoption, inspect the relevant package documentation and executable examples for the intended BFV, BGV, CKKS, or multiparty flow, then verify the module version and Go version declared in `go.mod`.
Frequently asked questions
What is Lattigo used for?
Lattigo implements homomorphic encryption primitives and secure protocols for computing on encrypted data. It is intended for distributed systems and microservices where computation may need to occur without exposing plaintext inputs.
Which homomorphic encryption schemes does Lattigo support?
The scheme packages support BFV, BGV, and CKKS, including multiparty versions. BFV and BGV cover modular integer arithmetic, while CKKS covers approximate fixed-point arithmetic.
How do I install Lattigo with Go?
The README documents a local documentation workflow using `pkgsite`, rather than an application installer. The module path is `github.com/tuneinsight/lattigo/v6`, and `go.mod` declares `go 1.26.0`.
Does Lattigo support multiparty homomorphic encryption?
Yes. Its `multiparty` packages provide distributed key generation, conversion between linear secret-sharing shares and ciphertexts, and interactive bootstrapping for BGV and CKKS.
Does Lattigo support WebAssembly builds?
The README states that its pure Go implementation supports cross-platform builds, including WebAssembly compilation for browser clients.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/tuneinsight-lattigo)Was this useful?