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 Coordinates,
23 Verify,
24 BadDigestOutput,
25}
26
27impl core::fmt::Display for Error {
28 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
29 match *self {
30 Error::Coordinates => write!(f, "Could not obtain the coordinates of a point"),
31 Error::Verify => write!(f, "Signature verification failed"),
32 Error::BadDigestOutput => write!(f, "Bad digest output size"),
33 }
34 }
35}
36
37/// Generates poseidon constants and returns the config
38pub fn poseidon_config<F: PrimeField>(
39 rate: usize,
40 full_rounds: usize,
41 partial_rounds: usize,
42) -> PoseidonConfig<F> {
43 let prime_bits = F::MODULUS_BIT_SIZE as u64;
44 let (ark, mds) = find_poseidon_ark_and_mds(
45 prime_bits,
46 rate,
47 full_rounds as u64,
48 partial_rounds as u64,
49 0,
50 );
51 PoseidonConfig::new(full_rounds, partial_rounds, 5, mds, ark, rate, 1)
52}
53
54#[cfg(test)]
55mod test {
56 use ark_crypto_primitives::sponge::Absorb;
57 // use ark_ec::twisted_edwards::TECurveConfig;
58 use ark_ec::CurveGroup;
59 use ark_ff::PrimeField;
60 use digest::Digest;
61 use rand_core::OsRng;
62
63 use super::poseidon_config;
64 use crate::SigningKey;
65
66 fn run_test<C: CurveGroup + Clone, D: Digest>()
67 where
68 C::BaseField: Absorb + PrimeField,
69 {
70 let poseidon = poseidon_config::<C::BaseField>(4, 8, 55);
71 let signing_key = SigningKey::<C>::generate::<D>(&mut OsRng).unwrap();
72 let message_raw = b"xxx yyy <<< zzz >>> bunny";
73 let message = C::BaseField::from_le_bytes_mod_order(message_raw);
74 let signature = signing_key.sign::<D>(&poseidon, &message).unwrap();
75 let public_key = signing_key.public_key();
76 public_key.verify(&poseidon, &message, &signature).unwrap();
77 }
78
79 #[test]
80 fn test_eddsa() {
81 run_test::<ark_ed_on_bn254::EdwardsProjective, sha2::Sha512>();
82 run_test::<ark_ed_on_bn254::EdwardsProjective, blake2::Blake2b512>();
83 run_test::<crate::ed_on_bn254_twist::EdwardsProjective, sha2::Sha512>();
84 run_test::<ark_ed_on_bls12_381::EdwardsProjective, sha2::Sha512>();
85 run_test::<ark_ed_on_bls12_381_bandersnatch::EdwardsProjective, sha2::Sha512>();
86 }
87}