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    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}