Skip to content
/ sumhash Public

sumhash512 cryptographic function implementation

License

Notifications You must be signed in to change notification settings

jsign/sumhash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sumhash

Crates.io Docs.rs CI

This repository contains a Rust implementation of subset-sum hash function designed by the Algorand project.

The reference implementation is written in Go and can be found in the go-sumhash repository. You can also refer to the spec to see a formal description of the hash function.

This implementation provides a core implementation to be used with the CoreWrapper trait. If you're interested in an earlier version that was a direct port of the reference implementation, see the legacyport branch.

This library has an AlgorandSumhash512Core type alias which facilitates a default configuration for Sumhash512Core that utilizes the official seed for the Algorand blockchain state proofs. The AlgorandSumhash512Core uses a lookup table as the default underlying compressor setup instead of a matrix.

This library isn't** audited, nor is it an official implementation.

You might be interested in this article explaining more details about the implementation and performance of the library.

Use

Using the Algorand instance configuration:

use sumhash::sumhash512core::AlgorandSumhash512Core;
use digest::{core_api::CoreWrapper, FixedOutput, Update};

fn main() {
  let mut h = CoreWrapper::<AlgorandSumhash512Core>::default();
  h.update("hello world".as_bytes());
  let output = h.finalize_fixed();
  println!("Result: {}", hex::encode(&output));
}

Generic flavor providing a custom seed:

use sumhash::sumhash512core::Sumhash512Core;
use digest::{core_api::CoreWrapper, FixedOutput, Update};

fn main() {
  let mut salt = [0; 64];
  salt[0] = 0x13;
  salt[1] = 0x37;
  let mut h = CoreWrapper::from_core(Sumhash512Core::new_with_salt(salt));
  h.update("hello world".as_bytes());
  let output = h.finalize_fixed();
  println!("Result: {}", hex::encode(&output));
}

Cargo

Build

Run cargo build.

Tests

All the existing tests from go-sumhash have been ported and are passing. The tests rely on generating random matrixes using Shake256 where this library also honors the input and expected exact output match, giving confidence for correctness.

Run cargo test:

running 5 tests
test sumhash512core::test::sumhash512_salt ... ok
test sumhash512core::test::sumhash512 ... ok
test sumhash512core::test::sumhash512_reset ... ok
test sumhash512core::test::test_vector ... ok
test compress::test::compression ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.59s

   Doc-tests sumhash

running 2 tests
test src/lib.rs - (line 37) ... ok
test src/lib.rs - (line 26) ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s

Benchmarks

You can run benchmarks with cargo bench.

License

Licensed under either of MIT license.

Contribution

See CONTRIBUTING.md.