|
@ -4,6 +4,7 @@ use super::{ |
|
|
SIG_L2_BOUND, ZERO,
|
|
|
SIG_L2_BOUND, ZERO,
|
|
|
};
|
|
|
};
|
|
|
use crate::utils::string::ToString;
|
|
|
use crate::utils::string::ToString;
|
|
|
|
|
|
use core::cell::OnceCell;
|
|
|
|
|
|
|
|
|
// FALCON SIGNATURE
|
|
|
// FALCON SIGNATURE
|
|
|
// ================================================================================================
|
|
|
// ================================================================================================
|
|
@ -43,6 +44,10 @@ use crate::utils::string::ToString; |
|
|
pub struct Signature {
|
|
|
pub struct Signature {
|
|
|
pub(super) pk: PublicKeyBytes,
|
|
|
pub(super) pk: PublicKeyBytes,
|
|
|
pub(super) sig: SignatureBytes,
|
|
|
pub(super) sig: SignatureBytes,
|
|
|
|
|
|
|
|
|
|
|
|
// Cached polynomial decoding for public key and signatures
|
|
|
|
|
|
pub(super) pk_polynomial: OnceCell<Polynomial>,
|
|
|
|
|
|
pub(super) sig_polynomial: OnceCell<Polynomial>,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl Signature {
|
|
|
impl Signature {
|
|
@ -51,10 +56,11 @@ impl Signature { |
|
|
|
|
|
|
|
|
/// Returns the public key polynomial h.
|
|
|
/// Returns the public key polynomial h.
|
|
|
pub fn pub_key_poly(&self) -> Polynomial {
|
|
|
pub fn pub_key_poly(&self) -> Polynomial {
|
|
|
// TODO: memoize
|
|
|
|
|
|
// we assume that the signature was constructed with a valid public key, and thus
|
|
|
|
|
|
// expect() is OK here.
|
|
|
|
|
|
Polynomial::from_pub_key(&self.pk).expect("invalid public key")
|
|
|
|
|
|
|
|
|
*self.pk_polynomial.get_or_init(|| {
|
|
|
|
|
|
// we assume that the signature was constructed with a valid public key, and thus
|
|
|
|
|
|
// expect() is OK here.
|
|
|
|
|
|
Polynomial::from_pub_key(&self.pk).expect("invalid public key")
|
|
|
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/// Returns the nonce component of the signature represented as field elements.
|
|
|
/// Returns the nonce component of the signature represented as field elements.
|
|
@ -70,10 +76,11 @@ impl Signature { |
|
|
|
|
|
|
|
|
// Returns the polynomial representation of the signature in Z_p[x]/(phi).
|
|
|
// Returns the polynomial representation of the signature in Z_p[x]/(phi).
|
|
|
pub fn sig_poly(&self) -> Polynomial {
|
|
|
pub fn sig_poly(&self) -> Polynomial {
|
|
|
// TODO: memoize
|
|
|
|
|
|
// we assume that the signature was constructed with a valid signature, and thus
|
|
|
|
|
|
// expect() is OK here.
|
|
|
|
|
|
Polynomial::from_signature(&self.sig).expect("invalid signature")
|
|
|
|
|
|
|
|
|
*self.sig_polynomial.get_or_init(|| {
|
|
|
|
|
|
// we assume that the signature was constructed with a valid signature, and thus
|
|
|
|
|
|
// expect() is OK here.
|
|
|
|
|
|
Polynomial::from_signature(&self.sig).expect("invalid signature")
|
|
|
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
// HASH-TO-POINT
|
|
|
// HASH-TO-POINT
|
|
@ -123,12 +130,14 @@ impl Deserializable for Signature { |
|
|
let sig: SignatureBytes = source.read_array()?;
|
|
|
let sig: SignatureBytes = source.read_array()?;
|
|
|
|
|
|
|
|
|
// make sure public key and signature can be decoded correctly
|
|
|
// make sure public key and signature can be decoded correctly
|
|
|
Polynomial::from_pub_key(&pk)
|
|
|
|
|
|
.map_err(|err| DeserializationError::InvalidValue(err.to_string()))?;
|
|
|
|
|
|
Polynomial::from_signature(&sig[41..])
|
|
|
|
|
|
.map_err(|err| DeserializationError::InvalidValue(err.to_string()))?;
|
|
|
|
|
|
|
|
|
|
|
|
Ok(Self { pk, sig })
|
|
|
|
|
|
|
|
|
let pk_polynomial = Polynomial::from_pub_key(&pk)
|
|
|
|
|
|
.map_err(|err| DeserializationError::InvalidValue(err.to_string()))?
|
|
|
|
|
|
.into();
|
|
|
|
|
|
let sig_polynomial = Polynomial::from_signature(&sig[41..])
|
|
|
|
|
|
.map_err(|err| DeserializationError::InvalidValue(err.to_string()))?
|
|
|
|
|
|
.into();
|
|
|
|
|
|
|
|
|
|
|
|
Ok(Self { pk, sig, pk_polynomial, sig_polynomial })
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|