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 BadOutputSize,
18 InvalidData,
19}
20
21#[cfg(test)]
22mod test {
23
24 use crate::SigningKey;
25 use ark_crypto_primitives::sponge::poseidon::{find_poseidon_ark_and_mds, PoseidonConfig};
26 use ark_crypto_primitives::sponge::Absorb;
27 use ark_ec::{twisted_edwards::TECurveConfig, AffineRepr};
28 use ark_ff::PrimeField;
29 use digest::Digest;
30 use rand_core::OsRng;
31
32 /// Generates poseidon constants and returns the config
33 pub fn poseidon_config<F: PrimeField>(
34 rate: usize,
35 full_rounds: usize,
36 partial_rounds: usize,
37 ) -> PoseidonConfig<F> {
38 let prime_bits = F::MODULUS_BIT_SIZE as u64;
39 let (ark, mds) = find_poseidon_ark_and_mds(
40 prime_bits,
41 rate,
42 full_rounds as u64,
43 partial_rounds as u64,
44 0,
45 );
46 PoseidonConfig::new(full_rounds, partial_rounds, 5, mds, ark, rate, 1)
47 }
48
49 fn run_test<A: AffineRepr, D: Digest>()
50 where
51 A::BaseField: Absorb + PrimeField,
52 A::Config: TECurveConfig,
53 {
54 let poseidon = poseidon_config(4, 8, 55);
55 let signing_key = SigningKey::<A>::generate::<D>(&mut OsRng).unwrap();
56 let message = b"xxx yyy <<< zzz >>> bunny";
57 let signature = signing_key.sign::<D, _>(&poseidon, &message[..]);
58 let public_key = signing_key.public_key();
59 public_key
60 .verify::<_>(&poseidon, &message[..], &signature)
61 .unwrap();
62 }
63
64 #[test]
65 fn test_eddsa() {
66 run_test::<ark_ed_on_bn254::EdwardsAffine, sha2::Sha512>();
67 run_test::<ark_ed_on_bn254::EdwardsAffine, blake2::Blake2b512>();
68 run_test::<crate::ed_on_bn254_twist::EdwardsAffine, sha2::Sha512>();
69 run_test::<ark_ed_on_bls12_381::EdwardsAffine, sha2::Sha512>();
70 run_test::<ark_ed_on_bls12_381_bandersnatch::EdwardsAffine, sha2::Sha512>();
71 }
72}