redevplugin-contracts 0.7.23

Embedded machine contracts for the ReDevPlugin platform
Documentation
use redevplugin_contracts::{
    ReleaseContractError, SignatureEnvelopeV1, SigningLedgerEntryV1, SigningLedgerEvidenceV1,
    SigningSubjectV1, canonical_signature_envelope, canonical_signing_ledger_entry,
    canonical_signing_subject, decode_signature_envelope, decode_signing_ledger_entry,
    decode_signing_ledger_evidence, decode_signing_subject,
};
use serde_json::Value;

#[test]
fn signing_ledger_evidence_projection_is_closed_and_canonical() {
    let value: Value = serde_json::from_str(include_str!(
        "fixtures/release-signing-ledger-evidence-v1.json"
    ))
    .unwrap();
    let canonical = serde_json::to_vec(&value).unwrap();
    let evidence = decode_signing_ledger_evidence(&canonical).unwrap();
    assert_eq!(evidence.source_id, "redeven-official-github");
    assert_eq!(evidence.channel.as_deref(), Some("stable"));

    let mut unknown = value.clone();
    unknown["unknown"] = Value::Bool(true);
    assert_eq!(
        decode_signing_ledger_evidence(&serde_json::to_vec(&unknown).unwrap()),
        Err(ReleaseContractError::InvalidDocument)
    );

    let mut partial: SigningLedgerEvidenceV1 = serde_json::from_value(value).unwrap();
    partial.consistency_proof_sha256 = None;
    assert_eq!(
        decode_signing_ledger_evidence(&serde_json::to_vec(&partial).unwrap()),
        Err(ReleaseContractError::InvalidDocument)
    );
}

#[test]
fn signing_ledger_subject_envelope_and_entry_are_closed_and_canonical() {
    let fixture: Value =
        serde_json::from_str(include_str!("fixtures/release-signing-ledger-wire-v1.json")).unwrap();
    let subject: SigningSubjectV1 = serde_json::from_value(fixture["subject"].clone()).unwrap();
    let envelope: SignatureEnvelopeV1 =
        serde_json::from_value(fixture["envelope"].clone()).unwrap();
    let entry: SigningLedgerEntryV1 =
        serde_json::from_value(fixture["reserved_entry"].clone()).unwrap();

    assert_eq!(
        decode_signing_subject(&canonical_signing_subject(&subject).unwrap()).unwrap(),
        subject
    );
    assert_eq!(
        decode_signature_envelope(&canonical_signature_envelope(&envelope).unwrap()).unwrap(),
        envelope
    );
    assert_eq!(
        decode_signing_ledger_entry(&canonical_signing_ledger_entry(&entry).unwrap()).unwrap(),
        entry
    );

    let mut unknown = fixture["reserved_entry"].clone();
    unknown["unknown"] = Value::Bool(true);
    assert_eq!(
        decode_signing_ledger_entry(&serde_json::to_vec(&unknown).unwrap()),
        Err(ReleaseContractError::InvalidDocument)
    );
}