pub mod ecdsa_k256_keccak {
extern crate alloc;
use alloc::vec::Vec;
use miden_core::{Felt, Word, serde::Serializable, utils::bytes_to_packed_u32_elements};
use miden_crypto::dsa::ecdsa_k256_keccak::{PublicKey, SecretKey, Signature};
pub fn sign(sk: &SecretKey, msg: Word) -> Vec<Felt> {
let pk = sk.public_key();
let sig = sk.sign(msg);
encode_signature(&pk, &sig)
}
pub fn encode_signature(pk: &PublicKey, sig: &Signature) -> Vec<Felt> {
let mut out = Vec::new();
let pk_bytes = pk.to_bytes();
out.extend(bytes_to_packed_u32_elements(&pk_bytes));
let sig_bytes = sig.to_bytes();
out.extend(bytes_to_packed_u32_elements(&sig_bytes));
out
}
}
pub mod eddsa_ed25519 {
extern crate alloc;
use alloc::vec::Vec;
use miden_core::{Felt, Word, serde::Serializable, utils::bytes_to_packed_u32_elements};
use miden_crypto::dsa::eddsa_25519_sha512::{PublicKey, SecretKey, Signature};
pub fn sign(sk: &SecretKey, msg: Word) -> Vec<Felt> {
let pk = sk.public_key();
let sig = sk.sign(msg);
encode_signature(&pk, &sig)
}
pub fn encode_signature(pk: &PublicKey, sig: &Signature) -> Vec<Felt> {
let mut out = Vec::new();
let pk_bytes = pk.to_bytes();
out.extend(bytes_to_packed_u32_elements(&pk_bytes));
let sig_bytes = sig.to_bytes();
out.extend(bytes_to_packed_u32_elements(&sig_bytes));
out
}
}
pub mod falcon512_poseidon2 {
extern crate alloc;
use alloc::vec::Vec;
pub use miden_core::crypto::dsa::falcon512_poseidon2::{PublicKey, SecretKey, Signature};
use miden_core::{
Felt, Word,
crypto::{dsa::falcon512_poseidon2::Polynomial, hash::Poseidon2},
};
pub fn sign(sk: &SecretKey, msg: Word) -> Option<Vec<Felt>> {
let sig = sk.sign(msg);
Some(encode_signature(sig.public_key(), &sig))
}
pub fn encode_signature(pk: &PublicKey, sig: &Signature) -> Vec<Felt> {
use alloc::vec;
let nonce = sig.nonce();
let s2 = sig.sig_poly();
let pi = Polynomial::mul_modulo_p(pk, s2);
let mut polynomials = pk.to_elements();
polynomials.extend(s2.to_elements());
polynomials.extend(pi.iter().map(|a| Felt::new(*a)));
let digest_polynomials = Poseidon2::hash_elements(&polynomials);
let challenge = (digest_polynomials[0], digest_polynomials[1]);
let mut result: Vec<Felt> = vec![challenge.1, challenge.0];
result.extend_from_slice(&polynomials);
result.extend_from_slice(&nonce.to_elements());
result
}
}