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