binary-circle-checkHashing functions

Garaga provides implementations of common hash functions optimized for Cairo.


SHA-512

A pure Cairo implementation of SHA-512 following RFC-6234arrow-up-right. This is used internally for EdDSA signature verification but is also available for general use.

Usage

use garaga::hashes::sha_512::sha512;

fn hash_message() {
    // Hash a single byte
    let input: Array<u8> = array![49]; // ASCII '1'
    let hash: Array<u8> = sha512(input);

    // hash is a 64-byte (512-bit) array
    assert!(hash.len() == 64);
}

fn hash_empty() {
    // Hash empty input
    let empty: Array<u8> = array![];
    let hash = sha512(empty);

    // SHA-512 of empty string
    assert!(
        hash.span() == array![
            0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd,
            0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07,
            0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc,
            0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce,
            0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0,
            0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f,
            0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81,
            0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e,
        ].span()
    );
}

fn hash_text() {
    // Hash arbitrary text
    let msg: Array<u8> = array![
        0x4C, 0x6F, 0x72, 0x65, 0x6D, 0x20, 0x69, 0x70,
        0x73, 0x75, 0x6D  // "Lorem ipsum"
    ];
    let hash = sha512(msg);
    // Returns 64-byte hash
}

Function Signature

  • Input: Array<u8> - The message bytes to hash

  • Output: Array<u8> - 64-byte (512-bit) hash result


Poseidon (BN254 Scalar Field)

A ZK-friendly hash function operating on the BN254 scalar field. This implementation is compatible with:

Cross-Language Example

The same hash computed in Noir and Cairo:

Function Signature

  • Input: Two u384 field elements

  • Output: u384 - The Poseidon hash result

circle-info

This hash function is particularly useful when building circuits in Noir that need to verify hashes computed on Starknet, or vice versa.

Last updated

Was this helpful?