use kilt_support::signature::{SignatureVerificationError, SignatureVerificationResult, VerifySignature};
use sp_runtime::SaturatedConversion;
use sp_std::{marker::PhantomData, vec::Vec};
use sp_weights::Weight;
use crate::{
did_details::{DidSignature, DidVerificationKeyRelationship},
errors::DidError,
Config, Did, Pallet, WeightInfo,
};
pub struct DidSignatureVerify<T>(PhantomData<T>);
impl<T: Config> VerifySignature for DidSignatureVerify<T>
where
T::AccountId: AsRef<[u8; 32]> + From<[u8; 32]>,
{
type SignerId = <T as Config>::DidIdentifier;
type Payload = Vec<u8>;
type Signature = DidSignature;
fn verify(
delegate: &Self::SignerId,
payload: &Self::Payload,
signature: &Self::Signature,
) -> SignatureVerificationResult {
let delegate_details =
Did::<T>::get(delegate).ok_or(SignatureVerificationError::SignerInformationNotPresent)?;
Pallet::verify_payload_signature_with_did_key_type(
payload,
signature,
&delegate_details,
DidVerificationKeyRelationship::Authentication,
)
.map_err(|err| match err {
DidError::Signature(_) => SignatureVerificationError::SignatureInvalid,
_ => SignatureVerificationError::SignerInformationNotPresent,
})
}
fn weight(payload_byte_length: usize) -> Weight {
<T as Config>::WeightInfo::signature_verification_sr25519(payload_byte_length.saturated_into())
.max(<T as Config>::WeightInfo::signature_verification_ed25519(
payload_byte_length.saturated_into(),
))
.max(<T as Config>::WeightInfo::signature_verification_ecdsa(
payload_byte_length.saturated_into(),
))
}
}