pi-codex-auto-review 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1057) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +10 -0
  3. package/README.md +77 -0
  4. package/dist/approvals.d.ts +72 -0
  5. package/dist/approvals.js +167 -0
  6. package/dist/approvals.js.map +1 -0
  7. package/dist/audit.d.ts +28 -0
  8. package/dist/audit.js +40 -0
  9. package/dist/audit.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +70 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/context-files.d.ts +14 -0
  14. package/dist/context-files.js +113 -0
  15. package/dist/context-files.js.map +1 -0
  16. package/dist/contracts.d.ts +258 -0
  17. package/dist/contracts.js +102 -0
  18. package/dist/contracts.js.map +1 -0
  19. package/dist/index.d.ts +28 -0
  20. package/dist/index.js +106 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/native/darwin-arm64/artifact.json +5 -0
  23. package/dist/native/darwin-arm64/pi-guard-execpolicy +0 -0
  24. package/dist/native/linux-x64/artifact.json +5 -0
  25. package/dist/native/linux-x64/pi-guard-execpolicy +0 -0
  26. package/dist/policy/domains.d.ts +5 -0
  27. package/dist/policy/domains.js +18 -0
  28. package/dist/policy/domains.js.map +1 -0
  29. package/dist/policy/index.d.ts +56 -0
  30. package/dist/policy/index.js +304 -0
  31. package/dist/policy/index.js.map +1 -0
  32. package/dist/policy/paths.d.ts +5 -0
  33. package/dist/policy/paths.js +54 -0
  34. package/dist/policy/paths.js.map +1 -0
  35. package/dist/policy/rules.d.ts +36 -0
  36. package/dist/policy/rules.js +61 -0
  37. package/dist/policy/rules.js.map +1 -0
  38. package/dist/policy/shell.d.ts +14 -0
  39. package/dist/policy/shell.js +122 -0
  40. package/dist/policy/shell.js.map +1 -0
  41. package/dist/reports.d.ts +21 -0
  42. package/dist/reports.js +42 -0
  43. package/dist/reports.js.map +1 -0
  44. package/dist/review/context.d.ts +25 -0
  45. package/dist/review/context.js +108 -0
  46. package/dist/review/context.js.map +1 -0
  47. package/dist/review/investigation.d.ts +39 -0
  48. package/dist/review/investigation.js +36 -0
  49. package/dist/review/investigation.js.map +1 -0
  50. package/dist/review/lifecycle.d.ts +29 -0
  51. package/dist/review/lifecycle.js +71 -0
  52. package/dist/review/lifecycle.js.map +1 -0
  53. package/dist/review/policy.d.ts +4 -0
  54. package/dist/review/policy.js +15 -0
  55. package/dist/review/policy.js.map +1 -0
  56. package/dist/review/upstream-policy.d.ts +2 -0
  57. package/dist/review/upstream-policy.js +210 -0
  58. package/dist/review/upstream-policy.js.map +1 -0
  59. package/dist/reviewer.d.ts +45 -0
  60. package/dist/reviewer.js +148 -0
  61. package/dist/reviewer.js.map +1 -0
  62. package/dist/sandbox/broker.d.ts +1 -0
  63. package/dist/sandbox/broker.js +135 -0
  64. package/dist/sandbox/broker.js.map +1 -0
  65. package/dist/sandbox/config.d.ts +5 -0
  66. package/dist/sandbox/config.js +91 -0
  67. package/dist/sandbox/config.js.map +1 -0
  68. package/dist/sandbox/executor.d.ts +20 -0
  69. package/dist/sandbox/executor.js +144 -0
  70. package/dist/sandbox/executor.js.map +1 -0
  71. package/dist/sandbox/hard-links.d.ts +4 -0
  72. package/dist/sandbox/hard-links.js +145 -0
  73. package/dist/sandbox/hard-links.js.map +1 -0
  74. package/dist/sandbox/linux-read-paths.d.ts +7 -0
  75. package/dist/sandbox/linux-read-paths.js +47 -0
  76. package/dist/sandbox/linux-read-paths.js.map +1 -0
  77. package/dist/sandbox/paths.d.ts +3 -0
  78. package/dist/sandbox/paths.js +10 -0
  79. package/dist/sandbox/paths.js.map +1 -0
  80. package/dist/sandbox/runtime-write-paths.d.ts +2 -0
  81. package/dist/sandbox/runtime-write-paths.js +8 -0
  82. package/dist/sandbox/runtime-write-paths.js.map +1 -0
  83. package/dist/sandbox/seccomp.d.ts +5 -0
  84. package/dist/sandbox/seccomp.js +16 -0
  85. package/dist/sandbox/seccomp.js.map +1 -0
  86. package/dist/sandbox/worker.d.ts +1 -0
  87. package/dist/sandbox/worker.js +73 -0
  88. package/dist/sandbox/worker.js.map +1 -0
  89. package/dist/signals.d.ts +10 -0
  90. package/dist/signals.js +21 -0
  91. package/dist/signals.js.map +1 -0
  92. package/dist/startup.d.ts +22 -0
  93. package/dist/startup.js +100 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/tools/controller.d.ts +63 -0
  96. package/dist/tools/controller.js +286 -0
  97. package/dist/tools/controller.js.map +1 -0
  98. package/dist/tools/external.d.ts +30 -0
  99. package/dist/tools/external.js +24 -0
  100. package/dist/tools/external.js.map +1 -0
  101. package/dist/tools/mcp.d.ts +17 -0
  102. package/dist/tools/mcp.js +186 -0
  103. package/dist/tools/mcp.js.map +1 -0
  104. package/docs/publishing.md +73 -0
  105. package/docs/security/dependencies.md +43 -0
  106. package/docs/testing/auto-review-protection.md +130 -0
  107. package/docs/usage.md +217 -0
  108. package/native/execpolicy/LICENSE +201 -0
  109. package/native/execpolicy/NOTICE +6 -0
  110. package/node_modules/@anthropic-ai/sandbox-runtime/LICENSE +201 -0
  111. package/node_modules/@anthropic-ai/sandbox-runtime/README.md +901 -0
  112. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.d.ts +3 -0
  113. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.d.ts.map +1 -0
  114. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js +472 -0
  115. package/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js.map +1 -0
  116. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.d.ts +19 -0
  117. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.d.ts.map +1 -0
  118. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.js +17 -0
  119. package/node_modules/@anthropic-ai/sandbox-runtime/dist/index.js.map +1 -0
  120. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.d.ts +52 -0
  121. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.d.ts.map +1 -0
  122. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.js +153 -0
  123. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/address.js.map +1 -0
  124. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.d.ts +164 -0
  125. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.d.ts.map +1 -0
  126. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.js +246 -0
  127. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/aws-sigv4.js.map +1 -0
  128. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.d.ts +58 -0
  129. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.d.ts.map +1 -0
  130. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.js +128 -0
  131. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/body-substitution.js.map +1 -0
  132. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.d.ts +124 -0
  133. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.d.ts.map +1 -0
  134. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.js +258 -0
  135. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-aws-pairs.js.map +1 -0
  136. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.d.ts +87 -0
  137. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.d.ts.map +1 -0
  138. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.js +138 -0
  139. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-decode.js.map +1 -0
  140. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.d.ts +67 -0
  141. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.d.ts.map +1 -0
  142. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.js +113 -0
  143. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-extract.js.map +1 -0
  144. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.d.ts +70 -0
  145. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.d.ts.map +1 -0
  146. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.js +171 -0
  147. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-env.js.map +1 -0
  148. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.d.ts +120 -0
  149. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.d.ts.map +1 -0
  150. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.js +281 -0
  151. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-mask-files.js.map +1 -0
  152. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.d.ts +108 -0
  153. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.d.ts.map +1 -0
  154. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.js +208 -0
  155. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/credential-sentinel.js.map +1 -0
  156. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.d.ts +82 -0
  157. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.d.ts.map +1 -0
  158. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.js +155 -0
  159. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/domain-pattern.js.map +1 -0
  160. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.d.ts +44 -0
  161. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.d.ts.map +1 -0
  162. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.js +220 -0
  163. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/generate-seccomp-filter.js.map +1 -0
  164. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.d.ts +150 -0
  165. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.d.ts.map +1 -0
  166. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.js +678 -0
  167. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/http-proxy.js.map +1 -0
  168. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.d.ts +32 -0
  169. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.d.ts.map +1 -0
  170. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.js +111 -0
  171. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/java-proxy-agent.js.map +1 -0
  172. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.d.ts +305 -0
  173. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.d.ts.map +1 -0
  174. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.js +2605 -0
  175. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-sandbox-utils.js.map +1 -0
  176. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.d.ts +55 -0
  177. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.d.ts.map +1 -0
  178. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.js +152 -0
  179. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/linux-violation-monitor.js.map +1 -0
  180. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.d.ts +12 -0
  181. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.d.ts.map +1 -0
  182. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.js +43 -0
  183. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/listen-in-range.js.map +1 -0
  184. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.d.ts +116 -0
  185. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.d.ts.map +1 -0
  186. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.js +1195 -0
  187. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/macos-sandbox-utils.js.map +1 -0
  188. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.d.ts +200 -0
  189. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.d.ts.map +1 -0
  190. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.js +443 -0
  191. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-ca.js.map +1 -0
  192. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.d.ts +28 -0
  193. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.d.ts.map +1 -0
  194. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.js +114 -0
  195. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mitm-leaf.js.map +1 -0
  196. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.d.ts +59 -0
  197. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.d.ts.map +1 -0
  198. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.js +159 -0
  199. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/mux-proxy.js.map +1 -0
  200. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.d.ts +147 -0
  201. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.d.ts.map +1 -0
  202. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.js +445 -0
  203. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/parent-proxy.js.map +1 -0
  204. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.d.ts +17 -0
  205. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.d.ts.map +1 -0
  206. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.js +163 -0
  207. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/read-deny-glob.js.map +1 -0
  208. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.d.ts +83 -0
  209. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.d.ts.map +1 -0
  210. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.js +212 -0
  211. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/request-filter.js.map +1 -0
  212. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.d.ts +76 -0
  213. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.d.ts.map +1 -0
  214. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.js +221 -0
  215. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/resolved-address-guard.js.map +1 -0
  216. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.d.ts +1691 -0
  217. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.d.ts.map +1 -0
  218. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.js +1233 -0
  219. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-config.js.map +1 -0
  220. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.d.ts +97 -0
  221. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.d.ts.map +1 -0
  222. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.js +1937 -0
  223. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-manager.js.map +1 -0
  224. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.d.ts +113 -0
  225. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.d.ts.map +1 -0
  226. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.js +3 -0
  227. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-schemas.js.map +1 -0
  228. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.d.ts +411 -0
  229. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.d.ts.map +1 -0
  230. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.js +1408 -0
  231. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-utils.js.map +1 -0
  232. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.d.ts +37 -0
  233. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.d.ts.map +1 -0
  234. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.js +125 -0
  235. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/sandbox-violation-store.js.map +1 -0
  236. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.d.ts +57 -0
  237. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.d.ts.map +1 -0
  238. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.js +332 -0
  239. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/socks-proxy.js.map +1 -0
  240. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.d.ts +100 -0
  241. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.d.ts.map +1 -0
  242. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.js +546 -0
  243. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/tls-terminate-proxy.js.map +1 -0
  244. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.d.ts +923 -0
  245. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.d.ts.map +1 -0
  246. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.js +1419 -0
  247. package/node_modules/@anthropic-ai/sandbox-runtime/dist/sandbox/windows-sandbox-utils.js.map +1 -0
  248. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.d.ts +31 -0
  249. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.d.ts.map +1 -0
  250. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.js +69 -0
  251. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/config-loader.js.map +1 -0
  252. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.d.ts +7 -0
  253. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.d.ts.map +1 -0
  254. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.js +25 -0
  255. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/debug.js.map +1 -0
  256. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.d.ts +15 -0
  257. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.d.ts.map +1 -0
  258. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.js +49 -0
  259. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/platform.js.map +1 -0
  260. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.d.ts +17 -0
  261. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.d.ts.map +1 -0
  262. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.js +37 -0
  263. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/ripgrep.js.map +1 -0
  264. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.d.ts +27 -0
  265. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.d.ts.map +1 -0
  266. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.js +47 -0
  267. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/shell-quote.js.map +1 -0
  268. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.d.ts +9 -0
  269. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.d.ts.map +1 -0
  270. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.js +25 -0
  271. package/node_modules/@anthropic-ai/sandbox-runtime/dist/utils/which.js.map +1 -0
  272. package/node_modules/@anthropic-ai/sandbox-runtime/package.json +88 -0
  273. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/java-proxy-agent/build.ts +95 -0
  274. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/java-proxy-agent/srt-proxy-agent.jar +0 -0
  275. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/arm64/apply-seccomp +0 -0
  276. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/build.ts +69 -0
  277. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/seccomp/x64/apply-seccomp +0 -0
  278. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/arm64/srt-win.exe +0 -0
  279. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/build.ts +28 -0
  280. package/node_modules/@anthropic-ai/sandbox-runtime/vendor/srt-win/x64/srt-win.exe +0 -0
  281. package/node_modules/@pondwader/socks5-server/.github/workflows/ci.yml +27 -0
  282. package/node_modules/@pondwader/socks5-server/LICENSE +20 -0
  283. package/node_modules/@pondwader/socks5-server/README.md +151 -0
  284. package/node_modules/@pondwader/socks5-server/dist/index.d.mts +87 -0
  285. package/node_modules/@pondwader/socks5-server/dist/index.d.ts +87 -0
  286. package/node_modules/@pondwader/socks5-server/dist/index.js +346 -0
  287. package/node_modules/@pondwader/socks5-server/dist/index.mjs +307 -0
  288. package/node_modules/@pondwader/socks5-server/package.json +31 -0
  289. package/node_modules/commander/LICENSE +22 -0
  290. package/node_modules/commander/Readme.md +1157 -0
  291. package/node_modules/commander/esm.mjs +16 -0
  292. package/node_modules/commander/index.js +24 -0
  293. package/node_modules/commander/lib/argument.js +149 -0
  294. package/node_modules/commander/lib/command.js +2509 -0
  295. package/node_modules/commander/lib/error.js +39 -0
  296. package/node_modules/commander/lib/help.js +520 -0
  297. package/node_modules/commander/lib/option.js +330 -0
  298. package/node_modules/commander/lib/suggestSimilar.js +101 -0
  299. package/node_modules/commander/package-support.json +16 -0
  300. package/node_modules/commander/package.json +84 -0
  301. package/node_modules/commander/typings/esm.d.mts +3 -0
  302. package/node_modules/commander/typings/index.d.ts +969 -0
  303. package/node_modules/node-forge/.editorconfig +17 -0
  304. package/node_modules/node-forge/.eslintrc.js +24 -0
  305. package/node_modules/node-forge/.github/workflows/main.yaml +96 -0
  306. package/node_modules/node-forge/.istanbul.yml +2 -0
  307. package/node_modules/node-forge/.npmignore +15 -0
  308. package/node_modules/node-forge/CHANGELOG.md +555 -0
  309. package/node_modules/node-forge/CONTRIBUTING.md +18 -0
  310. package/node_modules/node-forge/LICENSE +331 -0
  311. package/node_modules/node-forge/README.md +2071 -0
  312. package/node_modules/node-forge/RELEASE.md +19 -0
  313. package/node_modules/node-forge/SECURITY.md +5 -0
  314. package/node_modules/node-forge/examples/create-cert.js +110 -0
  315. package/node_modules/node-forge/examples/create-csr.js +66 -0
  316. package/node_modules/node-forge/examples/create-pkcs12.js +160 -0
  317. package/node_modules/node-forge/examples/imap.js +46 -0
  318. package/node_modules/node-forge/examples/sign-p7.js +115 -0
  319. package/node_modules/node-forge/examples/tls.js +189 -0
  320. package/node_modules/node-forge/flash/PooledSocket.as +18 -0
  321. package/node_modules/node-forge/flash/README.md +48 -0
  322. package/node_modules/node-forge/flash/SocketEvent.as +36 -0
  323. package/node_modules/node-forge/flash/SocketPool.as +754 -0
  324. package/node_modules/node-forge/flash/mod_fsp/README +135 -0
  325. package/node_modules/node-forge/flash/mod_fsp/mod_fsp.c +415 -0
  326. package/node_modules/node-forge/flash/package.json +28 -0
  327. package/node_modules/node-forge/flash/policyserver.js +65 -0
  328. package/node_modules/node-forge/flash/policyserver.py +112 -0
  329. package/node_modules/node-forge/flash/swf/SocketPool.swf +0 -0
  330. package/node_modules/node-forge/karma-sauce.conf.js +79 -0
  331. package/node_modules/node-forge/karma.conf.js +133 -0
  332. package/node_modules/node-forge/lib/aes.js +1091 -0
  333. package/node_modules/node-forge/lib/aesCipherSuites.js +282 -0
  334. package/node_modules/node-forge/lib/asn1-validator.js +91 -0
  335. package/node_modules/node-forge/lib/asn1.js +1503 -0
  336. package/node_modules/node-forge/lib/baseN.js +186 -0
  337. package/node_modules/node-forge/lib/cipher.js +230 -0
  338. package/node_modules/node-forge/lib/cipherModes.js +999 -0
  339. package/node_modules/node-forge/lib/des.js +496 -0
  340. package/node_modules/node-forge/lib/ed25519.js +1091 -0
  341. package/node_modules/node-forge/lib/forge.js +13 -0
  342. package/node_modules/node-forge/lib/form.js +149 -0
  343. package/node_modules/node-forge/lib/hmac.js +146 -0
  344. package/node_modules/node-forge/lib/http.js +1346 -0
  345. package/node_modules/node-forge/lib/index.all.js +16 -0
  346. package/node_modules/node-forge/lib/index.js +33 -0
  347. package/node_modules/node-forge/lib/jsbn.js +1294 -0
  348. package/node_modules/node-forge/lib/kem.js +168 -0
  349. package/node_modules/node-forge/lib/log.js +319 -0
  350. package/node_modules/node-forge/lib/md.all.js +13 -0
  351. package/node_modules/node-forge/lib/md.js +11 -0
  352. package/node_modules/node-forge/lib/md5.js +289 -0
  353. package/node_modules/node-forge/lib/mgf.js +12 -0
  354. package/node_modules/node-forge/lib/mgf1.js +57 -0
  355. package/node_modules/node-forge/lib/oids.js +180 -0
  356. package/node_modules/node-forge/lib/pbe.js +1023 -0
  357. package/node_modules/node-forge/lib/pbkdf2.js +211 -0
  358. package/node_modules/node-forge/lib/pem.js +237 -0
  359. package/node_modules/node-forge/lib/pkcs1.js +276 -0
  360. package/node_modules/node-forge/lib/pkcs12.js +1078 -0
  361. package/node_modules/node-forge/lib/pkcs7.js +1260 -0
  362. package/node_modules/node-forge/lib/pkcs7asn1.js +410 -0
  363. package/node_modules/node-forge/lib/pki.js +102 -0
  364. package/node_modules/node-forge/lib/prime.js +297 -0
  365. package/node_modules/node-forge/lib/prime.worker.js +168 -0
  366. package/node_modules/node-forge/lib/prng.js +419 -0
  367. package/node_modules/node-forge/lib/pss.js +241 -0
  368. package/node_modules/node-forge/lib/random.js +191 -0
  369. package/node_modules/node-forge/lib/rc2.js +410 -0
  370. package/node_modules/node-forge/lib/rsa.js +1973 -0
  371. package/node_modules/node-forge/lib/sha1.js +319 -0
  372. package/node_modules/node-forge/lib/sha256.js +327 -0
  373. package/node_modules/node-forge/lib/sha512.js +561 -0
  374. package/node_modules/node-forge/lib/socket.js +287 -0
  375. package/node_modules/node-forge/lib/ssh.js +236 -0
  376. package/node_modules/node-forge/lib/tls.js +4282 -0
  377. package/node_modules/node-forge/lib/tlssocket.js +249 -0
  378. package/node_modules/node-forge/lib/util.js +2652 -0
  379. package/node_modules/node-forge/lib/x509.js +3251 -0
  380. package/node_modules/node-forge/lib/xhr.js +738 -0
  381. package/node_modules/node-forge/package.json +123 -0
  382. package/node_modules/node-forge/tests/.eslintrc.js +5 -0
  383. package/node_modules/node-forge/tests/README.md +4 -0
  384. package/node_modules/node-forge/tests/benchmarks/aes-speed.js +62 -0
  385. package/node_modules/node-forge/tests/benchmarks/so-44303784.js +246 -0
  386. package/node_modules/node-forge/tests/flash/README.md +7 -0
  387. package/node_modules/node-forge/tests/flash/Test.as +96 -0
  388. package/node_modules/node-forge/tests/flash/build-flash.xml +7 -0
  389. package/node_modules/node-forge/tests/flash/index.html +28 -0
  390. package/node_modules/node-forge/tests/index.html +33 -0
  391. package/node_modules/node-forge/tests/issues/heartbleed.js +55 -0
  392. package/node_modules/node-forge/tests/issues/issue-428.html +95 -0
  393. package/node_modules/node-forge/tests/issues/issue-428.js +375 -0
  394. package/node_modules/node-forge/tests/karma/index.js +8 -0
  395. package/node_modules/node-forge/tests/karma/testWorker.js +65 -0
  396. package/node_modules/node-forge/tests/karma/web-worker-rsa.js +55 -0
  397. package/node_modules/node-forge/tests/legacy/common.html +65 -0
  398. package/node_modules/node-forge/tests/legacy/common.js +2199 -0
  399. package/node_modules/node-forge/tests/legacy/form.html +148 -0
  400. package/node_modules/node-forge/tests/legacy/form.js +40 -0
  401. package/node_modules/node-forge/tests/legacy/http.html +235 -0
  402. package/node_modules/node-forge/tests/legacy/index.html +70 -0
  403. package/node_modules/node-forge/tests/legacy/keygen.html +113 -0
  404. package/node_modules/node-forge/tests/legacy/login.css +26 -0
  405. package/node_modules/node-forge/tests/legacy/loginDemo.html +32 -0
  406. package/node_modules/node-forge/tests/legacy/loginDemo.js +149 -0
  407. package/node_modules/node-forge/tests/legacy/performance.html +533 -0
  408. package/node_modules/node-forge/tests/legacy/result.txt +1 -0
  409. package/node_modules/node-forge/tests/legacy/socketPool.html +302 -0
  410. package/node_modules/node-forge/tests/legacy/tasks.html +54 -0
  411. package/node_modules/node-forge/tests/legacy/tasks.js +378 -0
  412. package/node_modules/node-forge/tests/legacy/tls.html +389 -0
  413. package/node_modules/node-forge/tests/legacy/webid.html +89 -0
  414. package/node_modules/node-forge/tests/legacy/webid.js +313 -0
  415. package/node_modules/node-forge/tests/legacy/ws-webid.js +120 -0
  416. package/node_modules/node-forge/tests/legacy/xhr.html +67 -0
  417. package/node_modules/node-forge/tests/legacy/xhr.js +590 -0
  418. package/node_modules/node-forge/tests/pocs/ghsa-2328-f5f3-gj25.js +85 -0
  419. package/node_modules/node-forge/tests/pocs/ghsa-ppp5-5v6c-4jwp.js +166 -0
  420. package/node_modules/node-forge/tests/pocs/ghsa-q67f-28xg-22rw.js +103 -0
  421. package/node_modules/node-forge/tests/security/cve-2025-12816.js +75 -0
  422. package/node_modules/node-forge/tests/security/ghsa-554w-wpv2-vw27.js +81 -0
  423. package/node_modules/node-forge/tests/security/index.js +3 -0
  424. package/node_modules/node-forge/tests/server.crt +26 -0
  425. package/node_modules/node-forge/tests/server.js +87 -0
  426. package/node_modules/node-forge/tests/server.key +27 -0
  427. package/node_modules/node-forge/tests/support/task.js +718 -0
  428. package/node_modules/node-forge/tests/tests.css +61 -0
  429. package/node_modules/node-forge/tests/unit/aes.js +1498 -0
  430. package/node_modules/node-forge/tests/unit/asn1.js +1337 -0
  431. package/node_modules/node-forge/tests/unit/csr.js +129 -0
  432. package/node_modules/node-forge/tests/unit/des.js +231 -0
  433. package/node_modules/node-forge/tests/unit/ed25519.js +395 -0
  434. package/node_modules/node-forge/tests/unit/forge.js +2 -0
  435. package/node_modules/node-forge/tests/unit/hmac.js +64 -0
  436. package/node_modules/node-forge/tests/unit/index.html +20 -0
  437. package/node_modules/node-forge/tests/unit/index.js +27 -0
  438. package/node_modules/node-forge/tests/unit/jsbn.js +40 -0
  439. package/node_modules/node-forge/tests/unit/kem.js +167 -0
  440. package/node_modules/node-forge/tests/unit/md5.js +114 -0
  441. package/node_modules/node-forge/tests/unit/mgf1.js +16 -0
  442. package/node_modules/node-forge/tests/unit/pbkdf2.js +182 -0
  443. package/node_modules/node-forge/tests/unit/pem.js +159 -0
  444. package/node_modules/node-forge/tests/unit/pkcs1.js +1077 -0
  445. package/node_modules/node-forge/tests/unit/pkcs12.js +739 -0
  446. package/node_modules/node-forge/tests/unit/pkcs7.js +792 -0
  447. package/node_modules/node-forge/tests/unit/random.js +48 -0
  448. package/node_modules/node-forge/tests/unit/rc2.js +88 -0
  449. package/node_modules/node-forge/tests/unit/rsa.js +1278 -0
  450. package/node_modules/node-forge/tests/unit/sha1.js +72 -0
  451. package/node_modules/node-forge/tests/unit/sha256.js +79 -0
  452. package/node_modules/node-forge/tests/unit/sha512.js +200 -0
  453. package/node_modules/node-forge/tests/unit/ssh.js +175 -0
  454. package/node_modules/node-forge/tests/unit/tls.js +175 -0
  455. package/node_modules/node-forge/tests/unit/util.js +595 -0
  456. package/node_modules/node-forge/tests/unit/x509.js +1986 -0
  457. package/node_modules/node-forge/tests/websockets/server-webid.js +495 -0
  458. package/node_modules/node-forge/tests/websockets/server-ws.js +158 -0
  459. package/node_modules/node-forge/webpack-tests.config.js +26 -0
  460. package/node_modules/node-forge/webpack.config.js +130 -0
  461. package/node_modules/zod/LICENSE +21 -0
  462. package/node_modules/zod/README.md +208 -0
  463. package/node_modules/zod/index.cjs +33 -0
  464. package/node_modules/zod/index.d.cts +4 -0
  465. package/node_modules/zod/index.d.ts +4 -0
  466. package/node_modules/zod/index.js +4 -0
  467. package/node_modules/zod/package.json +118 -0
  468. package/node_modules/zod/src/index.ts +4 -0
  469. package/node_modules/zod/src/v3/ZodError.ts +330 -0
  470. package/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
  471. package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  472. package/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
  473. package/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
  474. package/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
  475. package/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
  476. package/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
  477. package/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
  478. package/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
  479. package/node_modules/zod/src/v3/errors.ts +13 -0
  480. package/node_modules/zod/src/v3/external.ts +6 -0
  481. package/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
  482. package/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
  483. package/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
  484. package/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
  485. package/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
  486. package/node_modules/zod/src/v3/helpers/util.ts +224 -0
  487. package/node_modules/zod/src/v3/index.ts +4 -0
  488. package/node_modules/zod/src/v3/locales/en.ts +124 -0
  489. package/node_modules/zod/src/v3/standard-schema.ts +113 -0
  490. package/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
  491. package/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
  492. package/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
  493. package/node_modules/zod/src/v3/tests/array.test.ts +71 -0
  494. package/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
  495. package/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
  496. package/node_modules/zod/src/v3/tests/base.test.ts +29 -0
  497. package/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
  498. package/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
  499. package/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
  500. package/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
  501. package/node_modules/zod/src/v3/tests/complex.test.ts +56 -0
  502. package/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
  503. package/node_modules/zod/src/v3/tests/date.test.ts +32 -0
  504. package/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
  505. package/node_modules/zod/src/v3/tests/default.test.ts +112 -0
  506. package/node_modules/zod/src/v3/tests/description.test.ts +33 -0
  507. package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
  508. package/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
  509. package/node_modules/zod/src/v3/tests/error.test.ts +551 -0
  510. package/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
  511. package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  512. package/node_modules/zod/src/v3/tests/function.test.ts +257 -0
  513. package/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
  514. package/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
  515. package/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
  516. package/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
  517. package/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
  518. package/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
  519. package/node_modules/zod/src/v3/tests/map.test.ts +110 -0
  520. package/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
  521. package/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
  522. package/node_modules/zod/src/v3/tests/nan.test.ts +21 -0
  523. package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
  524. package/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
  525. package/node_modules/zod/src/v3/tests/number.test.ts +176 -0
  526. package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
  527. package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
  528. package/node_modules/zod/src/v3/tests/object.test.ts +434 -0
  529. package/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
  530. package/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
  531. package/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
  532. package/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
  533. package/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
  534. package/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
  535. package/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
  536. package/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
  537. package/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
  538. package/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
  539. package/node_modules/zod/src/v3/tests/record.test.ts +171 -0
  540. package/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
  541. package/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
  542. package/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
  543. package/node_modules/zod/src/v3/tests/set.test.ts +142 -0
  544. package/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
  545. package/node_modules/zod/src/v3/tests/string.test.ts +916 -0
  546. package/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
  547. package/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
  548. package/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
  549. package/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
  550. package/node_modules/zod/src/v3/tests/void.test.ts +15 -0
  551. package/node_modules/zod/src/v3/types.ts +5136 -0
  552. package/node_modules/zod/src/v4/classic/checks.ts +30 -0
  553. package/node_modules/zod/src/v4/classic/coerce.ts +27 -0
  554. package/node_modules/zod/src/v4/classic/compat.ts +66 -0
  555. package/node_modules/zod/src/v4/classic/errors.ts +75 -0
  556. package/node_modules/zod/src/v4/classic/external.ts +50 -0
  557. package/node_modules/zod/src/v4/classic/index.ts +5 -0
  558. package/node_modules/zod/src/v4/classic/iso.ts +90 -0
  559. package/node_modules/zod/src/v4/classic/parse.ts +33 -0
  560. package/node_modules/zod/src/v4/classic/schemas.ts +2054 -0
  561. package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
  562. package/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
  563. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
  564. package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
  565. package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
  566. package/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
  567. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
  568. package/node_modules/zod/src/v4/classic/tests/brand.test.ts +63 -0
  569. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +252 -0
  570. package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
  571. package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
  572. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +352 -0
  573. package/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
  574. package/node_modules/zod/src/v4/classic/tests/date.test.ts +31 -0
  575. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +296 -0
  576. package/node_modules/zod/src/v4/classic/tests/default.test.ts +313 -0
  577. package/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
  578. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +619 -0
  579. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
  580. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +527 -0
  581. package/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
  582. package/node_modules/zod/src/v4/classic/tests/file.test.ts +91 -0
  583. package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +175 -0
  584. package/node_modules/zod/src/v4/classic/tests/function.test.ts +268 -0
  585. package/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
  586. package/node_modules/zod/src/v4/classic/tests/index.test.ts +829 -0
  587. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +34 -0
  588. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +171 -0
  589. package/node_modules/zod/src/v4/classic/tests/json.test.ts +108 -0
  590. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
  591. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +92 -0
  592. package/node_modules/zod/src/v4/classic/tests/map.test.ts +196 -0
  593. package/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
  594. package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
  595. package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +86 -0
  596. package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
  597. package/node_modules/zod/src/v4/classic/tests/number.test.ts +247 -0
  598. package/node_modules/zod/src/v4/classic/tests/object.test.ts +563 -0
  599. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +123 -0
  600. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +147 -0
  601. package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +127 -0
  602. package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +81 -0
  603. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +37 -0
  604. package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +298 -0
  605. package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
  606. package/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
  607. package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
  608. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
  609. package/node_modules/zod/src/v4/classic/tests/record.test.ts +342 -0
  610. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +356 -0
  611. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +532 -0
  612. package/node_modules/zod/src/v4/classic/tests/registries.test.ts +204 -0
  613. package/node_modules/zod/src/v4/classic/tests/set.test.ts +179 -0
  614. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +57 -0
  615. package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +109 -0
  616. package/node_modules/zod/src/v4/classic/tests/string.test.ts +881 -0
  617. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +66 -0
  618. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +758 -0
  619. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2314 -0
  620. package/node_modules/zod/src/v4/classic/tests/transform.test.ts +250 -0
  621. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +163 -0
  622. package/node_modules/zod/src/v4/classic/tests/union.test.ts +94 -0
  623. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
  624. package/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
  625. package/node_modules/zod/src/v4/core/api.ts +1594 -0
  626. package/node_modules/zod/src/v4/core/checks.ts +1283 -0
  627. package/node_modules/zod/src/v4/core/config.ts +15 -0
  628. package/node_modules/zod/src/v4/core/core.ts +134 -0
  629. package/node_modules/zod/src/v4/core/doc.ts +44 -0
  630. package/node_modules/zod/src/v4/core/errors.ts +424 -0
  631. package/node_modules/zod/src/v4/core/function.ts +176 -0
  632. package/node_modules/zod/src/v4/core/index.ts +15 -0
  633. package/node_modules/zod/src/v4/core/json-schema.ts +143 -0
  634. package/node_modules/zod/src/v4/core/parse.ts +94 -0
  635. package/node_modules/zod/src/v4/core/regexes.ts +135 -0
  636. package/node_modules/zod/src/v4/core/registries.ts +96 -0
  637. package/node_modules/zod/src/v4/core/schemas.ts +3842 -0
  638. package/node_modules/zod/src/v4/core/standard-schema.ts +64 -0
  639. package/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
  640. package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
  641. package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
  642. package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
  643. package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
  644. package/node_modules/zod/src/v4/core/to-json-schema.ts +977 -0
  645. package/node_modules/zod/src/v4/core/util.ts +775 -0
  646. package/node_modules/zod/src/v4/core/versions.ts +5 -0
  647. package/node_modules/zod/src/v4/core/zsf.ts +323 -0
  648. package/node_modules/zod/src/v4/index.ts +4 -0
  649. package/node_modules/zod/src/v4/locales/ar.ts +125 -0
  650. package/node_modules/zod/src/v4/locales/az.ts +121 -0
  651. package/node_modules/zod/src/v4/locales/be.ts +184 -0
  652. package/node_modules/zod/src/v4/locales/ca.ts +127 -0
  653. package/node_modules/zod/src/v4/locales/cs.ts +142 -0
  654. package/node_modules/zod/src/v4/locales/de.ts +124 -0
  655. package/node_modules/zod/src/v4/locales/en.ts +127 -0
  656. package/node_modules/zod/src/v4/locales/eo.ts +125 -0
  657. package/node_modules/zod/src/v4/locales/es.ts +125 -0
  658. package/node_modules/zod/src/v4/locales/fa.ts +134 -0
  659. package/node_modules/zod/src/v4/locales/fi.ts +131 -0
  660. package/node_modules/zod/src/v4/locales/fr-CA.ts +126 -0
  661. package/node_modules/zod/src/v4/locales/fr.ts +124 -0
  662. package/node_modules/zod/src/v4/locales/he.ts +125 -0
  663. package/node_modules/zod/src/v4/locales/hu.ts +126 -0
  664. package/node_modules/zod/src/v4/locales/id.ts +125 -0
  665. package/node_modules/zod/src/v4/locales/index.ts +39 -0
  666. package/node_modules/zod/src/v4/locales/it.ts +125 -0
  667. package/node_modules/zod/src/v4/locales/ja.ts +122 -0
  668. package/node_modules/zod/src/v4/locales/kh.ts +126 -0
  669. package/node_modules/zod/src/v4/locales/ko.ts +131 -0
  670. package/node_modules/zod/src/v4/locales/mk.ts +127 -0
  671. package/node_modules/zod/src/v4/locales/ms.ts +124 -0
  672. package/node_modules/zod/src/v4/locales/nl.ts +126 -0
  673. package/node_modules/zod/src/v4/locales/no.ts +124 -0
  674. package/node_modules/zod/src/v4/locales/ota.ts +125 -0
  675. package/node_modules/zod/src/v4/locales/pl.ts +126 -0
  676. package/node_modules/zod/src/v4/locales/ps.ts +133 -0
  677. package/node_modules/zod/src/v4/locales/pt.ts +123 -0
  678. package/node_modules/zod/src/v4/locales/ru.ts +184 -0
  679. package/node_modules/zod/src/v4/locales/sl.ts +126 -0
  680. package/node_modules/zod/src/v4/locales/sv.ts +127 -0
  681. package/node_modules/zod/src/v4/locales/ta.ts +125 -0
  682. package/node_modules/zod/src/v4/locales/th.ts +126 -0
  683. package/node_modules/zod/src/v4/locales/tr.ts +121 -0
  684. package/node_modules/zod/src/v4/locales/ua.ts +126 -0
  685. package/node_modules/zod/src/v4/locales/ur.ts +126 -0
  686. package/node_modules/zod/src/v4/locales/vi.ts +125 -0
  687. package/node_modules/zod/src/v4/locales/zh-CN.ts +123 -0
  688. package/node_modules/zod/src/v4/locales/zh-TW.ts +125 -0
  689. package/node_modules/zod/src/v4/mini/checks.ts +32 -0
  690. package/node_modules/zod/src/v4/mini/coerce.ts +22 -0
  691. package/node_modules/zod/src/v4/mini/external.ts +40 -0
  692. package/node_modules/zod/src/v4/mini/index.ts +3 -0
  693. package/node_modules/zod/src/v4/mini/iso.ts +62 -0
  694. package/node_modules/zod/src/v4/mini/parse.ts +1 -0
  695. package/node_modules/zod/src/v4/mini/schemas.ts +1579 -0
  696. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
  697. package/node_modules/zod/src/v4/mini/tests/brand.test.ts +51 -0
  698. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
  699. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
  700. package/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
  701. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +43 -0
  702. package/node_modules/zod/src/v4/mini/tests/index.test.ts +871 -0
  703. package/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
  704. package/node_modules/zod/src/v4/mini/tests/object.test.ts +185 -0
  705. package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
  706. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
  707. package/node_modules/zod/src/v4/mini/tests/string.test.ts +299 -0
  708. package/node_modules/zod/src/v4-mini/index.ts +1 -0
  709. package/node_modules/zod/v3/ZodError.cjs +138 -0
  710. package/node_modules/zod/v3/ZodError.d.cts +164 -0
  711. package/node_modules/zod/v3/ZodError.d.ts +164 -0
  712. package/node_modules/zod/v3/ZodError.js +133 -0
  713. package/node_modules/zod/v3/errors.cjs +17 -0
  714. package/node_modules/zod/v3/errors.d.cts +5 -0
  715. package/node_modules/zod/v3/errors.d.ts +5 -0
  716. package/node_modules/zod/v3/errors.js +9 -0
  717. package/node_modules/zod/v3/external.cjs +22 -0
  718. package/node_modules/zod/v3/external.d.cts +6 -0
  719. package/node_modules/zod/v3/external.d.ts +6 -0
  720. package/node_modules/zod/v3/external.js +6 -0
  721. package/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
  722. package/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
  723. package/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
  724. package/node_modules/zod/v3/helpers/enumUtil.js +1 -0
  725. package/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
  726. package/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
  727. package/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
  728. package/node_modules/zod/v3/helpers/errorUtil.js +6 -0
  729. package/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
  730. package/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
  731. package/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
  732. package/node_modules/zod/v3/helpers/parseUtil.js +109 -0
  733. package/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
  734. package/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
  735. package/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
  736. package/node_modules/zod/v3/helpers/partialUtil.js +1 -0
  737. package/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
  738. package/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
  739. package/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
  740. package/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  741. package/node_modules/zod/v3/helpers/util.cjs +137 -0
  742. package/node_modules/zod/v3/helpers/util.d.cts +85 -0
  743. package/node_modules/zod/v3/helpers/util.d.ts +85 -0
  744. package/node_modules/zod/v3/helpers/util.js +133 -0
  745. package/node_modules/zod/v3/index.cjs +33 -0
  746. package/node_modules/zod/v3/index.d.cts +4 -0
  747. package/node_modules/zod/v3/index.d.ts +4 -0
  748. package/node_modules/zod/v3/index.js +4 -0
  749. package/node_modules/zod/v3/locales/en.cjs +111 -0
  750. package/node_modules/zod/v3/locales/en.d.cts +3 -0
  751. package/node_modules/zod/v3/locales/en.d.ts +3 -0
  752. package/node_modules/zod/v3/locales/en.js +109 -0
  753. package/node_modules/zod/v3/standard-schema.cjs +2 -0
  754. package/node_modules/zod/v3/standard-schema.d.cts +102 -0
  755. package/node_modules/zod/v3/standard-schema.d.ts +102 -0
  756. package/node_modules/zod/v3/standard-schema.js +1 -0
  757. package/node_modules/zod/v3/types.cjs +3775 -0
  758. package/node_modules/zod/v3/types.d.cts +1031 -0
  759. package/node_modules/zod/v3/types.d.ts +1031 -0
  760. package/node_modules/zod/v3/types.js +3693 -0
  761. package/node_modules/zod/v4/classic/checks.cjs +32 -0
  762. package/node_modules/zod/v4/classic/checks.d.cts +1 -0
  763. package/node_modules/zod/v4/classic/checks.d.ts +1 -0
  764. package/node_modules/zod/v4/classic/checks.js +1 -0
  765. package/node_modules/zod/v4/classic/coerce.cjs +47 -0
  766. package/node_modules/zod/v4/classic/coerce.d.cts +17 -0
  767. package/node_modules/zod/v4/classic/coerce.d.ts +17 -0
  768. package/node_modules/zod/v4/classic/coerce.js +17 -0
  769. package/node_modules/zod/v4/classic/compat.cjs +57 -0
  770. package/node_modules/zod/v4/classic/compat.d.cts +46 -0
  771. package/node_modules/zod/v4/classic/compat.d.ts +46 -0
  772. package/node_modules/zod/v4/classic/compat.js +27 -0
  773. package/node_modules/zod/v4/classic/errors.cjs +67 -0
  774. package/node_modules/zod/v4/classic/errors.d.cts +30 -0
  775. package/node_modules/zod/v4/classic/errors.d.ts +30 -0
  776. package/node_modules/zod/v4/classic/errors.js +41 -0
  777. package/node_modules/zod/v4/classic/external.cjs +70 -0
  778. package/node_modules/zod/v4/classic/external.d.cts +13 -0
  779. package/node_modules/zod/v4/classic/external.d.ts +13 -0
  780. package/node_modules/zod/v4/classic/external.js +18 -0
  781. package/node_modules/zod/v4/classic/index.cjs +33 -0
  782. package/node_modules/zod/v4/classic/index.d.cts +4 -0
  783. package/node_modules/zod/v4/classic/index.d.ts +4 -0
  784. package/node_modules/zod/v4/classic/index.js +4 -0
  785. package/node_modules/zod/v4/classic/iso.cjs +60 -0
  786. package/node_modules/zod/v4/classic/iso.d.cts +22 -0
  787. package/node_modules/zod/v4/classic/iso.d.ts +22 -0
  788. package/node_modules/zod/v4/classic/iso.js +30 -0
  789. package/node_modules/zod/v4/classic/parse.cjs +32 -0
  790. package/node_modules/zod/v4/classic/parse.d.cts +23 -0
  791. package/node_modules/zod/v4/classic/parse.d.ts +23 -0
  792. package/node_modules/zod/v4/classic/parse.js +6 -0
  793. package/node_modules/zod/v4/classic/schemas.cjs +1109 -0
  794. package/node_modules/zod/v4/classic/schemas.d.cts +630 -0
  795. package/node_modules/zod/v4/classic/schemas.d.ts +630 -0
  796. package/node_modules/zod/v4/classic/schemas.js +1006 -0
  797. package/node_modules/zod/v4/core/api.cjs +1039 -0
  798. package/node_modules/zod/v4/core/api.d.cts +284 -0
  799. package/node_modules/zod/v4/core/api.d.ts +284 -0
  800. package/node_modules/zod/v4/core/api.js +906 -0
  801. package/node_modules/zod/v4/core/checks.cjs +591 -0
  802. package/node_modules/zod/v4/core/checks.d.cts +278 -0
  803. package/node_modules/zod/v4/core/checks.d.ts +278 -0
  804. package/node_modules/zod/v4/core/checks.js +565 -0
  805. package/node_modules/zod/v4/core/core.cjs +67 -0
  806. package/node_modules/zod/v4/core/core.d.cts +49 -0
  807. package/node_modules/zod/v4/core/core.d.ts +49 -0
  808. package/node_modules/zod/v4/core/core.js +61 -0
  809. package/node_modules/zod/v4/core/doc.cjs +39 -0
  810. package/node_modules/zod/v4/core/doc.d.cts +14 -0
  811. package/node_modules/zod/v4/core/doc.d.ts +14 -0
  812. package/node_modules/zod/v4/core/doc.js +35 -0
  813. package/node_modules/zod/v4/core/errors.cjs +226 -0
  814. package/node_modules/zod/v4/core/errors.d.cts +208 -0
  815. package/node_modules/zod/v4/core/errors.d.ts +208 -0
  816. package/node_modules/zod/v4/core/errors.js +195 -0
  817. package/node_modules/zod/v4/core/function.cjs +102 -0
  818. package/node_modules/zod/v4/core/function.d.cts +52 -0
  819. package/node_modules/zod/v4/core/function.d.ts +52 -0
  820. package/node_modules/zod/v4/core/function.js +75 -0
  821. package/node_modules/zod/v4/core/index.cjs +44 -0
  822. package/node_modules/zod/v4/core/index.d.cts +15 -0
  823. package/node_modules/zod/v4/core/index.d.ts +15 -0
  824. package/node_modules/zod/v4/core/index.js +15 -0
  825. package/node_modules/zod/v4/core/json-schema.cjs +2 -0
  826. package/node_modules/zod/v4/core/json-schema.d.cts +87 -0
  827. package/node_modules/zod/v4/core/json-schema.d.ts +87 -0
  828. package/node_modules/zod/v4/core/json-schema.js +1 -0
  829. package/node_modules/zod/v4/core/parse.cjs +87 -0
  830. package/node_modules/zod/v4/core/parse.d.cts +25 -0
  831. package/node_modules/zod/v4/core/parse.d.ts +25 -0
  832. package/node_modules/zod/v4/core/parse.js +57 -0
  833. package/node_modules/zod/v4/core/regexes.cjs +103 -0
  834. package/node_modules/zod/v4/core/regexes.d.cts +62 -0
  835. package/node_modules/zod/v4/core/regexes.d.ts +62 -0
  836. package/node_modules/zod/v4/core/regexes.js +95 -0
  837. package/node_modules/zod/v4/core/registries.cjs +56 -0
  838. package/node_modules/zod/v4/core/registries.d.cts +35 -0
  839. package/node_modules/zod/v4/core/registries.d.ts +35 -0
  840. package/node_modules/zod/v4/core/registries.js +51 -0
  841. package/node_modules/zod/v4/core/schemas.cjs +1748 -0
  842. package/node_modules/zod/v4/core/schemas.d.cts +1041 -0
  843. package/node_modules/zod/v4/core/schemas.d.ts +1041 -0
  844. package/node_modules/zod/v4/core/schemas.js +1717 -0
  845. package/node_modules/zod/v4/core/standard-schema.cjs +2 -0
  846. package/node_modules/zod/v4/core/standard-schema.d.cts +55 -0
  847. package/node_modules/zod/v4/core/standard-schema.d.ts +55 -0
  848. package/node_modules/zod/v4/core/standard-schema.js +1 -0
  849. package/node_modules/zod/v4/core/to-json-schema.cjs +854 -0
  850. package/node_modules/zod/v4/core/to-json-schema.d.cts +88 -0
  851. package/node_modules/zod/v4/core/to-json-schema.d.ts +88 -0
  852. package/node_modules/zod/v4/core/to-json-schema.js +849 -0
  853. package/node_modules/zod/v4/core/util.cjs +539 -0
  854. package/node_modules/zod/v4/core/util.d.cts +183 -0
  855. package/node_modules/zod/v4/core/util.d.ts +183 -0
  856. package/node_modules/zod/v4/core/util.js +493 -0
  857. package/node_modules/zod/v4/core/versions.cjs +8 -0
  858. package/node_modules/zod/v4/core/versions.d.cts +5 -0
  859. package/node_modules/zod/v4/core/versions.d.ts +5 -0
  860. package/node_modules/zod/v4/core/versions.js +5 -0
  861. package/node_modules/zod/v4/index.cjs +22 -0
  862. package/node_modules/zod/v4/index.d.cts +3 -0
  863. package/node_modules/zod/v4/index.d.ts +3 -0
  864. package/node_modules/zod/v4/index.js +3 -0
  865. package/node_modules/zod/v4/locales/ar.cjs +142 -0
  866. package/node_modules/zod/v4/locales/ar.d.cts +4 -0
  867. package/node_modules/zod/v4/locales/ar.d.ts +4 -0
  868. package/node_modules/zod/v4/locales/ar.js +116 -0
  869. package/node_modules/zod/v4/locales/az.cjs +141 -0
  870. package/node_modules/zod/v4/locales/az.d.cts +4 -0
  871. package/node_modules/zod/v4/locales/az.d.ts +4 -0
  872. package/node_modules/zod/v4/locales/az.js +115 -0
  873. package/node_modules/zod/v4/locales/be.cjs +190 -0
  874. package/node_modules/zod/v4/locales/be.d.cts +4 -0
  875. package/node_modules/zod/v4/locales/be.d.ts +4 -0
  876. package/node_modules/zod/v4/locales/be.js +164 -0
  877. package/node_modules/zod/v4/locales/ca.cjs +144 -0
  878. package/node_modules/zod/v4/locales/ca.d.cts +4 -0
  879. package/node_modules/zod/v4/locales/ca.d.ts +4 -0
  880. package/node_modules/zod/v4/locales/ca.js +118 -0
  881. package/node_modules/zod/v4/locales/cs.cjs +161 -0
  882. package/node_modules/zod/v4/locales/cs.d.cts +4 -0
  883. package/node_modules/zod/v4/locales/cs.d.ts +4 -0
  884. package/node_modules/zod/v4/locales/cs.js +135 -0
  885. package/node_modules/zod/v4/locales/de.cjs +142 -0
  886. package/node_modules/zod/v4/locales/de.d.cts +4 -0
  887. package/node_modules/zod/v4/locales/de.d.ts +4 -0
  888. package/node_modules/zod/v4/locales/de.js +116 -0
  889. package/node_modules/zod/v4/locales/en.cjs +145 -0
  890. package/node_modules/zod/v4/locales/en.d.cts +5 -0
  891. package/node_modules/zod/v4/locales/en.d.ts +5 -0
  892. package/node_modules/zod/v4/locales/en.js +117 -0
  893. package/node_modules/zod/v4/locales/eo.cjs +144 -0
  894. package/node_modules/zod/v4/locales/eo.d.cts +5 -0
  895. package/node_modules/zod/v4/locales/eo.d.ts +5 -0
  896. package/node_modules/zod/v4/locales/eo.js +116 -0
  897. package/node_modules/zod/v4/locales/es.cjs +143 -0
  898. package/node_modules/zod/v4/locales/es.d.cts +4 -0
  899. package/node_modules/zod/v4/locales/es.d.ts +4 -0
  900. package/node_modules/zod/v4/locales/es.js +117 -0
  901. package/node_modules/zod/v4/locales/fa.cjs +148 -0
  902. package/node_modules/zod/v4/locales/fa.d.cts +4 -0
  903. package/node_modules/zod/v4/locales/fa.d.ts +4 -0
  904. package/node_modules/zod/v4/locales/fa.js +122 -0
  905. package/node_modules/zod/v4/locales/fi.cjs +148 -0
  906. package/node_modules/zod/v4/locales/fi.d.cts +4 -0
  907. package/node_modules/zod/v4/locales/fi.d.ts +4 -0
  908. package/node_modules/zod/v4/locales/fi.js +122 -0
  909. package/node_modules/zod/v4/locales/fr-CA.cjs +143 -0
  910. package/node_modules/zod/v4/locales/fr-CA.d.cts +4 -0
  911. package/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
  912. package/node_modules/zod/v4/locales/fr-CA.js +117 -0
  913. package/node_modules/zod/v4/locales/fr.cjs +142 -0
  914. package/node_modules/zod/v4/locales/fr.d.cts +4 -0
  915. package/node_modules/zod/v4/locales/fr.d.ts +4 -0
  916. package/node_modules/zod/v4/locales/fr.js +116 -0
  917. package/node_modules/zod/v4/locales/he.cjs +143 -0
  918. package/node_modules/zod/v4/locales/he.d.cts +4 -0
  919. package/node_modules/zod/v4/locales/he.d.ts +4 -0
  920. package/node_modules/zod/v4/locales/he.js +117 -0
  921. package/node_modules/zod/v4/locales/hu.cjs +143 -0
  922. package/node_modules/zod/v4/locales/hu.d.cts +4 -0
  923. package/node_modules/zod/v4/locales/hu.d.ts +4 -0
  924. package/node_modules/zod/v4/locales/hu.js +117 -0
  925. package/node_modules/zod/v4/locales/id.cjs +142 -0
  926. package/node_modules/zod/v4/locales/id.d.cts +4 -0
  927. package/node_modules/zod/v4/locales/id.d.ts +4 -0
  928. package/node_modules/zod/v4/locales/id.js +116 -0
  929. package/node_modules/zod/v4/locales/index.cjs +84 -0
  930. package/node_modules/zod/v4/locales/index.d.cts +39 -0
  931. package/node_modules/zod/v4/locales/index.d.ts +39 -0
  932. package/node_modules/zod/v4/locales/index.js +39 -0
  933. package/node_modules/zod/v4/locales/it.cjs +143 -0
  934. package/node_modules/zod/v4/locales/it.d.cts +4 -0
  935. package/node_modules/zod/v4/locales/it.d.ts +4 -0
  936. package/node_modules/zod/v4/locales/it.js +117 -0
  937. package/node_modules/zod/v4/locales/ja.cjs +141 -0
  938. package/node_modules/zod/v4/locales/ja.d.cts +4 -0
  939. package/node_modules/zod/v4/locales/ja.d.ts +4 -0
  940. package/node_modules/zod/v4/locales/ja.js +115 -0
  941. package/node_modules/zod/v4/locales/kh.cjs +143 -0
  942. package/node_modules/zod/v4/locales/kh.d.cts +4 -0
  943. package/node_modules/zod/v4/locales/kh.d.ts +4 -0
  944. package/node_modules/zod/v4/locales/kh.js +117 -0
  945. package/node_modules/zod/v4/locales/ko.cjs +147 -0
  946. package/node_modules/zod/v4/locales/ko.d.cts +4 -0
  947. package/node_modules/zod/v4/locales/ko.d.ts +4 -0
  948. package/node_modules/zod/v4/locales/ko.js +121 -0
  949. package/node_modules/zod/v4/locales/mk.cjs +144 -0
  950. package/node_modules/zod/v4/locales/mk.d.cts +4 -0
  951. package/node_modules/zod/v4/locales/mk.d.ts +4 -0
  952. package/node_modules/zod/v4/locales/mk.js +118 -0
  953. package/node_modules/zod/v4/locales/ms.cjs +142 -0
  954. package/node_modules/zod/v4/locales/ms.d.cts +4 -0
  955. package/node_modules/zod/v4/locales/ms.d.ts +4 -0
  956. package/node_modules/zod/v4/locales/ms.js +116 -0
  957. package/node_modules/zod/v4/locales/nl.cjs +143 -0
  958. package/node_modules/zod/v4/locales/nl.d.cts +4 -0
  959. package/node_modules/zod/v4/locales/nl.d.ts +4 -0
  960. package/node_modules/zod/v4/locales/nl.js +117 -0
  961. package/node_modules/zod/v4/locales/no.cjs +142 -0
  962. package/node_modules/zod/v4/locales/no.d.cts +4 -0
  963. package/node_modules/zod/v4/locales/no.d.ts +4 -0
  964. package/node_modules/zod/v4/locales/no.js +116 -0
  965. package/node_modules/zod/v4/locales/ota.cjs +143 -0
  966. package/node_modules/zod/v4/locales/ota.d.cts +4 -0
  967. package/node_modules/zod/v4/locales/ota.d.ts +4 -0
  968. package/node_modules/zod/v4/locales/ota.js +117 -0
  969. package/node_modules/zod/v4/locales/pl.cjs +143 -0
  970. package/node_modules/zod/v4/locales/pl.d.cts +4 -0
  971. package/node_modules/zod/v4/locales/pl.d.ts +4 -0
  972. package/node_modules/zod/v4/locales/pl.js +117 -0
  973. package/node_modules/zod/v4/locales/ps.cjs +148 -0
  974. package/node_modules/zod/v4/locales/ps.d.cts +4 -0
  975. package/node_modules/zod/v4/locales/ps.d.ts +4 -0
  976. package/node_modules/zod/v4/locales/ps.js +122 -0
  977. package/node_modules/zod/v4/locales/pt.cjs +142 -0
  978. package/node_modules/zod/v4/locales/pt.d.cts +4 -0
  979. package/node_modules/zod/v4/locales/pt.d.ts +4 -0
  980. package/node_modules/zod/v4/locales/pt.js +116 -0
  981. package/node_modules/zod/v4/locales/ru.cjs +190 -0
  982. package/node_modules/zod/v4/locales/ru.d.cts +4 -0
  983. package/node_modules/zod/v4/locales/ru.d.ts +4 -0
  984. package/node_modules/zod/v4/locales/ru.js +164 -0
  985. package/node_modules/zod/v4/locales/sl.cjs +143 -0
  986. package/node_modules/zod/v4/locales/sl.d.cts +4 -0
  987. package/node_modules/zod/v4/locales/sl.d.ts +4 -0
  988. package/node_modules/zod/v4/locales/sl.js +117 -0
  989. package/node_modules/zod/v4/locales/sv.cjs +144 -0
  990. package/node_modules/zod/v4/locales/sv.d.cts +4 -0
  991. package/node_modules/zod/v4/locales/sv.d.ts +4 -0
  992. package/node_modules/zod/v4/locales/sv.js +118 -0
  993. package/node_modules/zod/v4/locales/ta.cjs +143 -0
  994. package/node_modules/zod/v4/locales/ta.d.cts +4 -0
  995. package/node_modules/zod/v4/locales/ta.d.ts +4 -0
  996. package/node_modules/zod/v4/locales/ta.js +117 -0
  997. package/node_modules/zod/v4/locales/th.cjs +143 -0
  998. package/node_modules/zod/v4/locales/th.d.cts +4 -0
  999. package/node_modules/zod/v4/locales/th.d.ts +4 -0
  1000. package/node_modules/zod/v4/locales/th.js +117 -0
  1001. package/node_modules/zod/v4/locales/tr.cjs +143 -0
  1002. package/node_modules/zod/v4/locales/tr.d.cts +5 -0
  1003. package/node_modules/zod/v4/locales/tr.d.ts +5 -0
  1004. package/node_modules/zod/v4/locales/tr.js +115 -0
  1005. package/node_modules/zod/v4/locales/ua.cjs +143 -0
  1006. package/node_modules/zod/v4/locales/ua.d.cts +4 -0
  1007. package/node_modules/zod/v4/locales/ua.d.ts +4 -0
  1008. package/node_modules/zod/v4/locales/ua.js +117 -0
  1009. package/node_modules/zod/v4/locales/ur.cjs +143 -0
  1010. package/node_modules/zod/v4/locales/ur.d.cts +4 -0
  1011. package/node_modules/zod/v4/locales/ur.d.ts +4 -0
  1012. package/node_modules/zod/v4/locales/ur.js +117 -0
  1013. package/node_modules/zod/v4/locales/vi.cjs +142 -0
  1014. package/node_modules/zod/v4/locales/vi.d.cts +4 -0
  1015. package/node_modules/zod/v4/locales/vi.d.ts +4 -0
  1016. package/node_modules/zod/v4/locales/vi.js +116 -0
  1017. package/node_modules/zod/v4/locales/zh-CN.cjs +142 -0
  1018. package/node_modules/zod/v4/locales/zh-CN.d.cts +4 -0
  1019. package/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
  1020. package/node_modules/zod/v4/locales/zh-CN.js +116 -0
  1021. package/node_modules/zod/v4/locales/zh-TW.cjs +143 -0
  1022. package/node_modules/zod/v4/locales/zh-TW.d.cts +4 -0
  1023. package/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
  1024. package/node_modules/zod/v4/locales/zh-TW.js +117 -0
  1025. package/node_modules/zod/v4/mini/checks.cjs +34 -0
  1026. package/node_modules/zod/v4/mini/checks.d.cts +1 -0
  1027. package/node_modules/zod/v4/mini/checks.d.ts +1 -0
  1028. package/node_modules/zod/v4/mini/checks.js +1 -0
  1029. package/node_modules/zod/v4/mini/coerce.cjs +47 -0
  1030. package/node_modules/zod/v4/mini/coerce.d.cts +7 -0
  1031. package/node_modules/zod/v4/mini/coerce.d.ts +7 -0
  1032. package/node_modules/zod/v4/mini/coerce.js +17 -0
  1033. package/node_modules/zod/v4/mini/external.cjs +62 -0
  1034. package/node_modules/zod/v4/mini/external.d.cts +11 -0
  1035. package/node_modules/zod/v4/mini/external.d.ts +11 -0
  1036. package/node_modules/zod/v4/mini/external.js +13 -0
  1037. package/node_modules/zod/v4/mini/index.cjs +32 -0
  1038. package/node_modules/zod/v4/mini/index.d.cts +3 -0
  1039. package/node_modules/zod/v4/mini/index.d.ts +3 -0
  1040. package/node_modules/zod/v4/mini/index.js +3 -0
  1041. package/node_modules/zod/v4/mini/iso.cjs +60 -0
  1042. package/node_modules/zod/v4/mini/iso.d.cts +22 -0
  1043. package/node_modules/zod/v4/mini/iso.d.ts +22 -0
  1044. package/node_modules/zod/v4/mini/iso.js +30 -0
  1045. package/node_modules/zod/v4/mini/parse.cjs +8 -0
  1046. package/node_modules/zod/v4/mini/parse.d.cts +1 -0
  1047. package/node_modules/zod/v4/mini/parse.d.ts +1 -0
  1048. package/node_modules/zod/v4/mini/parse.js +1 -0
  1049. package/node_modules/zod/v4/mini/schemas.cjs +839 -0
  1050. package/node_modules/zod/v4/mini/schemas.d.cts +356 -0
  1051. package/node_modules/zod/v4/mini/schemas.d.ts +356 -0
  1052. package/node_modules/zod/v4/mini/schemas.js +732 -0
  1053. package/node_modules/zod/v4-mini/index.cjs +17 -0
  1054. package/node_modules/zod/v4-mini/index.d.cts +1 -0
  1055. package/node_modules/zod/v4-mini/index.d.ts +1 -0
  1056. package/node_modules/zod/v4-mini/index.js +1 -0
  1057. package/package.json +97 -0
