Skip to main content
Version: 3.9.0

ICICLE libraries

Device Library​

The ICICLE device library serves as an abstraction layer for interacting with various hardware devices. It provides a comprehensive interface for tasks such as setting the active device, querying device-specific information like free and total memory, determining the number of available devices, and managing memory allocation. Additionally, it offers functionality for copying data to and from devices, managing task queues (streams) for efficient device utilization, and abstracting the complexities of device management away from the user.

See programmers guide for more details. C++, Rust, Go

Core Library​

ICICLE Core is a template library written in C++ that implements fundamental cryptographic operations, including field and curve arithmetic, as well as higher-level APIs such as MSM and NTT. Each library has a corresponding crate. See Rust and Go.

The Core can be instantiated for different fields, curves, and other cryptographic components, allowing you to tailor it to your specific needs. You can link your application to one or more ICICLE libraries, depending on the requirements of your project. For example, you might only need the babybear library or a combination of babybear and a Merkle tree builder.

Supported curves, fields and operations​

This chart is scrollable horizontally & vertically. It shows feature support across different curves and fields.
Each icon represents support for a specific backend.

  • A gear icon means partial support.
  • A full icon without the gear means full support.
  • Icons are clickable — click to reveal the backend and support type.
  • For more info on specific operations, please see the API section.
Operationbn254bls377bls381bw6grumpkinbabybearkoalabearstark252m31goldilockslabrador (babybear x koalabear)
Field Ops
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
Extension Field Ops
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
G1
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
G2
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
Vector Ops
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Extension Vector Ops
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go �— Partially Supported
CPU — Supported
CUDA — Supported
Polynomial Ops
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
C++ — Supported
CPU — Supported
CUDA — Supported
MSM G1
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
MSM G2
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Partially Supported
NTT Ops
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
Metal — Partially Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
C++ — Supported
Rust — Partially Supported
CPU — Partially Supported
CUDA — Partially Supported
FRI
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
ECNTT
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
Sumcheck
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Blake3 Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Blake2s Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Keccak256 Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Keccak512 Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Sha256 Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Sha512 Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Poseidon Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
Rust — Supported
Go — Supported
Poseidon2 Hash
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Merkle Tree ops
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Matrix Ops
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Partially Supported
Go — Partially Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
Go — Supported
CPU — Supported
CUDA — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Pairing
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Metal — Supported
C++ — Supported
Rust — Supported
CPU — Supported
CUDA — Supported
Metal — Supported

Backend​

Each backend must implement the device API interface. Each backend may implement

  • One or more ICICLE library. For example implement only bn254 curve.
  • One or more APIs in this library. For example MSM only.

See CUDA backend and Build Your Own Backend for more info about implementing a backend.