@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,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KEY_ALGORITHMS = void 0;
4
+ exports.isValidKid = isValidKid;
5
+ exports.checkPublicJwk = checkPublicJwk;
6
+ exports.thumbprint = thumbprint;
7
+ exports.publicKeyObject = publicKeyObject;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const util_1 = require("@spinajs/util");
10
+ const base64url_js_1 = require("./base64url.js");
11
+ const ed25519_js_1 = require("./ed25519.js");
12
+ exports.KEY_ALGORITHMS = Object.freeze(['EdDSA', 'ES256']);
13
+ const KID = /^[A-Za-z0-9._-]{1,64}$/;
14
+ function isValidKid(kid) {
15
+ return typeof kid === 'string' && KID.test(kid);
16
+ }
17
+ const has32Bytes = (v) => (0, base64url_js_1.decodeB64url)(v)?.length === 32;
18
+ function importable(jwk) {
19
+ try {
20
+ return (0, node_crypto_1.createPublicKey)({ key: { ...jwk }, format: 'jwk' });
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Design §22.10, canvas C8 D5: an Ed25519 key (RFC 8037) whose `x` is a canonical point and not of small order, or a
28
+ * P-256 key whose `x` and `y` are 32 bytes and on the curve; never a private part. Members other than the required ones
29
+ * are dropped, never trusted (the algorithm comes from the key type). Null for anything else.
30
+ */
31
+ function checkPublicJwk(input, allowed = exports.KEY_ALGORITHMS) {
32
+ if (!(0, util_1.isPlainObject)(input) || 'd' in input) {
33
+ return null;
34
+ }
35
+ let material = null;
36
+ if (input.kty === 'OKP' && input.crv === 'Ed25519' && has32Bytes(input.x)) {
37
+ const x = (0, base64url_js_1.decodeB64url)(input.x);
38
+ if ((0, ed25519_js_1.isCanonicalPoint)(x) && !(0, ed25519_js_1.isSmallOrder)(x)) {
39
+ const jwk = { kty: 'OKP', crv: 'Ed25519', x: input.x };
40
+ material = { alg: 'EdDSA', jwk };
41
+ }
42
+ }
43
+ else if (input.kty === 'EC' && input.crv === 'P-256' && has32Bytes(input.x) && has32Bytes(input.y)) {
44
+ const jwk = { kty: 'EC', crv: 'P-256', x: input.x, y: input.y };
45
+ material = { alg: 'ES256', jwk };
46
+ }
47
+ if (!material || !allowed.includes(material.alg) || !importable(material.jwk)) {
48
+ return null;
49
+ }
50
+ return material;
51
+ }
52
+ /** RFC 7638: the required members only, in lexicographic order, no whitespace; SHA-256, base64url. */
53
+ function thumbprint(jwk) {
54
+ const json = jwk.kty === 'OKP' ? JSON.stringify({ crv: jwk.crv, kty: jwk.kty, x: jwk.x }) : JSON.stringify({ crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y });
55
+ return (0, node_crypto_1.createHash)('sha256').update(json, 'utf8').digest('base64url');
56
+ }
57
+ const CACHE_LIMIT = 1024;
58
+ const checked = new Map();
59
+ function cacheKey(m) {
60
+ const jwk = m.jwk;
61
+ if ('d' in jwk || typeof jwk.x !== 'string') {
62
+ return null;
63
+ }
64
+ if (m.alg === 'EdDSA' && jwk.kty === 'OKP' && jwk.crv === 'Ed25519') {
65
+ return `EdDSA:${jwk.x}`;
66
+ }
67
+ if (m.alg === 'ES256' && jwk.kty === 'EC' && jwk.crv === 'P-256' && typeof jwk.y === 'string') {
68
+ return `ES256:${jwk.x}:${jwk.y}`;
69
+ }
70
+ return null;
71
+ }
72
+ /**
73
+ * The node:crypto key for a material that passes checkPublicJwk with its own algorithm, or null. Materials can come
74
+ * from a caller's key lookup, so they are checked again here (cached, as the point check costs a few modular powers).
75
+ */
76
+ function publicKeyObject(material) {
77
+ if (!(0, util_1.isPlainObject)(material) || !(0, util_1.isPlainObject)(material.jwk)) {
78
+ return null;
79
+ }
80
+ const key = cacheKey(material);
81
+ if (key === null) {
82
+ return null;
83
+ }
84
+ const hit = checked.get(key);
85
+ if (hit) {
86
+ return hit;
87
+ }
88
+ const ok = checkPublicJwk(material.jwk);
89
+ if (!ok || ok.alg !== material.alg) {
90
+ return null;
91
+ }
92
+ const object = importable(ok.jwk);
93
+ if (!object) {
94
+ return null;
95
+ }
96
+ if (checked.size >= CACHE_LIMIT) {
97
+ checked.delete(checked.keys().next().value);
98
+ }
99
+ checked.set(key, object);
100
+ return object;
101
+ }
102
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/jwk/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { KeyObject } from 'node:crypto';
2
+ import type { KeyAlgorithm, KeyMaterial } from '@spinajs/authn/contracts';
3
+ /** Raw signature length for both algorithms: Ed25519, and ES256 as IEEE P1363 r || s. */
4
+ export declare const SIGNATURE_BYTES = 64;
5
+ /** Verifies with the key's own algorithm; false for a key that fails the key checks or any other signature length. */
6
+ export declare function verifySignature(material: KeyMaterial, data: Uint8Array, signature: Uint8Array): boolean;
7
+ /** Raw signature: Ed25519, or ES256 over SHA-256 as IEEE P1363. */
8
+ export declare function signRaw(alg: KeyAlgorithm, privateKey: KeyObject, data: Uint8Array): Buffer;
9
+ /** The work of one verification under a key nobody holds, so an unknown key costs what a known one does (A02). */
10
+ export declare function dummyVerify(alg: KeyAlgorithm, data: Uint8Array, signature: Uint8Array): false;
11
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/jwk/signature.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI1E,yFAAyF;AACzF,eAAO,MAAM,eAAe,KAAK,CAAC;AAiBlC,sHAAsH;AACtH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAGvG;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAE1F;AAOD,kHAAkH;AAClH,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,KAAK,CAG7F"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SIGNATURE_BYTES = void 0;
4
+ exports.verifySignature = verifySignature;
5
+ exports.signRaw = signRaw;
6
+ exports.dummyVerify = dummyVerify;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const ed25519_js_1 = require("./ed25519.js");
9
+ const keys_js_1 = require("./keys.js");
10
+ /** Raw signature length for both algorithms: Ed25519, and ES256 as IEEE P1363 r || s. */
11
+ exports.SIGNATURE_BYTES = 64;
12
+ function verifyWith(alg, key, data, signature) {
13
+ if (signature.length !== exports.SIGNATURE_BYTES) {
14
+ return false;
15
+ }
16
+ try {
17
+ if (alg === 'EdDSA') {
18
+ // ed25519-dalek's verify_strict refuses a small-order R and OpenSSL does not; canvas C8 refuses it on both sides.
19
+ return !(0, ed25519_js_1.isSmallOrder)(signature.subarray(0, 32)) && (0, node_crypto_1.verify)(null, data, key, signature);
20
+ }
21
+ return (0, node_crypto_1.verify)('sha256', data, { key, dsaEncoding: 'ieee-p1363' }, signature);
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ /** Verifies with the key's own algorithm; false for a key that fails the key checks or any other signature length. */
28
+ function verifySignature(material, data, signature) {
29
+ const key = (0, keys_js_1.publicKeyObject)(material);
30
+ return key !== null && verifyWith(material.alg, key, data, signature);
31
+ }
32
+ /** Raw signature: Ed25519, or ES256 over SHA-256 as IEEE P1363. */
33
+ function signRaw(alg, privateKey, data) {
34
+ return alg === 'EdDSA' ? (0, node_crypto_1.sign)(null, data, privateKey) : (0, node_crypto_1.sign)('sha256', data, { key: privateKey, dsaEncoding: 'ieee-p1363' });
35
+ }
36
+ const dummies = {
37
+ EdDSA: (0, node_crypto_1.createPublicKey)((0, node_crypto_1.generateKeyPairSync)('ed25519').privateKey),
38
+ ES256: (0, node_crypto_1.createPublicKey)((0, node_crypto_1.generateKeyPairSync)('ec', { namedCurve: 'P-256' }).privateKey),
39
+ };
40
+ /** The work of one verification under a key nobody holds, so an unknown key costs what a known one does (A02). */
41
+ function dummyVerify(alg, data, signature) {
42
+ verifyWith(alg, dummies[alg], data, signature.length === exports.SIGNATURE_BYTES ? signature : Buffer.alloc(exports.SIGNATURE_BYTES, 1));
43
+ return false;
44
+ }
45
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/jwk/signature.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAiF;AAGjF,6CAA4C;AAC5C,uCAA4C;AAE5C,yFAAyF;AAC5E,QAAA,eAAe,GAAG,EAAE,CAAC;AAElC,SAAS,UAAU,CAAC,GAAiB,EAAE,GAAc,EAAE,IAAgB,EAAE,SAAqB;IAC5F,IAAI,SAAS,CAAC,MAAM,KAAK,QAAA,eAAe,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,kHAAkH;YAClH,OAAO,CAAC,IAAA,yBAAY,EAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAA,oBAAM,EAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,IAAA,oBAAM,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sHAAsH;AACtH,yBAAgC,QAAqB,EAAE,IAAgB,EAAE,SAAqB;IAC5F,MAAM,GAAG,GAAG,IAAA,yBAAe,EAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AACxE,CAAC;AAED,mEAAmE;AACnE,iBAAwB,GAAiB,EAAE,UAAqB,EAAE,IAAgB;IAChF,OAAO,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,IAAA,kBAAI,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAI,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;AAC/H,CAAC;AAED,MAAM,OAAO,GAAoC;IAC/C,KAAK,EAAE,IAAA,6BAAe,EAAC,IAAA,iCAAmB,EAAC,SAAS,CAAC,CAAC,UAAU,CAAC;IACjE,KAAK,EAAE,IAAA,6BAAe,EAAC,IAAA,iCAAmB,EAAC,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC;CACtF,CAAC;AAEF,kHAAkH;AAClH,qBAA4B,GAAiB,EAAE,IAAgB,EAAE,SAAqB;IACpF,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,KAAK,QAAA,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAA,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;IACzH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './json.js';
2
+ export * from './verifier.js';
3
+ export * from './signer.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jws/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./json.js"), exports);
18
+ __exportStar(require("./verifier.js"), exports);
19
+ __exportStar(require("./signer.js"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,gDAA8B;AAC9B,8CAA4B"}
@@ -0,0 +1,11 @@
1
+ import { isPlainObject } from '@spinajs/util';
2
+ /**
3
+ * JSON as serde_json reads it, so this verifier agrees with the canvas C8 Rust one: refuses invalid UTF-8, lone
4
+ * surrogates (escaped or not, keys included, also under a duplicate key), nesting deeper than 127, numbers beyond f64,
5
+ * and top-level `uintKeys` whose number is not written as a plain integer. A duplicate key keeps its last value
6
+ * (RFC 7515 §4 allows that, and both C8 verifiers do it). Undefined when refused; never throws.
7
+ */
8
+ export declare function parseStrictJson(bytes: Uint8Array, uintKeys?: readonly string[]): unknown;
9
+ /** @deprecated Use `isPlainObject` from `@spinajs/util`. */
10
+ export declare const isJsonObject: typeof isPlainObject;
11
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/jws/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAY9C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,GAAG,OAAO,CAgD5F;AAED,4DAA4D;AAC5D,eAAO,MAAM,YAAY,sBAAgB,CAAC"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isJsonObject = void 0;
4
+ exports.parseStrictJson = parseStrictJson;
5
+ const util_1 = require("@spinajs/util");
6
+ const LONE_SURROGATE = /\p{Surrogate}/u;
7
+ // serde_json refuses the 128th nested array or object (its recursion limit); canvas C8 refuses it on both sides.
8
+ const MAX_DEPTH = 127;
9
+ // On text JSON.parse accepted, these are exactly its strings, brackets and numbers (literals are skipped).
10
+ const TOKENS = /"[^"\\]*(?:\\.[^"\\]*)*"|[[\]{}]|-?[0-9][0-9.eE+-]*/g;
11
+ const KEY_FOLLOWS = /\s*:/y;
12
+ const UINT_TEXT = /^(0|[1-9][0-9]*)$/;
13
+ const decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
14
+ /**
15
+ * JSON as serde_json reads it, so this verifier agrees with the canvas C8 Rust one: refuses invalid UTF-8, lone
16
+ * surrogates (escaped or not, keys included, also under a duplicate key), nesting deeper than 127, numbers beyond f64,
17
+ * and top-level `uintKeys` whose number is not written as a plain integer. A duplicate key keeps its last value
18
+ * (RFC 7515 §4 allows that, and both C8 verifiers do it). Undefined when refused; never throws.
19
+ */
20
+ function parseStrictJson(bytes, uintKeys = []) {
21
+ try {
22
+ const text = decoder.decode(bytes);
23
+ const value = JSON.parse(text);
24
+ // The number text of each top-level key, the last occurrence winning as in JSON.parse; read from the tokens
25
+ // because the reviver's source text needs Node 21+.
26
+ const numberText = new Map();
27
+ const topLevelObject = text.trimStart().startsWith('{');
28
+ let depth = 0;
29
+ let key = null;
30
+ for (const m of text.matchAll(TOKENS)) {
31
+ const token = m[0];
32
+ const pending = key;
33
+ key = null;
34
+ if (token === '[' || token === '{') {
35
+ depth += 1;
36
+ if (depth > MAX_DEPTH) {
37
+ return undefined;
38
+ }
39
+ }
40
+ else if (token === ']' || token === '}') {
41
+ depth -= 1;
42
+ }
43
+ else if (token.startsWith('"')) {
44
+ const s = JSON.parse(token);
45
+ if (LONE_SURROGATE.test(s)) {
46
+ return undefined;
47
+ }
48
+ if (topLevelObject && depth === 1) {
49
+ KEY_FOLLOWS.lastIndex = m.index + token.length;
50
+ if (KEY_FOLLOWS.test(text)) {
51
+ key = s;
52
+ }
53
+ }
54
+ }
55
+ else if (!Number.isFinite(Number(token))) {
56
+ return undefined;
57
+ }
58
+ else if (pending !== null) {
59
+ numberText.set(pending, token);
60
+ }
61
+ }
62
+ for (const k of uintKeys) {
63
+ const t = numberText.get(k);
64
+ if (t !== undefined && !UINT_TEXT.test(t)) {
65
+ return undefined;
66
+ }
67
+ }
68
+ return value;
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
74
+ /** @deprecated Use `isPlainObject` from `@spinajs/util`. */
75
+ exports.isJsonObject = util_1.isPlainObject;
76
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/jws/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { JwsSigner } from '@spinajs/authn/contracts';
2
+ import type { JwsClaims, JwsKey, JwsSignOptions } from '@spinajs/authn/contracts';
3
+ /** A private signing JWK: Ed25519 (RFC 8037) or P-256, with its `kid`. */
4
+ export interface PrivateJwk {
5
+ readonly kty: string;
6
+ readonly crv: string;
7
+ readonly kid: string;
8
+ readonly x: string;
9
+ readonly y?: string;
10
+ readonly d: string;
11
+ }
12
+ /**
13
+ * JwsSigner over private JWKs the app loads (from a secret reference) and passes in; the first key, or `current`,
14
+ * signs by default. Header and claims are written exactly as canvas C8 does, so EdDSA tickets come out byte for byte.
15
+ */
16
+ export declare class LocalJwsSigner extends JwsSigner {
17
+ private readonly keys;
18
+ private readonly current;
19
+ constructor(privateJwks: readonly PrivateJwk[], opts?: {
20
+ readonly current?: string;
21
+ });
22
+ sign<C extends JwsClaims>(claims: C, opts: JwsSignOptions): Promise<string>;
23
+ publicKeys(): Promise<readonly JwsKey[]>;
24
+ }
25
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../../src/jws/signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQlF,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAgCD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,YAAY,WAAW,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,EAavF;IAEK,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhF;IAEK,UAAU,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAE7C;CACF"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalJwsSigner = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const contracts_1 = require("@spinajs/authn/contracts");
6
+ const util_1 = require("@spinajs/util");
7
+ const exceptions_1 = require("@spinajs/exceptions");
8
+ const base64url_js_1 = require("../jwk/base64url.js");
9
+ const keys_js_1 = require("../jwk/keys.js");
10
+ const signature_js_1 = require("../jwk/signature.js");
11
+ const json_js_1 = require("./json.js");
12
+ function signingKey(jwk) {
13
+ const where = `signing key ${JSON.stringify(jwk?.kid)}`;
14
+ if (!(0, keys_js_1.isValidKid)(jwk?.kid)) {
15
+ throw new exceptions_1.InvalidArgument(`${where}: kid must be 1-64 of [A-Za-z0-9._-]`);
16
+ }
17
+ const material = (0, keys_js_1.checkPublicJwk)(jwk.kty === 'EC' ? { kty: jwk.kty, crv: jwk.crv, x: jwk.x, y: jwk.y } : { kty: jwk.kty, crv: jwk.crv, x: jwk.x });
18
+ if (!material) {
19
+ throw new exceptions_1.InvalidArgument(`${where}: not a valid Ed25519 or P-256 key`);
20
+ }
21
+ if ((0, base64url_js_1.decodeB64url)(jwk.d)?.length !== 32) {
22
+ throw new exceptions_1.InvalidArgument(`${where}: d must be 32 bytes of base64url`);
23
+ }
24
+ let privateKey;
25
+ try {
26
+ privateKey = (0, node_crypto_1.createPrivateKey)({ key: { ...material.jwk, d: jwk.d }, format: 'jwk' });
27
+ }
28
+ catch {
29
+ throw new exceptions_1.InvalidArgument(`${where}: the private key does not load`);
30
+ }
31
+ const derived = (0, node_crypto_1.createPublicKey)(privateKey).export({ format: 'jwk' });
32
+ if (derived.x !== material.jwk.x || (material.jwk.kty === 'EC' && derived.y !== material.jwk.y)) {
33
+ throw new exceptions_1.InvalidArgument(`${where}: the public part does not match d`);
34
+ }
35
+ return { publicKey: Object.freeze({ ...material, kid: jwk.kid }), privateKey };
36
+ }
37
+ /**
38
+ * JwsSigner over private JWKs the app loads (from a secret reference) and passes in; the first key, or `current`,
39
+ * signs by default. Header and claims are written exactly as canvas C8 does, so EdDSA tickets come out byte for byte.
40
+ */
41
+ class LocalJwsSigner extends contracts_1.JwsSigner {
42
+ constructor(privateJwks, opts = {}) {
43
+ super();
44
+ this.keys = new Map();
45
+ for (const jwk of privateJwks) {
46
+ if (this.keys.has(jwk.kid)) {
47
+ throw new exceptions_1.InvalidArgument(`signing key ${JSON.stringify(jwk.kid)} appears twice`);
48
+ }
49
+ this.keys.set(jwk.kid, signingKey(jwk));
50
+ }
51
+ const current = opts.current ?? privateJwks[0]?.kid;
52
+ if (current === undefined || !this.keys.has(current)) {
53
+ throw new exceptions_1.InvalidArgument(`no signing key ${JSON.stringify(current)}`);
54
+ }
55
+ this.current = current;
56
+ }
57
+ async sign(claims, opts) {
58
+ const kid = opts.kid ?? this.current;
59
+ const key = this.keys.get(kid);
60
+ if (!key) {
61
+ throw new exceptions_1.InvalidArgument(`no signing key ${JSON.stringify(kid)}`);
62
+ }
63
+ const [hasTyp] = (0, util_1._try_check_arg)((0, util_1._is_string)((0, util_1._non_empty)()))(opts.typ, 'opts.typ');
64
+ if (!hasTyp) {
65
+ throw new exceptions_1.InvalidArgument('a JWS needs a typ');
66
+ }
67
+ if (typeof claims.iss !== 'string' || typeof claims.aud !== 'string' || !(0, util_1.isNonNegativeInt)(claims.iat) || !(0, util_1.isNonNegativeInt)(claims.exp) || claims.exp <= claims.iat) {
68
+ throw new exceptions_1.InvalidArgument('claims need string iss and aud, and integer iat < exp in Unix seconds');
69
+ }
70
+ const header = JSON.stringify({ alg: key.publicKey.alg, kid, typ: opts.typ });
71
+ const payload = JSON.stringify(claims);
72
+ if ((0, json_js_1.parseStrictJson)(Buffer.from(payload, 'utf8'), ['iat', 'exp']) === undefined) {
73
+ throw new exceptions_1.InvalidArgument('claims must be JSON a strict verifier reads (no lone surrogates, no nesting deeper than 127)');
74
+ }
75
+ const input = `${(0, base64url_js_1.encodeB64url)(header)}.${(0, base64url_js_1.encodeB64url)(payload)}`;
76
+ return `${input}.${(0, base64url_js_1.encodeB64url)((0, signature_js_1.signRaw)(key.publicKey.alg, key.privateKey, Buffer.from(input, 'ascii')))}`;
77
+ }
78
+ async publicKeys() {
79
+ return Object.freeze([...this.keys.values()].map((k) => k.publicKey));
80
+ }
81
+ }
82
+ exports.LocalJwsSigner = LocalJwsSigner;
83
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/jws/signer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { JwsVerifier } from '@spinajs/authn/contracts';
2
+ import type { JwsClaims, JwsKey, JwsVerification, JwsVerifyOptions } from '@spinajs/authn/contracts';
3
+ /**
4
+ * Compact JWS under the canvas C8 D4 rules (lane notes D3): the first failing check gives the code. The signature is
5
+ * checked with the key's own algorithm; a key that fails the key checks counts as unknown.
6
+ */
7
+ export declare class StrictJwsVerifier extends JwsVerifier {
8
+ verify<C extends JwsClaims, K extends JwsKey = JwsKey>(token: string, opts: JwsVerifyOptions<C, K>): Promise<JwsVerification<C, K>>;
9
+ }
10
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../src/jws/verifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAA2B,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAgB,MAAM,0BAA0B,CAAC;AAW5I;;;GAGG;AACH,qBACa,iBAAkB,SAAQ,WAAW;IAC1C,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CA2DxI;CACF"}
@@ -0,0 +1,86 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.StrictJwsVerifier = void 0;
10
+ const di_1 = require("@spinajs/di");
11
+ const contracts_1 = require("@spinajs/authn/contracts");
12
+ const util_1 = require("@spinajs/util");
13
+ const base64url_js_1 = require("../jwk/base64url.js");
14
+ const keys_js_1 = require("../jwk/keys.js");
15
+ const signature_js_1 = require("../jwk/signature.js");
16
+ const json_js_1 = require("./json.js");
17
+ const HEADER_MEMBERS = ['alg', 'kid', 'typ'];
18
+ const fail = (code) => ({ ok: false, code });
19
+ /**
20
+ * Compact JWS under the canvas C8 D4 rules (lane notes D3): the first failing check gives the code. The signature is
21
+ * checked with the key's own algorithm; a key that fails the key checks counts as unknown.
22
+ */
23
+ let StrictJwsVerifier = class StrictJwsVerifier extends contracts_1.JwsVerifier {
24
+ async verify(token, opts) {
25
+ if (typeof token !== 'string') {
26
+ return fail('malformed');
27
+ }
28
+ const parts = token.split('.');
29
+ if (parts.length !== 3) {
30
+ return fail('malformed');
31
+ }
32
+ const [headerText, payloadText, signatureText] = parts;
33
+ const headerBytes = (0, base64url_js_1.decodeB64url)(headerText);
34
+ const payloadBytes = (0, base64url_js_1.decodeB64url)(payloadText);
35
+ const signature = (0, base64url_js_1.decodeB64url)(signatureText);
36
+ if (!headerBytes || !payloadBytes || signature?.length !== signature_js_1.SIGNATURE_BYTES) {
37
+ return fail('malformed');
38
+ }
39
+ const h = (0, json_js_1.parseStrictJson)(headerBytes);
40
+ if (!(0, util_1.isPlainObject)(h) || Object.keys(h).length !== HEADER_MEMBERS.length || !HEADER_MEMBERS.every((m) => typeof h[m] === 'string')) {
41
+ return fail('bad_header');
42
+ }
43
+ const header = Object.freeze({ alg: h.alg, kid: h.kid, typ: h.typ });
44
+ if (!opts.algorithms.includes(header.alg) || header.typ !== opts.typ) {
45
+ return fail('bad_header');
46
+ }
47
+ const key = await opts.keys(header.kid);
48
+ if (!key || key.alg !== header.alg || (0, keys_js_1.publicKeyObject)(key) === null) {
49
+ return fail('unknown_key');
50
+ }
51
+ if (!(0, signature_js_1.verifySignature)(key, Buffer.from(`${headerText}.${payloadText}`, 'ascii'), signature)) {
52
+ return fail('bad_signature');
53
+ }
54
+ const payload = (0, json_js_1.parseStrictJson)(payloadBytes, ['iat', 'exp']);
55
+ if (!(0, util_1.isPlainObject)(payload)) {
56
+ return fail('invalid_claims');
57
+ }
58
+ const { iss, aud, iat, exp } = payload;
59
+ if (typeof iss !== 'string' || typeof aud !== 'string' || !(0, util_1.isNonNegativeInt)(iat) || !(0, util_1.isNonNegativeInt)(exp) || exp <= iat || exp - iat > opts.maxLifetimeSeconds) {
60
+ return fail('invalid_claims');
61
+ }
62
+ const claims = opts.claims(payload);
63
+ if (claims === null) {
64
+ return fail('invalid_claims');
65
+ }
66
+ if (typeof opts.issuer === 'function' ? !opts.issuer(iss, key) : iss !== opts.issuer) {
67
+ return fail('wrong_issuer');
68
+ }
69
+ if (aud !== opts.audience) {
70
+ return fail('wrong_audience');
71
+ }
72
+ const nowS = Math.floor(opts.now.getTime() / 1000);
73
+ if (nowS >= exp + opts.skewSeconds) {
74
+ return fail('expired');
75
+ }
76
+ if (iat > nowS + opts.skewSeconds) {
77
+ return fail('not_yet_valid');
78
+ }
79
+ return { ok: true, header, claims, key };
80
+ }
81
+ };
82
+ exports.StrictJwsVerifier = StrictJwsVerifier;
83
+ exports.StrictJwsVerifier = StrictJwsVerifier = __decorate([
84
+ (0, di_1.Injectable)(contracts_1.JwsVerifier)
85
+ ], StrictJwsVerifier);
86
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/jws/verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { OrmDriver, OrmMigration } from '@spinajs/orm';
2
+ /** Design §22.16 `authn_key`, plus an owner index for GET /user/keys. */
3
+ export declare class AuthnKeys_2026_10_02_00_00_00 extends OrmMigration {
4
+ up(connection: OrmDriver): Promise<void>;
5
+ down(connection: OrmDriver): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=AuthnKeys_2026_10_02_00_00_00.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthnKeys_2026_10_02_00_00_00.d.ts","sourceRoot":"","sources":["../../../src/migrations/AuthnKeys_2026_10_02_00_00_00.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAElE,yEAAyE;AACzE,qBACa,6BAA8B,SAAQ,YAAY;IAChD,EAAE,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpD;IAEY,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtD;CACF"}
@@ -0,0 +1,40 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthnKeys_2026_10_02_00_00_00 = void 0;
10
+ const orm_1 = require("@spinajs/orm");
11
+ /** Design §22.16 `authn_key`, plus an owner index for GET /user/keys. */
12
+ let AuthnKeys_2026_10_02_00_00_00 = class AuthnKeys_2026_10_02_00_00_00 extends orm_1.OrmMigration {
13
+ async up(connection) {
14
+ await connection.schema().createTable('authn_key', (table) => {
15
+ table.string('kid', 64).primaryKey();
16
+ table.string('owner_type', 16).notNull();
17
+ table.string('owner_id', 64).notNull();
18
+ table.string('alg', 16).notNull();
19
+ table.text('jwk').notNull();
20
+ table.string('thumbprint', 64).notNull();
21
+ table.text('scope');
22
+ table.string('name', 128);
23
+ table.dateTime('expires_at');
24
+ table.dateTime('revoked_at');
25
+ table.dateTime('last_used_at');
26
+ table.string('created_by', 100);
27
+ table.dateTime('created_at').notNull();
28
+ });
29
+ await connection.index().unique().table('authn_key').name('authn_key_thumb').columns(['thumbprint']);
30
+ await connection.index().table('authn_key').name('authn_key_owner').columns(['owner_type', 'owner_id']);
31
+ }
32
+ async down(connection) {
33
+ await connection.schema().dropTable('authn_key');
34
+ }
35
+ };
36
+ exports.AuthnKeys_2026_10_02_00_00_00 = AuthnKeys_2026_10_02_00_00_00;
37
+ exports.AuthnKeys_2026_10_02_00_00_00 = AuthnKeys_2026_10_02_00_00_00 = __decorate([
38
+ (0, orm_1.Migration)('default')
39
+ ], AuthnKeys_2026_10_02_00_00_00);
40
+ //# sourceMappingURL=AuthnKeys_2026_10_02_00_00_00.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthnKeys_2026_10_02_00_00_00.js","sourceRoot":"","sources":["../../../src/migrations/AuthnKeys_2026_10_02_00_00_00.ts"],"names":[],"mappings":";;;;;;;;;AAAA,sCAAkE;AAElE,yEAAyE;AAElE,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,kBAAY;IACtD,KAAK,CAAC,EAAE,CAAC,UAAqB;QACnC,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3D,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;YACrC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACvC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7B,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC/B,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAChC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACrG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1G,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,UAAqB;QACrC,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;;wCAxBY,6BAA6B;IADzC,IAAA,eAAS,EAAC,SAAS,CAAC;GACR,6BAA6B,CAwBzC"}
@@ -0,0 +1,2 @@
1
+ export * from './AuthnKeys_2026_10_02_00_00_00.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC"}