@adcp/sdk 6.9.0 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/bin/adcp.js +285 -5
  2. package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
  3. package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
  4. package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
  5. package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
  6. package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
  7. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  8. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  9. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
  10. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
  11. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
  12. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
  13. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  14. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
  15. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  16. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  17. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  18. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  19. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
  20. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
  21. package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
  22. package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
  23. package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
  24. package/compliance/cache/3.0.6.previous/index.json +324 -0
  25. package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
  26. package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
  27. package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
  28. package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
  29. package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
  30. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  31. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  32. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
  33. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
  34. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
  35. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
  36. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  37. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
  38. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  39. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  40. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  41. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  42. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
  43. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  44. package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
  45. package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
  46. package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
  47. package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
  48. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
  49. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
  50. package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
  51. package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
  52. package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
  53. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
  54. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
  55. package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
  56. package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
  57. package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
  58. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
  59. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
  60. package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
  61. package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
  62. package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
  63. package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
  64. package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
  65. package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
  66. package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
  67. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
  68. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
  69. package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
  70. package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
  71. package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
  72. package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
  73. package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
  74. package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
  75. package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
  76. package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
  77. package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
  78. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  79. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
  80. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  81. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  82. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  83. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  84. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  85. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  86. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  87. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  88. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  89. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
  90. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
  91. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
  92. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  93. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  94. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  95. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  96. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  97. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  98. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  99. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  100. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  101. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  102. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  103. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  104. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  105. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  106. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  107. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  108. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  109. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  110. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  111. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  112. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  113. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  114. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  115. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  116. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  117. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  118. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  119. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  120. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  121. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  122. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  123. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  124. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  125. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  126. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  127. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  128. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  129. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  130. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  131. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
  132. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
  133. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  134. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  135. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  136. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  137. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  138. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  139. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  140. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  141. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  142. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  143. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  144. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  145. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  146. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  147. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  148. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  149. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  150. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  151. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  152. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  153. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  154. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  155. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  156. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  157. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  158. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  159. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  160. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  161. package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
  162. package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
  163. package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
  164. package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
  165. package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
  166. package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
  167. package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
  168. package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
  169. package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
  170. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
  171. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
  172. package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
  173. package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
  174. package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
  175. package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
  176. package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
  177. package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
  178. package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
  179. package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
  180. package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
  181. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  182. package/dist/lib/server/create-adcp-server.d.ts +33 -0
  183. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  184. package/dist/lib/server/create-adcp-server.js +127 -1
  185. package/dist/lib/server/create-adcp-server.js.map +1 -1
  186. package/dist/lib/server/credential-policy.d.ts +221 -0
  187. package/dist/lib/server/credential-policy.d.ts.map +1 -0
  188. package/dist/lib/server/credential-policy.js +260 -0
  189. package/dist/lib/server/credential-policy.js.map +1 -0
  190. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  191. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  192. package/dist/lib/server/dynamic-registry.js +245 -0
  193. package/dist/lib/server/dynamic-registry.js.map +1 -0
  194. package/dist/lib/server/index.d.ts +8 -0
  195. package/dist/lib/server/index.d.ts.map +1 -1
  196. package/dist/lib/server/index.js +15 -4
  197. package/dist/lib/server/index.js.map +1 -1
  198. package/dist/lib/server/operational-platform.d.ts +239 -0
  199. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  200. package/dist/lib/server/operational-platform.js +94 -0
  201. package/dist/lib/server/operational-platform.js.map +1 -0
  202. package/dist/lib/server/wire-safe.d.ts +211 -0
  203. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  204. package/dist/lib/server/wire-safe.js +231 -0
  205. package/dist/lib/server/wire-safe.js.map +1 -0
  206. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  207. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  208. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  209. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  210. package/dist/lib/testing/compliance/index.d.ts +2 -0
  211. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  212. package/dist/lib/testing/compliance/index.js +6 -1
  213. package/dist/lib/testing/compliance/index.js.map +1 -1
  214. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  215. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  216. package/dist/lib/testing/compliance/summary.js +176 -0
  217. package/dist/lib/testing/compliance/summary.js.map +1 -0
  218. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  219. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  220. package/dist/lib/testing/storyboard/compliance.js +51 -0
  221. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  222. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  223. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  224. package/dist/lib/testing/storyboard/index.js +4 -2
  225. package/dist/lib/testing/storyboard/index.js.map +1 -1
  226. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  227. package/dist/lib/testing/storyboard/runner.js +58 -5
  228. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  229. package/dist/lib/version.d.ts +3 -3
  230. package/dist/lib/version.d.ts.map +1 -1
  231. package/dist/lib/version.js +3 -3
  232. package/dist/lib/version.js.map +1 -1
  233. package/package.json +2 -2
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "JWK declares alg=EdDSA but crv=P-256 (parameter-mismatch on presented key)",
3
+ "spec_reference": "#verifier-checklist-requests step 8 (key-purpose + parameter consistency; RFC 8037 binds alg=EdDSA to OKP key types, not EC)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-alg-crv-mismatch-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_override": {
23
+ "keys": [
24
+ {
25
+ "$comment": "Malformed JWK: alg=EdDSA is valid only for kty=OKP with crv=Ed25519 or crv=Ed448 (RFC 8037 §3.1). This JWK declares alg=EdDSA with kty=EC and crv=P-256, which is an impossible combination. Key material is the real Ed25519 public key bytes from test-ed25519-2026 so the failure MUST land on parameter consistency, not on some unrelated key-material defect. Verifier MUST reject at step 8 with request_signature_key_purpose_invalid — 'key purpose' encompasses both adcp_use scoping and the fundamental alg/kty/crv consistency that makes a JWK usable at all.",
26
+ "kid": "test-alg-crv-mismatch-2026",
27
+ "kty": "EC",
28
+ "crv": "P-256",
29
+ "alg": "EdDSA",
30
+ "use": "sig",
31
+ "key_ops": ["verify"],
32
+ "adcp_use": "request-signing",
33
+ "x": "gWUqzATUcUco5Q8fZZXn8aWwb7DQbYGBiqUzLiSDDJo"
34
+ }
35
+ ]
36
+ },
37
+ "expected_outcome": {
38
+ "success": false,
39
+ "error_code": "request_signature_key_purpose_invalid",
40
+ "failed_step": 8
41
+ },
42
+ "$comment": "Parameter-consistency check on the resolved JWK. A lenient verifier that picks alg from the sig-params and ignores the JWK's declared alg/crv would proceed to step 10 and reject with request_signature_invalid — a DIFFERENT (and less informative) error code. Per README 'Conformance expectations' §1, error-code mismatch is non-conformant even when the rejection lands at a different step. Uses jwks_override rather than a new keys.json entry because this key shape is deliberately malformed — polluting the canonical keys.json with impossible key parameters would risk other vectors inheriting the malformed shape through a bug."
43
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "URL authority contains raw IDN U-label (non-ASCII bytes in host)",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization: hosts MUST be ASCII A-labels; RFC 5891 §4.4)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://bücher.example.com/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_outcome": {
26
+ "success": false,
27
+ "error_code": "request_signature_header_malformed",
28
+ "failed_step": 1
29
+ },
30
+ "$comment": "Host label 'bücher' is a Unicode U-label; the AdCP @target-uri algorithm requires A-label (Punycode, 'xn--bcher-kva') form. Accepting a raw U-label on the wire risks a canonicalization-differential: UTS-46 Nontransitional processing produces one A-label, naive lowercase + Punycode produces another (see canonicalization.json case 'idn-mixed-case-to-punycode'), and non-ASCII-aware libraries may round-trip the bytes unchanged. Verifier MUST reject at parse rather than guess. Companion canonicalization.json cases 'idn-to-punycode' and 'idn-mixed-case-to-punycode' exercise the SIGNER side (expect A-label output from U-label input after explicit UTS-46 processing); this vector exercises the VERIFIER side (reject U-label bytes received on the wire inside a signed request)."
31
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "Webhook registration with push_notification_config.authentication over bearer (unsigned); seller supports request signing but operation is NOT in required_for",
3
+ "spec_reference": "#webhook-security Downgrade and injection resistance — MUST require 9421 when authentication is present",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/update_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Authorization": "Bearer test-bearer-token"
11
+ },
12
+ "body": "{\"media_buy_id\":\"mb_001\",\"push_notification_config\":{\"url\":\"https://buyer.example.com/webhook\",\"authentication\":{\"scheme\":\"HMAC-SHA256\",\"credentials\":\"shared-secret-placeholder\"}}}"
13
+ },
14
+ "verifier_capability": {
15
+ "supported": true,
16
+ "covers_content_digest": "either",
17
+ "required_for": []
18
+ },
19
+ "jwks_ref": ["test-ed25519-2026"],
20
+ "expected_outcome": {
21
+ "success": false,
22
+ "error_code": "request_signature_required",
23
+ "failed_step": 0
24
+ }
25
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "Basic POST, Ed25519, no content-digest coverage",
3
+ "spec_reference": "#verifier-checklist-requests (all steps pass)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:U51PJzU9nMJxMAH_u-UDpSecT5SQX1-deSnWE3XpFo-BLT2_2h5FgMltntNCW05chhmFnjZEzkRmaYKeU0UUBw:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\",\"packages\":[{\"package_id\":\"pkg_1\",\"budget\":{\"amount\":1000,\"currency\":\"USD\"}}]}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "Signature generated by .context/generate-test-vectors.mjs from expected_signature_base using the test-ed25519-2026 private key in keys.json. Ed25519 is deterministic; ES256 here uses IEEE P1363 (r||s) encoding per RFC 9421 §3.3.2."
30
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "POST with content-digest covered, Ed25519",
3
+ "spec_reference": "#content-digest-and-proxy-compatibility and #verifier-checklist-requests",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Content-Digest": "sha-256=:SNIVma8dgUBx/U1CBaYFQnsJep9S0/tXaNXlQQOdoxQ=:",
11
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\" \"content-digest\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
12
+ "Signature": "sig1=:RiD5mPhxpBWhmaqUL5-vceyPX5jpjzYZhSnteuYCIYhIqdIl0Yxdh5qstCPXwkKL4AZOsPBL7-8ctbPkHunSAw:"
13
+ },
14
+ "body": "{\"plan_id\":\"plan_001\"}"
15
+ },
16
+ "verifier_capability": {
17
+ "supported": true,
18
+ "covers_content_digest": "required",
19
+ "required_for": [
20
+ "create_media_buy"
21
+ ]
22
+ },
23
+ "jwks_ref": [
24
+ "test-ed25519-2026"
25
+ ],
26
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"content-digest\": sha-256=:SNIVma8dgUBx/U1CBaYFQnsJep9S0/tXaNXlQQOdoxQ=:\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\" \"content-digest\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
27
+ "expected_outcome": {
28
+ "success": true
29
+ },
30
+ "$comment": "Signature generated by .context/generate-test-vectors.mjs from expected_signature_base using the test-ed25519-2026 private key in keys.json. Ed25519 is deterministic; ES256 here uses IEEE P1363 (r||s) encoding per RFC 9421 §3.3.2."
31
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "POST with ES256 algorithm (edge-runtime profile)",
3
+ "spec_reference": "#adcp-rfc-9421-profile (alg allowlist)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-es256-2026\";alg=\"ecdsa-p256-sha256\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:iROVe9SPqEARfTlnbJsJYdg6Mv7WPr7fWD05rZ31H3o1Nprm-n181yGQpixU9EvgDnAUO3f-9FVpttLxDoRGxA:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-es256-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-es256-2026\";alg=\"ecdsa-p256-sha256\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "Signature generated by .context/generate-test-vectors.mjs from expected_signature_base using the test-es256-2026 private key in keys.json. Ed25519 is deterministic; ES256 here uses IEEE P1363 (r||s) encoding per RFC 9421 §3.3.2."
30
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "Multiple Signature-Input labels — verifier MUST process exactly one",
3
+ "spec_reference": "#adcp-rfc-9421-profile (One signature per request)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\", sig2=(\"@method\" \"@target-uri\");created=1776520800;expires=1776521100;nonce=\"DIFFERENT-NONCE-FOR-SIG2____\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:U51PJzU9nMJxMAH_u-UDpSecT5SQX1-deSnWE3XpFo-BLT2_2h5FgMltntNCW05chhmFnjZEzkRmaYKeU0UUBw:, sig2=:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\",\"packages\":[{\"package_id\":\"pkg_1\",\"budget\":{\"amount\":1000,\"currency\":\"USD\"}}]}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": ["create_media_buy"]
19
+ },
20
+ "jwks_ref": ["test-ed25519-2026"],
21
+ "expected_outcome": {
22
+ "success": true,
23
+ "verified_label": "sig1"
24
+ },
25
+ "$comment": "Two signature labels: sig1 is valid (copied from positive/001); sig2 has a different covered-components set, different nonce, and a zero-byte signature that would not verify. Per spec, verifiers MUST process exactly one Signature-Input label (conventionally sig1) and MUST ignore additional labels. This vector's expected_outcome is SUCCESS — sig1 verifies and the request is treated as authenticated. If a verifier attempts to verify sig2, it will fail and reject the request, which is non-conformant. This locks in option (a) of the relay model (ignore extras) ahead of #2324's full design; option (b) chained-signature semantics is a future RFC."
26
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "URL has explicit :443 port; canonicalization strips it",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 4: strip default ports)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com:443/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:U51PJzU9nMJxMAH_u-UDpSecT5SQX1-deSnWE3XpFo-BLT2_2h5FgMltntNCW05chhmFnjZEzkRmaYKeU0UUBw:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "As-received URL has :443; the canonical @target-uri value in the signature base strips it per RFC 3986 §6.2.3 scheme-based normalization. Signer and verifier MUST both canonicalize before computing or verifying the base. A verifier that leaves :443 in @target-uri will fail cryptographic verify at step 10."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "URL path has a /./ segment; canonicalization collapses it",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 5: remove_dot_segments)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/./create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:U51PJzU9nMJxMAH_u-UDpSecT5SQX1-deSnWE3XpFo-BLT2_2h5FgMltntNCW05chhmFnjZEzkRmaYKeU0UUBw:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "As-received URL has /./ mid-path; canonical @target-uri applies remove_dot_segments (RFC 3986 §5.2.4) producing /adcp/create_media_buy. Similar rules apply to /../ and double slashes. Verifiers that don't apply remove_dot_segments will fail step 10 (signature invalid) because their computed base will differ."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "URL query string preserves byte order (not alphabetized)",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 7: preserve query byte-for-byte)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/get_media_buy?b=2&a=1&c=3",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:ovWpkGEukPhxTju9HTOj1LSrwbTbs95K2HHWUbA5aCBfHDvnGXcFfEM8X5p0VhOeCIAva0eCAaLuF6FCadHiBQ:"
12
+ },
13
+ "body": "{\"update\":\"rename\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/get_media_buy?b=2&a=1&c=3\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "Query string is b=2&a=1&c=3 (intentionally non-alphabetized). Spec mandates preserving the query byte-for-byte in @target-uri. Verifiers that alphabetize (some 9421 libraries do this by default) will fail step 10 because their base differs by query ordering. The +/%20 handling edge case is also captured here — do not interpret + as space; do not re-encode."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "URL path percent-encoded bytes normalized to uppercase hex",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 6: normalize percent-encoding)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/resource/%e2%98%83/item",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:3BiEuAwj6TId9StqdEmin-WxLkyji6sOH0dFuCLm3Rk7GHCsYtcXIswbD4oFoVmtvRCHuMaIyCMqnQejhV7PDA:"
12
+ },
13
+ "body": "{\"op\":\"update\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/resource/%E2%98%83/item\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "As-received path uses lowercase hex (%e2%98%83 — the ☃ snowman); canonical @target-uri uppercases to %E2%98%83 per RFC 3986 §6.2.2.1. Unreserved characters would additionally be decoded, but the snowman bytes are reserved so they stay percent-encoded. Verifiers that don't uppercase hex will fail step 10."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "URL path percent-encoded unreserved bytes decoded per RFC 3986 §6.2.2.2",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 6: decode percent-encoded unreserved characters)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/a%7Eb%2Dc%5Fd%2Ee/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:o2kFcTvxhbtnyteqXSKBvg_WcDeh7Ev-6rmhbl5bqEa5LHEDBBQbzoB8JEgOxtYjsrANKz8qygxfc0JOUQnKBg:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/a~b-c_d.e/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "Companion to 008-percent-encoded-path (which exercises the reserved-byte uppercase rule). This vector covers the decode-side of step 6: the four unreserved characters that are percent-encoded on the wire (%7E=~, %2D=-, %5F=_, %2E=.) MUST be decoded in the canonical @target-uri per RFC 3986 §6.2.2.2. A verifier that uppercases but doesn't decode will fail step 10 (signature invalid) because %7E != ~ in the canonical base. Signature generated with the test-ed25519-2026 private key from the expected_signature_base."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "URL path with %2F (reserved) preserved literally through remove_dot_segments",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 5: remove_dot_segments operates on percent-encoded form; step 6: reserved bytes stay percent-encoded)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://seller.example.com/adcp/segment%2Fwith-encoded-slash/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:2MVpRwioVrc-gLepGnleM5Nk0hI8M-V5A9buqMly0oL5Z4p3VfPh92ijitH1fKL2o7i97160AJ0Sf_wP9Q0KCQ:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://seller.example.com/adcp/segment%2Fwith-encoded-slash/create_media_buy\n\"@authority\": seller.example.com\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "%2F is the percent-encoding of '/', a reserved character. Two properties MUST hold in canonical form: (a) remove_dot_segments per RFC 3986 §5.2.4 operates on the percent-encoded path and does NOT treat %2F as a segment separator, so 'segment%2Fwith-encoded-slash' stays as one path segment; (b) step 6 keeps reserved bytes percent-encoded (with uppercase hex) — the %2F does NOT decode to '/'. A verifier that decodes %2F before remove_dot_segments can produce a different path entirely (especially when combined with /./ or /../). Signature generated with the test-ed25519-2026 private key from the expected_signature_base."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "IPv6 literal authority; brackets preserved in @target-uri and @authority",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 2: IPv6 brackets preserved; @authority derivation)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://[2001:db8::1]/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:QplWbT2vVnF_TSfY5w5d8zQYkLpD7Bp4rxE9uKHl14UjBmUnF6mwKB8pEgoFTKHF1jVwwL14hx_AM6sFBtT9CA:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://[2001:db8::1]/adcp/create_media_buy\n\"@authority\": [2001:db8::1]\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "Bare IPv6 literal in authority. RFC 9421 canonicalizes @target-uri and @authority with brackets retained; common host-parsing libraries strip brackets during authority split and must reinstate them in the canonical form. A verifier that emits '2001:db8::1' without brackets (or with an extra ':' splitting ambiguity) will fail step 10. Paired with 012-ipv6-authority-default-port-stripped to cover the '@target-uri must not strip the bracket while stripping the default port' interaction. Signature generated with the test-ed25519-2026 private key from the expected_signature_base."
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "IPv6 literal authority with explicit :443; canonicalization strips port but preserves brackets",
3
+ "spec_reference": "#adcp-rfc-9421-profile (@target-uri canonicalization step 2 + step 4: IPv6 brackets preserved AND default ports stripped)",
4
+ "reference_now": 1776520800,
5
+ "request": {
6
+ "method": "POST",
7
+ "url": "https://[2001:db8::1]:443/adcp/create_media_buy",
8
+ "headers": {
9
+ "Content-Type": "application/json",
10
+ "Signature-Input": "sig1=(\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
11
+ "Signature": "sig1=:QplWbT2vVnF_TSfY5w5d8zQYkLpD7Bp4rxE9uKHl14UjBmUnF6mwKB8pEgoFTKHF1jVwwL14hx_AM6sFBtT9CA:"
12
+ },
13
+ "body": "{\"plan_id\":\"plan_001\"}"
14
+ },
15
+ "verifier_capability": {
16
+ "supported": true,
17
+ "covers_content_digest": "either",
18
+ "required_for": [
19
+ "create_media_buy"
20
+ ]
21
+ },
22
+ "jwks_ref": [
23
+ "test-ed25519-2026"
24
+ ],
25
+ "expected_signature_base": "\"@method\": POST\n\"@target-uri\": https://[2001:db8::1]/adcp/create_media_buy\n\"@authority\": [2001:db8::1]\n\"content-type\": application/json\n\"@signature-params\": (\"@method\" \"@target-uri\" \"@authority\" \"content-type\");created=1776520800;expires=1776521100;nonce=\"KXYnfEfJ0PBRZXQyVXfVQA\";keyid=\"test-ed25519-2026\";alg=\"ed25519\";tag=\"adcp/request-signing/v1\"",
26
+ "expected_outcome": {
27
+ "success": true
28
+ },
29
+ "$comment": "Intersection of bracket preservation (step 2) and default-port stripping (step 4). As-received URL has '[2001:db8::1]:443'; canonical form is '[2001:db8::1]' — port stripped, brackets retained. A naive regex that strips ':443$' from the authority string will incorrectly produce '[2001:db8::1' (eating the closing bracket) or leave the port in place. Canonical base is identical to 011-ipv6-authority by construction, so the same signature bytes verify both vectors. Signature generated with the test-ed25519-2026 private key from the expected_signature_base."
30
+ }