Public source file

backend/scripts/qr_artifact_poc_demo.py

Documentation home
77 lines2,692 bytesread-only generated view
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from __future__ import annotations

import asyncio
from datetime import datetime, timedelta, timezone

from backend.app.services.narrowed_verifier_poc import (
    IssuerVerificationState,
    NarrowedVerifierService,
)
from backend.app.services.qr_artifact_poc import (
    analyze_qr_artifact_from_png_bytes,
    decode_envelope_from_qr_payload,
    decode_qr_payload_from_png_bytes,
    encode_envelope_as_qr_payload,
    render_qr_png_bytes,
)
from backend.app.services.replay_guard_poc import InMemoryReplayGuard
from backend.app.services.signed_schema_poc import (
    SUPPORTED_ALGORITHM_ID,
    build_demo_certificate,
    create_signed_envelope,
    parse_claims_mapping,
)


async def main() -> None:
    certificate, private_key_pem = build_demo_certificate()
    now = datetime.now(timezone.utc)
    claims = parse_claims_mapping(
        {
            "version": "1",
            "usage_policy": "one_time",
            "certificate_ref": certificate.certificate_ref,
            "issued_at": (now - timedelta(minutes=1)).isoformat(),
            "expires_at": (now + timedelta(minutes=5)).isoformat(),
            "nonce": "qr-demo-script-001",
            "payload": "https://acme.example/pay",
        }
    )
    envelope = create_signed_envelope(
        claims,
        private_key_pem,
        code_algorithm_id=SUPPORTED_ALGORITHM_ID,
    )
    qr_payload = encode_envelope_as_qr_payload(envelope)
    png_bytes = render_qr_png_bytes(qr_payload)
    artifact_analysis = analyze_qr_artifact_from_png_bytes(png_bytes)
    decoded_qr_payload = decode_qr_payload_from_png_bytes(png_bytes)
    scanned_envelope = decode_envelope_from_qr_payload(decoded_qr_payload)

    verifier = NarrowedVerifierService(InMemoryReplayGuard())
    issuer_state = IssuerVerificationState(verified_domains=["acme.example"])
    first_result = await verifier.verify_presented_code(
        scanned_envelope,
        certificate,
        issuer_state,
    )
    second_result = await verifier.verify_presented_code(
        scanned_envelope,
        certificate,
        issuer_state,
    )

    print("QR artifact demo")
    print(f"- encoded payload length: {len(qr_payload)}")
    print(f"- png bytes: {len(png_bytes)}")
    print(f"- artifact integrity: {artifact_analysis.artifact_integrity}")
    print(f"- artifact risk score: {artifact_analysis.risk_score}")
    print(f"- artifact indicators: {artifact_analysis.tamper_indicators}")
    print(f"- scan roundtrip exact: {decoded_qr_payload == qr_payload}")
    print(f"- first verification stage: {first_result.stage}")
    print(f"- second verification stage: {second_result.stage}")


if __name__ == "__main__":
    asyncio.run(main())