@wirebench/engine 2.1.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 (583) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +3 -0
  3. package/dist/assert/contract.d.ts +3 -0
  4. package/dist/assert/contract.js +17 -0
  5. package/dist/assert/index.d.ts +4 -0
  6. package/dist/assert/index.js +27 -0
  7. package/dist/assert/match.d.ts +3 -0
  8. package/dist/assert/match.js +58 -0
  9. package/dist/assert/model.d.ts +73 -0
  10. package/dist/assert/model.js +8 -0
  11. package/dist/assert/schema.d.ts +34 -0
  12. package/dist/assert/schema.js +46 -0
  13. package/dist/assert/sla.d.ts +3 -0
  14. package/dist/assert/sla.js +8 -0
  15. package/dist/assert/soap-fault.d.ts +3 -0
  16. package/dist/assert/soap-fault.js +20 -0
  17. package/dist/assert/status.d.ts +3 -0
  18. package/dist/assert/status.js +14 -0
  19. package/dist/errors.d.ts +77 -0
  20. package/dist/errors.js +121 -0
  21. package/dist/fs.d.ts +35 -0
  22. package/dist/fs.js +64 -0
  23. package/dist/generate.d.ts +12 -0
  24. package/dist/generate.js +14 -0
  25. package/dist/grpc/browser.d.ts +11 -0
  26. package/dist/grpc/browser.js +9 -0
  27. package/dist/grpc/cache.d.ts +113 -0
  28. package/dist/grpc/cache.js +244 -0
  29. package/dist/grpc/call.d.ts +64 -0
  30. package/dist/grpc/call.js +72 -0
  31. package/dist/grpc/codec.d.ts +29 -0
  32. package/dist/grpc/codec.js +416 -0
  33. package/dist/grpc/command.d.ts +23 -0
  34. package/dist/grpc/command.js +91 -0
  35. package/dist/grpc/expand.d.ts +25 -0
  36. package/dist/grpc/expand.js +52 -0
  37. package/dist/grpc/framing.d.ts +28 -0
  38. package/dist/grpc/framing.js +61 -0
  39. package/dist/grpc/import.d.ts +47 -0
  40. package/dist/grpc/import.js +88 -0
  41. package/dist/grpc/model.d.ts +179 -0
  42. package/dist/grpc/model.js +91 -0
  43. package/dist/grpc/proto/describe.d.ts +92 -0
  44. package/dist/grpc/proto/describe.js +205 -0
  45. package/dist/grpc/proto/load.d.ts +35 -0
  46. package/dist/grpc/proto/load.js +112 -0
  47. package/dist/grpc/proto/sample.d.ts +21 -0
  48. package/dist/grpc/proto/sample.js +79 -0
  49. package/dist/grpc/proto/well-known.d.ts +42 -0
  50. package/dist/grpc/proto/well-known.js +143 -0
  51. package/dist/grpc/reconcile.d.ts +42 -0
  52. package/dist/grpc/reconcile.js +153 -0
  53. package/dist/grpc/reflection/client.d.ts +70 -0
  54. package/dist/grpc/reflection/client.js +197 -0
  55. package/dist/grpc/reflection/descriptors.d.ts +69 -0
  56. package/dist/grpc/reflection/descriptors.js +140 -0
  57. package/dist/grpc/reflection/proto.d.ts +33 -0
  58. package/dist/grpc/reflection/proto.js +144 -0
  59. package/dist/grpc/send.d.ts +132 -0
  60. package/dist/grpc/send.js +435 -0
  61. package/dist/grpc/shape.d.ts +29 -0
  62. package/dist/grpc/shape.js +36 -0
  63. package/dist/grpc/status.d.ts +21 -0
  64. package/dist/grpc/status.js +62 -0
  65. package/dist/grpc/target.d.ts +21 -0
  66. package/dist/grpc/target.js +66 -0
  67. package/dist/http/auth/apply.d.ts +37 -0
  68. package/dist/http/auth/apply.js +74 -0
  69. package/dist/http/auth/basic.d.ts +36 -0
  70. package/dist/http/auth/basic.js +69 -0
  71. package/dist/http/auth/md4.d.ts +13 -0
  72. package/dist/http/auth/md4.js +81 -0
  73. package/dist/http/auth/ntlm-transport.d.ts +61 -0
  74. package/dist/http/auth/ntlm-transport.js +97 -0
  75. package/dist/http/auth/ntlm.d.ts +190 -0
  76. package/dist/http/auth/ntlm.js +377 -0
  77. package/dist/http/client.d.ts +73 -0
  78. package/dist/http/client.js +403 -0
  79. package/dist/http/curl-flags.d.ts +15 -0
  80. package/dist/http/curl-flags.js +95 -0
  81. package/dist/http/curl.d.ts +94 -0
  82. package/dist/http/curl.js +245 -0
  83. package/dist/http/decompress.d.ts +7 -0
  84. package/dist/http/decompress.js +22 -0
  85. package/dist/http/errors.d.ts +22 -0
  86. package/dist/http/errors.js +144 -0
  87. package/dist/http/failed-request.d.ts +27 -0
  88. package/dist/http/failed-request.js +48 -0
  89. package/dist/http/headers.d.ts +15 -0
  90. package/dist/http/headers.js +50 -0
  91. package/dist/http/heredoc.d.ts +25 -0
  92. package/dist/http/heredoc.js +74 -0
  93. package/dist/http/proxy.d.ts +103 -0
  94. package/dist/http/proxy.js +168 -0
  95. package/dist/http/raw-capture.d.ts +23 -0
  96. package/dist/http/raw-capture.js +57 -0
  97. package/dist/http/timings.d.ts +79 -0
  98. package/dist/http/timings.js +212 -0
  99. package/dist/http/tls.d.ts +111 -0
  100. package/dist/http/tls.js +167 -0
  101. package/dist/http/types.d.ts +125 -0
  102. package/dist/http/types.js +6 -0
  103. package/dist/import-detect.d.ts +26 -0
  104. package/dist/import-detect.js +169 -0
  105. package/dist/import.d.ts +20 -0
  106. package/dist/import.js +163 -0
  107. package/dist/index.d.ts +272 -0
  108. package/dist/index.js +157 -0
  109. package/dist/json/cursor.d.ts +43 -0
  110. package/dist/json/cursor.js +168 -0
  111. package/dist/operations.d.ts +12 -0
  112. package/dist/operations.js +52 -0
  113. package/dist/project/attachments-cache.d.ts +80 -0
  114. package/dist/project/attachments-cache.js +186 -0
  115. package/dist/project/endpoints.d.ts +23 -0
  116. package/dist/project/endpoints.js +47 -0
  117. package/dist/project/environments.d.ts +68 -0
  118. package/dist/project/environments.js +124 -0
  119. package/dist/project/fs.d.ts +45 -0
  120. package/dist/project/fs.js +78 -0
  121. package/dist/project/history.d.ts +171 -0
  122. package/dist/project/history.js +179 -0
  123. package/dist/project/keystores.d.ts +24 -0
  124. package/dist/project/keystores.js +66 -0
  125. package/dist/project/load.d.ts +44 -0
  126. package/dist/project/load.js +634 -0
  127. package/dist/project/migrate.d.ts +27 -0
  128. package/dist/project/migrate.js +46 -0
  129. package/dist/project/model.d.ts +401 -0
  130. package/dist/project/model.js +126 -0
  131. package/dist/project/paths.d.ts +134 -0
  132. package/dist/project/paths.js +259 -0
  133. package/dist/project/preferences.d.ts +318 -0
  134. package/dist/project/preferences.js +239 -0
  135. package/dist/project/properties.d.ts +97 -0
  136. package/dist/project/properties.js +356 -0
  137. package/dist/project/save.d.ts +65 -0
  138. package/dist/project/save.js +295 -0
  139. package/dist/project/schema.d.ts +1329 -0
  140. package/dist/project/schema.js +737 -0
  141. package/dist/project/serialize.d.ts +42 -0
  142. package/dist/project/serialize.js +385 -0
  143. package/dist/project/wss-configs.d.ts +40 -0
  144. package/dist/project/wss-configs.js +142 -0
  145. package/dist/project/yaml.d.ts +17 -0
  146. package/dist/project/yaml.js +39 -0
  147. package/dist/redact/index.d.ts +77 -0
  148. package/dist/redact/index.js +328 -0
  149. package/dist/redact/literal.d.ts +12 -0
  150. package/dist/redact/literal.js +68 -0
  151. package/dist/rest/auth.d.ts +53 -0
  152. package/dist/rest/auth.js +80 -0
  153. package/dist/rest/body.d.ts +61 -0
  154. package/dist/rest/body.js +184 -0
  155. package/dist/rest/browser.d.ts +12 -0
  156. package/dist/rest/browser.js +11 -0
  157. package/dist/rest/cookies.d.ts +41 -0
  158. package/dist/rest/cookies.js +102 -0
  159. package/dist/rest/curl.d.ts +75 -0
  160. package/dist/rest/curl.js +417 -0
  161. package/dist/rest/expand.d.ts +35 -0
  162. package/dist/rest/expand.js +104 -0
  163. package/dist/rest/model.d.ts +247 -0
  164. package/dist/rest/model.js +118 -0
  165. package/dist/rest/oauth2.d.ts +118 -0
  166. package/dist/rest/oauth2.js +212 -0
  167. package/dist/rest/openapi/cache.d.ts +54 -0
  168. package/dist/rest/openapi/cache.js +128 -0
  169. package/dist/rest/openapi/import.d.ts +67 -0
  170. package/dist/rest/openapi/import.js +91 -0
  171. package/dist/rest/openapi/map.d.ts +102 -0
  172. package/dist/rest/openapi/map.js +477 -0
  173. package/dist/rest/openapi/model.d.ts +203 -0
  174. package/dist/rest/openapi/model.js +37 -0
  175. package/dist/rest/openapi/parse.d.ts +44 -0
  176. package/dist/rest/openapi/parse.js +1530 -0
  177. package/dist/rest/openapi/refs.d.ts +63 -0
  178. package/dist/rest/openapi/refs.js +258 -0
  179. package/dist/rest/openapi/sample.d.ts +68 -0
  180. package/dist/rest/openapi/sample.js +336 -0
  181. package/dist/rest/postman/import.d.ts +21 -0
  182. package/dist/rest/postman/import.js +47 -0
  183. package/dist/rest/postman/index.d.ts +7 -0
  184. package/dist/rest/postman/index.js +7 -0
  185. package/dist/rest/postman/map.d.ts +28 -0
  186. package/dist/rest/postman/map.js +427 -0
  187. package/dist/rest/postman/model.d.ts +118 -0
  188. package/dist/rest/postman/model.js +7 -0
  189. package/dist/rest/postman/parse.d.ts +29 -0
  190. package/dist/rest/postman/parse.js +518 -0
  191. package/dist/rest/response.d.ts +72 -0
  192. package/dist/rest/response.js +221 -0
  193. package/dist/rest/send.d.ts +102 -0
  194. package/dist/rest/send.js +148 -0
  195. package/dist/rest/url.d.ts +92 -0
  196. package/dist/rest/url.js +213 -0
  197. package/dist/run/effective-auth.d.ts +10 -0
  198. package/dist/run/effective-auth.js +19 -0
  199. package/dist/run/index.d.ts +8 -0
  200. package/dist/run/index.js +4 -0
  201. package/dist/run/prepare.d.ts +43 -0
  202. package/dist/run/prepare.js +280 -0
  203. package/dist/run/run.d.ts +53 -0
  204. package/dist/run/run.js +223 -0
  205. package/dist/run/secret-needs.d.ts +13 -0
  206. package/dist/run/secret-needs.js +125 -0
  207. package/dist/run/select.d.ts +34 -0
  208. package/dist/run/select.js +76 -0
  209. package/dist/secrets/env-names.d.ts +27 -0
  210. package/dist/secrets/env-names.js +40 -0
  211. package/dist/secrets/resolve.d.ts +58 -0
  212. package/dist/secrets/resolve.js +136 -0
  213. package/dist/send-options.d.ts +141 -0
  214. package/dist/send-options.js +228 -0
  215. package/dist/send.d.ts +53 -0
  216. package/dist/send.js +210 -0
  217. package/dist/soap/body-builder.d.ts +38 -0
  218. package/dist/soap/body-builder.js +250 -0
  219. package/dist/soap/build-problems.d.ts +12 -0
  220. package/dist/soap/build-problems.js +2 -0
  221. package/dist/soap/charset.d.ts +23 -0
  222. package/dist/soap/charset.js +47 -0
  223. package/dist/soap/envelope.d.ts +44 -0
  224. package/dist/soap/envelope.js +76 -0
  225. package/dist/soap/fault.d.ts +46 -0
  226. package/dist/soap/fault.js +129 -0
  227. package/dist/soap/form-request.d.ts +34 -0
  228. package/dist/soap/form-request.js +251 -0
  229. package/dist/soap/legacy-project/definition-fetcher.d.ts +21 -0
  230. package/dist/soap/legacy-project/definition-fetcher.js +43 -0
  231. package/dist/soap/legacy-project/format.d.ts +18 -0
  232. package/dist/soap/legacy-project/format.js +24 -0
  233. package/dist/soap/legacy-project/import.d.ts +21 -0
  234. package/dist/soap/legacy-project/import.js +46 -0
  235. package/dist/soap/legacy-project/index.d.ts +9 -0
  236. package/dist/soap/legacy-project/index.js +5 -0
  237. package/dist/soap/legacy-project/map.d.ts +91 -0
  238. package/dist/soap/legacy-project/map.js +290 -0
  239. package/dist/soap/legacy-project/model.d.ts +98 -0
  240. package/dist/soap/legacy-project/model.js +5 -0
  241. package/dist/soap/legacy-project/parse.d.ts +16 -0
  242. package/dist/soap/legacy-project/parse.js +325 -0
  243. package/dist/soap/mime/cid-scan.d.ts +36 -0
  244. package/dist/soap/mime/cid-scan.js +52 -0
  245. package/dist/soap/mime/inline-files.d.ts +39 -0
  246. package/dist/soap/mime/inline-files.js +71 -0
  247. package/dist/soap/mime/mtom.d.ts +74 -0
  248. package/dist/soap/mime/mtom.js +134 -0
  249. package/dist/soap/mime/multipart.d.ts +66 -0
  250. package/dist/soap/mime/multipart.js +329 -0
  251. package/dist/soap/mime/send-pipeline.d.ts +61 -0
  252. package/dist/soap/mime/send-pipeline.js +145 -0
  253. package/dist/soap/mime/swa.d.ts +45 -0
  254. package/dist/soap/mime/swa.js +62 -0
  255. package/dist/soap/mime/types.d.ts +69 -0
  256. package/dist/soap/mime/types.js +10 -0
  257. package/dist/soap/namespace-scope.d.ts +32 -0
  258. package/dist/soap/namespace-scope.js +85 -0
  259. package/dist/soap/prefixes.d.ts +24 -0
  260. package/dist/soap/prefixes.js +70 -0
  261. package/dist/soap/recreate.d.ts +28 -0
  262. package/dist/soap/recreate.js +168 -0
  263. package/dist/soap/request-builder.d.ts +63 -0
  264. package/dist/soap/request-builder.js +161 -0
  265. package/dist/soap/response-parser.d.ts +29 -0
  266. package/dist/soap/response-parser.js +71 -0
  267. package/dist/soap/soap-action.d.ts +31 -0
  268. package/dist/soap/soap-action.js +28 -0
  269. package/dist/soap/transforms.d.ts +52 -0
  270. package/dist/soap/transforms.js +164 -0
  271. package/dist/types.d.ts +307 -0
  272. package/dist/types.js +6 -0
  273. package/dist/validate/index.d.ts +61 -0
  274. package/dist/validate/index.js +72 -0
  275. package/dist/validate/schema-file-set.d.ts +51 -0
  276. package/dist/validate/schema-file-set.js +288 -0
  277. package/dist/validate/schema-validator.d.ts +53 -0
  278. package/dist/validate/schema-validator.js +251 -0
  279. package/dist/validate/soap-structure.d.ts +34 -0
  280. package/dist/validate/soap-structure.js +255 -0
  281. package/dist/validate/types.d.ts +47 -0
  282. package/dist/validate/types.js +8 -0
  283. package/dist/validate/wsi/assertions/helpers.d.ts +145 -0
  284. package/dist/validate/wsi/assertions/helpers.js +387 -0
  285. package/dist/validate/wsi/assertions/index.d.ts +44 -0
  286. package/dist/validate/wsi/assertions/index.js +77 -0
  287. package/dist/validate/wsi/assertions/message/helpers.d.ts +63 -0
  288. package/dist/validate/wsi/assertions/message/helpers.js +168 -0
  289. package/dist/validate/wsi/assertions/message/index.d.ts +39 -0
  290. package/dist/validate/wsi/assertions/message/index.js +62 -0
  291. package/dist/validate/wsi/assertions/message/r1001.d.ts +10 -0
  292. package/dist/validate/wsi/assertions/message/r1001.js +38 -0
  293. package/dist/validate/wsi/assertions/message/r1003.d.ts +14 -0
  294. package/dist/validate/wsi/assertions/message/r1003.js +45 -0
  295. package/dist/validate/wsi/assertions/message/r1005.d.ts +12 -0
  296. package/dist/validate/wsi/assertions/message/r1005.js +37 -0
  297. package/dist/validate/wsi/assertions/message/r1006.d.ts +10 -0
  298. package/dist/validate/wsi/assertions/message/r1006.js +49 -0
  299. package/dist/validate/wsi/assertions/message/r1007.d.ts +10 -0
  300. package/dist/validate/wsi/assertions/message/r1007.js +30 -0
  301. package/dist/validate/wsi/assertions/message/r1011.d.ts +10 -0
  302. package/dist/validate/wsi/assertions/message/r1011.js +33 -0
  303. package/dist/validate/wsi/assertions/message/r1012.d.ts +13 -0
  304. package/dist/validate/wsi/assertions/message/r1012.js +37 -0
  305. package/dist/validate/wsi/assertions/message/r1013.d.ts +9 -0
  306. package/dist/validate/wsi/assertions/message/r1013.js +42 -0
  307. package/dist/validate/wsi/assertions/message/r1014.d.ts +10 -0
  308. package/dist/validate/wsi/assertions/message/r1014.js +30 -0
  309. package/dist/validate/wsi/assertions/message/r1015.d.ts +12 -0
  310. package/dist/validate/wsi/assertions/message/r1015.js +36 -0
  311. package/dist/validate/wsi/assertions/message/r1017.d.ts +10 -0
  312. package/dist/validate/wsi/assertions/message/r1017.js +30 -0
  313. package/dist/validate/wsi/assertions/message/r1100.d.ts +10 -0
  314. package/dist/validate/wsi/assertions/message/r1100.js +39 -0
  315. package/dist/validate/wsi/assertions/message/r1101.d.ts +10 -0
  316. package/dist/validate/wsi/assertions/message/r1101.js +37 -0
  317. package/dist/validate/wsi/assertions/message/r1102.d.ts +10 -0
  318. package/dist/validate/wsi/assertions/message/r1102.js +41 -0
  319. package/dist/validate/wsi/assertions/message/r1103.d.ts +10 -0
  320. package/dist/validate/wsi/assertions/message/r1103.js +28 -0
  321. package/dist/validate/wsi/assertions/message/r1107.d.ts +10 -0
  322. package/dist/validate/wsi/assertions/message/r1107.js +38 -0
  323. package/dist/validate/wsi/assertions/message/r1109.d.ts +10 -0
  324. package/dist/validate/wsi/assertions/message/r1109.js +32 -0
  325. package/dist/validate/wsi/assertions/message/r1124.d.ts +10 -0
  326. package/dist/validate/wsi/assertions/message/r1124.js +31 -0
  327. package/dist/validate/wsi/assertions/message/r1132.d.ts +9 -0
  328. package/dist/validate/wsi/assertions/message/r1132.js +23 -0
  329. package/dist/validate/wsi/assertions/message/r1140.d.ts +10 -0
  330. package/dist/validate/wsi/assertions/message/r1140.js +42 -0
  331. package/dist/validate/wsi/assertions/message/r1141.d.ts +10 -0
  332. package/dist/validate/wsi/assertions/message/r1141.js +32 -0
  333. package/dist/validate/wsi/assertions/message/r2113.d.ts +11 -0
  334. package/dist/validate/wsi/assertions/message/r2113.js +33 -0
  335. package/dist/validate/wsi/assertions/message/r2211.d.ts +7 -0
  336. package/dist/validate/wsi/assertions/message/r2211.js +42 -0
  337. package/dist/validate/wsi/assertions/r2001.d.ts +15 -0
  338. package/dist/validate/wsi/assertions/r2001.js +47 -0
  339. package/dist/validate/wsi/assertions/r2002.d.ts +11 -0
  340. package/dist/validate/wsi/assertions/r2002.js +38 -0
  341. package/dist/validate/wsi/assertions/r2003.d.ts +7 -0
  342. package/dist/validate/wsi/assertions/r2003.js +32 -0
  343. package/dist/validate/wsi/assertions/r2005.d.ts +7 -0
  344. package/dist/validate/wsi/assertions/r2005.js +40 -0
  345. package/dist/validate/wsi/assertions/r2101.d.ts +14 -0
  346. package/dist/validate/wsi/assertions/r2101.js +65 -0
  347. package/dist/validate/wsi/assertions/r2102.d.ts +10 -0
  348. package/dist/validate/wsi/assertions/r2102.js +41 -0
  349. package/dist/validate/wsi/assertions/r2105.d.ts +8 -0
  350. package/dist/validate/wsi/assertions/r2105.js +39 -0
  351. package/dist/validate/wsi/assertions/r2110.d.ts +8 -0
  352. package/dist/validate/wsi/assertions/r2110.js +38 -0
  353. package/dist/validate/wsi/assertions/r2111.d.ts +6 -0
  354. package/dist/validate/wsi/assertions/r2111.js +30 -0
  355. package/dist/validate/wsi/assertions/r2112.d.ts +7 -0
  356. package/dist/validate/wsi/assertions/r2112.js +35 -0
  357. package/dist/validate/wsi/assertions/r2201.d.ts +7 -0
  358. package/dist/validate/wsi/assertions/r2201.js +28 -0
  359. package/dist/validate/wsi/assertions/r2203.d.ts +7 -0
  360. package/dist/validate/wsi/assertions/r2203.js +30 -0
  361. package/dist/validate/wsi/assertions/r2204.d.ts +6 -0
  362. package/dist/validate/wsi/assertions/r2204.js +29 -0
  363. package/dist/validate/wsi/assertions/r2205.d.ts +8 -0
  364. package/dist/validate/wsi/assertions/r2205.js +46 -0
  365. package/dist/validate/wsi/assertions/r2206.d.ts +7 -0
  366. package/dist/validate/wsi/assertions/r2206.js +36 -0
  367. package/dist/validate/wsi/assertions/r2209.d.ts +12 -0
  368. package/dist/validate/wsi/assertions/r2209.js +37 -0
  369. package/dist/validate/wsi/assertions/r2210.d.ts +7 -0
  370. package/dist/validate/wsi/assertions/r2210.js +30 -0
  371. package/dist/validate/wsi/assertions/r2303.d.ts +7 -0
  372. package/dist/validate/wsi/assertions/r2303.js +44 -0
  373. package/dist/validate/wsi/assertions/r2304.d.ts +6 -0
  374. package/dist/validate/wsi/assertions/r2304.js +32 -0
  375. package/dist/validate/wsi/assertions/r2401.d.ts +12 -0
  376. package/dist/validate/wsi/assertions/r2401.js +31 -0
  377. package/dist/validate/wsi/assertions/r2701.d.ts +7 -0
  378. package/dist/validate/wsi/assertions/r2701.js +28 -0
  379. package/dist/validate/wsi/assertions/r2702.d.ts +6 -0
  380. package/dist/validate/wsi/assertions/r2702.js +26 -0
  381. package/dist/validate/wsi/assertions/r2705.d.ts +11 -0
  382. package/dist/validate/wsi/assertions/r2705.js +31 -0
  383. package/dist/validate/wsi/assertions/r2706.d.ts +7 -0
  384. package/dist/validate/wsi/assertions/r2706.js +29 -0
  385. package/dist/validate/wsi/assertions/r2710.d.ts +13 -0
  386. package/dist/validate/wsi/assertions/r2710.js +37 -0
  387. package/dist/validate/wsi/assertions/r2716.d.ts +7 -0
  388. package/dist/validate/wsi/assertions/r2716.js +29 -0
  389. package/dist/validate/wsi/assertions/r2717.d.ts +9 -0
  390. package/dist/validate/wsi/assertions/r2717.js +31 -0
  391. package/dist/validate/wsi/assertions/r2718.d.ts +7 -0
  392. package/dist/validate/wsi/assertions/r2718.js +41 -0
  393. package/dist/validate/wsi/assertions/r2720.d.ts +7 -0
  394. package/dist/validate/wsi/assertions/r2720.js +29 -0
  395. package/dist/validate/wsi/assertions/r2721.d.ts +6 -0
  396. package/dist/validate/wsi/assertions/r2721.js +27 -0
  397. package/dist/validate/wsi/assertions/r2722.d.ts +6 -0
  398. package/dist/validate/wsi/assertions/r2722.js +29 -0
  399. package/dist/validate/wsi/assertions/r2801.d.ts +7 -0
  400. package/dist/validate/wsi/assertions/r2801.js +39 -0
  401. package/dist/validate/wsi/assertions/r2803.d.ts +7 -0
  402. package/dist/validate/wsi/assertions/r2803.js +29 -0
  403. package/dist/validate/wsi/docs.d.ts +29 -0
  404. package/dist/validate/wsi/docs.js +167 -0
  405. package/dist/validate/wsi/index.d.ts +16 -0
  406. package/dist/validate/wsi/index.js +11 -0
  407. package/dist/validate/wsi/report-html.d.ts +36 -0
  408. package/dist/validate/wsi/report-html.js +135 -0
  409. package/dist/validate/wsi/run-message.d.ts +50 -0
  410. package/dist/validate/wsi/run-message.js +190 -0
  411. package/dist/validate/wsi/run-wsdl.d.ts +48 -0
  412. package/dist/validate/wsi/run-wsdl.js +99 -0
  413. package/dist/validate/wsi/types.d.ts +173 -0
  414. package/dist/validate/wsi/types.js +17 -0
  415. package/dist/workspace/commit-message.d.ts +47 -0
  416. package/dist/workspace/commit-message.js +195 -0
  417. package/dist/workspace/environments.d.ts +79 -0
  418. package/dist/workspace/environments.js +115 -0
  419. package/dist/workspace/index.d.ts +28 -0
  420. package/dist/workspace/index.js +19 -0
  421. package/dist/workspace/load.d.ts +45 -0
  422. package/dist/workspace/load.js +155 -0
  423. package/dist/workspace/local-state.d.ts +37 -0
  424. package/dist/workspace/local-state.js +59 -0
  425. package/dist/workspace/migrate.d.ts +38 -0
  426. package/dist/workspace/migrate.js +50 -0
  427. package/dist/workspace/model.d.ts +86 -0
  428. package/dist/workspace/model.js +54 -0
  429. package/dist/workspace/paths.d.ts +64 -0
  430. package/dist/workspace/paths.js +97 -0
  431. package/dist/workspace/reidentify.d.ts +22 -0
  432. package/dist/workspace/reidentify.js +122 -0
  433. package/dist/workspace/save.d.ts +31 -0
  434. package/dist/workspace/save.js +84 -0
  435. package/dist/workspace/schema.d.ts +93 -0
  436. package/dist/workspace/schema.js +115 -0
  437. package/dist/workspace/serialize.d.ts +24 -0
  438. package/dist/workspace/serialize.js +60 -0
  439. package/dist/workspace/share.d.ts +52 -0
  440. package/dist/workspace/share.js +89 -0
  441. package/dist/ws/browser.d.ts +13 -0
  442. package/dist/ws/browser.js +11 -0
  443. package/dist/ws/call.d.ts +53 -0
  444. package/dist/ws/call.js +106 -0
  445. package/dist/ws/command.d.ts +19 -0
  446. package/dist/ws/command.js +28 -0
  447. package/dist/ws/expand.d.ts +38 -0
  448. package/dist/ws/expand.js +76 -0
  449. package/dist/ws/model.d.ts +191 -0
  450. package/dist/ws/model.js +83 -0
  451. package/dist/ws/pretty.d.ts +12 -0
  452. package/dist/ws/pretty.js +25 -0
  453. package/dist/ws/session.d.ts +50 -0
  454. package/dist/ws/session.js +333 -0
  455. package/dist/ws/shape.d.ts +18 -0
  456. package/dist/ws/shape.js +28 -0
  457. package/dist/ws/transcript.d.ts +14 -0
  458. package/dist/ws/transcript.js +29 -0
  459. package/dist/ws/url.d.ts +3 -0
  460. package/dist/ws/url.js +44 -0
  461. package/dist/wsa/headers.d.ts +78 -0
  462. package/dist/wsa/headers.js +244 -0
  463. package/dist/wsa/model.d.ts +66 -0
  464. package/dist/wsa/model.js +52 -0
  465. package/dist/wsa/policy-detect.d.ts +81 -0
  466. package/dist/wsa/policy-detect.js +245 -0
  467. package/dist/wsdl/cache-naming.d.ts +39 -0
  468. package/dist/wsdl/cache-naming.js +90 -0
  469. package/dist/wsdl/cache.d.ts +48 -0
  470. package/dist/wsdl/cache.js +141 -0
  471. package/dist/wsdl/docs-generator.d.ts +47 -0
  472. package/dist/wsdl/docs-generator.js +439 -0
  473. package/dist/wsdl/dom-utils.d.ts +15 -0
  474. package/dist/wsdl/dom-utils.js +50 -0
  475. package/dist/wsdl/export-definition.d.ts +38 -0
  476. package/dist/wsdl/export-definition.js +100 -0
  477. package/dist/wsdl/fetch.d.ts +13 -0
  478. package/dist/wsdl/fetch.js +60 -0
  479. package/dist/wsdl/merge.d.ts +17 -0
  480. package/dist/wsdl/merge.js +57 -0
  481. package/dist/wsdl/model.d.ts +176 -0
  482. package/dist/wsdl/model.js +17 -0
  483. package/dist/wsdl/parse-binding.d.ts +6 -0
  484. package/dist/wsdl/parse-binding.js +150 -0
  485. package/dist/wsdl/parse-wsdl.d.ts +47 -0
  486. package/dist/wsdl/parse-wsdl.js +161 -0
  487. package/dist/wsdl/qname.d.ts +28 -0
  488. package/dist/wsdl/qname.js +41 -0
  489. package/dist/wsdl/ref-policy.d.ts +54 -0
  490. package/dist/wsdl/ref-policy.js +87 -0
  491. package/dist/wsdl/resolver.d.ts +81 -0
  492. package/dist/wsdl/resolver.js +276 -0
  493. package/dist/wsdl/update-definition.d.ts +106 -0
  494. package/dist/wsdl/update-definition.js +314 -0
  495. package/dist/wss/apply.d.ts +40 -0
  496. package/dist/wss/apply.js +212 -0
  497. package/dist/wss/c14n-prefixes.d.ts +27 -0
  498. package/dist/wss/c14n-prefixes.js +95 -0
  499. package/dist/wss/incoming/decrypt.d.ts +35 -0
  500. package/dist/wss/incoming/decrypt.js +57 -0
  501. package/dist/wss/incoming/index.d.ts +56 -0
  502. package/dist/wss/incoming/index.js +189 -0
  503. package/dist/wss/incoming/verify.d.ts +74 -0
  504. package/dist/wss/incoming/verify.js +440 -0
  505. package/dist/wss/key-identifiers.d.ts +76 -0
  506. package/dist/wss/key-identifiers.js +139 -0
  507. package/dist/wss/keystore/certificate.d.ts +45 -0
  508. package/dist/wss/keystore/certificate.js +134 -0
  509. package/dist/wss/keystore/index.d.ts +50 -0
  510. package/dist/wss/keystore/index.js +80 -0
  511. package/dist/wss/keystore/model.d.ts +83 -0
  512. package/dist/wss/keystore/model.js +27 -0
  513. package/dist/wss/keystore/pem.d.ts +21 -0
  514. package/dist/wss/keystore/pem.js +140 -0
  515. package/dist/wss/keystore/pkcs12.d.ts +21 -0
  516. package/dist/wss/keystore/pkcs12.js +125 -0
  517. package/dist/wss/model.d.ts +160 -0
  518. package/dist/wss/model.js +37 -0
  519. package/dist/wss/outgoing/encryption.d.ts +76 -0
  520. package/dist/wss/outgoing/encryption.js +618 -0
  521. package/dist/wss/outgoing/signature.d.ts +73 -0
  522. package/dist/wss/outgoing/signature.js +239 -0
  523. package/dist/wss/outgoing/timestamp.d.ts +29 -0
  524. package/dist/wss/outgoing/timestamp.js +39 -0
  525. package/dist/wss/outgoing/username-token.d.ts +36 -0
  526. package/dist/wss/outgoing/username-token.js +68 -0
  527. package/dist/wss/security-header.d.ts +31 -0
  528. package/dist/wss/security-header.js +83 -0
  529. package/dist/xml/index.d.ts +7 -0
  530. package/dist/xml/index.js +7 -0
  531. package/dist/xml/namespaces.d.ts +36 -0
  532. package/dist/xml/namespaces.js +60 -0
  533. package/dist/xml/parse.d.ts +79 -0
  534. package/dist/xml/parse.js +109 -0
  535. package/dist/xml/positions.d.ts +26 -0
  536. package/dist/xml/positions.js +71 -0
  537. package/dist/xml/pretty.d.ts +37 -0
  538. package/dist/xml/pretty.js +137 -0
  539. package/dist/xml/serialize.d.ts +6 -0
  540. package/dist/xml/serialize.js +8 -0
  541. package/dist/xml/tolerant-tree.d.ts +56 -0
  542. package/dist/xml/tolerant-tree.js +134 -0
  543. package/dist/xpath/evaluate-async.d.ts +31 -0
  544. package/dist/xpath/evaluate-async.js +81 -0
  545. package/dist/xpath/evaluate.d.ts +98 -0
  546. package/dist/xpath/evaluate.js +340 -0
  547. package/dist/xpath/jsonpath.d.ts +40 -0
  548. package/dist/xpath/jsonpath.js +109 -0
  549. package/dist/xpath/namespaces.d.ts +29 -0
  550. package/dist/xpath/namespaces.js +101 -0
  551. package/dist/xpath/worker.d.ts +7 -0
  552. package/dist/xpath/worker.js +26 -0
  553. package/dist/xsd/builtins.d.ts +36 -0
  554. package/dist/xsd/builtins.js +108 -0
  555. package/dist/xsd/check-references.d.ts +25 -0
  556. package/dist/xsd/check-references.js +145 -0
  557. package/dist/xsd/form-edits.d.ts +57 -0
  558. package/dist/xsd/form-edits.js +153 -0
  559. package/dist/xsd/form-model.d.ts +153 -0
  560. package/dist/xsd/form-model.js +691 -0
  561. package/dist/xsd/locate.d.ts +42 -0
  562. package/dist/xsd/locate.js +249 -0
  563. package/dist/xsd/model.d.ts +249 -0
  564. package/dist/xsd/model.js +1 -0
  565. package/dist/xsd/parse-particles.d.ts +48 -0
  566. package/dist/xsd/parse-particles.js +320 -0
  567. package/dist/xsd/parse-schema.d.ts +21 -0
  568. package/dist/xsd/parse-schema.js +143 -0
  569. package/dist/xsd/resolve-content.d.ts +18 -0
  570. package/dist/xsd/resolve-content.js +242 -0
  571. package/dist/xsd/sample-generator.d.ts +51 -0
  572. package/dist/xsd/sample-generator.js +291 -0
  573. package/dist/xsd/sample-types.d.ts +21 -0
  574. package/dist/xsd/sample-types.js +69 -0
  575. package/dist/xsd/sample-values.d.ts +54 -0
  576. package/dist/xsd/sample-values.js +267 -0
  577. package/dist/xsd/schema-set.d.ts +51 -0
  578. package/dist/xsd/schema-set.js +203 -0
  579. package/dist/xsd/xml-scan.d.ts +64 -0
  580. package/dist/xsd/xml-scan.js +286 -0
  581. package/dist/xsd/xml-writer.d.ts +56 -0
  582. package/dist/xsd/xml-writer.js +103 -0
  583. package/package.json +69 -0
