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