@spinajs/authn-keys 0.0.0-stage → 3.0.1

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 (342) hide show
  1. package/README.md +165 -2
  2. package/lib/cjs/bootstrap.d.ts +6 -0
  3. package/lib/cjs/bootstrap.d.ts.map +1 -0
  4. package/lib/cjs/bootstrap.js +23 -0
  5. package/lib/cjs/bootstrap.js.map +1 -0
  6. package/lib/cjs/challenge/challenge.d.ts +27 -0
  7. package/lib/cjs/challenge/challenge.d.ts.map +1 -0
  8. package/lib/cjs/challenge/challenge.js +56 -0
  9. package/lib/cjs/challenge/challenge.js.map +1 -0
  10. package/lib/cjs/challenge/index.d.ts +2 -0
  11. package/lib/cjs/challenge/index.d.ts.map +1 -0
  12. package/lib/cjs/challenge/index.js +18 -0
  13. package/lib/cjs/challenge/index.js.map +1 -0
  14. package/lib/cjs/cli/AddKey.d.ts +18 -0
  15. package/lib/cjs/cli/AddKey.d.ts.map +1 -0
  16. package/lib/cjs/cli/AddKey.js +65 -0
  17. package/lib/cjs/cli/AddKey.js.map +1 -0
  18. package/lib/cjs/cli/ListKeys.d.ts +11 -0
  19. package/lib/cjs/cli/ListKeys.d.ts.map +1 -0
  20. package/lib/cjs/cli/ListKeys.js +48 -0
  21. package/lib/cjs/cli/ListKeys.js.map +1 -0
  22. package/lib/cjs/cli/RevokeKey.d.ts +9 -0
  23. package/lib/cjs/cli/RevokeKey.d.ts.map +1 -0
  24. package/lib/cjs/cli/RevokeKey.js +42 -0
  25. package/lib/cjs/cli/RevokeKey.js.map +1 -0
  26. package/lib/cjs/cli/common.d.ts +9 -0
  27. package/lib/cjs/cli/common.d.ts.map +1 -0
  28. package/lib/cjs/cli/common.js +35 -0
  29. package/lib/cjs/cli/common.js.map +1 -0
  30. package/lib/cjs/cli/index.d.ts +5 -0
  31. package/lib/cjs/cli/index.d.ts.map +1 -0
  32. package/lib/cjs/cli/index.js +21 -0
  33. package/lib/cjs/cli/index.js.map +1 -0
  34. package/lib/cjs/config/authn-keys.d.ts +9 -0
  35. package/lib/cjs/config/authn-keys.d.ts.map +1 -0
  36. package/lib/cjs/config/authn-keys.js +23 -0
  37. package/lib/cjs/config/authn-keys.js.map +1 -0
  38. package/lib/cjs/httpsig/base.d.ts +8 -0
  39. package/lib/cjs/httpsig/base.d.ts.map +1 -0
  40. package/lib/cjs/httpsig/base.js +73 -0
  41. package/lib/cjs/httpsig/base.js.map +1 -0
  42. package/lib/cjs/httpsig/fields.d.ts +17 -0
  43. package/lib/cjs/httpsig/fields.d.ts.map +1 -0
  44. package/lib/cjs/httpsig/fields.js +137 -0
  45. package/lib/cjs/httpsig/fields.js.map +1 -0
  46. package/lib/cjs/httpsig/index.d.ts +3 -0
  47. package/lib/cjs/httpsig/index.d.ts.map +1 -0
  48. package/lib/cjs/httpsig/index.js +19 -0
  49. package/lib/cjs/httpsig/index.js.map +1 -0
  50. package/lib/cjs/index.d.ts +13 -0
  51. package/lib/cjs/index.d.ts.map +1 -0
  52. package/lib/cjs/index.js +29 -0
  53. package/lib/cjs/index.js.map +1 -0
  54. package/lib/cjs/jwk/base64url.d.ts +7 -0
  55. package/lib/cjs/jwk/base64url.d.ts.map +1 -0
  56. package/lib/cjs/jwk/base64url.js +22 -0
  57. package/lib/cjs/jwk/base64url.js.map +1 -0
  58. package/lib/cjs/jwk/ed25519.d.ts +9 -0
  59. package/lib/cjs/jwk/ed25519.d.ts.map +1 -0
  60. package/lib/cjs/jwk/ed25519.js +47 -0
  61. package/lib/cjs/jwk/ed25519.js.map +1 -0
  62. package/lib/cjs/jwk/index.d.ts +5 -0
  63. package/lib/cjs/jwk/index.d.ts.map +1 -0
  64. package/lib/cjs/jwk/index.js +21 -0
  65. package/lib/cjs/jwk/index.js.map +1 -0
  66. package/lib/cjs/jwk/keys.d.ts +18 -0
  67. package/lib/cjs/jwk/keys.d.ts.map +1 -0
  68. package/lib/cjs/jwk/keys.js +102 -0
  69. package/lib/cjs/jwk/keys.js.map +1 -0
  70. package/lib/cjs/jwk/signature.d.ts +11 -0
  71. package/lib/cjs/jwk/signature.d.ts.map +1 -0
  72. package/lib/cjs/jwk/signature.js +45 -0
  73. package/lib/cjs/jwk/signature.js.map +1 -0
  74. package/lib/cjs/jws/index.d.ts +4 -0
  75. package/lib/cjs/jws/index.d.ts.map +1 -0
  76. package/lib/cjs/jws/index.js +20 -0
  77. package/lib/cjs/jws/index.js.map +1 -0
  78. package/lib/cjs/jws/json.d.ts +11 -0
  79. package/lib/cjs/jws/json.d.ts.map +1 -0
  80. package/lib/cjs/jws/json.js +76 -0
  81. package/lib/cjs/jws/json.js.map +1 -0
  82. package/lib/cjs/jws/signer.d.ts +25 -0
  83. package/lib/cjs/jws/signer.d.ts.map +1 -0
  84. package/lib/cjs/jws/signer.js +83 -0
  85. package/lib/cjs/jws/signer.js.map +1 -0
  86. package/lib/cjs/jws/verifier.d.ts +10 -0
  87. package/lib/cjs/jws/verifier.d.ts.map +1 -0
  88. package/lib/cjs/jws/verifier.js +86 -0
  89. package/lib/cjs/jws/verifier.js.map +1 -0
  90. package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts +7 -0
  91. package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts.map +1 -0
  92. package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.js +40 -0
  93. package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.js.map +1 -0
  94. package/lib/cjs/migrations/index.d.ts +2 -0
  95. package/lib/cjs/migrations/index.d.ts.map +1 -0
  96. package/lib/cjs/migrations/index.js +18 -0
  97. package/lib/cjs/migrations/index.js.map +1 -0
  98. package/lib/cjs/models/AuthnKey.d.ts +22 -0
  99. package/lib/cjs/models/AuthnKey.d.ts.map +1 -0
  100. package/lib/cjs/models/AuthnKey.js +43 -0
  101. package/lib/cjs/models/AuthnKey.js.map +1 -0
  102. package/lib/cjs/models/AuthnNonce.d.ts +8 -0
  103. package/lib/cjs/models/AuthnNonce.d.ts.map +1 -0
  104. package/lib/cjs/models/AuthnNonce.js +31 -0
  105. package/lib/cjs/models/AuthnNonce.js.map +1 -0
  106. package/lib/cjs/models/index.d.ts +3 -0
  107. package/lib/cjs/models/index.d.ts.map +1 -0
  108. package/lib/cjs/models/index.js +19 -0
  109. package/lib/cjs/models/index.js.map +1 -0
  110. package/lib/cjs/nonce/index.d.ts +2 -0
  111. package/lib/cjs/nonce/index.d.ts.map +1 -0
  112. package/lib/cjs/nonce/index.js +18 -0
  113. package/lib/cjs/nonce/index.js.map +1 -0
  114. package/lib/cjs/nonce/store.d.ts +22 -0
  115. package/lib/cjs/nonce/store.d.ts.map +1 -0
  116. package/lib/cjs/nonce/store.js +98 -0
  117. package/lib/cjs/nonce/store.js.map +1 -0
  118. package/lib/cjs/options/index.d.ts +2 -0
  119. package/lib/cjs/options/index.d.ts.map +1 -0
  120. package/lib/cjs/options/index.js +18 -0
  121. package/lib/cjs/options/index.js.map +1 -0
  122. package/lib/cjs/options/options.d.ts +47 -0
  123. package/lib/cjs/options/options.d.ts.map +1 -0
  124. package/lib/cjs/options/options.js +42 -0
  125. package/lib/cjs/options/options.js.map +1 -0
  126. package/lib/cjs/package.json +1 -0
  127. package/lib/cjs/register-schema.d.ts +2 -0
  128. package/lib/cjs/register-schema.d.ts.map +1 -0
  129. package/lib/cjs/register-schema.js +9 -0
  130. package/lib/cjs/register-schema.js.map +1 -0
  131. package/lib/cjs/registry/index.d.ts +4 -0
  132. package/lib/cjs/registry/index.d.ts.map +1 -0
  133. package/lib/cjs/registry/index.js +20 -0
  134. package/lib/cjs/registry/index.js.map +1 -0
  135. package/lib/cjs/registry/orm-store.d.ts +15 -0
  136. package/lib/cjs/registry/orm-store.d.ts.map +1 -0
  137. package/lib/cjs/registry/orm-store.js +109 -0
  138. package/lib/cjs/registry/orm-store.js.map +1 -0
  139. package/lib/cjs/registry/registry.d.ts +54 -0
  140. package/lib/cjs/registry/registry.d.ts.map +1 -0
  141. package/lib/cjs/registry/registry.js +244 -0
  142. package/lib/cjs/registry/registry.js.map +1 -0
  143. package/lib/cjs/registry/store.d.ts +25 -0
  144. package/lib/cjs/registry/store.d.ts.map +1 -0
  145. package/lib/cjs/registry/store.js +66 -0
  146. package/lib/cjs/registry/store.js.map +1 -0
  147. package/lib/cjs/schema.d.ts +88 -0
  148. package/lib/cjs/schema.d.ts.map +1 -0
  149. package/lib/cjs/schema.js +41 -0
  150. package/lib/cjs/schema.js.map +1 -0
  151. package/lib/cjs/strategies/assertion.d.ts +29 -0
  152. package/lib/cjs/strategies/assertion.d.ts.map +1 -0
  153. package/lib/cjs/strategies/assertion.js +118 -0
  154. package/lib/cjs/strategies/assertion.js.map +1 -0
  155. package/lib/cjs/strategies/challenge.d.ts +25 -0
  156. package/lib/cjs/strategies/challenge.d.ts.map +1 -0
  157. package/lib/cjs/strategies/challenge.js +81 -0
  158. package/lib/cjs/strategies/challenge.js.map +1 -0
  159. package/lib/cjs/strategies/httpsig.d.ts +34 -0
  160. package/lib/cjs/strategies/httpsig.d.ts.map +1 -0
  161. package/lib/cjs/strategies/httpsig.js +127 -0
  162. package/lib/cjs/strategies/httpsig.js.map +1 -0
  163. package/lib/cjs/strategies/index.d.ts +5 -0
  164. package/lib/cjs/strategies/index.d.ts.map +1 -0
  165. package/lib/cjs/strategies/index.js +21 -0
  166. package/lib/cjs/strategies/index.js.map +1 -0
  167. package/lib/cjs/strategies/keys.d.ts +43 -0
  168. package/lib/cjs/strategies/keys.d.ts.map +1 -0
  169. package/lib/cjs/strategies/keys.js +93 -0
  170. package/lib/cjs/strategies/keys.js.map +1 -0
  171. package/lib/mjs/bootstrap.d.ts +6 -0
  172. package/lib/mjs/bootstrap.d.ts.map +1 -0
  173. package/lib/mjs/bootstrap.js +20 -0
  174. package/lib/mjs/bootstrap.js.map +1 -0
  175. package/lib/mjs/challenge/challenge.d.ts +27 -0
  176. package/lib/mjs/challenge/challenge.d.ts.map +1 -0
  177. package/lib/mjs/challenge/challenge.js +45 -0
  178. package/lib/mjs/challenge/challenge.js.map +1 -0
  179. package/lib/mjs/challenge/index.d.ts +2 -0
  180. package/lib/mjs/challenge/index.d.ts.map +1 -0
  181. package/lib/mjs/challenge/index.js +2 -0
  182. package/lib/mjs/challenge/index.js.map +1 -0
  183. package/lib/mjs/cli/AddKey.d.ts +18 -0
  184. package/lib/mjs/cli/AddKey.d.ts.map +1 -0
  185. package/lib/mjs/cli/AddKey.js +62 -0
  186. package/lib/mjs/cli/AddKey.js.map +1 -0
  187. package/lib/mjs/cli/ListKeys.d.ts +11 -0
  188. package/lib/mjs/cli/ListKeys.d.ts.map +1 -0
  189. package/lib/mjs/cli/ListKeys.js +44 -0
  190. package/lib/mjs/cli/ListKeys.js.map +1 -0
  191. package/lib/mjs/cli/RevokeKey.d.ts +9 -0
  192. package/lib/mjs/cli/RevokeKey.d.ts.map +1 -0
  193. package/lib/mjs/cli/RevokeKey.js +39 -0
  194. package/lib/mjs/cli/RevokeKey.js.map +1 -0
  195. package/lib/mjs/cli/common.d.ts +9 -0
  196. package/lib/mjs/cli/common.d.ts.map +1 -0
  197. package/lib/mjs/cli/common.js +30 -0
  198. package/lib/mjs/cli/common.js.map +1 -0
  199. package/lib/mjs/cli/index.d.ts +5 -0
  200. package/lib/mjs/cli/index.d.ts.map +1 -0
  201. package/lib/mjs/cli/index.js +5 -0
  202. package/lib/mjs/cli/index.js.map +1 -0
  203. package/lib/mjs/config/authn-keys.d.ts +9 -0
  204. package/lib/mjs/config/authn-keys.d.ts.map +1 -0
  205. package/lib/mjs/config/authn-keys.js +21 -0
  206. package/lib/mjs/config/authn-keys.js.map +1 -0
  207. package/lib/mjs/httpsig/base.d.ts +8 -0
  208. package/lib/mjs/httpsig/base.d.ts.map +1 -0
  209. package/lib/mjs/httpsig/base.js +67 -0
  210. package/lib/mjs/httpsig/base.js.map +1 -0
  211. package/lib/mjs/httpsig/fields.d.ts +17 -0
  212. package/lib/mjs/httpsig/fields.d.ts.map +1 -0
  213. package/lib/mjs/httpsig/fields.js +133 -0
  214. package/lib/mjs/httpsig/fields.js.map +1 -0
  215. package/lib/mjs/httpsig/index.d.ts +3 -0
  216. package/lib/mjs/httpsig/index.d.ts.map +1 -0
  217. package/lib/mjs/httpsig/index.js +3 -0
  218. package/lib/mjs/httpsig/index.js.map +1 -0
  219. package/lib/mjs/index.d.ts +13 -0
  220. package/lib/mjs/index.d.ts.map +1 -0
  221. package/lib/mjs/index.js +13 -0
  222. package/lib/mjs/index.js.map +1 -0
  223. package/lib/mjs/jwk/base64url.d.ts +7 -0
  224. package/lib/mjs/jwk/base64url.d.ts.map +1 -0
  225. package/lib/mjs/jwk/base64url.js +18 -0
  226. package/lib/mjs/jwk/base64url.js.map +1 -0
  227. package/lib/mjs/jwk/ed25519.d.ts +9 -0
  228. package/lib/mjs/jwk/ed25519.d.ts.map +1 -0
  229. package/lib/mjs/jwk/ed25519.js +42 -0
  230. package/lib/mjs/jwk/ed25519.js.map +1 -0
  231. package/lib/mjs/jwk/index.d.ts +5 -0
  232. package/lib/mjs/jwk/index.d.ts.map +1 -0
  233. package/lib/mjs/jwk/index.js +5 -0
  234. package/lib/mjs/jwk/index.js.map +1 -0
  235. package/lib/mjs/jwk/keys.d.ts +18 -0
  236. package/lib/mjs/jwk/keys.d.ts.map +1 -0
  237. package/lib/mjs/jwk/keys.js +95 -0
  238. package/lib/mjs/jwk/keys.js.map +1 -0
  239. package/lib/mjs/jwk/signature.d.ts +11 -0
  240. package/lib/mjs/jwk/signature.d.ts.map +1 -0
  241. package/lib/mjs/jwk/signature.js +39 -0
  242. package/lib/mjs/jwk/signature.js.map +1 -0
  243. package/lib/mjs/jws/index.d.ts +4 -0
  244. package/lib/mjs/jws/index.d.ts.map +1 -0
  245. package/lib/mjs/jws/index.js +4 -0
  246. package/lib/mjs/jws/index.js.map +1 -0
  247. package/lib/mjs/jws/json.d.ts +11 -0
  248. package/lib/mjs/jws/json.d.ts.map +1 -0
  249. package/lib/mjs/jws/json.js +72 -0
  250. package/lib/mjs/jws/json.js.map +1 -0
  251. package/lib/mjs/jws/signer.d.ts +25 -0
  252. package/lib/mjs/jws/signer.d.ts.map +1 -0
  253. package/lib/mjs/jws/signer.js +79 -0
  254. package/lib/mjs/jws/signer.js.map +1 -0
  255. package/lib/mjs/jws/verifier.d.ts +10 -0
  256. package/lib/mjs/jws/verifier.d.ts.map +1 -0
  257. package/lib/mjs/jws/verifier.js +83 -0
  258. package/lib/mjs/jws/verifier.js.map +1 -0
  259. package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts +7 -0
  260. package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts.map +1 -0
  261. package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.js +37 -0
  262. package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.js.map +1 -0
  263. package/lib/mjs/migrations/index.d.ts +2 -0
  264. package/lib/mjs/migrations/index.d.ts.map +1 -0
  265. package/lib/mjs/migrations/index.js +2 -0
  266. package/lib/mjs/migrations/index.js.map +1 -0
  267. package/lib/mjs/models/AuthnKey.d.ts +22 -0
  268. package/lib/mjs/models/AuthnKey.d.ts.map +1 -0
  269. package/lib/mjs/models/AuthnKey.js +40 -0
  270. package/lib/mjs/models/AuthnKey.js.map +1 -0
  271. package/lib/mjs/models/AuthnNonce.d.ts +8 -0
  272. package/lib/mjs/models/AuthnNonce.d.ts.map +1 -0
  273. package/lib/mjs/models/AuthnNonce.js +28 -0
  274. package/lib/mjs/models/AuthnNonce.js.map +1 -0
  275. package/lib/mjs/models/index.d.ts +3 -0
  276. package/lib/mjs/models/index.d.ts.map +1 -0
  277. package/lib/mjs/models/index.js +3 -0
  278. package/lib/mjs/models/index.js.map +1 -0
  279. package/lib/mjs/nonce/index.d.ts +2 -0
  280. package/lib/mjs/nonce/index.d.ts.map +1 -0
  281. package/lib/mjs/nonce/index.js +2 -0
  282. package/lib/mjs/nonce/index.js.map +1 -0
  283. package/lib/mjs/nonce/store.d.ts +22 -0
  284. package/lib/mjs/nonce/store.d.ts.map +1 -0
  285. package/lib/mjs/nonce/store.js +92 -0
  286. package/lib/mjs/nonce/store.js.map +1 -0
  287. package/lib/mjs/options/index.d.ts +2 -0
  288. package/lib/mjs/options/index.d.ts.map +1 -0
  289. package/lib/mjs/options/index.js +2 -0
  290. package/lib/mjs/options/index.js.map +1 -0
  291. package/lib/mjs/options/options.d.ts +47 -0
  292. package/lib/mjs/options/options.d.ts.map +1 -0
  293. package/lib/mjs/options/options.js +39 -0
  294. package/lib/mjs/options/options.js.map +1 -0
  295. package/lib/mjs/package.json +1 -0
  296. package/lib/mjs/register-schema.d.ts +2 -0
  297. package/lib/mjs/register-schema.d.ts.map +1 -0
  298. package/lib/mjs/register-schema.js +7 -0
  299. package/lib/mjs/register-schema.js.map +1 -0
  300. package/lib/mjs/registry/index.d.ts +4 -0
  301. package/lib/mjs/registry/index.d.ts.map +1 -0
  302. package/lib/mjs/registry/index.js +4 -0
  303. package/lib/mjs/registry/index.js.map +1 -0
  304. package/lib/mjs/registry/orm-store.d.ts +15 -0
  305. package/lib/mjs/registry/orm-store.d.ts.map +1 -0
  306. package/lib/mjs/registry/orm-store.js +106 -0
  307. package/lib/mjs/registry/orm-store.js.map +1 -0
  308. package/lib/mjs/registry/registry.d.ts +54 -0
  309. package/lib/mjs/registry/registry.d.ts.map +1 -0
  310. package/lib/mjs/registry/registry.js +239 -0
  311. package/lib/mjs/registry/registry.js.map +1 -0
  312. package/lib/mjs/registry/store.d.ts +25 -0
  313. package/lib/mjs/registry/store.d.ts.map +1 -0
  314. package/lib/mjs/registry/store.js +57 -0
  315. package/lib/mjs/registry/store.js.map +1 -0
  316. package/lib/mjs/schema.d.ts +88 -0
  317. package/lib/mjs/schema.d.ts.map +1 -0
  318. package/lib/mjs/schema.js +38 -0
  319. package/lib/mjs/schema.js.map +1 -0
  320. package/lib/mjs/strategies/assertion.d.ts +29 -0
  321. package/lib/mjs/strategies/assertion.d.ts.map +1 -0
  322. package/lib/mjs/strategies/assertion.js +115 -0
  323. package/lib/mjs/strategies/assertion.js.map +1 -0
  324. package/lib/mjs/strategies/challenge.d.ts +25 -0
  325. package/lib/mjs/strategies/challenge.d.ts.map +1 -0
  326. package/lib/mjs/strategies/challenge.js +78 -0
  327. package/lib/mjs/strategies/challenge.js.map +1 -0
  328. package/lib/mjs/strategies/httpsig.d.ts +34 -0
  329. package/lib/mjs/strategies/httpsig.d.ts.map +1 -0
  330. package/lib/mjs/strategies/httpsig.js +124 -0
  331. package/lib/mjs/strategies/httpsig.js.map +1 -0
  332. package/lib/mjs/strategies/index.d.ts +5 -0
  333. package/lib/mjs/strategies/index.d.ts.map +1 -0
  334. package/lib/mjs/strategies/index.js +5 -0
  335. package/lib/mjs/strategies/index.js.map +1 -0
  336. package/lib/mjs/strategies/keys.d.ts +43 -0
  337. package/lib/mjs/strategies/keys.d.ts.map +1 -0
  338. package/lib/mjs/strategies/keys.js +85 -0
  339. package/lib/mjs/strategies/keys.js.map +1 -0
  340. package/lib/tsconfig.cjs.tsbuildinfo +1 -0
  341. package/lib/tsconfig.mjs.tsbuildinfo +1 -0
  342. package/package.json +79 -4
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.KeyStrategy = exports.failure = exports.assertionIssuer = exports.MAX_CREDENTIAL_LENGTH = void 0;
13
+ exports.keyThrottleKeys = keyThrottleKeys;
14
+ exports.usableKey = usableKey;
15
+ const di_1 = require("@spinajs/di");
16
+ const configuration_1 = require("@spinajs/configuration");
17
+ const log_1 = require("@spinajs/log");
18
+ require("../register-schema.js");
19
+ const contracts_1 = require("@spinajs/authn/contracts");
20
+ const keys_js_1 = require("../jwk/keys.js");
21
+ const signature_js_1 = require("../jwk/signature.js");
22
+ const options_js_1 = require("../options/options.js");
23
+ const registry_js_1 = require("../registry/registry.js");
24
+ /** Credentials longer than this are refused before any parsing (a header is parsed before its signature is checked). */
25
+ exports.MAX_CREDENTIAL_LENGTH = 8192;
26
+ /** An assertion's `iss`: the key owner as `<type>:<id>` (lane notes D8), e.g. `user:<uuid>` or `service:runner-1`. */
27
+ const assertionIssuer = (owner) => `${owner.type}:${owner.id}`;
28
+ exports.assertionIssuer = assertionIssuer;
29
+ /** Credentials name a kid before anything is verified; one that cannot be read throttles under one shared key. */
30
+ function keyThrottleKeys(kid, ctx) {
31
+ const id = kid !== null && (0, keys_js_1.isValidKid)(kid) ? `key:${kid}` : 'key:?';
32
+ return [
33
+ { kind: 'account', value: id },
34
+ { kind: 'account-ip', value: `${id}|${ctx.ip ?? ''}` },
35
+ ];
36
+ }
37
+ /** byId for verifiers: only a key that is neither revoked nor expired at ctx.now is usable; the reason goes to audit. */
38
+ async function usableKey(registry, kid, ctx) {
39
+ const key = (0, keys_js_1.isValidKid)(kid) ? await registry.byId(kid) : null;
40
+ if (!key) {
41
+ return { key: null, reason: 'invalid_credentials' };
42
+ }
43
+ if (!(0, registry_js_1.isUsableKey)(key, ctx.now)) {
44
+ return { key: null, reason: key.revokedAt ? 'revoked' : 'expired', alg: key.alg };
45
+ }
46
+ return { key };
47
+ }
48
+ const failure = (reason) => ({ ok: false, reason });
49
+ exports.failure = failure;
50
+ /** What the key strategies share: the registry, `authn.keys`, the cost of an unusable key and the success outcome. */
51
+ class KeyStrategy extends contracts_1.AuthenticationStrategy {
52
+ constructor(Deps) {
53
+ super();
54
+ this.Deps = Deps;
55
+ }
56
+ get registry() {
57
+ return this.Deps?.registry ?? this.Registry;
58
+ }
59
+ get options() {
60
+ return (0, options_js_1.keysOptionsOf)(this.Deps?.options ?? this.KeysConfig);
61
+ }
62
+ /** The signature work an unknown, revoked or expired key costs, so it answers in the time a known key does (A02). */
63
+ unknownKeyWork(alg, data, signature) {
64
+ (0, signature_js_1.dummyVerify)(alg, data, signature);
65
+ }
66
+ /** Stamps the key's last use when the registry can; a failed stamp costs the stamp, never the login. */
67
+ async success(key, method, ctx) {
68
+ const registry = this.registry;
69
+ if (registry.touch) {
70
+ try {
71
+ await registry.touch(key.kid, ctx.now);
72
+ }
73
+ catch (err) {
74
+ this.Log.error({ error: err, kid: key.kid }, 'Could not stamp the last use of key ${kid}');
75
+ }
76
+ }
77
+ return { ok: true, identity: { type: key.owner.type, id: key.owner.id }, method, ...(key.scope ? { ceiling: key.scope } : {}) };
78
+ }
79
+ }
80
+ exports.KeyStrategy = KeyStrategy;
81
+ __decorate([
82
+ (0, configuration_1.Config)('authn.keys'),
83
+ __metadata("design:type", Object)
84
+ ], KeyStrategy.prototype, "KeysConfig", void 0);
85
+ __decorate([
86
+ (0, di_1.Autoinject)(contracts_1.KeyRegistry),
87
+ __metadata("design:type", contracts_1.KeyRegistry)
88
+ ], KeyStrategy.prototype, "Registry", void 0);
89
+ __decorate([
90
+ (0, log_1.Logger)('authn-keys'),
91
+ __metadata("design:type", log_1.Log)
92
+ ], KeyStrategy.prototype, "Log", void 0);
93
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/strategies/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Bootstrapper } from '@spinajs/di';
2
+ /** Registers the authn.keys schema, so the configuration validates that subtree and fills its defaults. */
3
+ export declare class AuthnKeysConfigBootstrapper extends Bootstrapper {
4
+ bootstrap(): void;
5
+ }
6
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAIvD,2GAA2G;AAC3G,qBACa,2BAA4B,SAAQ,YAAY;IACpD,SAAS,IAAI,IAAI,CAEvB;CACF"}
@@ -0,0 +1,20 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { registerConfigurationSchema } from '@spinajs/configuration';
8
+ import { Bootstrapper, Injectable } from '@spinajs/di';
9
+ import { AUTHN_KEYS_CONFIGURATION_SCHEMA } from './schema.js';
10
+ /** Registers the authn.keys schema, so the configuration validates that subtree and fills its defaults. */
11
+ let AuthnKeysConfigBootstrapper = class AuthnKeysConfigBootstrapper extends Bootstrapper {
12
+ bootstrap() {
13
+ registerConfigurationSchema(AUTHN_KEYS_CONFIGURATION_SCHEMA);
14
+ }
15
+ };
16
+ AuthnKeysConfigBootstrapper = __decorate([
17
+ Injectable(Bootstrapper)
18
+ ], AuthnKeysConfigBootstrapper);
19
+ export { AuthnKeysConfigBootstrapper };
20
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAE9D,2GAA2G;AAEpG,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,YAAY;IACpD,SAAS;QACd,2BAA2B,CAAC,+BAA+B,CAAC,CAAC;IAC/D,CAAC;CACF,CAAA;AAJY,2BAA2B;IADvC,UAAU,CAAC,YAAY,CAAC;GACZ,2BAA2B,CAIvC"}
@@ -0,0 +1,27 @@
1
+ import type { KeyObject } from 'node:crypto';
2
+ import type { KeyAlgorithm, KeyChallenge, KeyMaterial } from '@spinajs/authn/contracts';
3
+ export type ChallengePurpose = 'register' | 'login';
4
+ /** The SecretStore purpose of one challenge; `rid` keeps it within authn_secret.purpose (varchar 32). */
5
+ export declare const challengeSecretPurpose: (rid: string) => string;
6
+ export declare const newChallengeRid: () => string;
7
+ /**
8
+ * `<rid>.<nonce>`. SecretStore keeps only a hash of the nonce and redeems by the raw value, and the credentials carry
9
+ * only the challenge id and a signature, so the id has to bring the nonce back.
10
+ */
11
+ export declare const challengeId: (rid: string, nonce: string) => string;
12
+ export declare function parseChallengeId(id: unknown): {
13
+ rid: string;
14
+ nonce: string;
15
+ } | null;
16
+ /** Nonces are base64url, so the first ':' after one ends it and the signing input has exactly one reading. */
17
+ export declare const isChallengeNonce: (nonce: unknown) => nonce is string;
18
+ /**
19
+ * The bytes a key signs to answer a challenge: UTF-8 of `spinajs-key-<purpose>:<nonce>:<audience>`. The purpose keeps
20
+ * a login signature from proving a registration; the audience is the service as the client knows it (never taken from
21
+ * the challenge answer), so a service that relays another one's challenge gets a signature the other one refuses.
22
+ */
23
+ export declare function challengeSigningInput(challenge: Pick<KeyChallenge, 'nonce'>, purpose: ChallengePurpose, audience: string): Buffer;
24
+ /** The answer a client sends: the raw signature (64 bytes; ES256 as IEEE P1363) as unpadded base64url. */
25
+ export declare function signChallenge(challenge: Pick<KeyChallenge, 'nonce'>, purpose: ChallengePurpose, audience: string, privateKey: KeyObject, alg: KeyAlgorithm): string;
26
+ export declare function verifyChallengeSignature(key: KeyMaterial, nonce: string, purpose: ChallengePurpose, audience: string, signature: unknown): boolean;
27
+ //# sourceMappingURL=challenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../../src/challenge/challenge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKxF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,OAAO,CAAC;AAEpD,yGAAyG;AACzG,eAAO,MAAM,sBAAsB,QAAS,MAAM,KAAG,MAAgC,CAAC;AAQtF,eAAO,MAAM,eAAe,QAAO,MAAsD,CAAC;AAE1F;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAS,MAAM,SAAS,MAAM,KAAG,MAA2B,CAAC;AAErF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQnF;AAED,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,KAAK,IAAI,MAAwD,CAAC;AAEpH;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjI;AAED,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAEnK;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAGlJ"}
@@ -0,0 +1,45 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { _between, _custom, _is_string, _try_check_arg } from '@spinajs/util';
3
+ import { decodeB64url, encodeB64url } from '../jwk/base64url.js';
4
+ import { signRaw, verifySignature } from '../jwk/signature.js';
5
+ /** The SecretStore purpose of one challenge; `rid` keeps it within authn_secret.purpose (varchar 32). */
6
+ export const challengeSecretPurpose = (rid) => `key-challenge:${rid}`;
7
+ const RID_BYTES = 12;
8
+ const RID_LENGTH = 16;
9
+ const RID = /^[A-Za-z0-9_-]{16}$/;
10
+ const MAX_NONCE_LENGTH = 512;
11
+ const NONCE = /^[A-Za-z0-9_-]{22,512}$/;
12
+ export const newChallengeRid = () => randomBytes(RID_BYTES).toString('base64url');
13
+ /**
14
+ * `<rid>.<nonce>`. SecretStore keeps only a hash of the nonce and redeems by the raw value, and the credentials carry
15
+ * only the challenge id and a signature, so the id has to bring the nonce back.
16
+ */
17
+ export const challengeId = (rid, nonce) => `${rid}.${nonce}`;
18
+ export function parseChallengeId(id) {
19
+ const [ok, text] = _try_check_arg(_is_string(_between(RID_LENGTH + 2, RID_LENGTH + 1 + MAX_NONCE_LENGTH), _custom((s) => s[RID_LENGTH] === '.')))(id, 'id');
20
+ if (!ok) {
21
+ return null;
22
+ }
23
+ const rid = text.slice(0, RID_LENGTH);
24
+ const nonce = text.slice(RID_LENGTH + 1);
25
+ return RID.test(rid) && isChallengeNonce(nonce) ? { rid, nonce } : null;
26
+ }
27
+ /** Nonces are base64url, so the first ':' after one ends it and the signing input has exactly one reading. */
28
+ export const isChallengeNonce = (nonce) => typeof nonce === 'string' && NONCE.test(nonce);
29
+ /**
30
+ * The bytes a key signs to answer a challenge: UTF-8 of `spinajs-key-<purpose>:<nonce>:<audience>`. The purpose keeps
31
+ * a login signature from proving a registration; the audience is the service as the client knows it (never taken from
32
+ * the challenge answer), so a service that relays another one's challenge gets a signature the other one refuses.
33
+ */
34
+ export function challengeSigningInput(challenge, purpose, audience) {
35
+ return Buffer.from(`spinajs-key-${purpose}:${challenge.nonce}:${audience}`, 'utf8');
36
+ }
37
+ /** The answer a client sends: the raw signature (64 bytes; ES256 as IEEE P1363) as unpadded base64url. */
38
+ export function signChallenge(challenge, purpose, audience, privateKey, alg) {
39
+ return encodeB64url(signRaw(alg, privateKey, challengeSigningInput(challenge, purpose, audience)));
40
+ }
41
+ export function verifyChallengeSignature(key, nonce, purpose, audience, signature) {
42
+ const raw = decodeB64url(signature);
43
+ return raw !== null && isChallengeNonce(nonce) && verifySignature(key, challengeSigningInput({ nonce }, purpose, audience), raw);
44
+ }
45
+ //# sourceMappingURL=challenge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../../src/challenge/challenge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './challenge.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/challenge/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './challenge.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/challenge/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { Log } from '@spinajs/log';
3
+ import { KeyRegistry } from '@spinajs/authn/contracts';
4
+ interface AddKeyOptions {
5
+ jwk?: string;
6
+ file?: string;
7
+ kid?: string;
8
+ name?: string;
9
+ expires?: string;
10
+ }
11
+ /** Services and agents only: a user registers a key with a proof of possession, which the CLI cannot give. */
12
+ export declare class AddKey extends CliCommand {
13
+ protected Log: Log;
14
+ protected Registry: KeyRegistry;
15
+ execute(ownerType: string, ownerId: string, options: AddKeyOptions): Promise<void>;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=AddKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddKey.d.ts","sourceRoot":"","sources":["../../../src/cli/AddKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,UAAU,EAAmB,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,WAAW,EAAc,MAAM,0BAA0B,CAAC;AAK9E,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8GAA8G;AAC9G,qBAQa,MAAO,SAAQ,UAAU;IAEpC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9F;CACF"}
@@ -0,0 +1,62 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Autoinject } from '@spinajs/di';
11
+ import { Argument, CliCommand, Command, Option } from '@spinajs/cli';
12
+ import { Log, Logger } from '@spinajs/log';
13
+ import { CLI_ACTOR, KeyRegistry, cliContext } from '@spinajs/authn/contracts';
14
+ import { InvalidArgument } from '@spinajs/exceptions';
15
+ import { ownerArg, readPublicJwk } from './common.js';
16
+ /** Services and agents only: a user registers a key with a proof of possession, which the CLI cannot give. */
17
+ let AddKey = class AddKey extends CliCommand {
18
+ async execute(ownerType, ownerId, options) {
19
+ const owner = ownerArg(ownerType, ownerId);
20
+ if (owner.type === 'user') {
21
+ throw new InvalidArgument('a user registers a key with a proof of possession, through POST /user/keys');
22
+ }
23
+ const expiresAt = options.expires === undefined ? undefined : new Date(options.expires);
24
+ // Without a zone, Date reads the time as local, which differs per host.
25
+ if (expiresAt !== undefined && (Number.isNaN(expiresAt.getTime()) || !/T.*(Z|[+-]\d{2}:?\d{2})$/i.test(options.expires))) {
26
+ throw new InvalidArgument(`--expires is not an ISO 8601 instant with Z or an offset: ${options.expires}`);
27
+ }
28
+ const reg = {
29
+ owner,
30
+ actor: CLI_ACTOR,
31
+ jwk: readPublicJwk(options),
32
+ ...(options.kid !== undefined ? { kid: options.kid } : {}),
33
+ ...(options.name !== undefined ? { name: options.name } : {}),
34
+ ...(expiresAt ? { expiresAt } : {}),
35
+ };
36
+ const r = await this.Registry.register(reg, cliContext());
37
+ if (!r.ok) {
38
+ throw new InvalidArgument(`key not registered: ${r.code}`);
39
+ }
40
+ this.Log.success({ kid: r.key.kid, alg: r.key.alg, thumbprint: r.key.thumbprint }, 'Key registered: kid ${kid}, ${alg}, thumbprint ${thumbprint}');
41
+ }
42
+ };
43
+ __decorate([
44
+ Logger('authn-keys'),
45
+ __metadata("design:type", Log)
46
+ ], AddKey.prototype, "Log", void 0);
47
+ __decorate([
48
+ Autoinject(KeyRegistry),
49
+ __metadata("design:type", KeyRegistry)
50
+ ], AddKey.prototype, "Registry", void 0);
51
+ AddKey = __decorate([
52
+ Command('authn:key-add', 'Registers an Ed25519 or P-256 public key for a service or an agent'),
53
+ Argument({ name: 'ownerType', required: true, description: 'service or agent', choices: ['service', 'agent'] }),
54
+ Argument('ownerId', true, 'id of the service or agent'),
55
+ Option('--jwk <json>', false, 'the public JWK as JSON'),
56
+ Option('--file <path>', false, 'a file with the public JWK (JSON) or a PEM public key'),
57
+ Option('--kid <kid>', false, 'key id, 1-64 of [A-Za-z0-9._-]; default: the RFC 7638 thumbprint'),
58
+ Option('--name <name>', false, 'label, up to 128 characters'),
59
+ Option('--expires <iso>', false, 'ISO 8601 expiry instant with Z or an offset')
60
+ ], AddKey);
61
+ export { AddKey };
62
+ //# sourceMappingURL=AddKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddKey.js","sourceRoot":"","sources":["../../../src/cli/AddKey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { Log } from '@spinajs/log';
3
+ import { KeyRegistry } from '@spinajs/authn/contracts';
4
+ import type { KeyRecord } from '@spinajs/authn/contracts';
5
+ export declare function keyLine(k: KeyRecord): string;
6
+ export declare class ListKeys extends CliCommand {
7
+ protected Log: Log;
8
+ protected Registry: KeyRegistry;
9
+ execute(ownerType: string, ownerId: string): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=ListKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListKeys.d.ts","sourceRoot":"","sources":["../../../src/cli/ListKeys.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,UAAU,EAAW,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAK1D,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAE5C;AAED,qBAGa,QAAS,SAAQ,UAAU;IAEtC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtE;CACF"}
@@ -0,0 +1,44 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Autoinject } from '@spinajs/di';
11
+ import { Argument, CliCommand, Command } from '@spinajs/cli';
12
+ import { Log, Logger } from '@spinajs/log';
13
+ import { KeyRegistry } from '@spinajs/authn/contracts';
14
+ import { OWNER_TYPES, ownerArg } from './common.js';
15
+ const iso = (d) => (d ? d.toISOString() : '-');
16
+ export function keyLine(k) {
17
+ return [k.kid, k.alg, k.name ?? '-', `created ${iso(k.createdAt)}`, `expires ${iso(k.expiresAt)}`, `revoked ${iso(k.revokedAt)}`, `last used ${iso(k.lastUsedAt)}`].join(' ');
18
+ }
19
+ let ListKeys = class ListKeys extends CliCommand {
20
+ async execute(ownerType, ownerId) {
21
+ const keys = await this.Registry.list(ownerArg(ownerType, ownerId));
22
+ if (keys.length === 0) {
23
+ this.Log.info('No keys');
24
+ }
25
+ for (const k of keys) {
26
+ this.Log.info(keyLine(k));
27
+ }
28
+ }
29
+ };
30
+ __decorate([
31
+ Logger('authn-keys'),
32
+ __metadata("design:type", Log)
33
+ ], ListKeys.prototype, "Log", void 0);
34
+ __decorate([
35
+ Autoinject(KeyRegistry),
36
+ __metadata("design:type", KeyRegistry)
37
+ ], ListKeys.prototype, "Registry", void 0);
38
+ ListKeys = __decorate([
39
+ Command('authn:key-list', 'Lists the public keys of a user, a service or an agent, revoked and expired ones included'),
40
+ Argument({ name: 'ownerType', required: true, description: OWNER_TYPES.join(', '), choices: OWNER_TYPES }),
41
+ Argument('ownerId', true, 'id of the owner (users.Uuid for users)')
42
+ ], ListKeys);
43
+ export { ListKeys };
44
+ //# sourceMappingURL=ListKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListKeys.js","sourceRoot":"","sources":["../../../src/cli/ListKeys.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,GAAG,GAAG,CAAC,CAAQ,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE9D,MAAM,UAAU,OAAO,CAAC,CAAY;IAClC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjL,CAAC;AAKM,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,UAAU;IAO/B,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;CACF,CAAA;AAdW;IADT,MAAM,CAAC,YAAY,CAAC;8BACN,GAAG;qCAAC;AAGT;IADT,UAAU,CAAC,WAAW,CAAC;8BACJ,WAAW;0CAAC;AALrB,QAAQ;IAHpB,OAAO,CAAC,gBAAgB,EAAE,2FAA2F,CAAC;IACtH,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC1G,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,wCAAwC,CAAC;GACvD,QAAQ,CAgBpB"}
@@ -0,0 +1,9 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { Log } from '@spinajs/log';
3
+ import { KeyRegistry } from '@spinajs/authn/contracts';
4
+ export declare class RevokeKey extends CliCommand {
5
+ protected Log: Log;
6
+ protected Registry: KeyRegistry;
7
+ execute(ownerType: string, ownerId: string, kid: string): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=RevokeKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevokeKey.d.ts","sourceRoot":"","sources":["../../../src/cli/RevokeKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,UAAU,EAAW,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,WAAW,EAAc,MAAM,0BAA0B,CAAC;AAI9E,qBAIa,SAAU,SAAQ,UAAU;IAEvC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;CACF"}
@@ -0,0 +1,39 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Autoinject } from '@spinajs/di';
11
+ import { Argument, CliCommand, Command } from '@spinajs/cli';
12
+ import { Log, Logger } from '@spinajs/log';
13
+ import { CLI_ACTOR, KeyRegistry, cliContext } from '@spinajs/authn/contracts';
14
+ import { InvalidArgument } from '@spinajs/exceptions';
15
+ import { OWNER_TYPES, ownerArg } from './common.js';
16
+ let RevokeKey = class RevokeKey extends CliCommand {
17
+ async execute(ownerType, ownerId, kid) {
18
+ if (!(await this.Registry.revoke(ownerArg(ownerType, ownerId), kid, cliContext(), { actor: CLI_ACTOR }))) {
19
+ throw new InvalidArgument(`no key ${kid} of ${ownerType} ${ownerId}`);
20
+ }
21
+ this.Log.success({ kid }, 'Key ${kid} revoked');
22
+ }
23
+ };
24
+ __decorate([
25
+ Logger('authn-keys'),
26
+ __metadata("design:type", Log)
27
+ ], RevokeKey.prototype, "Log", void 0);
28
+ __decorate([
29
+ Autoinject(KeyRegistry),
30
+ __metadata("design:type", KeyRegistry)
31
+ ], RevokeKey.prototype, "Registry", void 0);
32
+ RevokeKey = __decorate([
33
+ Command('authn:key-revoke', 'Revokes a public key; it fails on the next request'),
34
+ Argument({ name: 'ownerType', required: true, description: OWNER_TYPES.join(', '), choices: OWNER_TYPES }),
35
+ Argument('ownerId', true, 'id of the owner (users.Uuid for users)'),
36
+ Argument('kid', true, 'key id')
37
+ ], RevokeKey);
38
+ export { RevokeKey };
39
+ //# sourceMappingURL=RevokeKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevokeKey.js","sourceRoot":"","sources":["../../../src/cli/RevokeKey.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM7C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAOhC,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe,EAAE,GAAW;QAClE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACzG,MAAM,IAAI,eAAe,CAAC,UAAU,GAAG,OAAO,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AAXW;IADT,MAAM,CAAC,YAAY,CAAC;8BACN,GAAG;sCAAC;AAGT;IADT,UAAU,CAAC,WAAW,CAAC;8BACJ,WAAW;2CAAC;AALrB,SAAS;IAJrB,OAAO,CAAC,kBAAkB,EAAE,oDAAoD,CAAC;IACjF,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC1G,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,wCAAwC,CAAC;IACnE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;GACnB,SAAS,CAarB"}
@@ -0,0 +1,9 @@
1
+ import type { IdentityRef } from '@spinajs/authn/contracts';
2
+ export declare const OWNER_TYPES: string[];
3
+ export declare function ownerArg(type: string, id: string): IdentityRef;
4
+ /** A public JWK given inline as JSON, or a file holding JSON or a PEM public key; private keys are refused. */
5
+ export declare function readPublicJwk(opts: {
6
+ jwk?: string;
7
+ file?: string;
8
+ }): unknown;
9
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/cli/common.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,eAAO,MAAM,WAAW,UAA+B,CAAC;AAExD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,CAK9D;AAED,+GAA+G;AAC/G,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAgB5E"}
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createPublicKey } from 'node:crypto';
3
+ import { InvalidArgument } from '@spinajs/exceptions';
4
+ export const OWNER_TYPES = ['user', 'service', 'agent'];
5
+ export function ownerArg(type, id) {
6
+ if (!OWNER_TYPES.includes(type)) {
7
+ throw new InvalidArgument(`owner type must be one of ${OWNER_TYPES.join(', ')}, not ${JSON.stringify(type)}`);
8
+ }
9
+ return { type, id };
10
+ }
11
+ /** A public JWK given inline as JSON, or a file holding JSON or a PEM public key; private keys are refused. */
12
+ export function readPublicJwk(opts) {
13
+ if ((opts.jwk === undefined) === (opts.file === undefined)) {
14
+ throw new InvalidArgument('give the key with exactly one of --jwk or --file');
15
+ }
16
+ const text = opts.jwk ?? readFileSync(opts.file, 'utf8');
17
+ if (text.includes('-----BEGIN')) {
18
+ if (!text.includes('-----BEGIN PUBLIC KEY-----') || text.includes('PRIVATE KEY')) {
19
+ throw new InvalidArgument('the PEM file must hold a public key (SPKI), never a private key');
20
+ }
21
+ return createPublicKey(text).export({ format: 'jwk' });
22
+ }
23
+ try {
24
+ return JSON.parse(text);
25
+ }
26
+ catch {
27
+ throw new InvalidArgument('the key is neither JSON nor a PEM public key');
28
+ }
29
+ }
30
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/cli/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,EAAU;IAC/C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CAAC,6BAA6B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,aAAa,CAAC,IAAqC;IACjE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,eAAe,CAAC,kDAAkD,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAK,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,eAAe,CAAC,iEAAiE,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,8CAA8C,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './common.js';
2
+ export * from './AddKey.js';
3
+ export * from './ListKeys.js';
4
+ export * from './RevokeKey.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './common.js';
2
+ export * from './AddKey.js';
3
+ export * from './ListKeys.js';
4
+ export * from './RevokeKey.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ declare const authnKeys: {
2
+ system: {
3
+ dirs: {
4
+ cli: string[];
5
+ };
6
+ };
7
+ };
8
+ export default authnKeys;
9
+ //# sourceMappingURL=authn-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authn-keys.d.ts","sourceRoot":"","sources":["../../../src/config/authn-keys.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,SAAS;IACb,MAAM;QACJ,IAAI;YACF,GAAG;;;CAGR,CAAC;eAEa,SAAS"}
@@ -0,0 +1,21 @@
1
+ import { join, normalize, resolve } from 'path';
2
+ function dir(path) {
3
+ const inCommonJs = typeof module !== 'undefined';
4
+ return [
5
+ resolve(normalize(join(process.env.WORKSPACE_ROOT_PATH ?? process.cwd(), 'node_modules', '@spinajs', 'authn-keys', 'lib', inCommonJs ? 'cjs' : 'mjs', path))),
6
+ // one up if we run from app or build folder
7
+ resolve(normalize(join(process.env.WORKSPACE_ROOT_PATH ?? process.cwd(), '../', 'node_modules', '@spinajs', 'authn-keys', 'lib', inCommonJs ? 'cjs' : 'mjs', path))),
8
+ ];
9
+ }
10
+ // Only the CLI scan dir. A non-empty system.dirs.migrations would replace the orm's defaults in every app (see
11
+ // authn-token's config); the migration and the models register through their decorators. The authn.keys defaults
12
+ // live in the authn schema.
13
+ const authnKeys = {
14
+ system: {
15
+ dirs: {
16
+ cli: [...dir('cli')],
17
+ },
18
+ },
19
+ };
20
+ export default authnKeys;
21
+ //# sourceMappingURL=authn-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authn-keys.js","sourceRoot":"","sources":["../../../src/config/authn-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;IACjD,OAAO;QACL,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAE7J,4CAA4C;QAC5C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KACrK,CAAC;AACJ,CAAC;AAED,+GAA+G;AAC/G,iHAAiH;AACjH,4BAA4B;AAC5B,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;SACrB;KACF;CACF,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SignedRequest } from '@spinajs/authn/contracts';
2
+ import type { SignatureInput } from './fields.js';
3
+ export declare const lowerCaseHeaders: (headers: Readonly<Record<string, string>>) => Record<string, string>;
4
+ /** RFC 9421 §2.5 for the covered components; null when one may not be covered or has no value. */
5
+ export declare function signatureBase(req: SignedRequest, input: SignatureInput): string | null;
6
+ /** RFC 9530 Content-Digest: every member is sha-256 or sha-512 and matches the body. */
7
+ export declare function digestMatches(header: unknown, body: Uint8Array): boolean;
8
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/httpsig/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,eAAO,MAAM,gBAAgB,YAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAA4F,CAAC;AA6B/L,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAetF;AAID,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAYxE"}