use crate::*;
use candid::Principal;
use dmsg_types::*;
pub fn execution_receipt_key(account: &AccountId, request: OpId) -> Vec<u8> {
[
b"execution/".as_slice(),
account.as_slice(),
request.as_slice(),
]
.concat()
}
pub fn match_execution_receipt(
artifact: &SignedArtifact,
receipt: &ExecutionReceipt,
) -> Result<()> {
ensure(receipt.schema == 2, Error::IntegrityFailed)?;
let verified = verify_and_parse_artifact(artifact)?;
ensure(
verified.statement.issuer == receipt.issuer
&& sha256(&verified.signing_bytes()?) == receipt.to_be_signed_digest
&& thumbprint(&verified.key)? == receipt.public_key_fingerprint
&& sha256(verified.message.signature()) == receipt.signature_digest,
Error::IntegrityFailed,
)
}
pub fn verify_attestation(
artifact: &SignedArtifact,
receipt: &CertifiedBatch,
account: &AccountId,
request: OpId,
trusted_home: Principal,
trusted_ic_root_der: &[u8],
) -> Result<(Statement, ExecutionReceipt, u64)> {
let statement = verify_artifact(artifact)?;
let key = execution_receipt_key(account, request);
let (value, at) = crate::authentication::verify_recorded_leaf(
receipt,
&key,
trusted_home,
trusted_ic_root_der,
)?;
let leaf: ExecutionReceipt = decode_canonical(&value)?;
match_execution_receipt(artifact, &leaf)?;
ensure(
leaf.account_id == *account && leaf.request_id == request,
Error::IntegrityFailed,
)?;
Ok((statement, leaf, at))
}