use serde::{Deserialize, Serialize};
use crate::sidetree::{json_canonicalization_scheme, DIDSuffix, PublicKeyJwk, Sidetree};
use super::{jws_decode_verify_inner, PartialVerificationError, SidetreeOperation};
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
#[serde(deny_unknown_fields)]
pub struct DeactivateOperation {
pub did_suffix: DIDSuffix,
pub reveal_value: String,
pub signed_data: String,
}
impl SidetreeOperation for DeactivateOperation {
type PartiallyVerifiedForm = PartiallyVerifiedDeactivateOperation;
fn partial_verify<S: Sidetree>(
self,
) -> Result<PartiallyVerifiedDeactivateOperation, PartialVerificationError> {
let (header, claims) =
jws_decode_verify_inner(&self.signed_data, |claims: &DeactivateClaims| {
&claims.recovery_key
})?;
if header.algorithm != S::SIGNATURE_ALGORITHM {
return Err(PartialVerificationError::InvalidSignatureAlgorithm);
}
let canonicalized_public_key = json_canonicalization_scheme(&claims.recovery_key).unwrap();
let computed_reveal_value = S::reveal_value(canonicalized_public_key.as_bytes());
if self.reveal_value != computed_reveal_value {
return Err(PartialVerificationError::RevealValueMismatch {
computed: computed_reveal_value,
found: self.reveal_value,
});
}
if self.did_suffix != claims.did_suffix {
return Err(PartialVerificationError::DIDSuffixMismatch);
}
Ok(PartiallyVerifiedDeactivateOperation {
signed_did_suffix: claims.did_suffix,
reveal_value: self.reveal_value,
signed_recovery_key: claims.recovery_key,
})
}
}
#[derive(Debug, Clone)]
pub struct PartiallyVerifiedDeactivateOperation {
pub signed_did_suffix: DIDSuffix,
pub reveal_value: String,
pub signed_recovery_key: PublicKeyJwk,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
#[serde(deny_unknown_fields)]
pub struct DeactivateClaims {
pub did_suffix: DIDSuffix,
pub recovery_key: PublicKeyJwk,
}