ICICLE v4 introduces support for lattice-based cryptography, enabling a new class of post-quantum and privacy-preserving applications. Lattices provide a strong foundation for post-quantum cryptography, support a range of cryptographic protocols, and lay the groundwork for advanced schemes such as fully homomorphic encryption (FHE).

Here are some of the protocols we’ve implemented so far using v4: 

ML-KEM 

ICICLE’s lattice upgrade enables post-quantum cryptography, starting with NIST FIPS203 standard, aka ML-KEM, now supported in C++, Rust, and Go, and paving the way for more to come. The CUDA code is fully open source and outperforms state of the art. 

ML-KEM Keygen, Encap, Decap comparison between ICICLE GPU and NVIDIA cuPQC

Labrador 

Labrador has become an important tool in lattice cryptography, already seeing applications in tasks like post-quantum signature aggregation. 

Labrador is a zkSNARK designed to produce almost constant size lattice-based zero-knowledge proofs. It is the first practical lattice-based zkSNARK. Since the protocol relies only on lattice assumptions, it is also post-quantum secure. By exploiting the stronger lattice based module SIS assumption, it is able to create proofs of approximately 50 kB across a wide range of practically relevant R1CS sizes. These are much smaller in comparison to the proofs generated by hash based PCP arguments. 

Labrador can be defined for any ring Z_q where q ≈ 2^64, An advantageous choice is given by q= p1p2 where p1,p2 are 31-bit primes with high 2-adicity and efficient modular reductions. We chose p1 to be the prime of Baby Bear,and p2 the prime of Koala Bear, in what we are calling the Baby Koala ring. 

We’ve implemented Labrador using ICICLE v4. Our version runs on both CPU and GPU. It’s fast, simple, and highly readable. This brings post-quantum proving closer to real-world use. Read the full article here.

End-to-end latency, ICICLE Labrador vs. Lattirust Labrador implementation. Note that there are multiple parameter choices for defining the input to the prover and for HW configuration. We chose a configuration that we believe simulates real-world scenario. For full analysis data please reach out to hi@ingonyama.com

Build your own Lattice cryptography

Our new lattice API is available in C++ and in Rust. For easy onboarding, we suggest starting with Rust. We wrote a detailed lattice dev docs including code examples for the new API. 

Core Types

  • Zq — Integer rings modulo ( q )
  • Rq / Tq — Polynomial rings Zq[X]/(Xⁿ + 1)
    • Rq refers to the coefficient (standard) representation.
    • Tq refers to the evaluation (NTT-transformed) representation.
    • In ICICLE, both share a single unified trait.

We used the C++ API to implement our Labrador prover. The same API can be used for other lattice based provers such as Greyhound. For the LatticeFold family we are still missing Sumchecks over rings (stay tuned!).

Supported Operations

  • Negacyclic Number-Theoretic Transforms (NTT)
    For fast polynomial multiplication in Tq
  • Matrix Operations
    Matrix multiplication and transpose
  • Vector Operations
    Elementwise arithmetic, sum-reduction, scalar ops
  • Balanced Base Decomposition
    Represent elements in base-b with digits in (-b/2, b/2]
  • Norm Computation
    ℓ₂ and ℓ∞ norms with bound checking
  • Johnson–Lindenstrauss (JL) Projection
    Randomized projection with reproducible seeds
  • Random Vector Sampling
    Efficient, seedable generation of vectors over Zq or Rq
  • Challenge Sampling
    Rejection sampling of polynomials satisfying operator norm bounds

ICICLE is designed for cryptographers. We encourage you to explore the new API and if you find something that’s missing for your protocol, or a bug, please let us know 🙌🏻. 

Better Dev Experience

The real highlight of this version is actually not lattices but our new object-oriented API for field operations. This change makes ICICLE more intuitive to use across all supported languages. 

The change includes a complete redesign of field operations from static methods to instance methods, method-chaining support, improved Rust trait design with standard operator overloading, and more! 

Finally, in v4, the Program API has been moved from VecOps to a dedicated Program module for better organization and type safety.

To learn more about the conceptual changes and how to migrate from v3, please visit our Migration Guide.

What We've Always Aimed For

From day one, ICICLE has been built with flexibility in mind, a cryptographic engine designed to support more hardware, more languages, and more cryptographic primitives. v4 continues that vision with lattice-based cryptography, and we’re not stopping here. Expect ICICLE to keep growing, adapting, and powering the next generation of ZK and post-quantum applications.

Check out the full v4.0.0 release notes to learn more.