arnaucube
arnaucube/arkeddsaPublic Self-hosted repository
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}