Cryptographic primitives

Some cryptographic primitives are already developed and ready-to-use for any Noir project:

sha256

Given an array of bytes, returns the sha256 of it:

fn main() {
    let x = [163, 117, 178, 149] // some random bytes
    let hash = std::hash::sha256(x);
}

blake2s

Given an array of bytes, returns the Blake2 of it:

fn main() {
    let x = [163, 117, 178, 149] // some random bytes
    let hash = std::hash::blake2s(x);
}

pedersen

Given an array of Fields, returns the Pedersen hash of it:

fn main() {
    let x = [163, 117, 178, 149] // some random bytes
    let hash = std::hash::pedersen(x);
}

mimc_bn254 and mimc

mimc_bn254 is mimc, but with hardcoded parameters for the BN254 curve. You can use it by providing an array of Fields, and it returns a Field with the hash. You can use the mimc method if you're willing to input your own constants:


#![allow(unused)]
fn main() {
fn mimc<N>(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field
}

otherwise, use the mimc_bn254 method:


#![allow(unused)]
fn main() {
fn mimc_bn254<N>(array: [Field; N]) -> Field
}

example:


fn main() {
    let x = [163, 117, 178, 149] // some random bytes
    let hash = std::hash::mimc_bn254(x);
}

scalar_mul::fixed_base

Performs scalar multiplication over the embedded curve whose coordinates are defined by the configured noir field. For the BN254 scalar field, this is BabyJubJub or Grumpkin.


#![allow(unused)]
fn main() {
fn fixed_base(_input : Field) -> [Field; 2]
}

example

fn main(x : Field) {
    let scal = std::scalar_mul::fixed_base(x);
    std::println(scal);
}

schnorr::verify_signature

Verifier for Schnorr signatures


#![allow(unused)]
fn main() {
fn verify_signature(_public_key_x: Field, _public_key_y: Field, _signature: [u8; 64], _message: [u8]) -> Field
}

ecdsa_secp256k1::verify_signature

Verifier for ECDSA Secp256k1 signatures


#![allow(unused)]
fn main() {
fn verify_signature(_public_key_x : [u8; 32], _public_key_y : [u8; 32], _signature: [u8; 64], _message: [u8]) -> Field
}