@@ -0,0 +1,1986 @@
1
+ var ASSERT = require('assert');
2
+ var ASN1 = require('../../lib/asn1');
3
+ var MD = require('../../lib/md.all');
4
+ var PKI = require('../../lib/pki');
5
+ var UTIL = require('../../lib/util');
6
+
7
+ (function() {
8
+ var _pem = {
9
+ privateKey: '-----BEGIN RSA PRIVATE KEY-----\r\n' +
10
+ 'MIICXQIBAAKBgQDL0EugUiNGMWscLAVM0VoMdhDZEJOqdsUMpx9U0YZI7szokJqQ\r\n' +
11
+ 'NIwokiQ6EonNnWSMlIvy46AhnlRYn+ezeTeU7eMGTkP3VF29vXBo+dLq5e+8VyAy\r\n' +
12
+ 'Q3FzM1wI4ts4hRACF8w6mqygXQ7i/SDu8/rXqRGtvnM+z0MYDdKo80efzwIDAQAB\r\n' +
13
+ 'AoGAIzkGONi5G+JifmXlLJdplom486p3upf4Ce2/7mqfaG9MnkyPSairKD/JXvfh\r\n' +
14
+ 'NNWkkN8DKKDKBcVVElPgORYT0qwrWc7ueLBMUCbRXb1ZyfEulimG0R3kjUh7NYau\r\n' +
15
+ 'DaIkVgfykXGSQMZx8FoaT6L080zd+0emKDDYRrb+/kgJNJECQQDoUZoiC2K/DWNY\r\n' +
16
+ 'h3/ppZ0ane2y4SBmJUHJVMPQ2CEgxsrJTxet668ckNCKaOP/3VFPoWC41f17DvKq\r\n' +
17
+ 'noYINNntAkEA4JbZBZBVUrQFhHlrpXT4jzqtO2RlKZzEq8qmFZfEErxOT1WMyyCi\r\n' +
18
+ 'lAQ5gUKardo1Kf0omC8Xq/uO9ZYdED55KwJBALs6cJ65UFaq4oLJiQPzLd7yokuE\r\n' +
19
+ 'dcj8g71PLBTW6jPxIiMFNA89nz3FU9wIVp+xbMNhSoMMKqIPVPC+m0Rn260CQQDA\r\n' +
20
+ 'I83fWK/mZWUjBM33a68KumRiH238v8XyQxj7+C8i6D8G2GXvkigFAehAkb7LZZd+\r\n' +
21
+ 'KLuGFyPlWv3fVWHf99KpAkBQFKk3MRMl6IGJZUEFQe4l5whm8LkGU4acSqv9B3xt\r\n' +
22
+ 'qROkCrsFrMPqjuuzEmyHoQZ64r2PLJg7FOuyhBnQUOt4\r\n' +
23
+ '-----END RSA PRIVATE KEY-----\r\n',
24
+ publicKey: '-----BEGIN PUBLIC KEY-----\r\n' +
25
+ 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDL0EugUiNGMWscLAVM0VoMdhDZ\r\n' +
26
+ 'EJOqdsUMpx9U0YZI7szokJqQNIwokiQ6EonNnWSMlIvy46AhnlRYn+ezeTeU7eMG\r\n' +
27
+ 'TkP3VF29vXBo+dLq5e+8VyAyQ3FzM1wI4ts4hRACF8w6mqygXQ7i/SDu8/rXqRGt\r\n' +
28
+ 'vnM+z0MYDdKo80efzwIDAQAB\r\n' +
29
+ '-----END PUBLIC KEY-----\r\n',
30
+ certificate: '-----BEGIN CERTIFICATE-----\r\n' +
31
+ 'MIIDIjCCAougAwIBAgIJANE2aHSbwpaRMA0GCSqGSIb3DQEBBQUAMGoxCzAJBgNV\r\n' +
32
+ 'BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVyZzEN\r\n' +
33
+ 'MAsGA1UEChMEVGVzdDENMAsGA1UECxMEVGVzdDEVMBMGA1UEAxMMbXlzZXJ2ZXIu\r\n' +
34
+ 'Y29tMB4XDTEwMDYxOTE3MzYyOFoXDTExMDYxOTE3MzYyOFowajELMAkGA1UEBhMC\r\n' +
35
+ 'VVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYDVQQHEwpCbGFja3NidXJnMQ0wCwYD\r\n' +
36
+ 'VQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MRUwEwYDVQQDEwxteXNlcnZlci5jb20w\r\n' +
37
+ 'gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMvQS6BSI0YxaxwsBUzRWgx2ENkQ\r\n' +
38
+ 'k6p2xQynH1TRhkjuzOiQmpA0jCiSJDoSic2dZIyUi/LjoCGeVFif57N5N5Tt4wZO\r\n' +
39
+ 'Q/dUXb29cGj50url77xXIDJDcXMzXAji2ziFEAIXzDqarKBdDuL9IO7z+tepEa2+\r\n' +
40
+ 'cz7PQxgN0qjzR5/PAgMBAAGjgc8wgcwwHQYDVR0OBBYEFPV1Y+DHXW6bA/r9sv1y\r\n' +
41
+ 'NJ8jAwMAMIGcBgNVHSMEgZQwgZGAFPV1Y+DHXW6bA/r9sv1yNJ8jAwMAoW6kbDBq\r\n' +
42
+ 'MQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEzARBgNVBAcTCkJsYWNr\r\n' +
43
+ 'c2J1cmcxDTALBgNVBAoTBFRlc3QxDTALBgNVBAsTBFRlc3QxFTATBgNVBAMTDG15\r\n' +
44
+ 'c2VydmVyLmNvbYIJANE2aHSbwpaRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF\r\n' +
45
+ 'BQADgYEARdH2KOlJWTC1CS2y/PAvg4uiM31PXMC1hqSdJlnLM1MY4hRfuf9VyTeX\r\n' +
46
+ 'Y6FdybcyDLSxKn9id+g9229ci9/s9PI+QmD5vXd8yZyScLc2JkYB4GC6+9D1+/+x\r\n' +
47
+ 's2hzMxuK6kzZlP+0l9LGcraMQPGRydjCARZZm4Uegln9rh85XFQ=\r\n' +
48
+ '-----END CERTIFICATE-----\r\n'
49
+ };
50
+
51
+ var _pem_sha256 = {
52
+ privateKey: '-----BEGIN RSA PRIVATE KEY-----\r\n' +
53
+ 'MIIEpAIBAAKCAQEAgqu7/2ntXa9rzqiUvDD2swStK8w7MFtha/OiwzEDJng7mZUs\r\n' +
54
+ 'uy7Neqh5S1Z+nWq7NP51ol//tnNCrWM6VozrJKTAEC2qj3k+bMWnjuTU7sTJHpoZ\r\n' +
55
+ '9wdCqS9q7oOJhqwBxS7M9l8LNA+6I4Qj1bY1g2XeZsxEjJfCvILa3yBzztL3CxSF\r\n' +
56
+ 'R36FoOo9IpzYlVcE9mqTdJgTwR43ZsFNCRAkfSqJjLKy1A2+aDxUcrom2OrLSITI\r\n' +
57
+ 'CWqz5R1hFIIIB0aprjpz5F2MunciUAhTjUqrQPCtw17wmwmaeXZsu0zoq9P/VtKE\r\n' +
58
+ 'AxtQkS4tqgnodBzmmgM8YemjkJAVHQzkH8jiGQIDAQABAoIBAQAMuYiPMNOKogCP\r\n' +
59
+ 'mV8SjHoZqMTsVPEWnm94QbuB4o35+w9iv2IhwEcGQM2/BmdCERi16mmuLEcMj2DY\r\n' +
60
+ '3abastJbOSfy61+GpTntAbp1cddCgStMrZkFs1FMhG+XVnvX/3wUpaAUBeFjanyn\r\n' +
61
+ '5MBQmXPQneTwgcfTIRw3m06RF+nvI/ssIz6oHTDTTwRanTa64KYCww/fcX0XCLGw\r\n' +
62
+ 'D4GYaRrBLvglp27omQCLuCBp1Dedwx5+JRnybyQm1ZYVJ0kirD/qVDRJqQN6z2N/\r\n' +
63
+ '3XmvOc6yNnzNQwKDlFFs6VxLG/i/sv+TekiPIP2LIQ1V/0ojUJriRdPAe/dhER5E\r\n' +
64
+ 'ku2n+k75AoGBAPDUZNyqPqFTUaLj6mdTEIvLbG0Dx0/EZTalUohFUBpJSxSUuNIS\r\n' +
65
+ '6z+2dohTO5qj6Mv1JpXqXEWmRQisBl8ibizD5KJkgQW0EptmJf5BU9bnqYllgjZj\r\n' +
66
+ 'jJsBixFFcwbFUwD4vg7NjYrxEv2Wjv8II0rVNbEh61F35vMNdmgMsu0TAoGBAIrm\r\n' +
67
+ '7NbFDDBWREyFZKZdVhTo2AR8JyWuWdOO7EFbv+mzHy7TkgscwYlV4yeU/+TG6KLG\r\n' +
68
+ 'WPo5AX2mWL/zI2Zjd2Quw002e6Y9ZIO8CUK8iocrvhNy+Bfli2XyjYZxRIILQeKX\r\n' +
69
+ 'ID/h+gyzViKOXFclbUkubnm/kEGwWO8hRQvh/TWjAoGAUwbGZxUCVpfk8yVkMI8A\r\n' +
70
+ 'i1FsZgEBe8yXoElKtNRAk29lRQko1rPTCrobD1CyodOUdIxl6xVLDnAOKLk10SKL\r\n' +
71
+ 'nT9D2YCQwqicKZsDyi43e0WOu2GVjK6xUNctXJz21QS+Yv1eeLgA7j/Cbk6zqdTi\r\n' +
72
+ 'ZfAvfIvXFtUhd/XSNnj6TqUCgYBKGrE4U6ARGbUObgwohZsrRJ4apnHsNHxP1exN\r\n' +
73
+ 'Yjmc4Kc+QDmmHA1Uy7GIqIFs+IGcdd16gXc+JcUrgvfb5C0KEbi4NNz67730WhlG\r\n' +
74
+ 'tXfibX/WuHuLpDceiKzgkQVPq9nWnXHjIxhYNkU54mF5TMplRJRD9+NqaD7KNSG1\r\n' +
75
+ 'GTgRqQKBgQCSJ2W29p2uOrl+OcogFMSfZYkwJsKR25S/c7BAvsH7dVdtqSdBsRg2\r\n' +
76
+ 'zWEwWAGyd7BJsZd0gVCea9CHfZYwDoCC4nA7sRFVLAqWfRsmrALORIiXHBYD6SrL\r\n' +
77
+ 'H1G4nr6HK6/Ur0WTQQmwyz1Yw+ZhyShVRo+9NN2a3gA1n25wP3n6gQ==\r\n' +
78
+ '-----END RSA PRIVATE KEY-----\r\n',
79
+ publicKey: '-----BEGIN PUBLIC KEY-----\r\n' +
80
+ 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgqu7/2ntXa9rzqiUvDD2\r\n' +
81
+ 'swStK8w7MFtha/OiwzEDJng7mZUsuy7Neqh5S1Z+nWq7NP51ol//tnNCrWM6Vozr\r\n' +
82
+ 'JKTAEC2qj3k+bMWnjuTU7sTJHpoZ9wdCqS9q7oOJhqwBxS7M9l8LNA+6I4Qj1bY1\r\n' +
83
+ 'g2XeZsxEjJfCvILa3yBzztL3CxSFR36FoOo9IpzYlVcE9mqTdJgTwR43ZsFNCRAk\r\n' +
84
+ 'fSqJjLKy1A2+aDxUcrom2OrLSITICWqz5R1hFIIIB0aprjpz5F2MunciUAhTjUqr\r\n' +
85
+ 'QPCtw17wmwmaeXZsu0zoq9P/VtKEAxtQkS4tqgnodBzmmgM8YemjkJAVHQzkH8ji\r\n' +
86
+ 'GQIDAQAB\r\n' +
87
+ '-----END PUBLIC KEY-----\r\n',
88
+ certificate: '-----BEGIN CERTIFICATE-----\r\n' +
89
+ 'MIIECTCCAvGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBpMRQwEgYDVQQDEwtleGFt\r\n' +
90
+ 'cGxlLm9yZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYDVQQH\r\n' +
91
+ 'EwpCbGFja3NidXJnMQ0wCwYDVQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MB4XDTE1\r\n' +
92
+ 'MTAwOTE3NTc1NloXDTE2MTAwOTE3NTc1NlowaTEUMBIGA1UEAxMLZXhhbXBsZS5v\r\n' +
93
+ 'cmcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxh\r\n' +
94
+ 'Y2tzYnVyZzENMAsGA1UEChMEVGVzdDENMAsGA1UECxMEVGVzdDCCASIwDQYJKoZI\r\n' +
95
+ 'hvcNAQEBBQADggEPADCCAQoCggEBAIKru/9p7V2va86olLww9rMErSvMOzBbYWvz\r\n' +
96
+ 'osMxAyZ4O5mVLLsuzXqoeUtWfp1quzT+daJf/7ZzQq1jOlaM6ySkwBAtqo95PmzF\r\n' +
97
+ 'p47k1O7EyR6aGfcHQqkvau6DiYasAcUuzPZfCzQPuiOEI9W2NYNl3mbMRIyXwryC\r\n' +
98
+ '2t8gc87S9wsUhUd+haDqPSKc2JVXBPZqk3SYE8EeN2bBTQkQJH0qiYyystQNvmg8\r\n' +
99
+ 'VHK6Jtjqy0iEyAlqs+UdYRSCCAdGqa46c+RdjLp3IlAIU41Kq0DwrcNe8JsJmnl2\r\n' +
100
+ 'bLtM6KvT/1bShAMbUJEuLaoJ6HQc5poDPGHpo5CQFR0M5B/I4hkCAwEAAaOBuzCB\r\n' +
101
+ 'uDAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIC9DA7BgNVHSUENDAyBggrBgEFBQcD\r\n' +
102
+ 'AQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwgwEQYJYIZI\r\n' +
103
+ 'AYb4QgEBBAQDAgD3MCwGA1UdEQQlMCOGG2h0dHA6Ly9leGFtcGxlLm9yZy93ZWJp\r\n' +
104
+ 'ZCNtZYcEfwAAATAdBgNVHQ4EFgQUyX839dHHD+pAfU9F5t/rpQaq3LQwDQYJKoZI\r\n' +
105
+ 'hvcNAQELBQADggEBAGfr9yMwTXoHbZAj/8bRCfKUUg/xIbQY0RtuDwGKBnzVcz7r\r\n' +
106
+ 'NpocyEBUFvlbsXK4Dwpql41nYPwEpmm486gpWDqSBB0p0jF3HNHihKhCcR0LDQLt\r\n' +
107
+ 'hBP7SbX76uL4cHoJkbAVbc4FGARCkE7eVZ0sBWUPmLqVh2JmzlC3geq7Obs7HCvq\r\n' +
108
+ 'eStorsBlDZt27/N+xhvxdUTGJgiTBxk6BrRLGxUeor9TLRpZ2wsoMSnkIcQyooZ4\r\n' +
109
+ 'iGAZsqUyanWODz0o6R02kSpTA3zx6LssLuLdnxfi1EmHMSM27Lxuw308XzirTxM2\r\n' +
110
+ '/N0H5AwUc057+HoygLPfddxOfxHGXz4VmEKMcJ8=\r\n' +
111
+ '-----END CERTIFICATE-----\r\n'
112
+ };
113
+
114
+ var _pem_sha512 = {
115
+ privateKey: '-----BEGIN RSA PRIVATE KEY-----\r\n' +
116
+ 'MIIEowIBAAKCAQEAmy+xwQpZMYkMWHhw+kh2TDGbG+AF1w6BFVQ6CduEjUzD5d/j\r\n' +
117
+ 'URtkaeb0RO/uba+J92DMgJJLWlcTe5FpQMb2lxOrNoYP+suWnNxU7QD5vQ4OiJ+i\r\n' +
118
+ '3nTMly9LMB3BEEea2ZJRpVboJxRBeGl6pKz4obFfoFxqtSww38Cw8h5Nplt+LXR/\r\n' +
119
+ 'wq8yCpmN9hTE4CSw8iioIqxOZem3sz4//jcMHJ5/aiTjXwseE8eWjaVfvpDESuwQ\r\n' +
120
+ 'MNjfJYYP0onzEZmTtztyAspsyf0GZBjd1ew2nVCY0cCkQ1+tqYk7H9rjlj1PxduC\r\n' +
121
+ 'a4aGVKZjIBFnZXhCE23znOgVt9PxFMPUrmHwqwIDAQABAoIBAC68UWMak7wIUxB9\r\n' +
122
+ 'zUCC/CV8NwNRF1EqDBP5VrVLSAMp4EFliNcPUdFW/a+ZNowP9pPqsgvygwEFAlgP\r\n' +
123
+ 'dcxNX0wmX0S/YSadk5FQBb+OsKeQCS56LRmjwU2yr4khHNijR+5IU5BguO+z+Pej\r\n' +
124
+ 'hIz9jq9bdLoduwEu+tUX+fIg0C/OGfxKQrOXIW3hiJDilx2Bt+eyUYrtIxBhwNC9\r\n' +
125
+ 'jwwMCUFlcbvQSwq+Vx50v2LVjqalJMdMLQiULsF9nPw7EdUJz+aoM4STv7l4miXi\r\n' +
126
+ 'utkF4xlAl8lnJKOycsFPbqBBaypZoY3O3mKkWtSFRjD4oNW/juBGHTimPWRYgW3V\r\n' +
127
+ 'Q+IVHpkCgYEA75+vMp2Expq+iCa+UoV48HIVdiCaCk4vRedVe4IHyWxEkaliCHga\r\n' +
128
+ 'e9wAsxWipDxROv3yoLxlbddnZSD2YaYaIALH/xpSWlcBHZupyq6jNF7R+14Yx155\r\n' +
129
+ '88iGyoYKNE2VrcVlL164LIqaEB4lxYanhotwqcC5O6IOhpZZ7jSC/H8CgYEApcq9\r\n' +
130
+ '/G5po1BgYVZ2hdxTqdx8wniWaQNd7EVpogBhJ4KLC+tN42+vBHJT6BQp/PFRWjY5\r\n' +
131
+ 'fiC1zwI8ufL12F4T8+ZcQVZkHpLjKporYolYmQm/T8wNDwOziYB67Jp9M2EHdei/\r\n' +
132
+ 'HNo2FUsXRm+Tb1utiQn7AyJ6PHwwJAU1LbtYpdUCgYEAg4R/YiZ2c5MHNC8fkqdT\r\n' +
133
+ 'Q5U6FkW6hiF3bMSVdF5f67uSvufauI9C6exMLf6X79BzPQ+YlYQRn4H0a9r1n47N\r\n' +
134
+ 'E/iy0F8gCBlssVV4kZfcV6gbU/3HV9WQ1a6f3JRJEX/rwR5wdNll+HxyJpqFXK6V\r\n' +
135
+ 'UBFEWsc+Y26EznXDEiycH/0CgYBxwfMqSfhh/ryjDVi18L/XRVq1dVh/JbhEbjxU\r\n' +
136
+ '1D3VhlUyEHqZHADS5D9+dpd433wakipQyND3AWn5jSPzGlpGeEHE8yovcEo+6Rnr\r\n' +
137
+ 'uqH4ICAM+M3dB4UhS+8MedR+dI1R8ilv+qoxYhzOT7CyMA2agiaht/53kh7WGFys\r\n' +
138
+ 'zGe/IQKBgALJnE5CVQLaJgFcWGH2rnD6hWVh1DdV8ockzLg7ulUW0U5gueHWnaWv\r\n' +
139
+ 'PhP/P0YWF250IWmEm73LCZi3Cv3gBIwvn5pV3GHjMUexTQ3iODsGC8SdL0svnUTc\r\n' +
140
+ '5/VlSjAKS4Mn9gwutcXX9/Y2AJa4O6S/QfAQeU5aqkk/Fs+31ose\r\n' +
141
+ '-----END RSA PRIVATE KEY-----\r\n',
142
+ publicKey: '-----BEGIN PUBLIC KEY-----\r\n' +
143
+ 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmy+xwQpZMYkMWHhw+kh2\r\n' +
144
+ 'TDGbG+AF1w6BFVQ6CduEjUzD5d/jURtkaeb0RO/uba+J92DMgJJLWlcTe5FpQMb2\r\n' +
145
+ 'lxOrNoYP+suWnNxU7QD5vQ4OiJ+i3nTMly9LMB3BEEea2ZJRpVboJxRBeGl6pKz4\r\n' +
146
+ 'obFfoFxqtSww38Cw8h5Nplt+LXR/wq8yCpmN9hTE4CSw8iioIqxOZem3sz4//jcM\r\n' +
147
+ 'HJ5/aiTjXwseE8eWjaVfvpDESuwQMNjfJYYP0onzEZmTtztyAspsyf0GZBjd1ew2\r\n' +
148
+ 'nVCY0cCkQ1+tqYk7H9rjlj1PxduCa4aGVKZjIBFnZXhCE23znOgVt9PxFMPUrmHw\r\n' +
149
+ 'qwIDAQAB\r\n' +
150
+ '-----END PUBLIC KEY-----\r\n',
151
+ certificate: '-----BEGIN CERTIFICATE-----\r\n' +
152
+ 'MIIECTCCAvGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBpMRQwEgYDVQQDEwtleGFt\r\n' +
153
+ 'cGxlLm9yZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYDVQQH\r\n' +
154
+ 'EwpCbGFja3NidXJnMQ0wCwYDVQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MB4XDTE1\r\n' +
155
+ 'MTAwOTE4MDEwOVoXDTE2MTAwOTE4MDEwOVowaTEUMBIGA1UEAxMLZXhhbXBsZS5v\r\n' +
156
+ 'cmcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxh\r\n' +
157
+ 'Y2tzYnVyZzENMAsGA1UEChMEVGVzdDENMAsGA1UECxMEVGVzdDCCASIwDQYJKoZI\r\n' +
158
+ 'hvcNAQEBBQADggEPADCCAQoCggEBAJsvscEKWTGJDFh4cPpIdkwxmxvgBdcOgRVU\r\n' +
159
+ 'OgnbhI1Mw+Xf41EbZGnm9ETv7m2vifdgzICSS1pXE3uRaUDG9pcTqzaGD/rLlpzc\r\n' +
160
+ 'VO0A+b0ODoifot50zJcvSzAdwRBHmtmSUaVW6CcUQXhpeqSs+KGxX6BcarUsMN/A\r\n' +
161
+ 'sPIeTaZbfi10f8KvMgqZjfYUxOAksPIoqCKsTmXpt7M+P/43DByef2ok418LHhPH\r\n' +
162
+ 'lo2lX76QxErsEDDY3yWGD9KJ8xGZk7c7cgLKbMn9BmQY3dXsNp1QmNHApENframJ\r\n' +
163
+ 'Ox/a45Y9T8XbgmuGhlSmYyARZ2V4QhNt85zoFbfT8RTD1K5h8KsCAwEAAaOBuzCB\r\n' +
164
+ 'uDAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIC9DA7BgNVHSUENDAyBggrBgEFBQcD\r\n' +
165
+ 'AQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwgwEQYJYIZI\r\n' +
166
+ 'AYb4QgEBBAQDAgD3MCwGA1UdEQQlMCOGG2h0dHA6Ly9leGFtcGxlLm9yZy93ZWJp\r\n' +
167
+ 'ZCNtZYcEfwAAATAdBgNVHQ4EFgQUaC1StQewfZ4bMUDUsnpzy/4+CZ8wDQYJKoZI\r\n' +
168
+ 'hvcNAQENBQADggEBAGy58GzpSG3KAv0DILJPWhtxTRvbnd02AWO6fhCdx+siyQ02\r\n' +
169
+ 'aKgkf1sAS0MGDDMGiwMKvBTz8+8HnfFx6cA7NG7xtuw9m8yb1LeNLbOc3/TCrG/U\r\n' +
170
+ 'A27ZediP+hCqElB9MtNHyOx/vv+gdKXTFDG4PlykNFmFsGjrA+sA0OtwKRLPQCxp\r\n' +
171
+ 'rUtGw+cw+xy3O68/unCl86wc8PA5r4uAaQBXdWThpAL0KJI1ky7auUwpsR+aWILJ\r\n' +
172
+ '0x6a9LOUnCMbbOTN31vRweFxD0qS2J8QMDkfNflvEWmpIZHF4UEoietXk+suP9tc\r\n' +
173
+ '87rtT63BEY6KcZJJ+oDnKiZuAujmf1iezC+YORs=\r\n' +
174
+ '-----END CERTIFICATE-----\r\n'
175
+ };
176
+
177
+ var _pem_same_subject = [
178
+ '-----BEGIN CERTIFICATE-----\r\n' +
179
+ 'MIIBrDCCARWgAwIBAgIBATANBgkqhkiG9w0BAQUFADAAMB4XDTE2MDgwNDE0NDcw\r\n' +
180
+ 'MFoXDTE3MDgwNDE0NDcwMFowGTEXMBUGA1UEAxMOQ2VydCBBdXRob3JpdHkwgZ8w\r\n' +
181
+ 'DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMsBaqRGPC6bZh22NMmATSZq6E70SLfN\r\n' +
182
+ 'esKFOG337k2belUHr9tXU2699p0fJjNgDntNTo+0Sfu5mMa+zAUqJ3PzQcJ2NVY7\r\n' +
183
+ 'tYPqhDoPPooi8gv5F7EZZzZZ1FfkdHMSJVOwEn2ZAskN7eJyycibKIwRWu1ky8AK\r\n' +
184
+ 'M6lZvzGgDaORAgMBAAGjHTAbMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgLEMA0G\r\n' +
185
+ 'CSqGSIb3DQEBBQUAA4GBACYSi4PVsQVBu8vgUwDWNJs6+Qvuo4FtRuQNDg+aOa/O\r\n' +
186
+ 'MyOQBv3flEHNGrg7BN72tAdmlZLjp/dz87u8AwRNdW0KqF3zYI9Hsni3JDQjC/ga\r\n' +
187
+ '//Si48IbHpJrApQD7y9wwO4xjZbHQPRQ8BUJZgg57xeQqDe95vnQ62c7Eqdt97e9\r\n' +
188
+ '-----END CERTIFICATE-----\r\n',
189
+ '-----BEGIN CERTIFICATE-----\r\n' +
190
+ 'MIIBrzCCARigAwIBAgIBAjANBgkqhkiG9w0BAQUFADAAMB4XDTE2MDgwNDE0NDcw\r\n' +
191
+ 'MFoXDTE4MDgwNDE0NDcwMFowGTEXMBUGA1UEAxMOQ2VydCBBdXRob3JpdHkwgZ8w\r\n' +
192
+ 'DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOepv6vtleShp+A4XwJwqVAoAkEeR3dG\r\n' +
193
+ '6ogwYTNMTtLMXoYYXPj3UnKSUbK0XiCY/UK1rSC6/jp8OMb9xvVZ5+AH3y7h2FRm\r\n' +
194
+ 'gNLGGjuBPnfBea6FEuptk+//eheAQ0wl6Wre96zxILSyrPzBy8F91Ht/psO0WXIl\r\n' +
195
+ 'dfh/XHhBY3D1AgMBAAGjIDAeMA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgKE\r\n' +
196
+ 'MA0GCSqGSIb3DQEBBQUAA4GBAIYjbuzf2dANljhEgAWVPeu50OJJYLoV5umRQjXF\r\n' +
197
+ 'WfXc53ODU0usuHeeH14a63zW1jqfHgc475WEMgMLL/k0FechIuC9AdcDEgzGmBSG\r\n' +
198
+ 'PDV8nxhU98gpj6I7ewsVk31WDQhFYeSuYJiDiiL47P0BXJLWb+86fFiQklsm5y0h\r\n' +
199
+ 'Xt0s\r\n' +
200
+ '-----END CERTIFICATE-----\r\n'
201
+ ];
202
+
203
+ var _pem_past_2050 = {
204
+ privateKey: '-----BEGIN PRIVATE KEY-----\r\n' +
205
+ 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtQM1R5VoB8Hrr\r\n' +
206
+ 'hdL514H+oQN/FSIiHXsdoZlQqUEQ7yUBgC2c7fbq4Wm9AUHBkc/KfUGb9+ZeX6xo\r\n' +
207
+ '6L06M57QBD8nkSTStNHozlOwjnKu7DnlyW4j3ej9rBZzshLzAvWGZkx5sR1Eyz/2\r\n' +
208
+ '2Ns9PL+S4h3eiRGpTw3g3geI1wxBv3CCb/LUF5Wa4NWwIU1GP9S6d8MrOb3WGhR3\r\n' +
209
+ '64ZxajxSeX8R9WLsAo1Qx0dhsJ/UMwIibZ3hA9y1VBma2QyqQMzdY9OYC4oyE646\r\n' +
210
+ 'WfyJzHscpc6KNiVsWnYDP9+NStQlvaXMwhaPFpyVkLLB0vHho4oMXgEDTCH1iIe4\r\n' +
211
+ 'YGw01wQ/AgMBAAECggEAdx1wjHfFNEQkHr25WbDDXU9SWhMrjoz6UlsCT6SuaXgh\r\n' +
212
+ '1zBLK/OnqcEks5+jl/QqCqunahY8OnJI1S/+uX84Fwh0az2tNXjAQPFqNJ8bVgxv\r\n' +
213
+ 'mf6tTNeLEq04Gn856/4C1E6NEbWly+B5r7tUsHuNsuznYFKY4/DIN+wu/fPsJ17X\r\n' +
214
+ 'vbZiev6+OID/XCKPYWNRYiszBcmktGM5L+JLcYYPpxFYGFtw+khhUlazx0OmIuDB\r\n' +
215
+ 'AaePTtyXb1qQNKHv6wy7l+BTBKAlxoQQHMCw5qsnCr9RHed7LJr0kssUbVaseUOg\r\n' +
216
+ 'KMWtRG0Ms3ovOPWsVFC509gbGal8q+NSwyKd07SlQQKBgQDZX6bwE1H+V7r5GJwz\r\n' +
217
+ 'EGRLrMUDbbCb2qqZcSn+TCk9hsJ6jeSwz9KjZ2qONcmMl3WY6XAOdTjmJZl20wF9\r\n' +
218
+ 'GV58pZAoPhLh6tByX9RlUffXz+1KKMP0/5cxmwV8N0RBWrHcmRc6yMwJGZE7qBUh\r\n' +
219
+ 'JX/77xj9yPoDW+uOSGp+f0nZMQKBgQDMChqQF1cw7iIljzmtOhSnSEiCH7WYCJgp\r\n' +
220
+ 'um7KEGfFXxbNX07g6pojdjVFFf9uA6tPaiTnwXLc8wI8yiuwt8yPh60QTrcW/E/0\r\n' +
221
+ '+iQQGkwrFvWybbEuI++K6rOXdNMq7FEU467qN26lzHpagSEn6bXdss8L7AOcGRif\r\n' +
222
+ '0E/rSXlYbwKBgQDHFAA6vScJzmUxvyVG6ws/90IT6sClbHVzxB1WhX/7llDElvFM\r\n' +
223
+ 'MXlTJ+KBzacB+LC904VJ6Hes5+CN35/sZ3COrb7B7F+0wi4XocZO6OwYnZhPo9gb\r\n' +
224
+ 'qH1a9APpCGCdjid4xkhtEPs0llLZlQ2M5uA45ng37Xlz3Bp2m8HUilUi8QKBgQCa\r\n' +
225
+ 'RpV5F7zciWIWRipVGZJePeBdSz6SOwVan9V/QVJFQTXLiWHp3Fk5sPpsR0rAU1Pn\r\n' +
226
+ 'kxlehr2j5LZvYmoQj5jDedHYf7weTB7k23IDHu8ysYSLKjeK7K8FuZqbTUERtmdE\r\n' +
227
+ 'RTePbuRhxq9I2VRJioPxom680/KSx8L/q5GSFRcETwKBgDZhnBZ7+dIKlPAgfwPC\r\n' +
228
+ 'OCA2kKE+5UxyeAUeojNrSfHGdzF891PX+90D7sPfJi7SJU4E/UOMG/u8wUv5i2/+\r\n' +
229
+ '/nKOI6NwKB/m0FqpvxamuNJapn9RQ9bC7oz0Rj2Tho90mohwQG4DHF2uO8364Wb+\r\n' +
230
+ '9Bu1FCWmILPGcJM5iw6TJPA0\r\n' +
231
+ '-----END PRIVATE KEY-----\r\n',
232
+ certificate: '-----BEGIN CERTIFICATE-----\r\n' +
233
+ 'MIIDqjCCApKgAwIBAgIJAJvrXrdlRWTTMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\r\n' +
234
+ 'BAYTAlVTMRAwDgYDVQQIDAdWaXJnaW5hMRMwEQYDVQQHDApCbGFja3NidXJnMQ0w\r\n' +
235
+ 'CwYDVQQKDARUZXN0MQ0wCwYDVQQLDARUZXN0MRQwEgYDVQQDDAtleGFtcGxlLm9y\r\n' +
236
+ 'ZzAiGA8yMDUwMDIwMTIzMDAyOVoYDzIwNTEwMjAxMjMwMDI5WjBoMQswCQYDVQQG\r\n' +
237
+ 'EwJVUzEQMA4GA1UECAwHVmlyZ2luYTETMBEGA1UEBwwKQmxhY2tzYnVyZzENMAsG\r\n' +
238
+ 'A1UECgwEVGVzdDENMAsGA1UECwwEVGVzdDEUMBIGA1UEAwwLZXhhbXBsZS5vcmcw\r\n' +
239
+ 'ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtQM1R5VoB8HrrhdL514H+\r\n' +
240
+ 'oQN/FSIiHXsdoZlQqUEQ7yUBgC2c7fbq4Wm9AUHBkc/KfUGb9+ZeX6xo6L06M57Q\r\n' +
241
+ 'BD8nkSTStNHozlOwjnKu7DnlyW4j3ej9rBZzshLzAvWGZkx5sR1Eyz/22Ns9PL+S\r\n' +
242
+ '4h3eiRGpTw3g3geI1wxBv3CCb/LUF5Wa4NWwIU1GP9S6d8MrOb3WGhR364ZxajxS\r\n' +
243
+ 'eX8R9WLsAo1Qx0dhsJ/UMwIibZ3hA9y1VBma2QyqQMzdY9OYC4oyE646WfyJzHsc\r\n' +
244
+ 'pc6KNiVsWnYDP9+NStQlvaXMwhaPFpyVkLLB0vHho4oMXgEDTCH1iIe4YGw01wQ/\r\n' +
245
+ 'AgMBAAGjUzBRMB0GA1UdDgQWBBRxifZwjEsDjYgbajBq+e1r4krdwjAfBgNVHSME\r\n' +
246
+ 'GDAWgBRxifZwjEsDjYgbajBq+e1r4krdwjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\r\n' +
247
+ 'SIb3DQEBCwUAA4IBAQB0V8zdJ1WebOvZNwl6WcbzNJRQePPnGp9pAbGuqpLZHvs6\r\n' +
248
+ 'geAocgmEqleGOsU9GT30MV1vtkR1IY6CWkVPeSiXS43HT8enoYCJX3AZd6ItUrQH\r\n' +
249
+ '8UonY8UqAmzsGLO+ttO5o6kEY6K0e1QUdmFkOh9Z6M9U3s3DASwrKQ/xFlHQ2mNi\r\n' +
250
+ 'h7pKaH2+XlDTrCjhO1ip0n4AwG5lgFJpJlVOZ9+Axzc146q/YZqrhXHYU152Wqo/\r\n' +
251
+ 'mFlygydsKNwWdpK5fwGBZkBR8AsZvNZaQ9Rr3Rr3y5Xz7+aPfLfWF5hW+d11ghuy\r\n' +
252
+ 'FDeZMUBehXXEJLXrirfmO2KFmy3iKrniJDDa35Lg\r\n' +
253
+ '-----END CERTIFICATE-----\r\n'
254
+ };
255
+
256
+ describe('x509', function() {
257
+ it('should convert SHA-1 based certificate to/from PEM', function() {
258
+ var certificate = PKI.certificateFromPem(_pem.certificate);
259
+ ASSERT.equal(PKI.certificateToPem(certificate), _pem.certificate);
260
+ });
261
+
262
+ it('should convert SHA-256 based certificate to/from PEM', function() {
263
+ var certificate = PKI.certificateFromPem(_pem_sha256.certificate);
264
+ ASSERT.equal(PKI.certificateToPem(certificate), _pem_sha256.certificate);
265
+ });
266
+
267
+ it('should convert certificate not before < 2050 < not after to/from PEM', function() {
268
+ var certificate = PKI.certificateFromPem(_pem_past_2050.certificate);
269
+ ASSERT.equal(PKI.certificateToPem(certificate), _pem_past_2050.certificate);
270
+ });
271
+
272
+ it('should convert SHA-512 based certificate to/from PEM', function() {
273
+ var certificate = PKI.certificateFromPem(_pem_sha512.certificate);
274
+ ASSERT.equal(PKI.certificateToPem(certificate), _pem_sha512.certificate);
275
+ });
276
+
277
+ it('should verify SHA-1 based self-signed certificate', function() {
278
+ var certificate = PKI.certificateFromPem(_pem.certificate);
279
+ ASSERT.ok(certificate.verify(certificate));
280
+ });
281
+
282
+ it('should verify SHA-256 based self-signed certificate', function() {
283
+ var certificate = PKI.certificateFromPem(_pem_sha256.certificate);
284
+ ASSERT.ok(certificate.verify(certificate));
285
+ });
286
+
287
+ it('should verify SHA-512 based self-signed certificate', function() {
288
+ var certificate = PKI.certificateFromPem(_pem_sha512.certificate);
289
+ ASSERT.ok(certificate.verify(certificate));
290
+ });
291
+
292
+ it('should verify not before < 2050 < not after self-signed certificate', function() {
293
+ var certificate = PKI.certificateFromPem(_pem_past_2050.certificate);
294
+ ASSERT.ok(certificate.verify(certificate));
295
+ });
296
+
297
+ it('should generate a certificate with authorityKeyIdentifier extension', function() {
298
+ var keys = {
299
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
300
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
301
+ };
302
+ var attrs = [{
303
+ name: 'commonName',
304
+ value: 'example.org'
305
+ }, {
306
+ name: 'countryName',
307
+ value: 'US'
308
+ }, {
309
+ shortName: 'ST',
310
+ value: 'Virginia'
311
+ }, {
312
+ name: 'localityName',
313
+ value: 'Blacksburg'
314
+ }, {
315
+ name: 'organizationName',
316
+ value: 'Test'
317
+ }, {
318
+ shortName: 'OU',
319
+ value: 'Test'
320
+ }];
321
+ var cert = createCertificate({
322
+ publicKey: keys.publicKey,
323
+ signingKey: keys.privateKey,
324
+ extensions: [{
325
+ name: 'authorityKeyIdentifier',
326
+ keyIdentifier: true,
327
+ authorityCertIssuer: true,
328
+ serialNumber: true
329
+ }],
330
+ serialNumber: '01',
331
+ subject: attrs,
332
+ issuer: attrs,
333
+ isCA: true
334
+ });
335
+
336
+ // verify certificate encoding/parsing
337
+ var pem = PKI.certificateToPem(cert);
338
+ cert = PKI.certificateFromPem(pem);
339
+
340
+ // verify authorityKeyIdentifier extension
341
+ var index = findIndex(cert.extensions, {id: '2.5.29.35'});
342
+ ASSERT.ok(index !== -1);
343
+ var ext = cert.extensions[index];
344
+ ASSERT.equal(ext.name, 'authorityKeyIdentifier');
345
+ ASSERT.equal(ext.value, UTIL.hexToBytes(
346
+ '3081888014f57563e0c75d6e9b03fafdb2fd72349f23030300a16da46b30693114' +
347
+ '30120603550403130b6578616d706c652e6f7267310b3009060355040613025553' +
348
+ '3111300f0603550408130856697267696e6961311330110603550407130a426c61' +
349
+ '636b7362757267310d300b060355040a130454657374310d300b060355040b1304' +
350
+ '54657374820101'));
351
+
352
+ // verify certificate chain
353
+ var caStore = PKI.createCaStore();
354
+ caStore.addCertificate(cert);
355
+ PKI.verifyCertificateChain(caStore, [cert], function(vfd, depth, chain) {
356
+ ASSERT.equal(vfd, true);
357
+ ASSERT.ok(cert.verifySubjectKeyIdentifier());
358
+ return true;
359
+ });
360
+ });
361
+
362
+ it('should generate a certificate with cRLDistributionPoints extension', function() {
363
+ var keys = {
364
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
365
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
366
+ };
367
+ var attrs = [{
368
+ name: 'commonName',
369
+ value: 'example.org'
370
+ }, {
371
+ name: 'countryName',
372
+ value: 'US'
373
+ }, {
374
+ shortName: 'ST',
375
+ value: 'Virginia'
376
+ }, {
377
+ name: 'localityName',
378
+ value: 'Blacksburg'
379
+ }, {
380
+ name: 'organizationName',
381
+ value: 'Test'
382
+ }, {
383
+ shortName: 'OU',
384
+ value: 'Test'
385
+ }];
386
+ var cert = createCertificate({
387
+ publicKey: keys.publicKey,
388
+ signingKey: keys.privateKey,
389
+ extensions: [{
390
+ id: '2.5.29.31',
391
+ altNames: [{
392
+ type: 6,
393
+ value: 'https://test-organisation.com/test-organisation/crl/test_organisation_ca.crl.der'
394
+ }]
395
+ }],
396
+ serialNumber: '01',
397
+ subject: attrs,
398
+ issuer: attrs,
399
+ isCA: true
400
+ });
401
+
402
+ // verify certificate encoding/parsing
403
+ var pem = PKI.certificateToPem(cert);
404
+ cert = PKI.certificateFromPem(pem);
405
+
406
+ // verify cRLDistributionPoints extension
407
+ var index = findIndex(cert.extensions, {id: '2.5.29.31'});
408
+ ASSERT.ok(index !== -1);
409
+ var ext = cert.extensions[index];
410
+ ASSERT.equal(ext.name, 'cRLDistributionPoints');
411
+ ASSERT.equal(ext.value, UTIL.hexToBytes(
412
+ '30583056a054a052865068747470733a2f2f746573742d6f7267616e6973617469' +
413
+ '6f6e2e636f6d2f746573742d6f7267616e69736174696f6e2f63726c2f74657374' +
414
+ '5f6f7267616e69736174696f6e5f63612e63726c2e646572'));
415
+
416
+ // verify certificate chain
417
+ var caStore = PKI.createCaStore();
418
+ caStore.addCertificate(cert);
419
+ PKI.verifyCertificateChain(caStore, [cert], function(vfd, depth, chain) {
420
+ ASSERT.equal(vfd, true);
421
+ ASSERT.ok(cert.verifySubjectKeyIdentifier());
422
+ return true;
423
+ });
424
+ });
425
+
426
+ it('should generate a certificate with nsComment extension', function() {
427
+ var keys = {
428
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
429
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
430
+ };
431
+ var attrs = [{
432
+ name: 'commonName',
433
+ value: 'example.org'
434
+ }, {
435
+ name: 'countryName',
436
+ value: 'US'
437
+ }, {
438
+ shortName: 'ST',
439
+ value: 'Virginia'
440
+ }, {
441
+ name: 'localityName',
442
+ value: 'Blacksburg'
443
+ }, {
444
+ name: 'organizationName',
445
+ value: 'Test'
446
+ }, {
447
+ shortName: 'OU',
448
+ value: 'Test'
449
+ }];
450
+ var dummyTestStr = 'node-forge is awesome';
451
+ var cert = createCertificate({
452
+ publicKey: keys.publicKey,
453
+ signingKey: keys.privateKey,
454
+ extensions: [{
455
+ name: 'nsComment',
456
+ comment: dummyTestStr
457
+ }],
458
+ serialNumber: '01',
459
+ subject: attrs,
460
+ issuer: attrs,
461
+ isCA: true
462
+ });
463
+
464
+ // verify certificate encoding/parsing
465
+ var pem = PKI.certificateToPem(cert);
466
+ cert = PKI.certificateFromPem(pem);
467
+
468
+ // verify nsComment extension
469
+ var index = findIndex(cert.extensions, {id: '2.16.840.1.113730.1.13'});
470
+ ASSERT.ok(index !== -1);
471
+ var ext = cert.extensions[index];
472
+ ASSERT.equal(ASN1.fromDer(ext.value).value, dummyTestStr);
473
+
474
+ // verify certificate chain
475
+ var caStore = PKI.createCaStore();
476
+ caStore.addCertificate(cert);
477
+ PKI.verifyCertificateChain(caStore, [cert], function(vfd, depth, chain) {
478
+ ASSERT.equal(vfd, true);
479
+ ASSERT.ok(cert.verifySubjectKeyIdentifier());
480
+ return true;
481
+ });
482
+ });
483
+
484
+ it('should generate a certificate with postalCode attribute', function() {
485
+ var keys = {
486
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
487
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
488
+ };
489
+ var attrs = [{
490
+ name: 'commonName',
491
+ value: 'example.org'
492
+ }, {
493
+ name: 'countryName',
494
+ value: 'US'
495
+ }, {
496
+ shortName: 'ST',
497
+ value: 'Virginia'
498
+ }, {
499
+ name: 'localityName',
500
+ value: 'Blacksburg'
501
+ }, {
502
+ name: 'organizationName',
503
+ value: 'Test'
504
+ }, {
505
+ shortName: 'OU',
506
+ value: 'Test'
507
+ }, {
508
+ name: 'postalCode',
509
+ value: '24060'
510
+ }];
511
+ var cert = createCertificate({
512
+ publicKey: keys.publicKey,
513
+ signingKey: keys.privateKey,
514
+ serialNumber: '01',
515
+ subject: attrs,
516
+ issuer: attrs,
517
+ isCA: true
518
+ });
519
+
520
+ var pem = PKI.certificateToPem(cert);
521
+ cert = PKI.certificateFromPem(pem);
522
+ var index = findIndex(cert.subject.attributes, {type: '2.5.4.17'});
523
+ ASSERT.ok(index !== -1);
524
+ var attribute = cert.subject.attributes[index];
525
+ ASSERT.equal(attribute.name, 'postalCode');
526
+ ASSERT.equal(attribute.value, '24060');
527
+ });
528
+
529
+ it('should generate a certificate with businessCategory attribute', function() {
530
+ var keys = {
531
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
532
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
533
+ };
534
+ var attrs = [{
535
+ name: 'commonName',
536
+ value: 'example.org'
537
+ }, {
538
+ name: 'countryName',
539
+ value: 'US'
540
+ }, {
541
+ shortName: 'ST',
542
+ value: 'Virginia'
543
+ }, {
544
+ name: 'localityName',
545
+ value: 'Blacksburg'
546
+ }, {
547
+ name: 'organizationName',
548
+ value: 'Test'
549
+ }, {
550
+ shortName: 'OU',
551
+ value: 'Test'
552
+ }, {
553
+ name: 'businessCategory',
554
+ value: 'Test Organization'
555
+ }];
556
+ var cert = createCertificate({
557
+ publicKey: keys.publicKey,
558
+ signingKey: keys.privateKey,
559
+ serialNumber: '01',
560
+ subject: attrs,
561
+ issuer: attrs,
562
+ isCA: true
563
+ });
564
+
565
+ var pem = PKI.certificateToPem(cert);
566
+ cert = PKI.certificateFromPem(pem);
567
+ var index = findIndex(cert.subject.attributes, {type: '2.5.4.15'});
568
+ ASSERT.ok(index !== -1);
569
+ var attribute = cert.subject.attributes[index];
570
+ ASSERT.equal(attribute.name, 'businessCategory');
571
+ ASSERT.equal(attribute.value, 'Test Organization');
572
+ });
573
+
574
+ it('should generate a certificate with streetAddress attribute', function() {
575
+ var keys = {
576
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
577
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
578
+ };
579
+ var attrs = [{
580
+ name: 'commonName',
581
+ value: 'example.org'
582
+ }, {
583
+ name: 'countryName',
584
+ value: 'US'
585
+ }, {
586
+ shortName: 'ST',
587
+ value: 'Virginia'
588
+ }, {
589
+ name: 'localityName',
590
+ value: 'Blacksburg'
591
+ }, {
592
+ name: 'organizationName',
593
+ value: 'Test'
594
+ }, {
595
+ shortName: 'OU',
596
+ value: 'Test'
597
+ }, {
598
+ name: 'streetAddress',
599
+ value: 'Test Avenue'
600
+ }];
601
+ var cert = createCertificate({
602
+ publicKey: keys.publicKey,
603
+ signingKey: keys.privateKey,
604
+ serialNumber: '01',
605
+ subject: attrs,
606
+ issuer: attrs,
607
+ isCA: true
608
+ });
609
+
610
+ var pem = PKI.certificateToPem(cert);
611
+ cert = PKI.certificateFromPem(pem);
612
+ var index = findIndex(cert.subject.attributes, {type: '2.5.4.9'});
613
+ ASSERT.ok(index !== -1);
614
+ var attribute = cert.subject.attributes[index];
615
+ ASSERT.equal(attribute.name, 'streetAddress');
616
+ ASSERT.equal(attribute.value, 'Test Avenue');
617
+ });
618
+
619
+ it('should generate a certificate with pseudonym attribute', function() {
620
+ var keys = {
621
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
622
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
623
+ };
624
+ var attrs = [{
625
+ name: 'commonName',
626
+ value: 'example.org'
627
+ }, {
628
+ name: 'countryName',
629
+ value: 'US'
630
+ }, {
631
+ shortName: 'ST',
632
+ value: 'Virginia'
633
+ }, {
634
+ name: 'localityName',
635
+ value: 'Blacksburg'
636
+ }, {
637
+ name: 'organizationName',
638
+ value: 'Test'
639
+ }, {
640
+ shortName: 'OU',
641
+ value: 'Test'
642
+ }, {
643
+ name: 'pseudonym',
644
+ value: 'Satoshi Nakamato'
645
+ }];
646
+ var cert = createCertificate({
647
+ publicKey: keys.publicKey,
648
+ signingKey: keys.privateKey,
649
+ serialNumber: '01',
650
+ subject: attrs,
651
+ issuer: attrs,
652
+ isCA: true
653
+ });
654
+
655
+ var pem = PKI.certificateToPem(cert);
656
+ cert = PKI.certificateFromPem(pem);
657
+ var index = findIndex(cert.subject.attributes, {type: '2.5.4.65'});
658
+ ASSERT.ok(index !== -1);
659
+ var attribute = cert.subject.attributes[index];
660
+ ASSERT.equal(attribute.name, 'pseudonym');
661
+ ASSERT.equal(attribute.value, 'Satoshi Nakamato');
662
+ });
663
+
664
+
665
+ it('should generate a certificate with jurisdictionOfIncorporationStateOrProvinceName attribute', function() {
666
+ var keys = {
667
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
668
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
669
+ };
670
+ var attrs = [{
671
+ name: 'commonName',
672
+ value: 'example.org'
673
+ }, {
674
+ name: 'countryName',
675
+ value: 'US'
676
+ }, {
677
+ shortName: 'ST',
678
+ value: 'Virginia'
679
+ }, {
680
+ name: 'localityName',
681
+ value: 'Blacksburg'
682
+ }, {
683
+ name: 'organizationName',
684
+ value: 'Test'
685
+ }, {
686
+ shortName: 'OU',
687
+ value: 'Test'
688
+ }, {
689
+ name: 'jurisdictionOfIncorporationStateOrProvinceName',
690
+ value: 'Delaware'
691
+ }];
692
+ var cert = createCertificate({
693
+ publicKey: keys.publicKey,
694
+ signingKey: keys.privateKey,
695
+ serialNumber: '01',
696
+ subject: attrs,
697
+ issuer: attrs,
698
+ isCA: true
699
+ });
700
+
701
+ var pem = PKI.certificateToPem(cert);
702
+ cert = PKI.certificateFromPem(pem);
703
+ var index = findIndex(cert.subject.attributes, {type: '1.3.6.1.4.1.311.60.2.1.2'});
704
+ ASSERT.ok(index !== -1);
705
+ var attribute = cert.subject.attributes[index];
706
+ ASSERT.equal(attribute.name, 'jurisdictionOfIncorporationStateOrProvinceName');
707
+ ASSERT.equal(attribute.value, 'Delaware');
708
+ });
709
+
710
+ it('should generate a certificate with jurisdictionOfIncorporationCountryName attribute', function() {
711
+ var keys = {
712
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
713
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
714
+ };
715
+ var attrs = [{
716
+ name: 'commonName',
717
+ value: 'example.org'
718
+ }, {
719
+ name: 'countryName',
720
+ value: 'US'
721
+ }, {
722
+ shortName: 'ST',
723
+ value: 'Virginia'
724
+ }, {
725
+ name: 'localityName',
726
+ value: 'Blacksburg'
727
+ }, {
728
+ name: 'organizationName',
729
+ value: 'Test'
730
+ }, {
731
+ shortName: 'OU',
732
+ value: 'Test'
733
+ }, {
734
+ name: 'jurisdictionOfIncorporationCountryName',
735
+ value: 'US'
736
+ }];
737
+ var cert = createCertificate({
738
+ publicKey: keys.publicKey,
739
+ signingKey: keys.privateKey,
740
+ serialNumber: '01',
741
+ subject: attrs,
742
+ issuer: attrs,
743
+ isCA: true
744
+ });
745
+
746
+ var pem = PKI.certificateToPem(cert);
747
+ cert = PKI.certificateFromPem(pem);
748
+ var index = findIndex(cert.subject.attributes, {type: '1.3.6.1.4.1.311.60.2.1.3'});
749
+ ASSERT.ok(index !== -1);
750
+ var attribute = cert.subject.attributes[index];
751
+ ASSERT.equal(attribute.name, 'jurisdictionOfIncorporationCountryName');
752
+ ASSERT.equal(attribute.value, 'US');
753
+ });
754
+
755
+ it('should generate and verify a self-signed certificate', function() {
756
+ var keys = {
757
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
758
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
759
+ };
760
+ var attrs = [{
761
+ name: 'commonName',
762
+ value: 'example.org'
763
+ }, {
764
+ name: 'countryName',
765
+ value: 'US'
766
+ }, {
767
+ shortName: 'ST',
768
+ value: 'Virginia'
769
+ }, {
770
+ name: 'localityName',
771
+ value: 'Blacksburg'
772
+ }, {
773
+ name: 'organizationName',
774
+ value: 'Test'
775
+ }, {
776
+ shortName: 'OU',
777
+ value: 'Test'
778
+ }];
779
+ var cert = createCertificate({
780
+ publicKey: keys.publicKey,
781
+ signingKey: keys.privateKey,
782
+ serialNumber: '01',
783
+ subject: attrs,
784
+ issuer: attrs,
785
+ isCA: true
786
+ });
787
+
788
+ var pem = PKI.certificateToPem(cert);
789
+ cert = PKI.certificateFromPem(pem);
790
+
791
+ // verify certificate chain
792
+ var caStore = PKI.createCaStore();
793
+ caStore.addCertificate(cert);
794
+ PKI.verifyCertificateChain(caStore, [cert], function(vfd, depth, chain) {
795
+ ASSERT.equal(vfd, true);
796
+ ASSERT.ok(cert.verifySubjectKeyIdentifier());
797
+ return true;
798
+ });
799
+ });
800
+
801
+ it('should generate a self-signed certificate after 2050', function() {
802
+ var keys = {
803
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
804
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
805
+ };
806
+ var attrs = [{
807
+ name: 'commonName',
808
+ value: 'example.org'
809
+ }, {
810
+ name: 'countryName',
811
+ value: 'US'
812
+ }, {
813
+ shortName: 'ST',
814
+ value: 'Virginia'
815
+ }, {
816
+ name: 'localityName',
817
+ value: 'Blacksburg'
818
+ }, {
819
+ name: 'organizationName',
820
+ value: 'Test'
821
+ }, {
822
+ shortName: 'OU',
823
+ value: 'Test'
824
+ }];
825
+ var notBefore = new Date('2050-02-02');
826
+ var cert = createCertificate({
827
+ publicKey: keys.publicKey,
828
+ signingKey: keys.privateKey,
829
+ serialNumber: '01',
830
+ subject: attrs,
831
+ issuer: attrs,
832
+ isCA: true,
833
+ notBefore: notBefore
834
+ });
835
+
836
+ var pem = PKI.certificateToPem(cert);
837
+ cert = PKI.certificateFromPem(pem);
838
+
839
+ var notAfter = new Date('2051-02-02');
840
+ ASSERT.equal(cert.validity.notBefore.toString(), notBefore.toString());
841
+ ASSERT.equal(cert.validity.notAfter.toString(), notAfter.toString());
842
+ });
843
+
844
+ it('should generate and fail to verify a self-signed certificate that is not in the CA store', function() {
845
+ var keys = {
846
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
847
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
848
+ };
849
+ var attrs = [{
850
+ name: 'commonName',
851
+ value: 'example.org'
852
+ }, {
853
+ name: 'countryName',
854
+ value: 'US'
855
+ }, {
856
+ shortName: 'ST',
857
+ value: 'Virginia'
858
+ }, {
859
+ name: 'localityName',
860
+ value: 'Blacksburg'
861
+ }, {
862
+ name: 'organizationName',
863
+ value: 'Test'
864
+ }, {
865
+ shortName: 'OU',
866
+ value: 'Test'
867
+ }];
868
+ var cert = createCertificate({
869
+ publicKey: keys.publicKey,
870
+ signingKey: keys.privateKey,
871
+ serialNumber: '01',
872
+ subject: attrs,
873
+ issuer: attrs,
874
+ isCA: true
875
+ });
876
+
877
+ var pem = PKI.certificateToPem(cert);
878
+ cert = PKI.certificateFromPem(pem);
879
+
880
+ // verify certificate chain
881
+ var caStore = PKI.createCaStore();
882
+ PKI.verifyCertificateChain(caStore, [cert], function(vfd, depth, chain) {
883
+ ASSERT.equal(vfd, PKI.certificateError.unknown_ca);
884
+ return true;
885
+ });
886
+ });
887
+
888
+ it('should verify certificate chain ending with intermediate certificate from CA store', function() {
889
+ var keys = {
890
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
891
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
892
+ };
893
+ var entity = [{
894
+ name: 'commonName',
895
+ value: 'example.org'
896
+ }, {
897
+ name: 'countryName',
898
+ value: 'US'
899
+ }, {
900
+ shortName: 'ST',
901
+ value: 'Virginia'
902
+ }, {
903
+ name: 'localityName',
904
+ value: 'Blacksburg'
905
+ }, {
906
+ name: 'organizationName',
907
+ value: 'Test'
908
+ }, {
909
+ shortName: 'OU',
910
+ value: 'Test'
911
+ }];
912
+ var intermediate = [{
913
+ name: 'commonName',
914
+ value: 'intermediate'
915
+ }, {
916
+ name: 'countryName',
917
+ value: 'US'
918
+ }, {
919
+ shortName: 'ST',
920
+ value: 'Virginia'
921
+ }, {
922
+ name: 'localityName',
923
+ value: 'Blacksburg'
924
+ }, {
925
+ name: 'organizationName',
926
+ value: 'Test'
927
+ }, {
928
+ shortName: 'OU',
929
+ value: 'Test'
930
+ }];
931
+ var root = [{
932
+ name: 'commonName',
933
+ value: 'root'
934
+ }, {
935
+ name: 'countryName',
936
+ value: 'US'
937
+ }, {
938
+ shortName: 'ST',
939
+ value: 'Virginia'
940
+ }, {
941
+ name: 'localityName',
942
+ value: 'Blacksburg'
943
+ }, {
944
+ name: 'organizationName',
945
+ value: 'Test'
946
+ }, {
947
+ shortName: 'OU',
948
+ value: 'Test'
949
+ }];
950
+
951
+ var intermediateCert = createCertificate({
952
+ publicKey: keys.publicKey,
953
+ signingKey: keys.privateKey,
954
+ serialNumber: '01',
955
+ subject: intermediate,
956
+ issuer: root,
957
+ isCA: true
958
+ });
959
+
960
+ var entityCert = createCertificate({
961
+ publicKey: keys.publicKey,
962
+ signingKey: keys.privateKey,
963
+ serialNumber: '01',
964
+ subject: entity,
965
+ issuer: intermediate,
966
+ isCA: false
967
+ });
968
+
969
+ // verify certificate chain
970
+ var caStore = PKI.createCaStore();
971
+ caStore.addCertificate(intermediateCert);
972
+ var chain = [entityCert, intermediateCert];
973
+ PKI.verifyCertificateChain(caStore, chain, function(vfd, depth, chain) {
974
+ ASSERT.equal(vfd, true);
975
+ return true;
976
+ });
977
+ });
978
+
979
+ it('should fail to verify certificate chain ending with non-CA intermediate certificate from CA store', function() {
980
+ var keys = {
981
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
982
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
983
+ };
984
+ var entity = [{
985
+ name: 'commonName',
986
+ value: 'example.org'
987
+ }, {
988
+ name: 'countryName',
989
+ value: 'US'
990
+ }, {
991
+ shortName: 'ST',
992
+ value: 'Virginia'
993
+ }, {
994
+ name: 'localityName',
995
+ value: 'Blacksburg'
996
+ }, {
997
+ name: 'organizationName',
998
+ value: 'Test'
999
+ }, {
1000
+ shortName: 'OU',
1001
+ value: 'Test'
1002
+ }];
1003
+ var intermediate = [{
1004
+ name: 'commonName',
1005
+ value: 'intermediate'
1006
+ }, {
1007
+ name: 'countryName',
1008
+ value: 'US'
1009
+ }, {
1010
+ shortName: 'ST',
1011
+ value: 'Virginia'
1012
+ }, {
1013
+ name: 'localityName',
1014
+ value: 'Blacksburg'
1015
+ }, {
1016
+ name: 'organizationName',
1017
+ value: 'Test'
1018
+ }, {
1019
+ shortName: 'OU',
1020
+ value: 'Test'
1021
+ }];
1022
+ var root = [{
1023
+ name: 'commonName',
1024
+ value: 'root'
1025
+ }, {
1026
+ name: 'countryName',
1027
+ value: 'US'
1028
+ }, {
1029
+ shortName: 'ST',
1030
+ value: 'Virginia'
1031
+ }, {
1032
+ name: 'localityName',
1033
+ value: 'Blacksburg'
1034
+ }, {
1035
+ name: 'organizationName',
1036
+ value: 'Test'
1037
+ }, {
1038
+ shortName: 'OU',
1039
+ value: 'Test'
1040
+ }];
1041
+
1042
+ var intermediateCert = createCertificate({
1043
+ publicKey: keys.publicKey,
1044
+ signingKey: keys.privateKey,
1045
+ serialNumber: '01',
1046
+ subject: intermediate,
1047
+ issuer: root,
1048
+ isCA: false
1049
+ });
1050
+
1051
+ var entityCert = createCertificate({
1052
+ publicKey: keys.publicKey,
1053
+ signingKey: keys.privateKey,
1054
+ serialNumber: '01',
1055
+ subject: entity,
1056
+ issuer: intermediate,
1057
+ isCA: false
1058
+ });
1059
+
1060
+ // verify certificate chain
1061
+ var caStore = PKI.createCaStore();
1062
+ caStore.addCertificate(intermediateCert);
1063
+ var chain = [entityCert, intermediateCert];
1064
+ PKI.verifyCertificateChain(caStore, chain, function(vfd, depth, chain) {
1065
+ if(depth === 0) {
1066
+ ASSERT.equal(vfd, true);
1067
+ } else {
1068
+ ASSERT.equal(vfd, PKI.certificateError.bad_certificate);
1069
+ }
1070
+ return true;
1071
+ });
1072
+ });
1073
+
1074
+ it('should verify based on a custom specified validity date', function() {
1075
+ var keys = {
1076
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
1077
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
1078
+ };
1079
+
1080
+ var attrs = [{
1081
+ name: 'commonName',
1082
+ value: 'example.org'
1083
+ }, {
1084
+ name: 'countryName',
1085
+ value: 'US'
1086
+ }, {
1087
+ shortName: 'ST',
1088
+ value: 'Virginia'
1089
+ }, {
1090
+ name: 'localityName',
1091
+ value: 'Blacksburg'
1092
+ }, {
1093
+ name: 'organizationName',
1094
+ value: 'Test'
1095
+ }, {
1096
+ shortName: 'OU',
1097
+ value: 'Test'
1098
+ }];
1099
+
1100
+ var cert = createCertificate({
1101
+ publicKey: keys.publicKey,
1102
+ signingKey: keys.privateKey,
1103
+ extensions: [{
1104
+ name: 'authorityKeyIdentifier',
1105
+ keyIdentifier: true,
1106
+ authorityCertIssuer: true,
1107
+ serialNumber: true
1108
+ }],
1109
+ serialNumber: '01',
1110
+ subject: attrs,
1111
+ issuer: attrs,
1112
+ isCA: true
1113
+ });
1114
+ var caStore = PKI.createCaStore();
1115
+ caStore.addCertificate(cert);
1116
+
1117
+ var verifyDate = new Date();
1118
+ PKI.verifyCertificateChain(caStore, [cert], {
1119
+ validityCheckDate: verifyDate,
1120
+ verify: function(vfd, depth, chain) {
1121
+ ASSERT.equal(vfd, true);
1122
+ return true;
1123
+ }
1124
+ });
1125
+
1126
+ verifyDate = new Date();
1127
+ verifyDate.setFullYear(verifyDate.getFullYear() + 2);
1128
+ PKI.verifyCertificateChain(caStore, [cert], {
1129
+ validityCheckDate: verifyDate,
1130
+ verify: function(vfd, depth, chain) {
1131
+ ASSERT.equal(vfd, 'forge.pki.CertificateExpired');
1132
+ return true;
1133
+ }
1134
+ });
1135
+
1136
+ verifyDate = new Date();
1137
+ verifyDate.setFullYear(verifyDate.getFullYear() - 1);
1138
+ PKI.verifyCertificateChain(caStore, [cert], {
1139
+ validityCheckDate: verifyDate,
1140
+ verify: function(vfd, depth, chain) {
1141
+ ASSERT.equal(vfd, 'forge.pki.CertificateExpired');
1142
+ return true;
1143
+ }
1144
+ });
1145
+ });
1146
+
1147
+ it('should not verify the validity period if null is passed as validityCheckDate', function() {
1148
+ var keys = {
1149
+ privateKey: PKI.privateKeyFromPem(_pem.privateKey),
1150
+ publicKey: PKI.publicKeyFromPem(_pem.publicKey)
1151
+ };
1152
+
1153
+ var attrs = [{
1154
+ name: 'commonName',
1155
+ value: 'example.org'
1156
+ }, {
1157
+ name: 'countryName',
1158
+ value: 'US'
1159
+ }, {
1160
+ shortName: 'ST',
1161
+ value: 'Virginia'
1162
+ }, {
1163
+ name: 'localityName',
1164
+ value: 'Blacksburg'
1165
+ }, {
1166
+ name: 'organizationName',
1167
+ value: 'Test'
1168
+ }, {
1169
+ shortName: 'OU',
1170
+ value: 'Test'
1171
+ }];
1172
+
1173
+ var pastDate = new Date();
1174
+ pastDate.setFullYear(pastDate.getFullYear() - 1);
1175
+
1176
+ var cert = createCertificate({
1177
+ publicKey: keys.publicKey,
1178
+ signingKey: keys.privateKey,
1179
+ extensions: [{
1180
+ name: 'authorityKeyIdentifier',
1181
+ keyIdentifier: true,
1182
+ authorityCertIssuer: true,
1183
+ serialNumber: true
1184
+ }],
1185
+ serialNumber: '01',
1186
+ subject: attrs,
1187
+ issuer: attrs,
1188
+ isCA: true,
1189
+ notBefore: pastDate,
1190
+ notAfter: pastDate
1191
+ });
1192
+ var caStore = PKI.createCaStore();
1193
+ caStore.addCertificate(cert);
1194
+
1195
+ PKI.verifyCertificateChain(caStore, [cert], {
1196
+ verify: function(vfd, depth, chain) {
1197
+ ASSERT.equal(vfd, 'forge.pki.CertificateExpired');
1198
+ return true;
1199
+ }
1200
+ });
1201
+
1202
+ PKI.verifyCertificateChain(caStore, [cert], {
1203
+ validityCheckDate: null,
1204
+ verify: function(vfd, depth, chain) {
1205
+ ASSERT.equal(vfd, true);
1206
+ return true;
1207
+ }
1208
+ });
1209
+ });
1210
+
1211
+ it('should verify certificate with sha1WithRSAEncryption signature', function() {
1212
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1213
+ 'MIIDZDCCAs2gAwIBAgIKQ8fjjgAAAABh3jANBgkqhkiG9w0BAQUFADBGMQswCQYD\r\n' +
1214
+ 'VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu\r\n' +
1215
+ 'dGVybmV0IEF1dGhvcml0eTAeFw0xMjA2MjcxMzU5MTZaFw0xMzA2MDcxOTQzMjda\r\n' +
1216
+ 'MGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N\r\n' +
1217
+ 'b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRYwFAYDVQQDEw13d3cu\r\n' +
1218
+ 'Z29vZ2xlLmRlMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCw2Hw3vNy5QMSd\r\n' +
1219
+ '0/iMCS8lwZk9lnEk2NmrJt6vGJfRGlBprtHp5lpMFMoi+x8m8EwGVxXHGp7hLyN/\r\n' +
1220
+ 'gXuUjL7/DY9fxxx9l77D+sDZz7jfUfWmhS03Ra1FbT6myF8miVZFChJ8XgWzioJY\r\n' +
1221
+ 'gyNdRUC9149yrXdPWrSmSVaT0+tUCwIDAQABo4IBNjCCATIwHQYDVR0lBBYwFAYI\r\n' +
1222
+ 'KwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTiQGhrO3785rMPIKZ/zQEl5RyS\r\n' +
1223
+ '0TAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra42sSJDBbBgNVHR8EVDBSMFCg\r\n' +
1224
+ 'TqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dvb2dsZUludGVybmV0QXV0aG9y\r\n' +
1225
+ 'aXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNybDBmBggrBgEFBQcBAQRaMFgw\r\n' +
1226
+ 'VgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRpYy5jb20vR29vZ2xlSW50ZXJu\r\n' +
1227
+ 'ZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkuY3J0MAwGA1UdEwEB\r\n' +
1228
+ '/wQCMAAwDQYJKoZIhvcNAQEFBQADgYEAVJ0qt/MBvHEPuWHeH51756qy+lBNygLA\r\n' +
1229
+ 'Xp5Gq+xHUTOzRty61BR05zv142hYAGWvpvnEOJ/DI7V3QlXK8a6dQ+du97obQJJx\r\n' +
1230
+ '7ekqtfxVzmlSb23halYSoXmWgP8Tq0VUDsgsSLE7fS8JuO1soXUVKj1/6w189HL6\r\n' +
1231
+ 'LsngXwZSuL0=\r\n' +
1232
+ '-----END CERTIFICATE-----\r\n';
1233
+ var issuerPem = '-----BEGIN CERTIFICATE-----\r\n' +
1234
+ 'MIICsDCCAhmgAwIBAgIDC2dxMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT\r\n' +
1235
+ 'MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0\r\n' +
1236
+ 'aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA4MjA0MzI3WhcNMTMwNjA3MTk0MzI3\r\n' +
1237
+ 'WjBGMQswCQYDVQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZ\r\n' +
1238
+ 'R29vZ2xlIEludGVybmV0IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw\r\n' +
1239
+ 'gYkCgYEAye23pIucV+eEPkB9hPSP0XFjU5nneXQUr0SZMyCSjXvlKAy6rWxJfoNf\r\n' +
1240
+ 'NFlOCnowzdDXxFdF7dWq1nMmzq0yE7jXDx07393cCDaob1FEm8rWIFJztyaHNWrb\r\n' +
1241
+ 'qeXUWaUr/GcZOfqTGBhs3t0lig4zFEfC7wFQeeT9adGnwKziV28CAwEAAaOBozCB\r\n' +
1242
+ 'oDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFL/AMOv1QxE+Z7qekfv8atrjaxIk\r\n' +
1243
+ 'MB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMBIGA1UdEwEB/wQIMAYB\r\n' +
1244
+ 'Af8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20v\r\n' +
1245
+ 'Y3Jscy9zZWN1cmVjYS5jcmwwDQYJKoZIhvcNAQEFBQADgYEAuIojxkiWsRF8YHde\r\n' +
1246
+ 'BZqrocb6ghwYB8TrgbCoZutJqOkM0ymt9e8kTP3kS8p/XmOrmSfLnzYhLLkQYGfN\r\n' +
1247
+ '0rTw8Ktx5YtaiScRhKqOv5nwnQkhClIZmloJ0pC3+gz4fniisIWvXEyZ2VxVKfml\r\n' +
1248
+ 'UUIuOss4jHg7y/j7lYe8vJD5UDI=\r\n' +
1249
+ '-----END CERTIFICATE-----\r\n';
1250
+ var cert = PKI.certificateFromPem(certPem, true);
1251
+ var issuer = PKI.certificateFromPem(issuerPem);
1252
+ ASSERT.ok(issuer.verify(cert));
1253
+ });
1254
+
1255
+ it('should calculate a certificate subject and issuer hash', function() {
1256
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1257
+ 'MIIDZDCCAs2gAwIBAgIKQ8fjjgAAAABh3jANBgkqhkiG9w0BAQUFADBGMQswCQYD\r\n' +
1258
+ 'VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu\r\n' +
1259
+ 'dGVybmV0IEF1dGhvcml0eTAeFw0xMjA2MjcxMzU5MTZaFw0xMzA2MDcxOTQzMjda\r\n' +
1260
+ 'MGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N\r\n' +
1261
+ 'b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRYwFAYDVQQDEw13d3cu\r\n' +
1262
+ 'Z29vZ2xlLmRlMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCw2Hw3vNy5QMSd\r\n' +
1263
+ '0/iMCS8lwZk9lnEk2NmrJt6vGJfRGlBprtHp5lpMFMoi+x8m8EwGVxXHGp7hLyN/\r\n' +
1264
+ 'gXuUjL7/DY9fxxx9l77D+sDZz7jfUfWmhS03Ra1FbT6myF8miVZFChJ8XgWzioJY\r\n' +
1265
+ 'gyNdRUC9149yrXdPWrSmSVaT0+tUCwIDAQABo4IBNjCCATIwHQYDVR0lBBYwFAYI\r\n' +
1266
+ 'KwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTiQGhrO3785rMPIKZ/zQEl5RyS\r\n' +
1267
+ '0TAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra42sSJDBbBgNVHR8EVDBSMFCg\r\n' +
1268
+ 'TqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dvb2dsZUludGVybmV0QXV0aG9y\r\n' +
1269
+ 'aXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNybDBmBggrBgEFBQcBAQRaMFgw\r\n' +
1270
+ 'VgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRpYy5jb20vR29vZ2xlSW50ZXJu\r\n' +
1271
+ 'ZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkuY3J0MAwGA1UdEwEB\r\n' +
1272
+ '/wQCMAAwDQYJKoZIhvcNAQEFBQADgYEAVJ0qt/MBvHEPuWHeH51756qy+lBNygLA\r\n' +
1273
+ 'Xp5Gq+xHUTOzRty61BR05zv142hYAGWvpvnEOJ/DI7V3QlXK8a6dQ+du97obQJJx\r\n' +
1274
+ '7ekqtfxVzmlSb23halYSoXmWgP8Tq0VUDsgsSLE7fS8JuO1soXUVKj1/6w189HL6\r\n' +
1275
+ 'LsngXwZSuL0=\r\n' +
1276
+ '-----END CERTIFICATE-----\r\n';
1277
+ var issuerPem = '-----BEGIN CERTIFICATE-----\r\n' +
1278
+ 'MIICsDCCAhmgAwIBAgIDC2dxMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT\r\n' +
1279
+ 'MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0\r\n' +
1280
+ 'aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA4MjA0MzI3WhcNMTMwNjA3MTk0MzI3\r\n' +
1281
+ 'WjBGMQswCQYDVQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZ\r\n' +
1282
+ 'R29vZ2xlIEludGVybmV0IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw\r\n' +
1283
+ 'gYkCgYEAye23pIucV+eEPkB9hPSP0XFjU5nneXQUr0SZMyCSjXvlKAy6rWxJfoNf\r\n' +
1284
+ 'NFlOCnowzdDXxFdF7dWq1nMmzq0yE7jXDx07393cCDaob1FEm8rWIFJztyaHNWrb\r\n' +
1285
+ 'qeXUWaUr/GcZOfqTGBhs3t0lig4zFEfC7wFQeeT9adGnwKziV28CAwEAAaOBozCB\r\n' +
1286
+ 'oDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFL/AMOv1QxE+Z7qekfv8atrjaxIk\r\n' +
1287
+ 'MB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMBIGA1UdEwEB/wQIMAYB\r\n' +
1288
+ 'Af8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20v\r\n' +
1289
+ 'Y3Jscy9zZWN1cmVjYS5jcmwwDQYJKoZIhvcNAQEFBQADgYEAuIojxkiWsRF8YHde\r\n' +
1290
+ 'BZqrocb6ghwYB8TrgbCoZutJqOkM0ymt9e8kTP3kS8p/XmOrmSfLnzYhLLkQYGfN\r\n' +
1291
+ '0rTw8Ktx5YtaiScRhKqOv5nwnQkhClIZmloJ0pC3+gz4fniisIWvXEyZ2VxVKfml\r\n' +
1292
+ 'UUIuOss4jHg7y/j7lYe8vJD5UDI=\r\n' +
1293
+ '-----END CERTIFICATE-----\r\n';
1294
+ var cert = PKI.certificateFromPem(certPem, true);
1295
+ var issuer = PKI.certificateFromPem(issuerPem);
1296
+ ASSERT.strictEqual(issuer.subject.hash, 'd43b6713ab1a8679f0b70e169e9df889ed387a4b');
1297
+ ASSERT.strictEqual(cert.subject.hash, 'fd90a93e35c96cd6959f45ec60ca76faa4ce8926');
1298
+ ASSERT.strictEqual(cert.issuer.hash, 'd43b6713ab1a8679f0b70e169e9df889ed387a4b');
1299
+ });
1300
+
1301
+ it('should verify certificate with sha1WithRSASignature signature', function() {
1302
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1303
+ 'MIIBwjCCAS+gAwIBAgIQj2d4hVEz0L1DYFVhA9CxCzAJBgUrDgMCHQUAMA8xDTAL\r\n' +
1304
+ 'BgNVBAMTBFZQUzEwHhcNMDcwODE4MDkyODUzWhcNMDgwODE3MDkyODUzWjAPMQ0w\r\n' +
1305
+ 'CwYDVQQDEwRWUFMxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaqKn40uaU\r\n' +
1306
+ 'DbFL1NXXZ8/b4ZqDJ6eSI5lysMZHfZDs60G3ocbNKofBvURIutabrFuBCB2S5f/z\r\n' +
1307
+ 'ICan0LR4uFpGuZ2I/PuVaU8X5fT8gBh7L636cWzHPPScYts00OyywEq381UB7XwX\r\n' +
1308
+ 'YuWpM5kUW5rkbq1JV3ystTR/4YnLl48YtQIDAQABoycwJTATBgNVHSUEDDAKBggr\r\n' +
1309
+ 'BgEFBQcDATAOBgNVHQ8EBwMFALAAAAAwCQYFKw4DAh0FAAOBgQBuUrU+J2Z5WKcO\r\n' +
1310
+ 'VNjJHFUKo8qpbn8jKQZDl2nvVaXCTXQZblz/qxOm4FaGGzJ/m3GybVZNVfdyHg+U\r\n' +
1311
+ 'lmDpFpOITkvcyNc3xjJCf2GVBo/VvdtVt7Myq0IQtAi/CXRK22BRNhSt9uu2EcRu\r\n' +
1312
+ 'HIXdFWHEzi6eD4PpNw/0X3ID6Gxk4A==\r\n' +
1313
+ '-----END CERTIFICATE-----\r\n';
1314
+ var cert = PKI.certificateFromPem(certPem, true);
1315
+ ASSERT.equal(cert.signatureOid, PKI.oids['sha1WithRSASignature']);
1316
+ ASSERT.equal(cert.md.algorithm, 'sha1');
1317
+ });
1318
+
1319
+ it('should verify certificate with sha256WithRSAEncryption signature', function() {
1320
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1321
+ 'MIIDuzCCAqOgAwIBAgIEO5vZjDANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQGEwJE\r\n' +
1322
+ 'RTEPMA0GA1UEChMGRWxzdGVyMQswCQYDVQQLEwJDQTEZMBcGA1UEAxMQRWxzdGVy\r\n' +
1323
+ 'U29mdFRlc3RDQTAeFw0xMDA5MTUwNTM4MjRaFw0xMzA5MTUwNTM4MjRaMCsxFDAS\r\n' +
1324
+ 'BgNVBAUTCzEwMDIzMTQ5OTRDMRMwEQYDVQQDEwoxMDAyMzE0OTk0MIGfMA0GCSqG\r\n' +
1325
+ 'SIb3DQEBAQUAA4GNADCBiQKBgQCLPqjbwjsugzw6+qwwm/pdzDwk7ASIsBYJ17GT\r\n' +
1326
+ 'qyT0zCnYmdDDGWsYc+xxFVVIi8xBt6Mlq8Rwj+02UJhY9qm6zRA9MqFZC3ih+HoW\r\n' +
1327
+ 'xq7H8N2d10N0rX6h5PSjkF5fU5ugncZmppsRGJ9DNXgwjpf/CsH2rqThUzK4xfrq\r\n' +
1328
+ 'jpDS/wIDAQABo4IBTjCCAUowDgYDVR0PAQH/BAQDAgUgMAwGA1UdEwEB/wQCMAAw\r\n' +
1329
+ 'HQYDVR0OBBYEFF1h7H37OQivS57GD8+nK6VsgMPTMIGXBgNVHR8EgY8wgYwwgYmg\r\n' +
1330
+ 'gYaggYOGgYBsZGFwOi8vMTkyLjE2OC42LjI0OjM4OS9sJTNkQ0ElMjBaZXJ0aWZp\r\n' +
1331
+ 'a2F0ZSxvdSUzZENBLGNuJTNkRWxzdGVyU29mdFRlc3RDQSxkYyUzZHdpZXNlbCxk\r\n' +
1332
+ 'YyUzZGVsc3RlcixkYyUzZGRlPz9iYXNlPyhvYmplY3RDbGFzcz0qKTBxBgNVHSME\r\n' +
1333
+ 'ajBogBRBILMYmlZu//pj3wjDe2UPkq7jk6FKpEgwRjELMAkGA1UEBhMCREUxDzAN\r\n' +
1334
+ 'BgNVBAoTBkVsc3RlcjEPMA0GA1UECxMGUm9vdENBMRUwEwYDVQQDEwxFbHN0ZXJS\r\n' +
1335
+ 'b290Q0GCBDuayikwDQYJKoZIhvcNAQELBQADggEBAK8Z1+/VNyU5w/EiyhFH5aRE\r\n' +
1336
+ 'Mzxo0DahqKEm4pW5haBgKubJwZGs+CrBZR70TPbZGgJd36eyMgeXb/06lBnxewii\r\n' +
1337
+ 'I/aY6wMTviQTpqFnz5m0Le8UhH+hY1bqNG/vf6J+1gbOSrZyhAUV+MDJbL/OkzX4\r\n' +
1338
+ 'voVAfUBqSODod0f5wCW2RhvBmB9E62baP6qizdxyPA4iV16H4C0etd/7coLX6NZC\r\n' +
1339
+ 'oz3Yu0IRTQCH+YrpfIbxGb0grNhtCTfFpa287fuzu8mIEvLNr8GibhBXmQg7iJ+y\r\n' +
1340
+ 'q0VIyZLY8k6jEPrUB5Iv5ouSR19Dda/2+xJPlT/bosuNcErEuk/yKAHWAzwm1wQ=\r\n' +
1341
+ '-----END CERTIFICATE-----\r\n';
1342
+ var issuerPem = '-----BEGIN CERTIFICATE-----\r\n' +
1343
+ 'MIIESjCCAzKgAwIBAgIEO5rKKTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQGEwJE\r\n' +
1344
+ 'RTEPMA0GA1UEChMGRWxzdGVyMQ8wDQYDVQQLEwZSb290Q0ExFTATBgNVBAMTDEVs\r\n' +
1345
+ 'c3RlclJvb3RDQTAeFw0wOTA3MjgwODE5MTFaFw0xNDA3MjgwODE5MTFaMEYxCzAJ\r\n' +
1346
+ 'BgNVBAYTAkRFMQ8wDQYDVQQKEwZFbHN0ZXIxCzAJBgNVBAsTAkNBMRkwFwYDVQQD\r\n' +
1347
+ 'ExBFbHN0ZXJTb2Z0VGVzdENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\r\n' +
1348
+ 'AQEAv5uoKLnxXQe75iqwqgyt3H6MDAx/wvUVs26+2+yHpEUb/2gA3L8E+NChSb9E\r\n' +
1349
+ 'aNgxxoac3Yhvxzq2mPpih3vkY7Xw512Tm8l/OPbT8kbmBJmYZneFALXHytAIZiEf\r\n' +
1350
+ 'e0ZYNKAlClFIgNP5bE9UjTqVEEoSiUhpTubM6c5xEYVznnwPBoYQ0ari7RTDYnME\r\n' +
1351
+ 'HK4vMfoeBeWHYPiEygNHnGUG8d3merRC/lQASUtL6ikmLWKCKHfyit5ACzPNKAtw\r\n' +
1352
+ 'IzHAzD5ek0BpcUTci8hUsKz2ZvmoZcjPyj63veQuMYS5cTMgr3bfz9uz1xuoEDsb\r\n' +
1353
+ 'Sv9rQX9Iw3N7yMpxTDJTqGKhYwIDAQABo4IBPjCCATowDgYDVR0PAQH/BAQDAgEG\r\n' +
1354
+ 'MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEEgsxiaVm7/+mPfCMN7ZQ+S\r\n' +
1355
+ 'ruOTMIGXBgNVHR8EgY8wgYwwgYmggYaggYOGgYBsZGFwOi8vMTkyLjE2OC42LjI0\r\n' +
1356
+ 'OjM4OS9sJTNkQ0ElMjBaZXJ0aWZpa2F0ZSxvdSUzZFJvb3RDQSxjbiUzZEVsc3Rl\r\n' +
1357
+ 'clJvb3RDQSxkYyUzZHdpZXNlbCxkYyUzZGVsc3RlcixkYyUzZGRlPz9iYXNlPyhv\r\n' +
1358
+ 'YmplY3RDbGFzcz0qKTBbBgNVHSMEVDBSoUqkSDBGMQswCQYDVQQGEwJERTEPMA0G\r\n' +
1359
+ 'A1UEChMGRWxzdGVyMQ8wDQYDVQQLEwZSb290Q0ExFTATBgNVBAMTDEVsc3RlclJv\r\n' +
1360
+ 'b3RDQYIEO5rKADANBgkqhkiG9w0BAQsFAAOCAQEAFauDnfHSbgRmbFkpQUXM5wKi\r\n' +
1361
+ 'K5STAaVps201iAjacX5EsOs5L37VUMoT9G2DAE8Z6B1pIiR3zcd3UpiHnFlUTC0f\r\n' +
1362
+ 'ZdOCXzDkOfziKY/RzuUsLNFUhBizCIA0+XcKgm3dSA5ex8fChLJddSYheSLuPua7\r\n' +
1363
+ 'iNMuzaU2YnevbMwpdEsl55Qr/uzcc0YM/mCuM4vsNFyFml91SQyPPmdR3VvGOoGl\r\n' +
1364
+ 'qS1R0HSoPJUvr0N0kARwD7kO3ikcJ6FxBCsgVLZHGJC+q8PQNZmVMbfgjH4nAyP8\r\n' +
1365
+ 'u7Qe03v2WLW0UgKu2g0UcQXWXbovktpZoK0fUOwv3bqsZ0K1IjVvMKG8OysUvA==\r\n' +
1366
+ '-----END CERTIFICATE-----\r\n';
1367
+ var cert = PKI.certificateFromPem(certPem, true);
1368
+ var issuer = PKI.certificateFromPem(issuerPem);
1369
+ ASSERT.ok(issuer.verify(cert));
1370
+ });
1371
+
1372
+ it('should import certificate with sha256 RSASSA-PSS signature', function() {
1373
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1374
+ 'MIIERzCCAvugAwIBAgIEO50CcjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC\r\n' +
1375
+ 'AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwRjELMAkGA1UE\r\n' +
1376
+ 'BhMCREUxDzANBgNVBAoTBkVsc3RlcjELMAkGA1UECxMCQ0ExGTAXBgNVBAMTEEVs\r\n' +
1377
+ 'c3RlclNvZnRUZXN0Q0EwHhcNMTEwNzI4MTIxMzU3WhcNMTQwNzI4MTIxMzU3WjAr\r\n' +
1378
+ 'MRQwEgYDVQQFEwsxMDAyNzUzMzI1QzETMBEGA1UEAxMKMTAwMjc1MzMyNTCCASIw\r\n' +
1379
+ 'DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALHCogo7LVUkxWsMIc/0jgH2PCLt\r\n' +
1380
+ 'ukbATPehxWBG1XUPrz53lWgFJzlZaKLlLVVnXrfULaifuOKlZP6SM1JQlL1JuYgY\r\n' +
1381
+ 'AdgZyHjderNIk5NsSTmefwonSn/ukri5IRTH420oHtSjxk6+/DXlWnQy5OzTN6Bq\r\n' +
1382
+ 'jVJo8L+TTmf2jWuEam5cWa+YVP2k3tIqX5yMUDFjKO4znHdtIkHnBE0Kx03rWQRB\r\n' +
1383
+ 'TSYWDgDm2gttdOs9JVeuW0nnwQj27uo9gOR0iyaUjVrKLZ95p6zpXhM4uMSVRNeo\r\n' +
1384
+ 'LqkdqP2n+4pDXZVqLNgjkHQUS/xq9Q/kYgT2J7wkGfYxP9to7TG7vra1eOECAwEA\r\n' +
1385
+ 'AaOB7zCB7DAOBgNVHQ8BAf8EBAMCBSAwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU\r\n' +
1386
+ 'NDJ2BZIk6ukLqkdmttH12bu2leswOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2Ny\r\n' +
1387
+ 'bC5lbHN0ZXIuZGUvRWxzdGVyU29mdFRlc3RDQS5jcmwwcQYDVR0jBGowaIAU1R9A\r\n' +
1388
+ 'HmpdzaxK3v+ihQsEpAFgzOKhSqRIMEYxCzAJBgNVBAYTAkRFMQ8wDQYDVQQKEwZF\r\n' +
1389
+ 'bHN0ZXIxDzANBgNVBAsTBlJvb3RDQTEVMBMGA1UEAxMMRWxzdGVyUm9vdENBggQ7\r\n' +
1390
+ 'msqPMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0B\r\n' +
1391
+ 'AQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAQEAJBYNRZpe+z3yPPLV539Yci6OfjVg\r\n' +
1392
+ 'vs1e3rvSvcpFaqRJ8vZ8WNx3uuRQZ6B4Z3YEc00UJAOl3wU6KhamyryK2YvCrPg+\r\n' +
1393
+ 'TS5QDXNaO2z/rAnY1wWSlwBPlhqpMRrNv9cRXBcgK5YxprjytCVYN0UHdintgYxG\r\n' +
1394
+ 'fg7QYiFb00UXxAza1AFrpG+RqySFfO1scmu4kgpeb6A3USnQ0r6rZz6dt6NqgZZ6\r\n' +
1395
+ 'oUpDOCvnS9XSOWuvJirV8hIU0KAagguTbwfTqt9nt0wDlwZpemsJZ4Vvnvy8d9Jf\r\n' +
1396
+ 'zA68EWHbZLr2QP9hb3sHCWJgplMsTJnUwRfi2hf5KNtP8Xg5DSLMfTEbhw==\r\n' +
1397
+ '-----END CERTIFICATE-----\r\n';
1398
+ var cert = PKI.certificateFromPem(certPem, true);
1399
+
1400
+ ASSERT.equal(cert.signatureOid, PKI.oids['RSASSA-PSS']);
1401
+ ASSERT.equal(cert.signatureParameters.hash.algorithmOid, PKI.oids['sha256']);
1402
+ ASSERT.equal(cert.signatureParameters.mgf.algorithmOid, PKI.oids['mgf1']);
1403
+ ASSERT.equal(cert.signatureParameters.mgf.hash.algorithmOid, PKI.oids['sha256']);
1404
+ ASSERT.equal(cert.siginfo.algorithmOid, PKI.oids['RSASSA-PSS']);
1405
+ ASSERT.equal(cert.siginfo.parameters.hash.algorithmOid, PKI.oids['sha256']);
1406
+ ASSERT.equal(cert.siginfo.parameters.mgf.algorithmOid, PKI.oids['mgf1']);
1407
+ ASSERT.equal(cert.siginfo.parameters.mgf.hash.algorithmOid, PKI.oids['sha256']);
1408
+ });
1409
+
1410
+ it('should export certificate with sha256 RSASSA-PSS signature', function() {
1411
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1412
+ 'MIIERzCCAvugAwIBAgIEO50CcjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC\r\n' +
1413
+ 'AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwRjELMAkGA1UE\r\n' +
1414
+ 'BhMCREUxDzANBgNVBAoTBkVsc3RlcjELMAkGA1UECxMCQ0ExGTAXBgNVBAMTEEVs\r\n' +
1415
+ 'c3RlclNvZnRUZXN0Q0EwHhcNMTEwNzI4MTIxMzU3WhcNMTQwNzI4MTIxMzU3WjAr\r\n' +
1416
+ 'MRQwEgYDVQQFEwsxMDAyNzUzMzI1QzETMBEGA1UEAxMKMTAwMjc1MzMyNTCCASIw\r\n' +
1417
+ 'DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALHCogo7LVUkxWsMIc/0jgH2PCLt\r\n' +
1418
+ 'ukbATPehxWBG1XUPrz53lWgFJzlZaKLlLVVnXrfULaifuOKlZP6SM1JQlL1JuYgY\r\n' +
1419
+ 'AdgZyHjderNIk5NsSTmefwonSn/ukri5IRTH420oHtSjxk6+/DXlWnQy5OzTN6Bq\r\n' +
1420
+ 'jVJo8L+TTmf2jWuEam5cWa+YVP2k3tIqX5yMUDFjKO4znHdtIkHnBE0Kx03rWQRB\r\n' +
1421
+ 'TSYWDgDm2gttdOs9JVeuW0nnwQj27uo9gOR0iyaUjVrKLZ95p6zpXhM4uMSVRNeo\r\n' +
1422
+ 'LqkdqP2n+4pDXZVqLNgjkHQUS/xq9Q/kYgT2J7wkGfYxP9to7TG7vra1eOECAwEA\r\n' +
1423
+ 'AaOB7zCB7DAOBgNVHQ8BAf8EBAMCBSAwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU\r\n' +
1424
+ 'NDJ2BZIk6ukLqkdmttH12bu2leswOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2Ny\r\n' +
1425
+ 'bC5lbHN0ZXIuZGUvRWxzdGVyU29mdFRlc3RDQS5jcmwwcQYDVR0jBGowaIAU1R9A\r\n' +
1426
+ 'HmpdzaxK3v+ihQsEpAFgzOKhSqRIMEYxCzAJBgNVBAYTAkRFMQ8wDQYDVQQKEwZF\r\n' +
1427
+ 'bHN0ZXIxDzANBgNVBAsTBlJvb3RDQTEVMBMGA1UEAxMMRWxzdGVyUm9vdENBggQ7\r\n' +
1428
+ 'msqPMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0B\r\n' +
1429
+ 'AQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAQEAJBYNRZpe+z3yPPLV539Yci6OfjVg\r\n' +
1430
+ 'vs1e3rvSvcpFaqRJ8vZ8WNx3uuRQZ6B4Z3YEc00UJAOl3wU6KhamyryK2YvCrPg+\r\n' +
1431
+ 'TS5QDXNaO2z/rAnY1wWSlwBPlhqpMRrNv9cRXBcgK5YxprjytCVYN0UHdintgYxG\r\n' +
1432
+ 'fg7QYiFb00UXxAza1AFrpG+RqySFfO1scmu4kgpeb6A3USnQ0r6rZz6dt6NqgZZ6\r\n' +
1433
+ 'oUpDOCvnS9XSOWuvJirV8hIU0KAagguTbwfTqt9nt0wDlwZpemsJZ4Vvnvy8d9Jf\r\n' +
1434
+ 'zA68EWHbZLr2QP9hb3sHCWJgplMsTJnUwRfi2hf5KNtP8Xg5DSLMfTEbhw==\r\n' +
1435
+ '-----END CERTIFICATE-----\r\n';
1436
+ var cert = PKI.certificateFromPem(certPem, true);
1437
+ ASSERT.equal(PKI.certificateToPem(cert), certPem);
1438
+ });
1439
+
1440
+ it('should verify certificate with sha256 RSASSA-PSS signature', function() {
1441
+ var certPem = '-----BEGIN CERTIFICATE-----\r\n' +
1442
+ 'MIIERzCCAvugAwIBAgIEO50CcjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC\r\n' +
1443
+ 'AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwRjELMAkGA1UE\r\n' +
1444
+ 'BhMCREUxDzANBgNVBAoTBkVsc3RlcjELMAkGA1UECxMCQ0ExGTAXBgNVBAMTEEVs\r\n' +
1445
+ 'c3RlclNvZnRUZXN0Q0EwHhcNMTEwNzI4MTIxMzU3WhcNMTQwNzI4MTIxMzU3WjAr\r\n' +
1446
+ 'MRQwEgYDVQQFEwsxMDAyNzUzMzI1QzETMBEGA1UEAxMKMTAwMjc1MzMyNTCCASIw\r\n' +
1447
+ 'DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALHCogo7LVUkxWsMIc/0jgH2PCLt\r\n' +
1448
+ 'ukbATPehxWBG1XUPrz53lWgFJzlZaKLlLVVnXrfULaifuOKlZP6SM1JQlL1JuYgY\r\n' +
1449
+ 'AdgZyHjderNIk5NsSTmefwonSn/ukri5IRTH420oHtSjxk6+/DXlWnQy5OzTN6Bq\r\n' +
1450
+ 'jVJo8L+TTmf2jWuEam5cWa+YVP2k3tIqX5yMUDFjKO4znHdtIkHnBE0Kx03rWQRB\r\n' +
1451
+ 'TSYWDgDm2gttdOs9JVeuW0nnwQj27uo9gOR0iyaUjVrKLZ95p6zpXhM4uMSVRNeo\r\n' +
1452
+ 'LqkdqP2n+4pDXZVqLNgjkHQUS/xq9Q/kYgT2J7wkGfYxP9to7TG7vra1eOECAwEA\r\n' +
1453
+ 'AaOB7zCB7DAOBgNVHQ8BAf8EBAMCBSAwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU\r\n' +
1454
+ 'NDJ2BZIk6ukLqkdmttH12bu2leswOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2Ny\r\n' +
1455
+ 'bC5lbHN0ZXIuZGUvRWxzdGVyU29mdFRlc3RDQS5jcmwwcQYDVR0jBGowaIAU1R9A\r\n' +
1456
+ 'HmpdzaxK3v+ihQsEpAFgzOKhSqRIMEYxCzAJBgNVBAYTAkRFMQ8wDQYDVQQKEwZF\r\n' +
1457
+ 'bHN0ZXIxDzANBgNVBAsTBlJvb3RDQTEVMBMGA1UEAxMMRWxzdGVyUm9vdENBggQ7\r\n' +
1458
+ 'msqPMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0B\r\n' +
1459
+ 'AQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAQEAJBYNRZpe+z3yPPLV539Yci6OfjVg\r\n' +
1460
+ 'vs1e3rvSvcpFaqRJ8vZ8WNx3uuRQZ6B4Z3YEc00UJAOl3wU6KhamyryK2YvCrPg+\r\n' +
1461
+ 'TS5QDXNaO2z/rAnY1wWSlwBPlhqpMRrNv9cRXBcgK5YxprjytCVYN0UHdintgYxG\r\n' +
1462
+ 'fg7QYiFb00UXxAza1AFrpG+RqySFfO1scmu4kgpeb6A3USnQ0r6rZz6dt6NqgZZ6\r\n' +
1463
+ 'oUpDOCvnS9XSOWuvJirV8hIU0KAagguTbwfTqt9nt0wDlwZpemsJZ4Vvnvy8d9Jf\r\n' +
1464
+ 'zA68EWHbZLr2QP9hb3sHCWJgplMsTJnUwRfi2hf5KNtP8Xg5DSLMfTEbhw==\r\n' +
1465
+ '-----END CERTIFICATE-----\r\n';
1466
+ var issuerPem = '-----BEGIN CERTIFICATE-----\r\n' +
1467
+ 'MIIEZDCCAxigAwIBAgIEO5rKjzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC\r\n' +
1468
+ 'AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwRjELMAkGA1UE\r\n' +
1469
+ 'BhMCREUxDzANBgNVBAoTBkVsc3RlcjEPMA0GA1UECxMGUm9vdENBMRUwEwYDVQQD\r\n' +
1470
+ 'EwxFbHN0ZXJSb290Q0EwHhcNMTEwNzI4MTExNzI4WhcNMTYwNzI4MTExNzI4WjBG\r\n' +
1471
+ 'MQswCQYDVQQGEwJERTEPMA0GA1UEChMGRWxzdGVyMQswCQYDVQQLEwJDQTEZMBcG\r\n' +
1472
+ 'A1UEAxMQRWxzdGVyU29mdFRlc3RDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\r\n' +
1473
+ 'AQoCggEBAMFpz3sXnXq4ZUBdYdpG5DJVfITLXYwXPfEJzr1pLRfJ2eMPn7k3B/2g\r\n' +
1474
+ 'bvuH30zKmDRjlfV51sFw4l1l+cQugzy5FEOrfE6g7IvhpBUf9SQujVWtE3BoSRR5\r\n' +
1475
+ 'pSGbIWC7sm2SG0drpoCRpL0xmWZlAUS5mz7hBecJC/kKkKeOxUg5h492XQgWd0ow\r\n' +
1476
+ '6GlyQBxJCmxgQBMnLS0stecs234hR5gvTHic50Ey+gRMPsTyco2Fm0FqvXtBuOsj\r\n' +
1477
+ 'zAW7Nk2hnM6awFHVMDBLm+ClE1ww0dLW0ujkdoGsTEbvmM/w8MBI6WAiWaanjK/x\r\n' +
1478
+ 'lStmQeUVXKd+AfuzT/FIPrwANcC1qGUCAwEAAaOB8TCB7jAOBgNVHQ8BAf8EBAMC\r\n' +
1479
+ 'AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU1R9AHmpdzaxK3v+ihQsE\r\n' +
1480
+ 'pAFgzOIwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5lbHN0ZXIuZGUvRWxz\r\n' +
1481
+ 'dGVyUm9vdENBLmNybDBxBgNVHSMEajBogBS3zfTokckL2H/fTojW02K+metEcaFK\r\n' +
1482
+ 'pEgwRjELMAkGA1UEBhMCREUxDzANBgNVBAoTBkVsc3RlcjEPMA0GA1UECxMGUm9v\r\n' +
1483
+ 'dENBMRUwEwYDVQQDEwxFbHN0ZXJSb290Q0GCBDuaylowQQYJKoZIhvcNAQEKMDSg\r\n' +
1484
+ 'DzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKID\r\n' +
1485
+ 'AgEgA4IBAQBjT107fBmSfQNUYCpXIlaS/pogPoCahuC1g8QDtq6IEVXoEgXCzfVN\r\n' +
1486
+ 'JYHyYOQOraP4O2LEcXpo/oc0MMpVF06QLKG/KieUE0mrZnsCJ3GLSJkM8tI8bRHj\r\n' +
1487
+ '8tAhlViMacUqnKKufCs/rIN25JB57+sCyFqjtRbSt88e+xqFJ5I79Btp/bNtoj2G\r\n' +
1488
+ 'OJGl997EPua9/yJuvdA9W67WO/KwEh+FqylB1pAapccOHqttwu4QJIc/XJfG5rrf\r\n' +
1489
+ '8QZz8HIuOcroA4zIrprQ1nJRCuMII04ueDtBVz1eIEmqNEUkr09JdK8M0LKH0lMK\r\n' +
1490
+ 'Ysgjai/P2mPVVwhVw6dHzUVRLXh3xIQr\r\n' +
1491
+ '-----END CERTIFICATE-----\r\n';
1492
+ var cert = PKI.certificateFromPem(certPem, true);
1493
+ var issuer = PKI.certificateFromPem(issuerPem);
1494
+ ASSERT.ok(issuer.verify(cert));
1495
+ });
1496
+
1497
+ it('should parse certificate with ASN.1 signature data', function() {
1498
+ // signature has bytes that could look like ASN.1 data
1499
+ // TODO: add more similar tests with possible ASN.1 data in BIT
1500
+ // .. STRINGS that are just data.
1501
+ var certPem =
1502
+ '-----BEGIN CERTIFICATE-----\r\n' +
1503
+ 'MIIDsjCCApqgAwIBAgIUR+JnrOX42d+AXaXwLDWYsxmr+DwwDQYJKoZIhvcNAQEL\r\n' +
1504
+ 'BQAwgYgxJjAkBgNVBAMMHVRlc3QgSW50ZXJtZWRpYXRlIENlcnRpZmljYXRlMSEw\r\n' +
1505
+ 'HwYDVQQLDBhUZXN0IE9yZ2FuaXphdGlvbmFsIFVuaXQxGjAYBgNVBAoMEVRlc3Qg\r\n' +
1506
+ 'T3JnYW5pemF0aW9uMRIwEAYDVQQHDAlUZXN0IENpdHkxCzAJBgNVBAYTAlVTMB4X\r\n' +
1507
+ 'DTE3MDEzMDE1NTk0MloXDTIyMDEzMDE1NTk0MlowezEZMBcGA1UEAwwQVGVzdCBD\r\n' +
1508
+ 'ZXJ0aWZpY2F0ZTEhMB8GA1UECwwYVGVzdCBPcmdhbml6YXRpb25hbCBVbml0MRow\r\n' +
1509
+ 'GAYDVQQKDBFUZXN0IE9yZ2FuaXphdGlvbjESMBAGA1UEBwwJVGVzdCBDaXR5MQsw\r\n' +
1510
+ 'CQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMEBoBE9\r\n' +
1511
+ 'Kprzj7LRbK0JHKSNI93eKFDgkRc1lQWVf2cVyU6bncBDdxrCFLG6vadpQzPQDCJs\r\n' +
1512
+ 'ePlzM4J2TueTtbNTgLj3EBwwB1Ju9kOidxn5hCASWR0EObLiHSq3zlM/ABZOEOtz\r\n' +
1513
+ 'hPTGWnp7jfoDeTgK/zNnCsqdT1w1nzsz1u8zZ+96dEul6RC313CxV5Xq+Qacky8f\r\n' +
1514
+ '2tug0wgvmcYqfd6AIg0btIjhREsulJK0QqSjqmzkLiDBJRsOHzi9zAusYBkvqUMj\r\n' +
1515
+ '9ae2j4adIHKNzzgRAif8Bu9yXZ0iK3im6BQhBiC+unwMRAjbHdPI73ASJFdqjHb0\r\n' +
1516
+ 'uAkno0WIORHnQvECAwEAAaMgMB4wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQC\r\n' +
1517
+ 'MAAwDQYJKoZIhvcNAQELBQADggEBACsFnYH7ByzOFQo5zdOJp4NcmV6yDaTgJoEg\r\n' +
1518
+ '71oPI0bgRkpde2rJT7E41fxxajIGbGgVnvIT2yo2QZNRTJjrnzIoVAfOsgWSp8jf\r\n' +
1519
+ 'L6HjyZwK5L6ziBfPYnCAzRC4mwjgR2EkEhbA/HDZCko5CfRR8WIKVmtGweIL/5I+\r\n' +
1520
+ '9aUG7lUKbf3aGLnBMG6YzThNnMW1a4EZt7EZUlz4mZ3C7KH1lqdmeaZT+BdnZFL2\r\n' +
1521
+ 'Mjf0zXRaL1k1BpBrzPfmfWfE+gx7EAWF6E/iDu+g1PhX678vFEJiAQkINVwkjA1d\r\n' +
1522
+ '/fpSWNjJEEVPrhWwmoK5+xfM5qC9una9BfFwaUOdYDH59BN6jHE=\r\n' +
1523
+ '-----END CERTIFICATE-----\r\n';
1524
+ // round trip pem -> cert -> asn1 -> der -> asn1 -> cert -> pem
1525
+ var inCert = PKI.certificateFromPem(certPem);
1526
+ var inAsn1 = PKI.certificateToAsn1(inCert);
1527
+ var inDer = ASN1.toDer(inAsn1);
1528
+ var outAsn1 = ASN1.fromDer(inDer);
1529
+ var outCert = PKI.certificateFromAsn1(outAsn1);
1530
+ var outPem = PKI.certificateToPem(outCert);
1531
+ ASSERT.equal(certPem, outPem);
1532
+ });
1533
+
1534
+ it('should require basicConstraints on non-leaf certificates', function() {
1535
+ // see GHSA-2328-f5f3-gj25 and PoC in /tests/pocs/
1536
+ function generateKeyPair() {
1537
+ return PKI.rsa.generateKeyPair({bits: 2048, e: 0x10001});
1538
+ }
1539
+
1540
+ // 1. Create a legitimate Root CA (self-signed, with basicConstraints
1541
+ // cA=true)
1542
+ var rootKeys = generateKeyPair();
1543
+ var rootCert = PKI.createCertificate();
1544
+ rootCert.publicKey = rootKeys.publicKey;
1545
+ rootCert.serialNumber = '01';
1546
+ rootCert.validity.notBefore = new Date();
1547
+ rootCert.validity.notAfter = new Date();
1548
+ rootCert.validity.notAfter.setFullYear(rootCert.validity.notBefore.getFullYear() + 10);
1549
+
1550
+ var rootAttrs = [
1551
+ {name: 'commonName', value: 'Legitimate Root CA'},
1552
+ {name: 'organizationName', value: 'PoC Security Test'}
1553
+ ];
1554
+ rootCert.setSubject(rootAttrs);
1555
+ rootCert.setIssuer(rootAttrs);
1556
+ rootCert.setExtensions([
1557
+ {name: 'basicConstraints', cA: true, critical: true},
1558
+ {name: 'keyUsage', keyCertSign: true, cRLSign: true, critical: true}
1559
+ ]);
1560
+ rootCert.sign(rootKeys.privateKey, MD.sha256.create());
1561
+
1562
+ // 2. Create a "leaf" certificate signed by root — NO basicConstraints,
1563
+ // NO keyUsage This certificate should NOT be allowed to sign other
1564
+ // certificates
1565
+ var leafKeys = generateKeyPair();
1566
+ var leafCert = PKI.createCertificate();
1567
+ leafCert.publicKey = leafKeys.publicKey;
1568
+ leafCert.serialNumber = '02';
1569
+ leafCert.validity.notBefore = new Date();
1570
+ leafCert.validity.notAfter = new Date();
1571
+ leafCert.validity.notAfter.setFullYear(leafCert.validity.notBefore.getFullYear() + 5);
1572
+
1573
+ var leafAttrs = [
1574
+ {name: 'commonName', value: 'Non-CA Leaf Certificate'},
1575
+ {name: 'organizationName', value: 'PoC Security Test'}
1576
+ ];
1577
+ leafCert.setSubject(leafAttrs);
1578
+ leafCert.setIssuer(rootAttrs);
1579
+ // NO basicConstraints extension — NO keyUsage extension
1580
+ leafCert.sign(rootKeys.privateKey, MD.sha256.create());
1581
+
1582
+ // 3. Create a "victim" certificate signed by the leaf
1583
+ // This simulates an attacker using a non-CA cert to forge certificates
1584
+ var victimKeys = generateKeyPair();
1585
+ var victimCert = PKI.createCertificate();
1586
+ victimCert.publicKey = victimKeys.publicKey;
1587
+ victimCert.serialNumber = '03';
1588
+ victimCert.validity.notBefore = new Date();
1589
+ victimCert.validity.notAfter = new Date();
1590
+ victimCert.validity.notAfter.setFullYear(victimCert.validity.notBefore.getFullYear() + 1);
1591
+
1592
+ var victimAttrs = [
1593
+ {name: 'commonName', value: 'victim.example.com'},
1594
+ {name: 'organizationName', value: 'Victim Corp'}
1595
+ ];
1596
+ victimCert.setSubject(victimAttrs);
1597
+ victimCert.setIssuer(leafAttrs);
1598
+ victimCert.sign(leafKeys.privateKey, MD.sha256.create());
1599
+
1600
+ // 4. Verify the chain: root -> leaf -> victim
1601
+ var caStore = PKI.createCaStore([rootCert]);
1602
+
1603
+ ASSERT.throws(
1604
+ function() {
1605
+ PKI.verifyCertificateChain(caStore, [victimCert, leafCert]);
1606
+ },
1607
+ function(err) {
1608
+ var exMsg =
1609
+ 'Certificate is missing basicConstraints extension and cannot ' +
1610
+ 'be used as a CA.';
1611
+ var exErr = 'forge.pki.BadCertificate';
1612
+ return err.message === exMsg && err.error === exErr;
1613
+ }
1614
+ );
1615
+ });
1616
+ });
1617
+
1618
+ // TODO: add sha-512 and sha-256 fingerprint tests
1619
+
1620
+ describe('public key fingerprints', function() {
1621
+ it('should get a SHA-1 RSAPublicKey fingerprint', function() {
1622
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1623
+ var fp = PKI.getPublicKeyFingerprint(publicKey, {type: 'RSAPublicKey'});
1624
+ ASSERT.equal(fp.toHex(), 'f57563e0c75d6e9b03fafdb2fd72349f23030300');
1625
+ });
1626
+
1627
+ it('should get a SHA-1 SubjectPublicKeyInfo fingerprint', function() {
1628
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1629
+ var fp = PKI.getPublicKeyFingerprint(
1630
+ publicKey, {type: 'SubjectPublicKeyInfo'});
1631
+ ASSERT.equal(fp.toHex(), '984724bc548bbc2c8acbac044bd8d518abd26dd8');
1632
+ });
1633
+
1634
+ it('should get a hex SHA-1 RSAPublicKey fingerprint', function() {
1635
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1636
+ var fp = PKI.getPublicKeyFingerprint(
1637
+ publicKey, {type: 'RSAPublicKey', encoding: 'hex'});
1638
+ ASSERT.equal(fp, 'f57563e0c75d6e9b03fafdb2fd72349f23030300');
1639
+ });
1640
+
1641
+ it('should get a hex, colon-delimited SHA-1 RSAPublicKey fingerprint', function() {
1642
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1643
+ var fp = PKI.getPublicKeyFingerprint(
1644
+ publicKey, {type: 'RSAPublicKey', encoding: 'hex', delimiter: ':'});
1645
+ ASSERT.equal(
1646
+ fp, 'f5:75:63:e0:c7:5d:6e:9b:03:fa:fd:b2:fd:72:34:9f:23:03:03:00');
1647
+ });
1648
+
1649
+ it('should get a hex, colon-delimited SHA-1 SubjectPublicKeyInfo fingerprint', function() {
1650
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1651
+ var fp = PKI.getPublicKeyFingerprint(
1652
+ publicKey, {
1653
+ type: 'SubjectPublicKeyInfo',
1654
+ encoding: 'hex',
1655
+ delimiter: ':'
1656
+ });
1657
+ ASSERT.equal(
1658
+ fp, '98:47:24:bc:54:8b:bc:2c:8a:cb:ac:04:4b:d8:d5:18:ab:d2:6d:d8');
1659
+ });
1660
+
1661
+ it('should get an MD5 RSAPublicKey fingerprint', function() {
1662
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1663
+ var fp = PKI.getPublicKeyFingerprint(
1664
+ publicKey, {md: MD.md5.create(), type: 'RSAPublicKey'});
1665
+ ASSERT.equal(fp.toHex(), 'c7da180cc48d31a071d31a78bc43d9d7');
1666
+ });
1667
+
1668
+ it('should get an MD5 SubjectPublicKeyInfo fingerprint', function() {
1669
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1670
+ var fp = PKI.getPublicKeyFingerprint(
1671
+ publicKey, {md: MD.md5.create(), type: 'SubjectPublicKeyInfo'});
1672
+ ASSERT.equal(fp.toHex(), 'e5c5ba577fe24fb8a678d8d58f539cd7');
1673
+ });
1674
+
1675
+ it('should get a hex MD5 RSAPublicKey fingerprint', function() {
1676
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1677
+ var fp = PKI.getPublicKeyFingerprint(
1678
+ publicKey,
1679
+ {md: MD.md5.create(), type: 'RSAPublicKey', encoding: 'hex'});
1680
+ ASSERT.equal(fp, 'c7da180cc48d31a071d31a78bc43d9d7');
1681
+ });
1682
+
1683
+ it('should get a hex, colon-delimited MD5 RSAPublicKey fingerprint', function() {
1684
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1685
+ var fp = PKI.getPublicKeyFingerprint(
1686
+ publicKey, {
1687
+ md: MD.md5.create(),
1688
+ type: 'RSAPublicKey',
1689
+ encoding: 'hex',
1690
+ delimiter: ':'
1691
+ });
1692
+ ASSERT.equal(fp, 'c7:da:18:0c:c4:8d:31:a0:71:d3:1a:78:bc:43:d9:d7');
1693
+ });
1694
+
1695
+ it('should get a hex, colon-delimited MD5 SubjectPublicKeyInfo fingerprint', function() {
1696
+ var publicKey = PKI.publicKeyFromPem(_pem.publicKey);
1697
+ var fp = PKI.getPublicKeyFingerprint(
1698
+ publicKey, {
1699
+ md: MD.md5.create(),
1700
+ type: 'SubjectPublicKeyInfo',
1701
+ encoding: 'hex',
1702
+ delimiter: ':'
1703
+ });
1704
+ ASSERT.equal(fp, 'e5:c5:ba:57:7f:e2:4f:b8:a6:78:d8:d5:8f:53:9c:d7');
1705
+ });
1706
+ });
1707
+
1708
+ describe('CA store', function() {
1709
+ it('should add a certificate object to a store', function() {
1710
+ var cert = PKI.certificateFromPem(_pem.certificate);
1711
+ var caStore = PKI.createCaStore();
1712
+ caStore.addCertificate(cert);
1713
+ ASSERT.ok(caStore.hasCertificate(cert));
1714
+ ASSERT.equal(caStore.listAllCertificates().length, 1);
1715
+ });
1716
+
1717
+ it('should add a PEM certificate to a store', function() {
1718
+ var caStore = PKI.createCaStore();
1719
+ caStore.addCertificate(_pem.certificate);
1720
+ ASSERT.ok(caStore.hasCertificate(_pem.certificate));
1721
+ ASSERT.equal(caStore.listAllCertificates().length, 1);
1722
+ });
1723
+
1724
+ it('should add two certificate objects to a store', function() {
1725
+ var cert1 = PKI.certificateFromPem(_pem.certificate);
1726
+ var cert2 = PKI.certificateFromPem(_pem_sha256.certificate);
1727
+ var caStore = PKI.createCaStore();
1728
+ caStore.addCertificate(cert1);
1729
+ caStore.addCertificate(cert2);
1730
+ ASSERT.ok(caStore.hasCertificate(cert1));
1731
+ ASSERT.ok(caStore.hasCertificate(cert2));
1732
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1733
+ });
1734
+
1735
+ it('should add two PEM certificates to a store', function() {
1736
+ var cert1 = _pem.certificate;
1737
+ var cert2 = _pem_sha256.certificate;
1738
+ var caStore = PKI.createCaStore();
1739
+ caStore.addCertificate(cert1);
1740
+ caStore.addCertificate(cert2);
1741
+ ASSERT.ok(caStore.hasCertificate(cert1));
1742
+ ASSERT.ok(caStore.hasCertificate(cert2));
1743
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1744
+ });
1745
+
1746
+ it('should remove a certificate object from a store', function() {
1747
+ var cert1 = PKI.certificateFromPem(_pem.certificate);
1748
+ var cert2 = PKI.certificateFromPem(_pem_sha256.certificate);
1749
+ var caStore = PKI.createCaStore();
1750
+ caStore.addCertificate(cert1);
1751
+ caStore.addCertificate(cert2);
1752
+ var result = caStore.removeCertificate(cert1);
1753
+ ASSERT.equal(PKI.certificateToPem(result), PKI.certificateToPem(cert1));
1754
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1755
+ ASSERT.ok(caStore.hasCertificate(cert2));
1756
+ ASSERT.equal(caStore.listAllCertificates().length, 1);
1757
+ });
1758
+
1759
+ it('should remove a PEM certificate from a store', function() {
1760
+ var cert1 = _pem.certificate;
1761
+ var cert2 = _pem_sha256.certificate;
1762
+ var caStore = PKI.createCaStore();
1763
+ caStore.addCertificate(cert1);
1764
+ caStore.addCertificate(cert2);
1765
+ var result = caStore.removeCertificate(cert1);
1766
+ ASSERT.equal(PKI.certificateToPem(result), cert1);
1767
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1768
+ ASSERT.ok(caStore.hasCertificate(cert2));
1769
+ ASSERT.equal(caStore.listAllCertificates().length, 1);
1770
+ });
1771
+
1772
+ it('should remove a certificate object from a store with two remaining', function() {
1773
+ var cert1 = PKI.certificateFromPem(_pem.certificate);
1774
+ var cert2 = PKI.certificateFromPem(_pem_sha256.certificate);
1775
+ var cert3 = PKI.certificateFromPem(_pem_sha512.certificate);
1776
+ var caStore = PKI.createCaStore();
1777
+ caStore.addCertificate(cert1);
1778
+ caStore.addCertificate(cert2);
1779
+ caStore.addCertificate(cert3);
1780
+ var result = caStore.removeCertificate(cert1);
1781
+ ASSERT.equal(PKI.certificateToPem(result), PKI.certificateToPem(cert1));
1782
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1783
+ ASSERT.ok(caStore.hasCertificate(cert2));
1784
+ ASSERT.ok(caStore.hasCertificate(cert3));
1785
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1786
+ });
1787
+
1788
+ it('should remove a PEM certificate from a store with two remaining', function() {
1789
+ var cert1 = _pem.certificate;
1790
+ var cert2 = _pem_sha256.certificate;
1791
+ var cert3 = _pem_sha512.certificate;
1792
+ var caStore = PKI.createCaStore();
1793
+ caStore.addCertificate(cert1);
1794
+ caStore.addCertificate(cert2);
1795
+ caStore.addCertificate(cert3);
1796
+ var result = caStore.removeCertificate(cert1);
1797
+ ASSERT.equal(PKI.certificateToPem(result), cert1);
1798
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1799
+ ASSERT.ok(caStore.hasCertificate(cert2));
1800
+ ASSERT.ok(caStore.hasCertificate(cert3));
1801
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1802
+ });
1803
+
1804
+ it('should add two certificate objects with the same subject to a store', function() {
1805
+ var cert1 = PKI.certificateFromPem(_pem_same_subject[0]);
1806
+ var cert2 = PKI.certificateFromPem(_pem_same_subject[1]);
1807
+ var caStore = PKI.createCaStore();
1808
+ caStore.addCertificate(cert1);
1809
+ caStore.addCertificate(cert2);
1810
+ ASSERT.ok(caStore.hasCertificate(cert1));
1811
+ ASSERT.ok(caStore.hasCertificate(cert2));
1812
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1813
+ });
1814
+
1815
+ it('should add two PEM certificates with the same subject to a store', function() {
1816
+ var cert1 = _pem_same_subject[0];
1817
+ var cert2 = _pem_same_subject[1];
1818
+ var caStore = PKI.createCaStore();
1819
+ caStore.addCertificate(cert1);
1820
+ caStore.addCertificate(cert2);
1821
+ ASSERT.ok(caStore.hasCertificate(cert1));
1822
+ ASSERT.ok(caStore.hasCertificate(cert2));
1823
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1824
+ });
1825
+
1826
+ it('should remove a certificate object with the same subject from a store', function() {
1827
+ var cert1 = PKI.certificateFromPem(_pem_same_subject[0]);
1828
+ var cert2 = PKI.certificateFromPem(_pem_same_subject[1]);
1829
+ var caStore = PKI.createCaStore();
1830
+ caStore.addCertificate(cert1);
1831
+ caStore.addCertificate(cert2);
1832
+ caStore.removeCertificate(cert1);
1833
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1834
+ ASSERT.ok(caStore.hasCertificate(cert2));
1835
+ ASSERT.equal(caStore.listAllCertificates().length, 1);
1836
+ });
1837
+
1838
+ it('should remove a PEM certificate with the same subject from a store', function() {
1839
+ var cert1 = _pem_same_subject[0];
1840
+ var cert2 = _pem_same_subject[1];
1841
+ var caStore = PKI.createCaStore();
1842
+ caStore.addCertificate(cert1);
1843
+ caStore.addCertificate(cert2);
1844
+ caStore.removeCertificate(cert1);
1845
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1846
+ ASSERT.ok(caStore.hasCertificate(cert2));
1847
+ ASSERT.equal(caStore.listAllCertificates().length, 1);
1848
+ });
1849
+
1850
+ it('should remove a certificate object from a store with the same subject with two remaining', function() {
1851
+ var cert1 = PKI.certificateFromPem(_pem_same_subject[0]);
1852
+ var cert2 = PKI.certificateFromPem(_pem_same_subject[1]);
1853
+ var cert3 = PKI.certificateFromPem(_pem_sha512.certificate);
1854
+ var caStore = PKI.createCaStore();
1855
+ caStore.addCertificate(cert1);
1856
+ caStore.addCertificate(cert2);
1857
+ caStore.addCertificate(cert3);
1858
+ caStore.removeCertificate(cert1);
1859
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1860
+ ASSERT.ok(caStore.hasCertificate(cert2));
1861
+ ASSERT.ok(caStore.hasCertificate(cert3));
1862
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1863
+ });
1864
+
1865
+ it('should remove a PEM certificate from a store with the same subject with two remaining', function() {
1866
+ var cert1 = _pem_same_subject[0];
1867
+ var cert2 = _pem_same_subject[1];
1868
+ var cert3 = _pem_sha512.certificate;
1869
+ var caStore = PKI.createCaStore();
1870
+ caStore.addCertificate(cert1);
1871
+ caStore.addCertificate(cert2);
1872
+ caStore.addCertificate(cert3);
1873
+ caStore.removeCertificate(cert1);
1874
+ ASSERT.ok(!caStore.hasCertificate(cert1));
1875
+ ASSERT.ok(caStore.hasCertificate(cert2));
1876
+ ASSERT.ok(caStore.hasCertificate(cert3));
1877
+ ASSERT.equal(caStore.listAllCertificates().length, 2);
1878
+ });
1879
+
1880
+ it('should fail to remove a PEM certificate from a store', function() {
1881
+ var cert1 = _pem.certificate;
1882
+ var cert2 = _pem_sha256.certificate;
1883
+ var cert3 = _pem_sha512.certificate;
1884
+ var caStore = PKI.createCaStore();
1885
+ caStore.addCertificate(cert1);
1886
+ caStore.addCertificate(cert2);
1887
+ caStore.addCertificate(cert3);
1888
+ var result = caStore.removeCertificate(cert1);
1889
+ ASSERT.equal(PKI.certificateToPem(result), cert1);
1890
+ result = caStore.removeCertificate(cert2);
1891
+ ASSERT.equal(PKI.certificateToPem(result), cert2);
1892
+ result = caStore.removeCertificate(cert3);
1893
+ ASSERT.equal(PKI.certificateToPem(result), cert3);
1894
+ result = caStore.removeCertificate(cert1);
1895
+ ASSERT.equal(result, null);
1896
+ result = caStore.removeCertificate(cert2);
1897
+ ASSERT.equal(result, null);
1898
+ result = caStore.removeCertificate(cert3);
1899
+ ASSERT.equal(result, null);
1900
+ ASSERT.equal(caStore.listAllCertificates().length, 0);
1901
+ });
1902
+ });
1903
+
1904
+ function findIndex(array, predicateObj) {
1905
+ var result = -1;
1906
+ array.forEach(function(el, index) {
1907
+ var match = Object.keys(predicateObj).reduce(function(soFar, key) {
1908
+ return soFar && el[key] === predicateObj[key];
1909
+ }, true);
1910
+ if(match) {
1911
+ result = index;
1912
+ }
1913
+ });
1914
+ return result;
1915
+ }
1916
+
1917
+ function createCertificate(options) {
1918
+ var publicKey = options.publicKey;
1919
+ var signingKey = options.signingKey;
1920
+ var subject = options.subject;
1921
+ var issuer = options.issuer;
1922
+ var isCA = options.isCA;
1923
+ var serialNumber = options.serialNumber || '01';
1924
+ var notBefore = options.notBefore || new Date();
1925
+ var notAfter;
1926
+ if(options.notAfter) {
1927
+ notAfter = options.notAfter;
1928
+ } else {
1929
+ notAfter = new Date(notBefore);
1930
+ notAfter.setFullYear(notAfter.getFullYear() + 1);
1931
+ }
1932
+
1933
+ var cert = PKI.createCertificate();
1934
+ cert.publicKey = publicKey;
1935
+ cert.serialNumber = serialNumber;
1936
+ cert.validity.notBefore = notBefore;
1937
+ cert.validity.notAfter = notAfter;
1938
+ cert.setSubject(subject);
1939
+ cert.setIssuer(issuer);
1940
+ var extensions = options.extensions || [];
1941
+ if(isCA) {
1942
+ extensions.push({
1943
+ name: 'basicConstraints',
1944
+ cA: true
1945
+ });
1946
+ }
1947
+ extensions.push({
1948
+ name: 'keyUsage',
1949
+ keyCertSign: true,
1950
+ digitalSignature: true,
1951
+ nonRepudiation: true,
1952
+ keyEncipherment: true,
1953
+ dataEncipherment: true
1954
+ }, {
1955
+ name: 'extKeyUsage',
1956
+ serverAuth: true,
1957
+ clientAuth: true,
1958
+ codeSigning: true,
1959
+ emailProtection: true,
1960
+ timeStamping: true
1961
+ }, {
1962
+ name: 'nsCertType',
1963
+ client: true,
1964
+ server: true,
1965
+ email: true,
1966
+ objsign: true,
1967
+ sslCA: true,
1968
+ emailCA: true,
1969
+ objCA: true
1970
+ }, {
1971
+ name: 'subjectAltName',
1972
+ altNames: [{
1973
+ type: 6, // URI
1974
+ value: 'http://example.org/webid#me'
1975
+ }]
1976
+ }, {
1977
+ name: 'subjectKeyIdentifier'
1978
+ });
1979
+ // FIXME: add authorityKeyIdentifier extension
1980
+ cert.setExtensions(extensions);
1981
+
1982
+ cert.sign(signingKey);
1983
+
1984
+ return cert;
1985
+ }
1986
+ })();