redjubjub/README.md

53 lines
1.7 KiB
Markdown
Raw Permalink Normal View History

2019-12-04 17:36:01 -08:00
A minimal [RedJubjub][redjubjub] implementation for use in [Zebra][zebra].
2019-12-02 21:32:38 -08:00
Two parameterizations of RedJubjub are used in Zcash, one for
`BindingSig` and one for `SpendAuthSig`. This library distinguishes
these in the type system, using the [sealed] `SigType` trait as a
type-level enum.
2019-12-02 21:32:38 -08:00
In addition to the `Signature`, `SigningKey`, `VerificationKey` types,
the library also provides `VerificationKeyBytes`, a [refinement] of a
`[u8; 32]` indicating that bytes represent an encoding of a RedJubjub
verification key. This allows the `VerificationKey` type to cache
verification checks related to the verification key encoding.
2019-12-04 17:36:01 -08:00
## Examples
Creating a `BindingSig`, serializing and deserializing it, and
verifying the signature:
2019-12-02 22:38:15 -08:00
```rust
2019-12-04 17:36:01 -08:00
# use std::convert::TryFrom;
use rand::thread_rng;
2019-12-09 13:54:10 -08:00
use redjubjub::*;
2019-12-04 17:36:01 -08:00
let msg = b"Hello!";
// Generate a secret key and sign the message
let sk = SigningKey::<Binding>::new(thread_rng());
2019-12-04 17:36:01 -08:00
let sig = sk.sign(thread_rng(), msg);
// Types can be converted to raw byte arrays using From/Into
let sig_bytes: [u8; 64] = sig.into();
let pk_bytes: [u8; 32] = VerificationKey::from(&sk).into();
2019-12-04 17:36:01 -08:00
// Deserialize and verify the signature.
let sig: Signature<Binding> = sig_bytes.into();
assert!(
VerificationKey::try_from(pk_bytes)
2019-12-04 17:36:01 -08:00
.and_then(|pk| pk.verify(msg, &sig))
.is_ok()
);
```
## docs
```shell,no_run
2019-12-02 22:38:15 -08:00
cargo doc --features "nightly" --open
```
2019-12-02 21:32:38 -08:00
[redjubjub]: https://zips.z.cash/protocol/protocol.pdf#concretereddsa
[zebra]: https://github.com/ZcashFoundation/zebra
2019-12-04 17:36:01 -08:00
[refinement]: https://en.wikipedia.org/wiki/Refinement_type
2019-12-09 13:54:10 -08:00
[sealed]: https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed