{
  "notice": "Test data. The keys in these vectors are test keys — never Anis’s or any partner’s real keys — and partners.anis.ly is an example address.",
  "request": [
    {
      "id": "RQ-01-safe-read-no-query",
      "title": "Safe read with NO query string",
      "file": "https://developers.anis.ly/vectors/request/RQ-01-safe-read-no-query.json"
    },
    {
      "id": "RQ-02-safe-read-with-cursor",
      "title": "Safe read carrying a cursor query",
      "file": "https://developers.anis.ly/vectors/request/RQ-02-safe-read-with-cursor.json"
    },
    {
      "id": "RQ-03-authority-is-lower-cased",
      "title": "Mixed-case authority",
      "file": "https://developers.anis.ly/vectors/request/RQ-03-authority-is-lower-cased.json"
    },
    {
      "id": "RQ-04-authority-with-non-default-port",
      "title": "Authority carrying a non-default port",
      "file": "https://developers.anis.ly/vectors/request/RQ-04-authority-with-non-default-port.json"
    },
    {
      "id": "RQ-05-query-preserved-verbatim",
      "title": "Query with characters a normalizer would touch",
      "file": "https://developers.anis.ly/vectors/request/RQ-05-query-preserved-verbatim.json"
    },
    {
      "id": "RQ-06-reveal-bodyless-nonce-mutation",
      "title": "Single reveal: bodyless nonce mutation with ZERO body bytes",
      "file": "https://developers.anis.ly/vectors/request/RQ-06-reveal-bodyless-nonce-mutation.json"
    },
    {
      "id": "RQ-07-diagnostic-bodyless-nonce-mutation",
      "title": "Signature self-check: bodyless nonce mutation whose body is exactly {}",
      "file": "https://developers.anis.ly/vectors/request/RQ-07-diagnostic-bodyless-nonce-mutation.json"
    },
    {
      "id": "RQ-08-order-mutation",
      "title": "Order creation: the full profile",
      "file": "https://developers.anis.ly/vectors/request/RQ-08-order-mutation.json"
    },
    {
      "id": "RQ-09-invoice-reveal-bodyless-nonce-mutation",
      "title": "Invoice reveal: bodyless nonce mutation with ZERO body bytes",
      "file": "https://developers.anis.ly/vectors/request/RQ-09-invoice-reveal-bodyless-nonce-mutation.json"
    }
  ],
  "response": [
    {
      "id": "RS-001-safe-read-profile-200-M01",
      "title": "One body byte changed",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M01.json",
      "outcome": "reject",
      "reason": "content_digest_mismatch"
    },
    {
      "id": "RS-001-safe-read-profile-200-M02",
      "title": "Content-Digest rewritten",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M02.json",
      "outcome": "reject",
      "reason": "content_digest_mismatch"
    },
    {
      "id": "RS-001-safe-read-profile-200-M03",
      "title": "Status rewritten to 201",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M03.json",
      "outcome": "reject",
      "reason": "signature_invalid"
    },
    {
      "id": "RS-001-safe-read-profile-200-M04",
      "title": "X-Request-Id rewritten",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M04.json",
      "outcome": "reject",
      "reason": "signature_invalid"
    },
    {
      "id": "RS-001-safe-read-profile-200-M05",
      "title": "Signature bit flipped",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M05.json",
      "outcome": "reject",
      "reason": "signature_invalid"
    },
    {
      "id": "RS-001-safe-read-profile-200-M06",
      "title": "Signature truncated to 32 bytes",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M06.json",
      "outcome": "reject",
      "reason": "signature_malformed"
    },
    {
      "id": "RS-001-safe-read-profile-200-M07",
      "title": "Signature re-encoded as DER",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M07.json",
      "outcome": "reject",
      "reason": "signature_malformed"
    },
    {
      "id": "RS-001-safe-read-profile-200-M08",
      "title": "Signature header absent",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M08.json",
      "outcome": "reject",
      "reason": "signature_missing"
    },
    {
      "id": "RS-001-safe-read-profile-200-M09",
      "title": "Signature-Input header absent",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M09.json",
      "outcome": "reject",
      "reason": "signature_missing"
    },
    {
      "id": "RS-001-safe-read-profile-200-M10",
      "title": "Algorithm switched",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M10.json",
      "outcome": "reject",
      "reason": "algorithm_not_supported"
    },
    {
      "id": "RS-001-safe-read-profile-200-M11",
      "title": "Signature label changed",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M11.json",
      "outcome": "reject",
      "reason": "label_unexpected"
    },
    {
      "id": "RS-001-safe-read-profile-200-M12",
      "title": "keyid names an unpublished version",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M12.json",
      "outcome": "reject",
      "reason": "unknown_key"
    },
    {
      "id": "RS-001-safe-read-profile-200-M13",
      "title": "Validly signed over a REDUCED component set",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M13.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-001-safe-read-profile-200-M14",
      "title": "Request binding names a different request",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M14.json",
      "outcome": "reject",
      "reason": "signature_invalid"
    },
    {
      "id": "RS-001-safe-read-profile-200-M15",
      "title": "Request binding absent from the client's own request",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M15.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-001-safe-read-profile-200-M16",
      "title": "created far outside the freshness window",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M16.json",
      "outcome": "reject",
      "reason": "created_out_of_window"
    },
    {
      "id": "RS-001-safe-read-profile-200-M17",
      "title": "created at the edge of the window, still inside",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M17.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-001-safe-read-profile-200-M18",
      "title": "Uncovered Location added",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200-M18.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-001-safe-read-profile-200",
      "title": "Safe read, 200, no semantic headers",
      "file": "https://developers.anis.ly/vectors/response/RS-001-safe-read-profile-200.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-002-order-201-created-M01",
      "title": "Covered Location stripped",
      "file": "https://developers.anis.ly/vectors/response/RS-002-order-201-created-M01.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-002-order-201-created",
      "title": "Order created, 201, Location and no-store",
      "file": "https://developers.anis.ly/vectors/response/RS-002-order-201-created.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-003-order-202-processing-M01",
      "title": "Retry-After rewritten",
      "file": "https://developers.anis.ly/vectors/response/RS-003-order-202-processing-M01.json",
      "outcome": "reject",
      "reason": "signature_invalid"
    },
    {
      "id": "RS-003-order-202-processing",
      "title": "Order accepted, 202, Location and Retry-After",
      "file": "https://developers.anis.ly/vectors/response/RS-003-order-202-processing.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-004-order-201-replayed-M01",
      "title": "Idempotency-Replayed stripped",
      "file": "https://developers.anis.ly/vectors/response/RS-004-order-201-replayed-M01.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-004-order-201-replayed",
      "title": "Order repeated after completion, 201, Idempotency-Replayed true",
      "file": "https://developers.anis.ly/vectors/response/RS-004-order-201-replayed.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-005-reveal-200-M01",
      "title": "Cache-Control: no-store stripped",
      "file": "https://developers.anis.ly/vectors/response/RS-005-reveal-200-M01.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-005-reveal-200",
      "title": "Single credential reveal, 200, no-store",
      "file": "https://developers.anis.ly/vectors/response/RS-005-reveal-200.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-006-problem-429-rate-limited",
      "title": "Rate limited, 429 Problem, Retry-After on a safeRead route",
      "file": "https://developers.anis.ly/vectors/response/RS-006-problem-429-rate-limited.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-007-enrollment-200-no-request-binding",
      "title": "Enrollment status, 200, NO request binding",
      "file": "https://developers.anis.ly/vectors/response/RS-007-enrollment-200-no-request-binding.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-008-order-200-recovered-M01",
      "title": "Uncovered Idempotency-Replayed added",
      "file": "https://developers.anis.ly/vectors/response/RS-008-order-200-recovered-M01.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-008-order-200-recovered",
      "title": "Order recovered by a resume, 200, credentials, NO replay marker",
      "file": "https://developers.anis.ly/vectors/response/RS-008-order-200-recovered.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-009-problem-409-replayed-refusal-M01",
      "title": "Idempotency-Replayed stripped from a recorded refusal",
      "file": "https://developers.anis.ly/vectors/response/RS-009-problem-409-replayed-refusal-M01.json",
      "outcome": "reject",
      "reason": "covered_components_mismatch"
    },
    {
      "id": "RS-009-problem-409-replayed-refusal",
      "title": "Order refused earlier, repeated, 409 Problem with Idempotency-Replayed true",
      "file": "https://developers.anis.ly/vectors/response/RS-009-problem-409-replayed-refusal.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-010-invoice-reveal-200",
      "title": "Invoice reveal, 200, no-store",
      "file": "https://developers.anis.ly/vectors/response/RS-010-invoice-reveal-200.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-101-signed-by-next-key",
      "title": "Signed by the NEXT published key",
      "file": "https://developers.anis.ly/vectors/response/RS-101-signed-by-next-key.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-102-signed-by-retiring-key",
      "title": "Signed by the RETIRING published key",
      "file": "https://developers.anis.ly/vectors/response/RS-102-signed-by-retiring-key.json",
      "outcome": "accept",
      "reason": null
    },
    {
      "id": "RS-103-key-document-carries-private-member",
      "title": "Published key document leaks a private scalar on the ACTIVE key",
      "file": "https://developers.anis.ly/vectors/response/RS-103-key-document-carries-private-member.json",
      "outcome": "reject",
      "reason": "key_rejected"
    },
    {
      "id": "RS-104-private-member-on-an-unused-key",
      "title": "Published key document leaks a private scalar on a key this response never uses",
      "file": "https://developers.anis.ly/vectors/response/RS-104-private-member-on-an-unused-key.json",
      "outcome": "reject",
      "reason": "key_rejected"
    },
    {
      "id": "RS-105-published-key-coordinate-not-32-bytes",
      "title": "Published key's y coordinate is 31 bytes",
      "file": "https://developers.anis.ly/vectors/response/RS-105-published-key-coordinate-not-32-bytes.json",
      "outcome": "reject",
      "reason": "key_rejected"
    }
  ],
  "enrollment": [
    {
      "id": "EP-01-first-challenge",
      "title": "Possession proof over the first challenge",
      "file": "https://developers.anis.ly/vectors/enrollment/EP-01-first-challenge.json"
    },
    {
      "id": "EP-02-reissued-challenge",
      "title": "Possession proof after a challenge re-issue",
      "file": "https://developers.anis.ly/vectors/enrollment/EP-02-reissued-challenge.json"
    }
  ],
  "requestProfiles": {
    "safeRead": [
      "@method",
      "@authority",
      "@path",
      "@query",
      "x-anis-date"
    ],
    "bodylessNonceMutation": [
      "@method",
      "@authority",
      "@path",
      "@query",
      "content-digest",
      "nonce",
      "x-anis-date"
    ],
    "orderMutation": [
      "@method",
      "@authority",
      "@path",
      "@query",
      "content-digest",
      "nonce",
      "idempotency-key",
      "x-anis-date"
    ]
  },
  "maxSignatureLifetimeSeconds": 300,
  "responseFreshnessSeconds": 60
}
