{
  "schemaVersion": "2026-10-03-v1",
  "generatedAtUtc": "2026-10-03T06:06:23.432076Z",
  "scope": {
    "synthetic_only": true,
    "customer_data": false,
    "production_api_or_db": false,
    "payments": false,
    "hashcat_or_gpu": false,
    "worker_fleet": false,
    "test_password_public": true
  },
  "publicTestPasswords": {
    "primary": "demo-public-2026!",
    "owner": "demo-owner-2026!",
    "wrong_negative_control": "wrong-public-2026!",
    "owner_only_user_password": ""
  },
  "tools": {
    "python": "3.11.9",
    "packages": {
      "pyzipper": "0.3.6",
      "py7zr": "1.1.0",
      "pypdf": "6.7.1",
      "msoffcrypto-tool": "6.0.0",
      "python-docx": "1.2.0",
      "openpyxl": "3.1.5",
      "olefile": "0.47"
    },
    "john_build": "Version: 1.9.0-jumbo-1+bleeding-126b2a4814 2025-01-28 23:51:55 +0100",
    "libreoffice_buildid": "cd7284b4cbbfeb507e630c1aac019f4157393acb"
  },
  "fixtures": [
    {
      "id": "zipcrypto",
      "file": "zipcrypto_public.zip",
      "family": "archive",
      "profile": "ZIP ZipCrypto",
      "sha256": "8918d87dd875dd5e5e744b5a5942a203f3d4bffa71ca9309b398d80c4471084c",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_password_local_parser",
          "status": "tested",
          "operationDurationMs": 1,
          "method": "zipfile.ZipFile.read(pwd=PUBLIC_PASSWORD)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 0,
          "method": "zipfile.ZipFile.read(pwd=WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 2238,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "zip",
          "extracted_mode": "17200",
          "extracted_hash_sha256": "abee5370e6d805ae6c1e6e12ff7712fd62be48e00477ac42cd0907ec5d739593",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "zip_aes256",
      "file": "zip_aes256_public.zip",
      "family": "archive",
      "profile": "ZIP WinZip AES-256",
      "sha256": "0ec0f0789af7b5266cfaa741485cf269c8c4507a3d9d19fcf21933bce63753d8",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_password_local_parser",
          "status": "tested",
          "operationDurationMs": 3,
          "method": "pyzipper.AESZipFile.read(pwd=PUBLIC_PASSWORD)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 3,
          "method": "pyzipper.AESZipFile.read(pwd=WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 6609,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "zip",
          "extracted_mode": "13600",
          "extracted_hash_sha256": "36990641400bcd898e35b239015669e17d59b58ba1e8f342d119c9bf2cc7058e",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "sevenzip_aes",
      "file": "sevenzip_aes_public.7z",
      "family": "archive",
      "profile": "7z AES-256 with encrypted headers",
      "sha256": "5deb291059740dd33e09a9520bc7923e0ad89726d7ed1e845fc09d2e73258392",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_password_local_parser",
          "status": "tested",
          "operationDurationMs": 485,
          "method": "py7zr.SevenZipFile.extractall(password=PUBLIC_PASSWORD)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 228,
          "method": "py7zr.SevenZipFile.extractall(password=WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 2808,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "7z",
          "extracted_mode": "11600",
          "extracted_hash_sha256": "158165dc5e90e0e119762c3fa72f74ba3f8f9571226e9d689a73785636451074",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "pdf_open",
      "file": "pdf_open_password_public.pdf",
      "family": "pdf",
      "profile": "PDF open/user password (RC4-128 via pypdf)",
      "sha256": "550e5f3afdf4ee36a56adb7d4e1dfae4cf7e88a752012cc02b0c1208400bb6a8",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_open_password_local_parser",
          "status": "tested",
          "operationDurationMs": 3,
          "method": "pypdf.PdfReader.decrypt(PUBLIC_PASSWORD)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 3,
          "method": "pypdf.PdfReader.decrypt(WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 1446,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "pdf",
          "extracted_mode": "10500",
          "extracted_hash_sha256": "e7eee31da34414ff44cd8207c05131d2df4e98cbea024b278770f18af3901bd0",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "pdf_owner_only",
      "file": "pdf_owner_only_public.pdf",
      "family": "pdf",
      "profile": "PDF owner-only password with empty user password",
      "sha256": "756114290f03957aece2d054eac98a42db03874824b4850719d77a3131b7a6cd",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "permissions_flag_verified",
          "status": "tested",
          "operationDurationMs": 3,
          "method": "pypdf.PdfReader.trailer[/Encrypt][/P] == 4",
          "declaredPermissions": {
            "permissions_P": 4,
            "effective_permissions": 4,
            "print_allowed": true,
            "editing_restricted": true,
            "copying_restricted": true
          }
        },
        {
          "name": "correct_owner_password_local_parser",
          "status": "tested",
          "operationDurationMs": 2,
          "method": "pypdf.PdfReader.decrypt(PUBLIC_PASSWORD)"
        },
        {
          "name": "empty_open_password_local_parser",
          "status": "tested",
          "operationDurationMs": 2,
          "method": "pypdf.PdfReader.decrypt(EMPTY_PASSWORD)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 2,
          "method": "pypdf.PdfReader.decrypt(WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 835,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "pdf",
          "extracted_mode": "10500",
          "extracted_hash_sha256": "74bb34386caf913498ba72ba94e2cd45cde67edce20277ab8a2a796c8482a162",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "docx",
      "file": "modern_password_public.docx",
      "family": "office",
      "profile": "OOXML DOCX \u2014 Office 2007 Standard encryption (AES-128)",
      "sha256": "d56ce2658767e53bc303e3a7b4653b3993528ac5fac452613ec0832dcf861d88",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_password_local_parser",
          "status": "tested",
          "operationDurationMs": 61,
          "method": "msoffcrypto.OfficeFile.load_key(PUBLIC_PASSWORD)+decrypt(BytesIO)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 58,
          "method": "msoffcrypto.OfficeFile.load_key(WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 215,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "oldoffice",
          "extracted_mode": "9400",
          "extracted_hash_sha256": "5e496cca22bee730efc165fe6cbc92a367d7a4e946d60bc74df531fcc8a7def4",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "xlsx",
      "file": "modern_password_public.xlsx",
      "family": "office",
      "profile": "OOXML XLSX \u2014 Office 2007 Standard encryption (AES-128)",
      "sha256": "a1a078ddd6849c403076bebd492cabe2a3d621107111a94d09513f25d2620675",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_password_local_parser",
          "status": "tested",
          "operationDurationMs": 56,
          "method": "msoffcrypto.OfficeFile.load_key(PUBLIC_PASSWORD)+decrypt(BytesIO)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 62,
          "method": "msoffcrypto.OfficeFile.load_key(WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 212,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "oldoffice",
          "extracted_mode": "9400",
          "extracted_hash_sha256": "97b089b2be085acc96f26cdd560b0b9c7c2dead568c0267891dc246cb0f02800",
          "configured_route_available": true
        }
      ]
    },
    {
      "id": "pptx",
      "file": "modern_password_public.pptx",
      "family": "office",
      "profile": "OOXML PPTX \u2014 Office 2007 Standard encryption (AES-128)",
      "sha256": "13638ed5ded86fb44ba48d38e86425189bbf8c2d6fe41fd3bf4cc7b2692b8b4b",
      "positive_verified": true,
      "negative_rejected": true,
      "result": "verified",
      "checks": [
        {
          "name": "correct_password_local_parser",
          "status": "tested",
          "operationDurationMs": 66,
          "method": "msoffcrypto.OfficeFile.load_key(PUBLIC_PASSWORD)+decrypt(BytesIO)"
        },
        {
          "name": "incorrect_password_rejected",
          "status": "tested",
          "operationDurationMs": 62,
          "method": "msoffcrypto.OfficeFile.load_key(WRONG_PASSWORD)"
        },
        {
          "name": "backend_detection_and_hash_extraction",
          "status": "tested",
          "operationDurationMs": 223,
          "method": "local backend detector and hash extractor (private run)",
          "detected_family": "oldoffice",
          "extracted_mode": "9400",
          "extracted_hash_sha256": "6d1887d08c16f6727593815b2e34d6ab613d71e74d9d9d47773905479ea002b1",
          "configured_route_available": true
        }
      ]
    }
  ],
  "notRun": [
    "RAR creation and local verification",
    "GPU search and performance benchmarking",
    "End-to-end production recovery"
  ],
  "limitations": [
    "Local correct-password and wrong-password checks are not a measured password-search success rate.",
    "The portable script reproduces local fixture creation and parser controls. The eight service detector/extractor observations use private service source and are not included as executable public backend tests.",
    "The Office examples use the Office 2007 Standard profile; Office 2010 and 2013+ remain configured-only in this release.",
    "Random encryption salts change fixture bytes and hashes on each reproduction. Compare profile and test outcomes, not newly generated bytes to the release hash."
  ]
}