arkeddsa/src/lib.rs
src/lib.rsRaw
1pub mod ed_on_bn254_twist;
2pub mod eddsa;
3pub mod signature;
4
5use ark_ff::PrimeField;
6use digest::Digest;
7pub use eddsa::*;
8
9pub(crate) fn from_digest<F: PrimeField, D: Digest>(digest: D) -> F {
10 let bytes = digest.finalize();
11 F::from_le_bytes_mod_order(&bytes)
12}
13
14#[derive(Clone, Copy, Debug, Eq, PartialEq)]
15pub enum Error {
16 Verify,
17 BadDigestOutput,
18}
19
20impl core::fmt::Display for Error {
21 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
22 match *self {
23 Error::Verify => write!(f, "Signature verification failed"),
24 Error::BadDigestOutput => write!(f, "Bad digest output size"),
25 }
26 }
27}
28
29impl ark_std::error::Error for Error {}
30
31#[cfg(test)]
32mod test {
33
34 use crate::SigningKey;
35 use ark_crypto_primitives::sponge::poseidon::{find_poseidon_ark_and_mds, PoseidonConfig};
36 use ark_crypto_primitives::sponge::Absorb;
37 use ark_ec::twisted_edwards::TECurveConfig;
38 use ark_ff::PrimeField;
39 use digest::Digest;
40 use rand_core::OsRng;
41
42 /// Generates poseidon constants and returns the config
43 pub fn poseidon_config<F: PrimeField>(
44 rate: usize,
45 full_rounds: usize,
46 partial_rounds: usize,
47 ) -> PoseidonConfig<F> {
48 let prime_bits = F::MODULUS_BIT_SIZE as u64;
49 let (ark, mds) = find_poseidon_ark_and_mds(
50 prime_bits,
51 rate,
52 full_rounds as u64,
53 partial_rounds as u64,
54 0,
55 );
56 PoseidonConfig::new(full_rounds, partial_rounds, 5, mds, ark, rate, 1)
57 }
58
59 fn run_test<TE: TECurveConfig, D: Digest>()
60 where
61 TE::BaseField: Absorb + PrimeField,
62 {
63 let poseidon = poseidon_config(4, 8, 55);
64 let signing_key = SigningKey::<TE>::generate::<D>(&mut OsRng).unwrap();
65 let message = b"xxx yyy <<< zzz >>> bunny";
66 let signature = signing_key.sign::<D, _>(&poseidon, &message[..]);
67 let public_key = signing_key.public_key();
68 public_key
69 .verify::<_>(&poseidon, &message[..], &signature)
70 .unwrap();
71 }
72
73 #[test]
74 fn test_eddsa() {
75 run_test::<ark_ed_on_bn254::EdwardsConfig, sha2::Sha512>();
76 run_test::<ark_ed_on_bn254::EdwardsConfig, blake2::Blake2b512>();
77 run_test::<crate::ed_on_bn254_twist::EdwardsConfig, sha2::Sha512>();
78 run_test::<ark_ed_on_bls12_381::EdwardsConfig, sha2::Sha512>();
79 run_test::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig, sha2::Sha512>();
80 }
81}