anp 0.7.1

Rust SDK for Agent Network Protocol (ANP)
Documentation
use anp::proof::{
    generate_group_receipt_proof, generate_w3c_proof, verify_group_receipt_proof, verify_w3c_proof,
    ProofGenerationOptions, ProofVerificationOptions, CRYPTOSUITE_EDDSA_JCS_2022,
    PROOF_TYPE_DATA_INTEGRITY,
};
use anp::PrivateKeyMaterial;
use serde_json::json;

#[test]
fn test_generate_and_verify_secp256k1_proof() {
    let private_key =
        PrivateKeyMaterial::Secp256k1(k256::ecdsa::SigningKey::random(&mut rand::rngs::OsRng));
    let public_key = private_key.public_key();
    let document = json!({
        "id": "did:wba:example.com:alice",
        "claim": "test-data",
    });
    let signed = generate_w3c_proof(
        &document,
        &private_key,
        "did:wba:example.com:alice#key-1",
        ProofGenerationOptions::default(),
    )
    .expect("proof generation should succeed");
    assert!(verify_w3c_proof(
        &signed,
        &public_key,
        ProofVerificationOptions::default(),
    ));
}

#[test]
fn test_generate_and_verify_ed25519_data_integrity_proof() {
    let private_key =
        PrivateKeyMaterial::Ed25519(ed25519_dalek::SigningKey::generate(&mut rand::rngs::OsRng));
    let public_key = private_key.public_key();
    let document = json!({
        "id": "did:wba:example.com:bob",
        "type": "VerifiableCredential",
    });
    let signed = generate_w3c_proof(
        &document,
        &private_key,
        "did:wba:example.com:bob#key-1",
        ProofGenerationOptions {
            proof_type: Some(PROOF_TYPE_DATA_INTEGRITY.to_string()),
            cryptosuite: Some(CRYPTOSUITE_EDDSA_JCS_2022.to_string()),
            ..ProofGenerationOptions::default()
        },
    )
    .expect("proof generation should succeed");
    assert!(verify_w3c_proof(
        &signed,
        &public_key,
        ProofVerificationOptions::default(),
    ));
}

#[test]
fn test_tampered_document_fails_proof_verification() {
    let private_key =
        PrivateKeyMaterial::Secp256k1(k256::ecdsa::SigningKey::random(&mut rand::rngs::OsRng));
    let public_key = private_key.public_key();
    let document = json!({
        "id": "did:wba:example.com:alice",
        "claim": "test-data",
    });
    let mut signed = generate_w3c_proof(
        &document,
        &private_key,
        "did:wba:example.com:alice#key-1",
        ProofGenerationOptions::default(),
    )
    .expect("proof generation should succeed");
    signed["claim"] = json!("tampered-data");
    assert!(!verify_w3c_proof(
        &signed,
        &public_key,
        ProofVerificationOptions::default(),
    ));
}

#[test]
fn test_generate_and_verify_group_receipt_proof() {
    let private_key =
        PrivateKeyMaterial::Secp256k1(k256::ecdsa::SigningKey::random(&mut rand::rngs::OsRng));
    let public_key = private_key.public_key();
    let receipt = json!({
        "receipt_type": "anp.group_receipt.v1",
        "group_did": "did:wba:groups.example:team:dev:e1_group_dev",
        "group_state_version": "43",
        "group_event_seq": "128",
        "subject_method": "group.send",
        "operation_id": "op-group-send-001",
        "message_id": "msg-group-send-001",
        "actor_did": "did:wba:a.example:agents:alice:e1_alice",
        "accepted_at": "2026-03-29T15:10:01Z",
        "payload_digest": "sha-256=:stub:",
    });
    let signed = generate_group_receipt_proof(
        &receipt,
        &private_key,
        "did:wba:groups.example:team:dev:e1_group_dev#key-1",
    )
    .expect("group receipt proof generation should succeed");
    assert!(verify_group_receipt_proof(&signed, &public_key).is_ok());
}

#[test]
fn test_tampered_group_receipt_fails_verification() {
    let private_key =
        PrivateKeyMaterial::Secp256k1(k256::ecdsa::SigningKey::random(&mut rand::rngs::OsRng));
    let public_key = private_key.public_key();
    let receipt = json!({
        "receipt_type": "anp.group_receipt.v1",
        "group_did": "did:wba:groups.example:team:dev:e1_group_dev",
        "group_state_version": "43",
        "group_event_seq": "128",
        "subject_method": "group.send",
        "operation_id": "op-group-send-001",
        "actor_did": "did:wba:a.example:agents:alice:e1_alice",
        "accepted_at": "2026-03-29T15:10:01Z",
        "payload_digest": "sha-256=:stub:",
    });
    let mut signed = generate_group_receipt_proof(
        &receipt,
        &private_key,
        "did:wba:groups.example:team:dev:e1_group_dev#key-1",
    )
    .expect("group receipt proof generation should succeed");
    signed["group_event_seq"] = json!("129");
    assert!(verify_group_receipt_proof(&signed, &public_key).is_err());
}

#[test]
fn test_generate_and_verify_group_receipt_proof_ed25519() {
    let private_key =
        PrivateKeyMaterial::Ed25519(ed25519_dalek::SigningKey::generate(&mut rand::rngs::OsRng));
    let public_key = private_key.public_key();
    let receipt = json!({
        "receipt_type": "anp.group_receipt.v1",
        "group_did": "did:wba:groups.example:team:dev:e1_group_dev",
        "group_state_version": "43",
        "group_event_seq": "128",
        "subject_method": "group.send",
        "operation_id": "op-group-send-001",
        "actor_did": "did:wba:a.example:agents:alice:e1_alice",
        "accepted_at": "2026-03-29T15:10:01Z",
        "payload_digest": "sha-256=:stub:",
    });
    let signed = generate_group_receipt_proof(
        &receipt,
        &private_key,
        "did:wba:groups.example:team:dev:e1_group_dev#key-1",
    )
    .expect("group receipt proof generation should succeed");
    assert_eq!(signed["proof"]["cryptosuite"], json!("eddsa-jcs-2022"));
    assert!(verify_group_receipt_proof(&signed, &public_key).is_ok());
}