#signature #version #sign #binary #verify #timestamp #doughnut

no-std doughnut-rs

The official rust doughnut codec

4 releases

0.2.2 Feb 20, 2024
0.2.1 Feb 19, 2024
0.2.0 Feb 16, 2024
0.1.0 Feb 13, 2024

#1750 in Magic Beans

Download history 124/week @ 2024-02-11 267/week @ 2024-02-18 41/week @ 2024-02-25 32/week @ 2024-03-03 17/week @ 2024-03-10 17/week @ 2024-03-17 1/week @ 2024-03-24 29/week @ 2024-03-31

67 downloads per month

BUSL-1.1

160KB
4K SLoC

doughnut-rs

Rust implementation of the doughnut binary codec.
Currently compliant with version 0, 1 spec.

use doughnut_rs::v1::DoughnutV1;

let encoded_doughnut = vec![ <some bytes> ];
let doughnut = DoughnutV1::new(&encoded_doughnut)?;

Query permission topping

let topping: &[u8] = doughnut.get_topping("something")?;

Check a doughnut is valid to be used by a user (who) at a timestamp (when).

use doughnut_rs::traits::DoughnutApi;
// ..
assert!(
  doughnut.validate(who, when).is_ok()
)

Verify a doughnut's signature (requires "crypto" feature in "no_std" mode and rust nightly)

use doughnut_rs::traits::DoughnutVerify;
// ..
assert!(doughnut.verify().is_ok());

Sign a doughnut (requires "crypto" feature in "no_std" mode and rust nightly)

use doughnut_rs::traits::Signing;
let mut doughnut = DoughnutV1 { ... };
// ECDSA
assert!(doughnut.sign_ecdsa(<secret_key_bytes>).is_ok());
// EIP191
assert!(doughnut.sign_eip191(<secret_key_bytes>).is_ok());

Contributing

The following checks should pass

# Do the usual
cargo +nightly fmt && \
cargo check && \
cargo test

# Check 'no std' mode compiles
cargo check --no-default-features

# Check crypto functionality in 'no std' mode
cargo +nightly check --no-default-features

Generate JS/Wasm bindings

This crate also provides generated JS bindings using wasm-pack. See the js dir for usage.

To generate the package run:

# install wasm pack
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

# build
cd js/ && yarn build

# Run tests
yarn test

Dependencies

~4–6.5MB
~130K SLoC