identity_eddsa_verifier/
ed25519_verifier.rsuse std::ops::Deref;
use identity_jose::jwk::EdCurve;
use identity_jose::jwk::Jwk;
use identity_jose::jwk::JwkParamsOkp;
use identity_jose::jws::SignatureVerificationError;
use identity_jose::jws::SignatureVerificationErrorKind;
use identity_jose::jws::VerificationInput;
#[derive(Debug)]
#[non_exhaustive]
pub struct Ed25519Verifier;
impl Ed25519Verifier {
pub fn verify(input: VerificationInput, public_key: &Jwk) -> Result<(), SignatureVerificationError> {
let params: &JwkParamsOkp = public_key
.try_okp_params()
.map_err(|_| SignatureVerificationErrorKind::UnsupportedKeyType)?;
if params
.try_ed_curve()
.ok()
.filter(|curve_param| *curve_param == EdCurve::Ed25519)
.is_none()
{
return Err(SignatureVerificationErrorKind::UnsupportedKeyParams.into());
}
let pk: [u8; crypto::signatures::ed25519::PublicKey::LENGTH] = identity_jose::jwu::decode_b64(params.x.as_str())
.map_err(|_| {
SignatureVerificationError::new(SignatureVerificationErrorKind::KeyDecodingFailure)
.with_custom_message("could not decode x parameter from jwk")
})
.and_then(|value| {
TryInto::try_into(value).map_err(|_| {
SignatureVerificationError::new(SignatureVerificationErrorKind::KeyDecodingFailure)
.with_custom_message("invalid public key length")
})
})?;
let public_key_ed25519 = crypto::signatures::ed25519::PublicKey::try_from(pk).map_err(|err| {
SignatureVerificationError::new(SignatureVerificationErrorKind::KeyDecodingFailure).with_source(err)
})?;
let signature_arr =
<[u8; crypto::signatures::ed25519::Signature::LENGTH]>::try_from(input.decoded_signature.deref())
.map_err(|_| SignatureVerificationErrorKind::InvalidSignature)?;
let signature = crypto::signatures::ed25519::Signature::from_bytes(signature_arr);
if crypto::signatures::ed25519::PublicKey::verify(&public_key_ed25519, &signature, &input.signing_input) {
Ok(())
} else {
Err(SignatureVerificationErrorKind::InvalidSignature.into())
}
}
}