@@ -0,0 +1,618 @@
1
+ /**
2
+ * XML Encryption (W3C XML-Enc 1.0/1.1) for a WS-Security header, implemented directly on
3
+ * `node:crypto`.
4
+ *
5
+ * The spec-approved `xml-encryption` package was evaluated first and rejected: it does every
6
+ * algorithm this build needs, but it emits one fixed shape — an `xenc:EncryptedData` of
7
+ * `Type="…#Element"` with the `xenc:EncryptedKey` *nested inside its own `ds:KeyInfo`* — with
8
+ * no `Id`, no `Type="…#Content"`, no `xenc:ReferenceList`/`xenc:DataReference`, and no
9
+ * `wsse:SecurityTokenReference` key identifiers. WS-Security needs the opposite arrangement
10
+ * (one `EncryptedKey` in the `wsse:Security` header, referencing the `EncryptedData` blocks it
11
+ * keyed), so adopting it would mean rebuilding its output string and using only its ~40 lines
12
+ * of `node:crypto` calls. Those are written here instead, and no dependency was added.
13
+ *
14
+ * Ciphertext layout, per XML-Enc §5.2 and XML-Enc 1.1 §5.2.4: CBC is `IV(16) ‖ ciphertext`
15
+ * (PKCS#7 padded), GCM is `IV(12) ‖ ciphertext ‖ tag(16)`. Key transport is RSA-OAEP with a
16
+ * SHA-1 digest and MGF1-SHA1 (§5.4.2), or raw PKCS#1 v1.5.
17
+ *
18
+ * Unlike `signEnvelope`, this mutates `doc` in place and never re-serializes it, so elements
19
+ * the caller held stay valid — but `applyOutgoingWss` re-resolves the header anyway, because a
20
+ * *signature* entry earlier in the same configuration may already have swapped the document.
21
+ */
22
+ import { constants, createCipheriv, createDecipheriv, createPrivateKey, privateDecrypt, publicEncrypt, } from 'node:crypto';
23
+ import { ExclusiveCanonicalization } from 'xml-crypto';
24
+ import { WssError } from '../../errors.js';
25
+ import { NS } from '../../xml/namespaces.js';
26
+ import { parseXml } from '../../xml/parse.js';
27
+ import { serializeXml } from '../../xml/serialize.js';
28
+ import { detectEnvelopeVersion, envelopeNamespace } from '../../soap/envelope.js';
29
+ import { buildKeyIdentifier, certificateBase64, issuerDnRfc2253, pkiPathBase64, serialNumberDecimal, subjectKeyIdentifierBase64, thumbprintSha1Base64, WSS_TOKEN_TYPES, } from '../key-identifiers.js';
30
+ import { childElement, findElement, securityHeaders, securityIndex } from '../security-header.js';
31
+ import { inclusiveNamespacePrefixList } from '../c14n-prefixes.js';
32
+ /** The namespace `xmlns:*` declarations themselves live in. */
33
+ const XMLNS_NS = 'http://www.w3.org/2000/xmlns/';
34
+ /** The XML Encryption 1.1 namespace, where the GCM algorithm identifiers live. */
35
+ const XENC11 = 'http://www.w3.org/2009/xmlenc11#';
36
+ /** `xenc:EncryptedData` `Type` values. */
37
+ const ENCRYPTED_CONTENT_TYPE = `${NS.XENC}Content`;
38
+ const ENCRYPTED_ELEMENT_TYPE = `${NS.XENC}Element`;
39
+ const SYMMETRIC_SPECS = {
40
+ 'aes128-cbc': { uri: `${NS.XENC}aes128-cbc`, cipher: 'aes-128-cbc', keyBytes: 16, ivBytes: 16, gcm: false },
41
+ 'aes256-cbc': { uri: `${NS.XENC}aes256-cbc`, cipher: 'aes-256-cbc', keyBytes: 32, ivBytes: 16, gcm: false },
42
+ 'aes128-gcm': { uri: `${XENC11}aes128-gcm`, cipher: 'aes-128-gcm', keyBytes: 16, ivBytes: 12, gcm: true },
43
+ 'aes256-gcm': { uri: `${XENC11}aes256-gcm`, cipher: 'aes-256-gcm', keyBytes: 32, ivBytes: 12, gcm: true },
44
+ };
45
+ /** The same table by URI, for the decrypt direction. */
46
+ const SYMMETRIC_BY_URI = new Map(Object.values(SYMMETRIC_SPECS).map((spec) => [spec.uri, spec]));
47
+ /** `xenc:EncryptionMethod` URIs for the key transport algorithms. */
48
+ const KEY_TRANSPORT_URIS = {
49
+ 'rsa-oaep': `${NS.XENC}rsa-oaep-mgf1p`,
50
+ 'rsa-1_5': `${NS.XENC}rsa-1_5`,
51
+ };
52
+ /**
53
+ * `ds:DigestMethod` URIs, mapped onto the Node hash name RSA-OAEP takes. SHA-1 is the default
54
+ * `#rsa-oaep-mgf1p` implies; the other two are what an XML-Enc 1.1 `#rsa-oaep` typically names.
55
+ */
56
+ const OAEP_DIGESTS = {
57
+ [`${NS.DS}sha1`]: 'sha1',
58
+ [`${NS.XENC}sha256`]: 'sha256',
59
+ [`${NS.XENC}sha512`]: 'sha512',
60
+ };
61
+ /** `xenc11:MGF` URIs, mapped onto the hash MGF1 runs on. */
62
+ const MGF_DIGESTS = {
63
+ [`${XENC11}mgf1sha1`]: 'sha1',
64
+ [`${XENC11}mgf1sha256`]: 'sha256',
65
+ [`${XENC11}mgf1sha512`]: 'sha512',
66
+ };
67
+ /** The GCM authentication tag length, in bytes (XML-Enc 1.1 fixes it at 128 bits). */
68
+ const GCM_TAG_BYTES = 16;
69
+ /**
70
+ * The element a part names. The two SOAP envelope namespaces are treated as one, so a part
71
+ * storing the SOAP 1.1 `Body` namespace also matches a SOAP 1.2 envelope — the same rule
72
+ * `signEnvelope` applies.
73
+ */
74
+ function resolvePart(root, part, envelopeNs) {
75
+ const namespace = part.namespace === NS.SOAP11_ENV || part.namespace === NS.SOAP12_ENV ? envelopeNs : part.namespace;
76
+ return findElement(root, namespace, part.name);
77
+ }
78
+ /**
79
+ * Exclusive canonical form of one node, with an empty prefix scope — so every namespace the
80
+ * node's subtree visibly uses is declared *inside* the plaintext and a decryptor gets a
81
+ * self-contained, well-formed fragment rather than one that dangles on the envelope's
82
+ * declarations.
83
+ */
84
+ function canonicalize(node) {
85
+ const c14n = new ExclusiveCanonicalization();
86
+ if (node.nodeType !== 1) {
87
+ // `processInner` is the per-node entry point `process` itself calls; it is used directly
88
+ // because `Content` encryption has to canonicalize a *list* of children, not one element.
89
+ return c14n.processInner(node, [], '', {}, []);
90
+ }
91
+ const element_ = node;
92
+ // Prefixes the subtree uses only inside QName attribute values or text are invisible to
93
+ // exclusive c14n's "visible utilization" rule, so they are listed explicitly. The envelope
94
+ // prefix is deliberately *not* listed: unlike a signature reference, the plaintext is put
95
+ // back exactly where it came from, so it never has to stand alone inside the envelope.
96
+ const prefixes = inclusiveNamespacePrefixList(element_, null);
97
+ // The declarations themselves come from the ancestors the fragment is about to lose, so they
98
+ // are written onto a *copy* — the same move `ExclusiveCanonicalization.process` makes, minus
99
+ // the mutation of the live document.
100
+ const copy = element_.cloneNode(true);
101
+ for (const prefix of prefixes) {
102
+ const namespace = element_.lookupNamespaceURI(prefix);
103
+ if (namespace !== null) {
104
+ copy.setAttributeNS(XMLNS_NS, `xmlns:${prefix}`, namespace);
105
+ }
106
+ }
107
+ return c14n.processInner(copy, [], '', {}, prefixes);
108
+ }
109
+ /** The plaintext one part contributes: its children for `Content`, the element itself for `Element`. */
110
+ function plaintextOf(element, encode) {
111
+ if (encode === 'Element') {
112
+ return canonicalize(element);
113
+ }
114
+ let text = '';
115
+ for (let child = element.firstChild; child !== null; child = child.nextSibling) {
116
+ text += canonicalize(child);
117
+ }
118
+ return text;
119
+ }
120
+ /** Encrypts `plaintext` under `key`, producing the `CipherValue` bytes XML-Enc prescribes. */
121
+ function encryptData(spec, key, iv, plaintext) {
122
+ if (spec.gcm) {
123
+ const cipher = createCipheriv(spec.cipher, key, iv, { authTagLength: GCM_TAG_BYTES });
124
+ const body = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
125
+ return Buffer.concat([iv, body, cipher.getAuthTag()]);
126
+ }
127
+ const cipher = createCipheriv(spec.cipher, key, iv);
128
+ return Buffer.concat([iv, cipher.update(plaintext, 'utf8'), cipher.final()]);
129
+ }
130
+ /** The inverse of {@link encryptData}; throws whatever OpenSSL throws, for the caller to wrap. */
131
+ function decryptData(spec, key, cipherValue) {
132
+ const iv = cipherValue.subarray(0, spec.ivBytes);
133
+ if (spec.gcm) {
134
+ const tagAt = cipherValue.length - GCM_TAG_BYTES;
135
+ const decipher = createDecipheriv(spec.cipher, key, iv, { authTagLength: GCM_TAG_BYTES });
136
+ decipher.setAuthTag(cipherValue.subarray(tagAt));
137
+ return Buffer.concat([decipher.update(cipherValue.subarray(spec.ivBytes, tagAt)), decipher.final()]).toString('utf8');
138
+ }
139
+ const decipher = createDecipheriv(spec.cipher, key, iv);
140
+ // XML-Enc §5.2.2 pads with `n - 1` *arbitrary* bytes followed by the length byte `n`, so the
141
+ // non-final pad bytes carry no value to check and strict PKCS#7 would reject conformant
142
+ // ciphertext. OpenSSL's automatic unpadding is turned off and only the last byte is read.
143
+ decipher.setAutoPadding(false);
144
+ const padded = Buffer.concat([decipher.update(cipherValue.subarray(spec.ivBytes)), decipher.final()]);
145
+ const padLength = padded.at(-1);
146
+ if (padLength === undefined || padLength < 1 || padLength > spec.ivBytes || padLength > padded.length) {
147
+ throw new Error(`The CBC padding length byte is ${String(padLength)}, which cannot be right.`);
148
+ }
149
+ return padded.subarray(0, padded.length - padLength).toString('utf8');
150
+ }
151
+ /** Wraps the symmetric key for the recipient's public key. */
152
+ function wrapKey(algorithm, certPem, key) {
153
+ if (algorithm === 'rsa-1_5') {
154
+ return publicEncrypt({ key: certPem, padding: constants.RSA_PKCS1_PADDING }, key);
155
+ }
156
+ // SHA-1 digest with MGF1-SHA1 is what `#rsa-oaep-mgf1p` means, and what every WS-Security
157
+ // stack in the field interoperates on; Node derives MGF1's hash from `oaepHash`.
158
+ return publicEncrypt({ key: certPem, padding: constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha1' }, key);
159
+ }
160
+ /** Creates an element in `namespace` with `qualifiedName`, appending `children` in order. */
161
+ function element(doc, namespace, qualifiedName, children = []) {
162
+ const created = doc.createElementNS(namespace, qualifiedName);
163
+ for (const child of children) {
164
+ created.appendChild(child);
165
+ }
166
+ return created;
167
+ }
168
+ /**
169
+ * Parses an XML *string* (the key-identifier builders emit strings) into `doc`. A string that
170
+ * yields no document element is a bug in this build, not a configuration problem, so it fails
171
+ * loudly rather than quietly producing an empty `ds:KeyInfo` no recipient could use.
172
+ *
173
+ * @throws WssError `wss-internal`
174
+ */
175
+ function importXml(doc, xml) {
176
+ const parsed = parseXml(xml, { location: 'envelope' }).documentElement;
177
+ if (parsed === null) {
178
+ throw new WssError('wss-internal', 'A WS-Security key identifier could not be built.');
179
+ }
180
+ return doc.importNode(parsed, true);
181
+ }
182
+ /** The `ds:KeyInfo` an `xenc:EncryptedData` carries: an STR to the `xenc:EncryptedKey`. */
183
+ function dataKeyInfo(doc, keyId) {
184
+ const keyInfo = element(doc, NS.DS, 'ds:KeyInfo');
185
+ const str = element(doc, NS.WSSE, 'wsse:SecurityTokenReference');
186
+ const reference = element(doc, NS.WSSE, 'wsse:Reference');
187
+ reference.setAttribute('URI', `#${keyId}`);
188
+ str.appendChild(reference);
189
+ keyInfo.appendChild(str);
190
+ return keyInfo;
191
+ }
192
+ /** Builds the `<xenc:EncryptedData>` for one encrypted part. */
193
+ function encryptedData(doc, spec, id, keyId, encode, cipherValue) {
194
+ const data = element(doc, NS.XENC, 'xenc:EncryptedData');
195
+ data.setAttribute('Id', id);
196
+ data.setAttribute('Type', encode === 'Element' ? ENCRYPTED_ELEMENT_TYPE : ENCRYPTED_CONTENT_TYPE);
197
+ const method = element(doc, NS.XENC, 'xenc:EncryptionMethod');
198
+ method.setAttribute('Algorithm', spec.uri);
199
+ data.appendChild(method);
200
+ data.appendChild(dataKeyInfo(doc, keyId));
201
+ const value = element(doc, NS.XENC, 'xenc:CipherValue');
202
+ value.appendChild(doc.createTextNode(cipherValue.toString('base64')));
203
+ data.appendChild(element(doc, NS.XENC, 'xenc:CipherData', [value]));
204
+ return data;
205
+ }
206
+ /** An existing `wsse:BinarySecurityToken` in `security` that carries a `wsu:Id`. */
207
+ function existingBinarySecurityToken(security) {
208
+ for (let node = security.firstChild; node !== null; node = node.nextSibling) {
209
+ const candidate = node;
210
+ if (candidate.nodeType === 1 &&
211
+ candidate.namespaceURI === NS.WSSE &&
212
+ candidate.localName === 'BinarySecurityToken') {
213
+ const id = candidate.getAttributeNS(NS.WSU, 'Id');
214
+ if (id !== null && id !== '') {
215
+ return id;
216
+ }
217
+ }
218
+ }
219
+ return undefined;
220
+ }
221
+ /**
222
+ * Encrypts the parts `entry` names and, when `entry.encryptSymmetricKey`, appends one
223
+ * `<xenc:EncryptedKey>` to the `wsse:Security` block addressed to `resolved.actor`.
224
+ *
225
+ * The `EncryptedKey` is *appended*, so its position in the header matches the entry's position
226
+ * in the configuration: `[encryption, signature]` puts it before the `ds:Signature` (which
227
+ * therefore covers it), `[signature, encryption]` puts it after.
228
+ *
229
+ * @param doc the envelope, already carrying its `wsse:Security` header
230
+ * @param entry the encryption configuration
231
+ * @param resolved the keystore alias whose certificate the message is encrypted to
232
+ * @param ctx the injected entropy/uuid capabilities
233
+ * @throws WssError `wss-not-an-envelope`, `wss-part-missing`, `wss-ski-missing`
234
+ */
235
+ export function encryptEnvelope(doc, entry, resolved, ctx) {
236
+ const root = doc.documentElement;
237
+ const version = detectEnvelopeVersion(doc);
238
+ if (root === null || version === undefined) {
239
+ throw new WssError('wss-not-an-envelope', 'WS-Security can only be applied to a SOAP envelope.');
240
+ }
241
+ const envelopeNs = envelopeNamespace(version);
242
+ const header = childElement(root, envelopeNs, 'Header');
243
+ if (header === undefined) {
244
+ throw new WssError('wss-security-missing', 'The envelope has no wsse:Security header to encrypt into.');
245
+ }
246
+ // The same block `signEnvelope` would sign into: `securityIndex` counts direct `wsse:Security`
247
+ // children of the header and throws when none is addressed to this actor/role, so an entry
248
+ // configured for an actor never silently lands in the ultimate receiver's block.
249
+ const security = securityHeaders(header)[securityIndex(header, version, resolved.actor) - 1];
250
+ if (security === undefined) {
251
+ throw new WssError('wss-security-missing', 'The envelope has no wsse:Security header to encrypt into.');
252
+ }
253
+ if (!entry.encryptSymmetricKey) {
254
+ // The symmetric key is generated here and never transmitted, so nothing could open the
255
+ // message. Refusing is honest; emitting an undecryptable envelope is not.
256
+ throw new WssError('wss-entry-unsupported', 'Out-of-band symmetric keys are not supported yet: the symmetric key must be encrypted.');
257
+ }
258
+ const spec = SYMMETRIC_SPECS[entry.symmetricAlgorithm];
259
+ const key = Buffer.from(ctx.nonce(spec.keyBytes));
260
+ const keyId = `EK-${ctx.uuid()}`;
261
+ // Every part is resolved (and so every `wss-part-missing` raised) before anything is
262
+ // replaced, so a misconfigured entry never leaves the envelope half-encrypted.
263
+ const targets = [];
264
+ for (const part of entry.parts) {
265
+ const target = resolvePart(root, part, envelopeNs);
266
+ if (target === undefined) {
267
+ throw new WssError('wss-part-missing', `The message has no "${part.name}" element to encrypt.`, {
268
+ details: { name: part.name, namespace: part.namespace },
269
+ });
270
+ }
271
+ targets.push({ element: target, part });
272
+ }
273
+ const dataIds = [];
274
+ for (const { element: target, part } of targets) {
275
+ const plaintext = plaintextOf(target, part.encode);
276
+ const iv = Buffer.from(ctx.nonce(spec.ivBytes));
277
+ const id = `ED-${ctx.uuid()}`;
278
+ dataIds.push(id);
279
+ const data = encryptedData(doc, spec, id, keyId, part.encode, encryptData(spec, key, iv, plaintext));
280
+ if (part.encode === 'Element') {
281
+ target.parentNode?.replaceChild(data, target);
282
+ }
283
+ else {
284
+ while (target.firstChild !== null) {
285
+ target.removeChild(target.firstChild);
286
+ }
287
+ target.appendChild(data);
288
+ }
289
+ }
290
+ const tokenId = `X509-${ctx.uuid()}`;
291
+ const keyIdentifier = buildKeyIdentifier(entry.keyIdentifierType, {
292
+ certPem: resolved.alias.certPem,
293
+ chainPem: resolved.alias.chainPem,
294
+ useSingleCertificate: true,
295
+ tokenId,
296
+ });
297
+ let keyInfoXml = keyIdentifier.keyInfoXml;
298
+ if (keyIdentifier.binarySecurityTokenXml !== undefined) {
299
+ const reuse = entry.embedKey ? undefined : existingBinarySecurityToken(security);
300
+ if (reuse === undefined) {
301
+ // Nothing to point at (no BST is in the header yet), so the certificate is embedded
302
+ // anyway rather than emitting a reference that resolves to nothing.
303
+ security.appendChild(importXml(doc, keyIdentifier.binarySecurityTokenXml));
304
+ }
305
+ else {
306
+ keyInfoXml = keyIdentifier.keyInfoXml.replace(`URI="#${tokenId}"`, `URI="#${reuse}"`);
307
+ }
308
+ }
309
+ const encryptedKey = element(doc, NS.XENC, 'xenc:EncryptedKey');
310
+ encryptedKey.setAttribute('Id', keyId);
311
+ const method = element(doc, NS.XENC, 'xenc:EncryptionMethod');
312
+ method.setAttribute('Algorithm', KEY_TRANSPORT_URIS[entry.keyTransportAlgorithm]);
313
+ if (entry.keyTransportAlgorithm === 'rsa-oaep') {
314
+ const digest = element(doc, NS.DS, 'ds:DigestMethod');
315
+ digest.setAttribute('Algorithm', `${NS.DS}sha1`);
316
+ method.appendChild(digest);
317
+ }
318
+ encryptedKey.appendChild(method);
319
+ const keyInfo = element(doc, NS.DS, 'ds:KeyInfo');
320
+ keyInfo.appendChild(importXml(doc, keyInfoXml));
321
+ encryptedKey.appendChild(keyInfo);
322
+ const cipherValue = element(doc, NS.XENC, 'xenc:CipherValue');
323
+ cipherValue.appendChild(doc.createTextNode(wrapKey(entry.keyTransportAlgorithm, resolved.alias.certPem, key).toString('base64')));
324
+ encryptedKey.appendChild(element(doc, NS.XENC, 'xenc:CipherData', [cipherValue]));
325
+ const referenceList = element(doc, NS.XENC, 'xenc:ReferenceList');
326
+ for (const id of dataIds) {
327
+ const reference = element(doc, NS.XENC, 'xenc:DataReference');
328
+ reference.setAttribute('URI', `#${id}`);
329
+ referenceList.appendChild(reference);
330
+ }
331
+ encryptedKey.appendChild(referenceList);
332
+ security.appendChild(encryptedKey);
333
+ }
334
+ /** Every descendant-or-self of `root` in `namespace` with local name `localName`, in document order. */
335
+ function findAll(root, namespace, localName) {
336
+ const found = [];
337
+ const walk = (node) => {
338
+ if (node.namespaceURI === namespace && node.localName === localName) {
339
+ found.push(node);
340
+ }
341
+ for (let child = node.firstChild; child !== null; child = child.nextSibling) {
342
+ if (child.nodeType === 1) {
343
+ walk(child);
344
+ }
345
+ }
346
+ };
347
+ walk(root);
348
+ return found;
349
+ }
350
+ /** The element under `root` whose `Id` (in any namespace, or none) is `id`. */
351
+ function elementById(root, id) {
352
+ const walk = (node) => {
353
+ const attributes = node.attributes;
354
+ for (let i = 0; i < attributes.length; i += 1) {
355
+ const attribute = attributes.item(i);
356
+ if (attribute !== null && attribute.localName === 'Id' && attribute.value === id) {
357
+ return node;
358
+ }
359
+ }
360
+ for (let child = node.firstChild; child !== null; child = child.nextSibling) {
361
+ if (child.nodeType === 1) {
362
+ const found = walk(child);
363
+ if (found !== undefined) {
364
+ return found;
365
+ }
366
+ }
367
+ }
368
+ return undefined;
369
+ };
370
+ return walk(root);
371
+ }
372
+ /** Base64 with every whitespace character removed, so line-wrapped PEM-ish content compares. */
373
+ function compactBase64(value) {
374
+ return value.replace(/\s+/g, '');
375
+ }
376
+ /** The text content of `element`, whitespace-compacted. */
377
+ function textOf(element) {
378
+ return element === undefined ? '' : compactBase64(element.textContent ?? '');
379
+ }
380
+ /**
381
+ * Whether the `ds:KeyInfo` of an `xenc:EncryptedKey` names `certPem`, in any of the five X.509
382
+ * token profile forms. A form whose value cannot be computed for this certificate (a missing
383
+ * Subject Key Identifier, say) simply does not match rather than throwing — the caller falls
384
+ * back to trying the decryption itself.
385
+ */
386
+ function keyInfoNamesCertificate(root, keyInfo, certPem) {
387
+ if (keyInfo === undefined) {
388
+ return false;
389
+ }
390
+ const identifier = findElement(keyInfo, NS.WSSE, 'KeyIdentifier');
391
+ if (identifier !== undefined) {
392
+ const valueType = identifier.getAttribute('ValueType') ?? '';
393
+ const value = textOf(identifier);
394
+ try {
395
+ if (valueType === WSS_TOKEN_TYPES.THUMBPRINT_SHA1) {
396
+ return value === thumbprintSha1Base64(certPem);
397
+ }
398
+ if (valueType === WSS_TOKEN_TYPES.X509_SUBJECT_KEY_IDENTIFIER) {
399
+ return value === subjectKeyIdentifierBase64(certPem);
400
+ }
401
+ return value === certificateBase64(certPem);
402
+ }
403
+ catch {
404
+ return false;
405
+ }
406
+ }
407
+ const issuerSerial = findElement(keyInfo, NS.DS, 'X509IssuerSerial');
408
+ if (issuerSerial !== undefined) {
409
+ const issuer = childElement(issuerSerial, NS.DS, 'X509IssuerName')?.textContent ?? '';
410
+ const serial = childElement(issuerSerial, NS.DS, 'X509SerialNumber')?.textContent ?? '';
411
+ return issuer.trim() === issuerDnRfc2253(certPem) && serial.trim() === serialNumberDecimal(certPem);
412
+ }
413
+ const reference = findElement(keyInfo, NS.WSSE, 'Reference');
414
+ if (reference !== undefined) {
415
+ const uri = reference.getAttribute('URI') ?? '';
416
+ const token = uri.startsWith('#') ? elementById(root, uri.slice(1)) : undefined;
417
+ const value = textOf(token);
418
+ return value === certificateBase64(certPem) || value === pkiPathBase64([certPem]);
419
+ }
420
+ return false;
421
+ }
422
+ /** The private key of `alias`, decrypted with `keyPassword` when its PEM needs one. */
423
+ function privateKeyOf(options) {
424
+ const keyPem = options.alias.keyPem;
425
+ if (keyPem === undefined || keyPem === '') {
426
+ throw new WssError('wss-decryption-key-missing', `Keystore alias "${options.alias.alias}" has no private key to decrypt with.`);
427
+ }
428
+ try {
429
+ return createPrivateKey(keyPem);
430
+ }
431
+ catch (cause) {
432
+ if (options.keyPassword === undefined) {
433
+ throw new WssError('wss-decryption-key-missing', 'The decryption key could not be read.', { cause });
434
+ }
435
+ try {
436
+ return createPrivateKey({ key: keyPem, passphrase: options.keyPassword });
437
+ }
438
+ catch (innerCause) {
439
+ throw new WssError('wss-decryption-key-missing', 'The decryption key could not be decrypted.', {
440
+ cause: innerCause,
441
+ });
442
+ }
443
+ }
444
+ }
445
+ /**
446
+ * The OAEP hash an `xenc:EncryptionMethod` asks for: its `ds:DigestMethod`, defaulting to SHA-1
447
+ * (what `#rsa-oaep-mgf1p` means when the element is left out).
448
+ *
449
+ * Node derives MGF1's hash from `oaepHash`, so an `xenc11:MGF` naming a *different* hash cannot
450
+ * be honoured and is rejected rather than silently decrypted with the wrong parameters.
451
+ *
452
+ * @throws WssError `wss-algorithm-unsupported`
453
+ */
454
+ function oaepHashOf(method) {
455
+ const digestUri = method === undefined ? undefined : childElement(method, NS.DS, 'DigestMethod')?.getAttribute('Algorithm');
456
+ const digest = digestUri === null || digestUri === undefined || digestUri === '' ? 'sha1' : OAEP_DIGESTS[digestUri];
457
+ if (digest === undefined) {
458
+ throw new WssError('wss-algorithm-unsupported', `Unsupported RSA-OAEP digest "${String(digestUri)}".`, {
459
+ details: { algorithm: String(digestUri) },
460
+ });
461
+ }
462
+ const mgfUri = method === undefined ? undefined : childElement(method, XENC11, 'MGF')?.getAttribute('Algorithm');
463
+ if (mgfUri === null || mgfUri === undefined || mgfUri === '') {
464
+ return digest;
465
+ }
466
+ const mgf = MGF_DIGESTS[mgfUri];
467
+ if (mgf === undefined) {
468
+ throw new WssError('wss-algorithm-unsupported', `Unsupported RSA-OAEP mask generation function "${mgfUri}".`, {
469
+ details: { algorithm: mgfUri },
470
+ });
471
+ }
472
+ if (mgf !== digest) {
473
+ throw new WssError('wss-algorithm-unsupported', `This build cannot decrypt an RSA-OAEP key whose MGF1 hash (${mgf}) differs from its digest (${digest}).`, { details: { algorithm: mgfUri, digest } });
474
+ }
475
+ return digest;
476
+ }
477
+ /** Unwraps an `xenc:EncryptedKey`'s `CipherValue` with `privateKey`, honouring its OAEP parameters. */
478
+ function unwrapKey(method, privateKey, wrapped) {
479
+ const algorithm = method?.getAttribute('Algorithm') ?? '';
480
+ if (algorithm === KEY_TRANSPORT_URIS['rsa-1_5']) {
481
+ return privateDecrypt({ key: privateKey, padding: constants.RSA_PKCS1_PADDING }, wrapped);
482
+ }
483
+ if (algorithm === KEY_TRANSPORT_URIS['rsa-oaep'] || algorithm === `${XENC11}rsa-oaep`) {
484
+ return privateDecrypt({ key: privateKey, padding: constants.RSA_PKCS1_OAEP_PADDING, oaepHash: oaepHashOf(method) }, wrapped);
485
+ }
486
+ throw new WssError('wss-algorithm-unsupported', `Unsupported key transport algorithm "${algorithm}".`, {
487
+ details: { algorithm },
488
+ });
489
+ }
490
+ /**
491
+ * The `xenc:EncryptedData` blocks one `EncryptedKey` keyed, by its `xenc:ReferenceList`.
492
+ *
493
+ * A missing `ReferenceList` is only guessed past when the document carries a single
494
+ * `EncryptedKey`, where "all of them" is the only possible answer. With several keys in play,
495
+ * attributing every block to one of them would be a guess that fails as a wrong-key decryption
496
+ * far from its cause, so it is refused here instead.
497
+ *
498
+ * @throws WssError `wss-decrypt-failed`
499
+ */
500
+ function referencedData(root, encryptedKey, keyCount) {
501
+ const list = childElement(encryptedKey, NS.XENC, 'ReferenceList');
502
+ if (list === undefined) {
503
+ if (keyCount !== 1) {
504
+ throw new WssError('wss-decrypt-failed', 'An xenc:EncryptedKey carries no xenc:ReferenceList, and the document has more than one ' +
505
+ 'EncryptedKey, so which blocks it keyed cannot be known.');
506
+ }
507
+ return findAll(root, NS.XENC, 'EncryptedData');
508
+ }
509
+ const found = [];
510
+ for (let node = list.firstChild; node !== null; node = node.nextSibling) {
511
+ const reference = node;
512
+ if (reference.nodeType !== 1 || reference.localName !== 'DataReference') {
513
+ continue;
514
+ }
515
+ const uri = reference.getAttribute('URI') ?? '';
516
+ const data = uri.startsWith('#') ? elementById(root, uri.slice(1)) : undefined;
517
+ if (data !== undefined) {
518
+ found.push(data);
519
+ }
520
+ }
521
+ return found;
522
+ }
523
+ /** Replaces `data` with the nodes `plaintext` parses to, restoring what encryption removed. */
524
+ function restore(doc, data, plaintext) {
525
+ const parent = data.parentNode;
526
+ if (parent === null) {
527
+ return;
528
+ }
529
+ let fragment;
530
+ try {
531
+ fragment = parseXml(`<wb-decrypted>${plaintext}</wb-decrypted>`, { location: 'envelope' }).documentElement;
532
+ }
533
+ catch (cause) {
534
+ throw new WssError('wss-decrypt-failed', 'The decrypted content is not well-formed XML.', { cause });
535
+ }
536
+ if (fragment === null) {
537
+ throw new WssError('wss-decrypt-failed', 'The decrypted content is not well-formed XML.');
538
+ }
539
+ while (fragment.firstChild !== null) {
540
+ const child = fragment.firstChild;
541
+ fragment.removeChild(child);
542
+ parent.insertBefore(doc.importNode(child, true), data);
543
+ }
544
+ parent.removeChild(data);
545
+ }
546
+ /**
547
+ * Decrypts every `xenc:EncryptedData` in `xml` that `alias`'s private key can open, restoring
548
+ * the original `Content`/`Element` in place and removing the consumed `xenc:EncryptedKey` from
549
+ * the `wsse:Security` header.
550
+ *
551
+ * The `EncryptedKey` whose `ds:KeyInfo` names `alias`'s certificate is preferred; when none
552
+ * does (a key identifier form this build cannot compute, say), every `EncryptedKey` is tried
553
+ * and the first one that unwraps wins. A key that does not fit fails closed.
554
+ *
555
+ * @param xml the encrypted envelope
556
+ * @param options the keystore alias to decrypt with
557
+ * @returns the restored envelope and the plaintext of each decrypted block
558
+ * @throws WssError `wss-decrypt-failed`, `wss-algorithm-unsupported`, `wss-decryption-key-missing`
559
+ */
560
+ export function decryptEnvelope(xml, options) {
561
+ const doc = parseXml(xml, { location: 'envelope' });
562
+ const root = doc.documentElement;
563
+ if (root === null) {
564
+ throw new WssError('wss-decrypt-failed', 'The document to decrypt is empty.');
565
+ }
566
+ const encryptedKeys = findAll(root, NS.XENC, 'EncryptedKey');
567
+ if (encryptedKeys.length === 0) {
568
+ throw new WssError('wss-decrypt-failed', 'The document carries no xenc:EncryptedKey to open.');
569
+ }
570
+ const named = encryptedKeys.filter((key) => keyInfoNamesCertificate(root, childElement(key, NS.DS, 'KeyInfo'), options.alias.certPem));
571
+ const candidates = named.length > 0 ? named : encryptedKeys;
572
+ const privateKey = privateKeyOf(options);
573
+ const decrypted = [];
574
+ let opened = 0;
575
+ let lastCause;
576
+ for (const encryptedKey of candidates) {
577
+ const method = childElement(encryptedKey, NS.XENC, 'EncryptionMethod');
578
+ const cipherValue = childElement(childElement(encryptedKey, NS.XENC, 'CipherData') ?? encryptedKey, NS.XENC, 'CipherValue');
579
+ let key;
580
+ try {
581
+ key = unwrapKey(method, privateKey, Buffer.from(textOf(cipherValue), 'base64'));
582
+ }
583
+ catch (cause) {
584
+ if (cause instanceof WssError) {
585
+ throw cause;
586
+ }
587
+ lastCause = cause;
588
+ continue;
589
+ }
590
+ for (const data of referencedData(root, encryptedKey, encryptedKeys.length)) {
591
+ const dataAlgorithm = childElement(data, NS.XENC, 'EncryptionMethod')?.getAttribute('Algorithm') ?? '';
592
+ const spec = SYMMETRIC_BY_URI.get(dataAlgorithm);
593
+ if (spec === undefined) {
594
+ throw new WssError('wss-algorithm-unsupported', `Unsupported encryption algorithm "${dataAlgorithm}".`, {
595
+ details: { algorithm: dataAlgorithm },
596
+ });
597
+ }
598
+ const value = childElement(childElement(data, NS.XENC, 'CipherData') ?? data, NS.XENC, 'CipherValue');
599
+ let plaintext;
600
+ try {
601
+ plaintext = decryptData(spec, key, Buffer.from(textOf(value), 'base64'));
602
+ }
603
+ catch (cause) {
604
+ throw new WssError('wss-decrypt-failed', 'An xenc:EncryptedData block could not be decrypted.', { cause });
605
+ }
606
+ restore(doc, data, plaintext);
607
+ decrypted.push(plaintext);
608
+ }
609
+ encryptedKey.parentNode?.removeChild(encryptedKey);
610
+ opened += 1;
611
+ }
612
+ if (opened === 0) {
613
+ throw new WssError('wss-decrypt-failed', 'No xenc:EncryptedKey in the document could be opened with this key.', {
614
+ ...(lastCause !== undefined ? { cause: lastCause } : {}),
615
+ });
616
+ }
617
+ return { xml: serializeXml(doc), decrypted };
618
+ }