#finite-fields #finite #isogeny #field #isogenies

nightly fp2

An efficient, flexible and constant time Rust implementation of the extension field Fp^2 with modulus x^2 + 1

3 releases

Uses new Rust 2024

new 0.1.2 May 9, 2025
0.1.1 May 9, 2025
0.1.0 May 8, 2025
0.0.1 May 8, 2025

#455 in Cryptography

Download history

68 downloads per month

MIT/Apache

170KB
3K SLoC

Fp2

Build Status

An efficient, flexible and constant time Rust implementation of finite fields $\mathbb{F}_{p}$ and $\mathbb{F}_{p^2}$ where $p \equiv 3 \pmod 4$. Used currently for various Rust implementations of isogeny-based cryptographic protocols.

Motivation

These two macros have ended up being stuck inside every rust crypto thing I've written recently for isogeny-based crypto. The idea of this repository is to dedicate a central place to work on them to avoid there being many related but incompatible versions throughout my projects.

Usage

Fields can be defined using macros as follows:

// Fp251: a finite field element GF(p) with p = 3 mod 4.
// Contents are opaque, all functions are constant-time.
fp2_rs::define_fp_core!(
    typename = Fp251,
    modulus = [0xFFFFFFFFFFFFFFFFu64, 0xFFFFFFFFFFFFFFFFu64, 0xFFFFFFFFFFFFFFFFu64,
);

// Fp251Ext: a finite field element GF(p^2) with modulus x^2 + 1.
// Contents are opaque, all functions are constant-time.
fp2_rs::define_fp2_core!(
    typename = Fp251Ext,
    base_field = Fp251,
);

The easiest way to generate macro parameters is to generate the above code snippets with the sage file scripts/gen_fp.sage.

Tests

Tests can be run:

cargo test --features test_macros

Benchmarks

Benchmarks can be run with:

RUSTFLAGS="-C target-cpu=native" cargo bench

Dependencies