{
  "schema_version": "1.0.0",
  "record_type": "citation-evidence-pack",
  "pack_id": "openpgp-message",
  "title": "OpenPGP recipient-key inspection evidence",
  "description": "Public-key inspection outcomes for one encryption-ready synthetic key, the wrong armored block type, and truncated armor.",
  "scope": "These cases prove local parsing and encryption-capability observations. A readable fingerprint does not prove who owns the key.",
  "canonical_url": "https://encrypt-online.com/evidence/openpgp-message.json",
  "tool": {
    "id": "openpgp-message",
    "name": "OpenPGP Message Encrypt and Decrypt",
    "path": "/tools/openpgp-message",
    "canonical_url": "https://encrypt-online.com/tools/openpgp-message"
  },
  "implementation": {
    "version": "source-sha256:f1cadda9eb7ff218",
    "aggregate_sha256": "f1cadda9eb7ff218def491579cadcb278309228e40dba2011cab03bde8a5cba3",
    "sources": [
      {
        "path": "lib/openpgp-message-core.mjs",
        "sha256": "8f7756c766e7f38da8caebeb99e125bbc84923d5f39f8ca8a4c472cbef9cfc22"
      },
      {
        "path": "package-lock.json",
        "sha256": "7b1efb9cabf71ee5f1ac336455b293cd7ae80dc1b05f99837d4de4234f131259"
      }
    ]
  },
  "verification": {
    "last_verified": "2026-08-05",
    "command": "npm run check:citation-evidence",
    "environments": [
      "Node.js release check with Web Crypto",
      "Chromium desktop 1440x900 evidence presentation"
    ]
  },
  "standards": [
    {
      "name": "OpenPGP Message Format",
      "section": "Key material and public-key packet structures",
      "url": "https://www.rfc-editor.org/rfc/rfc9580"
    }
  ],
  "cases": [
    {
      "case_id": "OPENPGP-RECIPIENT-READY-001",
      "classification": "valid",
      "symptom": "One synthetic Curve25519 public key is readable and has an encryption-capable subkey.",
      "safe_input": {
        "armored_public_keys": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxiYEanMlwBv+7xpI5gLnsnoLTnr4THdd0377ETBYg6rpbIlBgB7LHM0rQ2l0\nYXRpb24gRml4dHVyZSA8Y2l0YXRpb25AZXhhbXBsZS5pbnZhbGlkPsLADwQT\nGwoAhQWCanMlwAMLCQcJEAf2UWrLJXUSRRQAAAAAABwAIHNhbHRAbm90YXRp\nb25zLm9wZW5wZ3Bqcy5vcmcFGwxnw0wvIYh3/FgBdm7Qn9q2V8aIPnHY6yxh\nNLE9BAUVCggODAQWAAIBAhkBApsDAh4BFiEEUy+nzG+hUJ0cM8sjB/ZRassl\ndRIAANp7XlXLCXMYm6d2dgdUz+y8YSSyY+YKs5gMHuOjWRb6HvvrjazBlNPF\n1vGXq/ObDiltrbk78cTrqL+txp8f87QFCc4mBGpzJcAZIqfR2zD6l9O0ZJjr\nEM/zqlEIym8Dx9llSSddWjTTuzDCugQYGwoAcAWCanMlwAkQB/ZRassldRJF\nFAAAAAAAHAAgc2FsdEBub3RhdGlvbnMub3BlbnBncGpzLm9yZ06HHgbjlrr9\nqt+dWmlFKyuB+qsQ01YbiGnqtrKQ+WtLApsMFiEEUy+nzG+hUJ0cM8sjB/ZR\nassldRIAACLymOc0Mtiy/pmE8yuRBWQQrvwS1snDnAzeU/4Ncw/BYUrFnodt\nqwkdJGf+36c8upEBkh/aH0s8PNkxbWKaBM28Aw==\n=aJt7\n-----END PGP PUBLIC KEY BLOCK-----"
      },
      "expected_output": {
        "status": "ready",
        "recipient_count": 1,
        "primary_user_id": "Citation Fixture <citation@example.invalid>",
        "fingerprint": "532F A7CC 6FA1 509D 1C33 CB23 07F6 516A CB25 7512",
        "can_encrypt": true,
        "primary_algorithm": "Ed25519",
        "encryption_algorithm": "X25519"
      },
      "failure_code": null,
      "expected_outcome": "Compare the full fingerprint through a trusted channel before encrypting sensitive text.",
      "fixture_sha256": "a95da9707dcd3ca7384518968a51cffdcf13bedd83194bf197c00769979442e1"
    },
    {
      "case_id": "OPENPGP-WRONG-BLOCK-TYPE-002",
      "classification": "mismatch",
      "symptom": "An armored message block is pasted where a recipient public key is required.",
      "safe_input": {
        "armored_public_keys": "-----BEGIN PGP MESSAGE-----\nZmFrZQ==\n-----END PGP MESSAGE-----"
      },
      "expected_output": {
        "status": "rejected",
        "message": "Unable to read the armored public key. Check that every complete public-key block was pasted."
      },
      "failure_code": "INVALID_PUBLIC_KEY",
      "expected_outcome": "Reject and request a complete armored public-key block from the recipient.",
      "fixture_sha256": "5d8ae0646cf5589aaeb3fffc2c4496ee0bd7e2bb2d68e126b3bb6f84187fc5eb"
    },
    {
      "case_id": "OPENPGP-ARMOR-TRUNCATED-003",
      "classification": "malformed",
      "symptom": "A public-key armor header is present but the block is incomplete.",
      "safe_input": {
        "armored_public_keys": "-----BEGIN PGP PUBLIC KEY BLOCK-----\ntruncated"
      },
      "expected_output": {
        "status": "rejected",
        "message": "Unable to read the armored public key. Check that every complete public-key block was pasted."
      },
      "failure_code": "INVALID_PUBLIC_KEY",
      "expected_outcome": "Reject before encryption.",
      "fixture_sha256": "8e7b298eb27a9555e106015c20911672db724e90b4c806faee80a7d73735554c"
    }
  ]
}
