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}