typenative 0.1.3 → 0.2.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 (500) hide show
  1. package/.gitattributes +1 -0
  2. package/.github/workflows/ci.yml +1 -1
  3. package/.github/workflows/npm-publish-github-packages.yml +1 -1
  4. package/CHANGELOG.md +247 -0
  5. package/CONTRIBUTION.md +1 -1
  6. package/README.md +4 -4
  7. package/bin/cli.js +3 -1
  8. package/bin/go/bridge.js +919 -0
  9. package/bin/go/convert.js +238 -0
  10. package/bin/go/metadata.js +211 -0
  11. package/bin/go/overrides.js +68 -0
  12. package/bin/go/stdlib.generated.js +175 -0
  13. package/bin/index.js +294 -240
  14. package/bin/main.js +4 -1
  15. package/bin/node/assert.js +344 -0
  16. package/bin/node/async_hooks.js +273 -0
  17. package/bin/node/buffer.js +765 -0
  18. package/bin/node/child_process.js +600 -0
  19. package/bin/node/cluster.js +1002 -0
  20. package/bin/node/console.js +121 -0
  21. package/bin/node/core.js +111 -0
  22. package/bin/node/crypto.js +414 -0
  23. package/bin/node/crypto_keys.js +2685 -0
  24. package/bin/node/dgram.js +388 -0
  25. package/bin/node/diagnostics_channel.js +534 -0
  26. package/bin/node/dns.js +635 -0
  27. package/bin/node/events.js +743 -0
  28. package/bin/node/fetch.js +737 -0
  29. package/bin/node/fs.js +998 -0
  30. package/bin/node/http.js +1500 -0
  31. package/bin/node/http2.js +688 -0
  32. package/bin/node/net.js +1143 -0
  33. package/bin/node/os.js +257 -0
  34. package/bin/node/path.js +758 -0
  35. package/bin/node/process.js +316 -0
  36. package/bin/node/punycode.js +195 -0
  37. package/bin/node/querystring.js +143 -0
  38. package/bin/node/readline.js +299 -0
  39. package/bin/node/registry.js +161 -0
  40. package/bin/node/sqlite.js +1142 -0
  41. package/bin/node/stream.js +1221 -0
  42. package/bin/node/stream_web.js +2259 -0
  43. package/bin/node/string_decoder.js +101 -0
  44. package/bin/node/system_extra.js +661 -0
  45. package/bin/node/test.js +1068 -0
  46. package/bin/node/timers.js +250 -0
  47. package/bin/node/tls.js +719 -0
  48. package/bin/node/url.js +861 -0
  49. package/bin/node/util.js +1311 -0
  50. package/bin/node/util_extra.js +599 -0
  51. package/bin/node/worker_threads.js +745 -0
  52. package/bin/node/zlib.js +263 -0
  53. package/bin/transpiler.js +2650 -575
  54. package/bin/version.js +2 -0
  55. package/conformance.md +707 -241
  56. package/govendor/github.com/ncruces/go-sqlite3/LICENSE +21 -0
  57. package/govendor/github.com/ncruces/go-sqlite3/README.md +121 -0
  58. package/govendor/github.com/ncruces/go-sqlite3/backup.go +132 -0
  59. package/govendor/github.com/ncruces/go-sqlite3/blob.go +266 -0
  60. package/govendor/github.com/ncruces/go-sqlite3/config.go +397 -0
  61. package/govendor/github.com/ncruces/go-sqlite3/conn.go +540 -0
  62. package/govendor/github.com/ncruces/go-sqlite3/conn_127.go +93 -0
  63. package/govendor/github.com/ncruces/go-sqlite3/const.go +436 -0
  64. package/govendor/github.com/ncruces/go-sqlite3/context.go +222 -0
  65. package/govendor/github.com/ncruces/go-sqlite3/error.go +182 -0
  66. package/govendor/github.com/ncruces/go-sqlite3/ext.go +153 -0
  67. package/govendor/github.com/ncruces/go-sqlite3/func.go +309 -0
  68. package/govendor/github.com/ncruces/go-sqlite3/go.mod +3 -0
  69. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk.go +29 -0
  70. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_other.go +13 -0
  71. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_unix.go +57 -0
  72. package/govendor/github.com/ncruces/go-sqlite3/internal/errutil/error.go +41 -0
  73. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/alloc.go +128 -0
  74. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/const.go +122 -0
  75. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/error.go +77 -0
  76. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem.go +116 -0
  77. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_other.go +34 -0
  78. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_unix.go +87 -0
  79. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_windows.go +149 -0
  80. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_unix.go +80 -0
  81. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_windows.go +129 -0
  82. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/sys_windows.go +60 -0
  83. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap.go +82 -0
  84. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_sys.go +113 -0
  85. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_vfs.go +181 -0
  86. package/govendor/github.com/ncruces/go-sqlite3/internal/testenv/env.go +55 -0
  87. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json.go +54 -0
  88. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json_v2.go +54 -0
  89. package/govendor/github.com/ncruces/go-sqlite3/internal/util/math.go +29 -0
  90. package/govendor/github.com/ncruces/go-sqlite3/internal/util/page.go +5 -0
  91. package/govendor/github.com/ncruces/go-sqlite3/internal/util/parse.go +142 -0
  92. package/govendor/github.com/ncruces/go-sqlite3/internal/util/pointer.go +3 -0
  93. package/govendor/github.com/ncruces/go-sqlite3/internal/util/reflect.go +10 -0
  94. package/govendor/github.com/ncruces/go-sqlite3/json.go +100 -0
  95. package/govendor/github.com/ncruces/go-sqlite3/json_v2.go +116 -0
  96. package/govendor/github.com/ncruces/go-sqlite3/pointer.go +13 -0
  97. package/govendor/github.com/ncruces/go-sqlite3/quote.go +140 -0
  98. package/govendor/github.com/ncruces/go-sqlite3/stmt.go +692 -0
  99. package/govendor/github.com/ncruces/go-sqlite3/time.go +360 -0
  100. package/govendor/github.com/ncruces/go-sqlite3/txn.go +374 -0
  101. package/govendor/github.com/ncruces/go-sqlite3/value.go +212 -0
  102. package/govendor/github.com/ncruces/go-sqlite3/vfs/README.md +133 -0
  103. package/govendor/github.com/ncruces/go-sqlite3/vfs/api.go +239 -0
  104. package/govendor/github.com/ncruces/go-sqlite3/vfs/cksm.go +143 -0
  105. package/govendor/github.com/ncruces/go-sqlite3/vfs/const.go +256 -0
  106. package/govendor/github.com/ncruces/go-sqlite3/vfs/file.go +260 -0
  107. package/govendor/github.com/ncruces/go-sqlite3/vfs/filename.go +187 -0
  108. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock.go +128 -0
  109. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go +23 -0
  110. package/govendor/github.com/ncruces/go-sqlite3/vfs/map.go +63 -0
  111. package/govendor/github.com/ncruces/go-sqlite3/vfs/map_other.go +13 -0
  112. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go +110 -0
  113. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go +131 -0
  114. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go +140 -0
  115. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go +56 -0
  116. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go +117 -0
  117. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go +59 -0
  118. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std.go +50 -0
  119. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_alloc.go +19 -0
  120. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_atomic.go +9 -0
  121. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_rw.go +13 -0
  122. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_sync.go +9 -0
  123. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_temp.go +16 -0
  124. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go +108 -0
  125. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +180 -0
  126. package/govendor/github.com/ncruces/go-sqlite3/vfs/registry.go +48 -0
  127. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm.go +26 -0
  128. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go +258 -0
  129. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go +90 -0
  130. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go +168 -0
  131. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_memlk.go +52 -0
  132. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go +185 -0
  133. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go +21 -0
  134. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go +124 -0
  135. package/govendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +455 -0
  136. package/govendor/github.com/ncruces/go-sqlite3/vtab.go +677 -0
  137. package/govendor/github.com/ncruces/go-sqlite3/wrap.go +48 -0
  138. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/LICENSE +18 -0
  139. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/README.md +11 -0
  140. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/go.mod +3 -0
  141. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/libc.go +215 -0
  142. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.dat +0 -0
  143. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.go +157903 -0
  144. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/tools.sh +38 -0
  145. package/govendor/github.com/ncruces/julianday/LICENSE +21 -0
  146. package/govendor/github.com/ncruces/julianday/README.md +9 -0
  147. package/govendor/github.com/ncruces/julianday/go.mod +3 -0
  148. package/govendor/github.com/ncruces/julianday/julianday.go +124 -0
  149. package/govendor/golang.org/x/sys/LICENSE +27 -0
  150. package/govendor/golang.org/x/sys/PATENTS +22 -0
  151. package/govendor/golang.org/x/sys/go.mod +3 -0
  152. package/govendor/golang.org/x/sys/unix/README.md +184 -0
  153. package/govendor/golang.org/x/sys/unix/affinity_linux.go +189 -0
  154. package/govendor/golang.org/x/sys/unix/aliases.go +13 -0
  155. package/govendor/golang.org/x/sys/unix/asm_aix_ppc64.s +17 -0
  156. package/govendor/golang.org/x/sys/unix/asm_bsd_386.s +27 -0
  157. package/govendor/golang.org/x/sys/unix/asm_bsd_amd64.s +27 -0
  158. package/govendor/golang.org/x/sys/unix/asm_bsd_arm.s +27 -0
  159. package/govendor/golang.org/x/sys/unix/asm_bsd_arm64.s +27 -0
  160. package/govendor/golang.org/x/sys/unix/asm_bsd_ppc64.s +29 -0
  161. package/govendor/golang.org/x/sys/unix/asm_bsd_riscv64.s +27 -0
  162. package/govendor/golang.org/x/sys/unix/asm_linux_386.s +65 -0
  163. package/govendor/golang.org/x/sys/unix/asm_linux_amd64.s +57 -0
  164. package/govendor/golang.org/x/sys/unix/asm_linux_arm.s +56 -0
  165. package/govendor/golang.org/x/sys/unix/asm_linux_arm64.s +50 -0
  166. package/govendor/golang.org/x/sys/unix/asm_linux_loong64.s +51 -0
  167. package/govendor/golang.org/x/sys/unix/asm_linux_mips64x.s +54 -0
  168. package/govendor/golang.org/x/sys/unix/asm_linux_mipsx.s +52 -0
  169. package/govendor/golang.org/x/sys/unix/asm_linux_ppc64x.s +42 -0
  170. package/govendor/golang.org/x/sys/unix/asm_linux_riscv64.s +47 -0
  171. package/govendor/golang.org/x/sys/unix/asm_linux_s390x.s +54 -0
  172. package/govendor/golang.org/x/sys/unix/asm_openbsd_mips64.s +29 -0
  173. package/govendor/golang.org/x/sys/unix/asm_solaris_amd64.s +17 -0
  174. package/govendor/golang.org/x/sys/unix/asm_zos_s390x.s +382 -0
  175. package/govendor/golang.org/x/sys/unix/auxv.go +36 -0
  176. package/govendor/golang.org/x/sys/unix/auxv_unsupported.go +13 -0
  177. package/govendor/golang.org/x/sys/unix/bluetooth_linux.go +36 -0
  178. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.go +657 -0
  179. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.s +192 -0
  180. package/govendor/golang.org/x/sys/unix/cap_freebsd.go +195 -0
  181. package/govendor/golang.org/x/sys/unix/constants.go +13 -0
  182. package/govendor/golang.org/x/sys/unix/dev_aix_ppc.go +26 -0
  183. package/govendor/golang.org/x/sys/unix/dev_aix_ppc64.go +28 -0
  184. package/govendor/golang.org/x/sys/unix/dev_darwin.go +24 -0
  185. package/govendor/golang.org/x/sys/unix/dev_dragonfly.go +30 -0
  186. package/govendor/golang.org/x/sys/unix/dev_freebsd.go +30 -0
  187. package/govendor/golang.org/x/sys/unix/dev_linux.go +42 -0
  188. package/govendor/golang.org/x/sys/unix/dev_netbsd.go +29 -0
  189. package/govendor/golang.org/x/sys/unix/dev_openbsd.go +29 -0
  190. package/govendor/golang.org/x/sys/unix/dev_zos.go +28 -0
  191. package/govendor/golang.org/x/sys/unix/dirent.go +102 -0
  192. package/govendor/golang.org/x/sys/unix/endian_big.go +9 -0
  193. package/govendor/golang.org/x/sys/unix/endian_little.go +9 -0
  194. package/govendor/golang.org/x/sys/unix/env_unix.go +31 -0
  195. package/govendor/golang.org/x/sys/unix/fcntl.go +36 -0
  196. package/govendor/golang.org/x/sys/unix/fcntl_darwin.go +24 -0
  197. package/govendor/golang.org/x/sys/unix/fcntl_linux_32bit.go +13 -0
  198. package/govendor/golang.org/x/sys/unix/fdset.go +27 -0
  199. package/govendor/golang.org/x/sys/unix/gccgo.go +59 -0
  200. package/govendor/golang.org/x/sys/unix/gccgo_c.c +44 -0
  201. package/govendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +20 -0
  202. package/govendor/golang.org/x/sys/unix/ifreq_linux.go +145 -0
  203. package/govendor/golang.org/x/sys/unix/ioctl_linux.go +341 -0
  204. package/govendor/golang.org/x/sys/unix/ioctl_signed.go +74 -0
  205. package/govendor/golang.org/x/sys/unix/ioctl_unsigned.go +74 -0
  206. package/govendor/golang.org/x/sys/unix/ioctl_zos.go +71 -0
  207. package/govendor/golang.org/x/sys/unix/mkall.sh +250 -0
  208. package/govendor/golang.org/x/sys/unix/mkerrors.sh +807 -0
  209. package/govendor/golang.org/x/sys/unix/mmap_nomremap.go +13 -0
  210. package/govendor/golang.org/x/sys/unix/mremap.go +57 -0
  211. package/govendor/golang.org/x/sys/unix/pagesize_unix.go +15 -0
  212. package/govendor/golang.org/x/sys/unix/pledge_openbsd.go +111 -0
  213. package/govendor/golang.org/x/sys/unix/ptrace_darwin.go +11 -0
  214. package/govendor/golang.org/x/sys/unix/ptrace_ios.go +11 -0
  215. package/govendor/golang.org/x/sys/unix/race.go +30 -0
  216. package/govendor/golang.org/x/sys/unix/race0.go +25 -0
  217. package/govendor/golang.org/x/sys/unix/readdirent_getdents.go +12 -0
  218. package/govendor/golang.org/x/sys/unix/readdirent_getdirentries.go +19 -0
  219. package/govendor/golang.org/x/sys/unix/readv_unix.go +103 -0
  220. package/govendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go +16 -0
  221. package/govendor/golang.org/x/sys/unix/sockcmsg_linux.go +85 -0
  222. package/govendor/golang.org/x/sys/unix/sockcmsg_unix.go +106 -0
  223. package/govendor/golang.org/x/sys/unix/sockcmsg_unix_other.go +46 -0
  224. package/govendor/golang.org/x/sys/unix/sockcmsg_zos.go +58 -0
  225. package/govendor/golang.org/x/sys/unix/symaddr_zos_s390x.s +75 -0
  226. package/govendor/golang.org/x/sys/unix/syscall.go +86 -0
  227. package/govendor/golang.org/x/sys/unix/syscall_aix.go +582 -0
  228. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc.go +52 -0
  229. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +83 -0
  230. package/govendor/golang.org/x/sys/unix/syscall_bsd.go +609 -0
  231. package/govendor/golang.org/x/sys/unix/syscall_darwin.go +711 -0
  232. package/govendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +50 -0
  233. package/govendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +50 -0
  234. package/govendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +26 -0
  235. package/govendor/golang.org/x/sys/unix/syscall_dragonfly.go +359 -0
  236. package/govendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +56 -0
  237. package/govendor/golang.org/x/sys/unix/syscall_freebsd.go +455 -0
  238. package/govendor/golang.org/x/sys/unix/syscall_freebsd_386.go +64 -0
  239. package/govendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +64 -0
  240. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +60 -0
  241. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +60 -0
  242. package/govendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go +60 -0
  243. package/govendor/golang.org/x/sys/unix/syscall_hurd.go +30 -0
  244. package/govendor/golang.org/x/sys/unix/syscall_hurd_386.go +28 -0
  245. package/govendor/golang.org/x/sys/unix/syscall_illumos.go +78 -0
  246. package/govendor/golang.org/x/sys/unix/syscall_linux.go +2574 -0
  247. package/govendor/golang.org/x/sys/unix/syscall_linux_386.go +313 -0
  248. package/govendor/golang.org/x/sys/unix/syscall_linux_alarm.go +12 -0
  249. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64.go +144 -0
  250. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go +12 -0
  251. package/govendor/golang.org/x/sys/unix/syscall_linux_arm.go +218 -0
  252. package/govendor/golang.org/x/sys/unix/syscall_linux_arm64.go +188 -0
  253. package/govendor/golang.org/x/sys/unix/syscall_linux_gc.go +14 -0
  254. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_386.go +16 -0
  255. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go +13 -0
  256. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go +30 -0
  257. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go +20 -0
  258. package/govendor/golang.org/x/sys/unix/syscall_linux_loong64.go +220 -0
  259. package/govendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +187 -0
  260. package/govendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +173 -0
  261. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc.go +203 -0
  262. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +114 -0
  263. package/govendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +193 -0
  264. package/govendor/golang.org/x/sys/unix/syscall_linux_s390x.go +295 -0
  265. package/govendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +111 -0
  266. package/govendor/golang.org/x/sys/unix/syscall_netbsd.go +388 -0
  267. package/govendor/golang.org/x/sys/unix/syscall_netbsd_386.go +37 -0
  268. package/govendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +37 -0
  269. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +37 -0
  270. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +37 -0
  271. package/govendor/golang.org/x/sys/unix/syscall_openbsd.go +346 -0
  272. package/govendor/golang.org/x/sys/unix/syscall_openbsd_386.go +41 -0
  273. package/govendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +41 -0
  274. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +41 -0
  275. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +41 -0
  276. package/govendor/golang.org/x/sys/unix/syscall_openbsd_libc.go +26 -0
  277. package/govendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go +39 -0
  278. package/govendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go +41 -0
  279. package/govendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go +41 -0
  280. package/govendor/golang.org/x/sys/unix/syscall_solaris.go +1183 -0
  281. package/govendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +27 -0
  282. package/govendor/golang.org/x/sys/unix/syscall_unix.go +619 -0
  283. package/govendor/golang.org/x/sys/unix/syscall_unix_gc.go +14 -0
  284. package/govendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go +22 -0
  285. package/govendor/golang.org/x/sys/unix/syscall_zos_s390x.go +3213 -0
  286. package/govendor/golang.org/x/sys/unix/sysvshm_linux.go +20 -0
  287. package/govendor/golang.org/x/sys/unix/sysvshm_unix.go +51 -0
  288. package/govendor/golang.org/x/sys/unix/sysvshm_unix_other.go +13 -0
  289. package/govendor/golang.org/x/sys/unix/timestruct.go +76 -0
  290. package/govendor/golang.org/x/sys/unix/unveil_openbsd.go +51 -0
  291. package/govendor/golang.org/x/sys/unix/vgetrandom_linux.go +13 -0
  292. package/govendor/golang.org/x/sys/unix/vgetrandom_unsupported.go +11 -0
  293. package/govendor/golang.org/x/sys/unix/xattr_bsd.go +280 -0
  294. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +1384 -0
  295. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +1385 -0
  296. package/govendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +1922 -0
  297. package/govendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +1922 -0
  298. package/govendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +1737 -0
  299. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +2042 -0
  300. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +2039 -0
  301. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +2033 -0
  302. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +2033 -0
  303. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go +2147 -0
  304. package/govendor/golang.org/x/sys/unix/zerrors_linux.go +4209 -0
  305. package/govendor/golang.org/x/sys/unix/zerrors_linux_386.go +882 -0
  306. package/govendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +882 -0
  307. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm.go +887 -0
  308. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +884 -0
  309. package/govendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +874 -0
  310. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips.go +888 -0
  311. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +888 -0
  312. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +888 -0
  313. package/govendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +888 -0
  314. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +940 -0
  315. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +944 -0
  316. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +944 -0
  317. package/govendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +884 -0
  318. package/govendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +943 -0
  319. package/govendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +992 -0
  320. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +1779 -0
  321. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +1769 -0
  322. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +1758 -0
  323. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +1769 -0
  324. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +1905 -0
  325. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +1905 -0
  326. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +1905 -0
  327. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +1905 -0
  328. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go +1905 -0
  329. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go +1904 -0
  330. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go +1903 -0
  331. package/govendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +1556 -0
  332. package/govendor/golang.org/x/sys/unix/zerrors_zos_s390x.go +990 -0
  333. package/govendor/golang.org/x/sys/unix/zptrace_armnn_linux.go +40 -0
  334. package/govendor/golang.org/x/sys/unix/zptrace_linux_arm64.go +17 -0
  335. package/govendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go +49 -0
  336. package/govendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go +49 -0
  337. package/govendor/golang.org/x/sys/unix/zptrace_x86_linux.go +79 -0
  338. package/govendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s +364 -0
  339. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +1461 -0
  340. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +1420 -0
  341. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +1188 -0
  342. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +1069 -0
  343. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +2728 -0
  344. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +799 -0
  345. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +2728 -0
  346. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +799 -0
  347. package/govendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +1666 -0
  348. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +1886 -0
  349. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +1886 -0
  350. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +1886 -0
  351. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +1886 -0
  352. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +1886 -0
  353. package/govendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +101 -0
  354. package/govendor/golang.org/x/sys/unix/zsyscall_linux.go +2267 -0
  355. package/govendor/golang.org/x/sys/unix/zsyscall_linux_386.go +469 -0
  356. package/govendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +636 -0
  357. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +584 -0
  358. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +535 -0
  359. package/govendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go +469 -0
  360. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +636 -0
  361. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +630 -0
  362. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +619 -0
  363. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +636 -0
  364. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +641 -0
  365. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +687 -0
  366. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +687 -0
  367. package/govendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +531 -0
  368. package/govendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +478 -0
  369. package/govendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +631 -0
  370. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +1848 -0
  371. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +1848 -0
  372. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +1848 -0
  373. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +1848 -0
  374. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +2407 -0
  375. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +719 -0
  376. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +2407 -0
  377. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +719 -0
  378. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +2407 -0
  379. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +719 -0
  380. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +2407 -0
  381. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +719 -0
  382. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +2407 -0
  383. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +719 -0
  384. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +2407 -0
  385. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +862 -0
  386. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +2407 -0
  387. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +719 -0
  388. package/govendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +2217 -0
  389. package/govendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +3458 -0
  390. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +280 -0
  391. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +280 -0
  392. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +280 -0
  393. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go +280 -0
  394. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go +280 -0
  395. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go +280 -0
  396. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go +281 -0
  397. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +439 -0
  398. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +437 -0
  399. package/govendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +316 -0
  400. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +393 -0
  401. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +393 -0
  402. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +393 -0
  403. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +393 -0
  404. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go +393 -0
  405. package/govendor/golang.org/x/sys/unix/zsysnum_linux_386.go +470 -0
  406. package/govendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +394 -0
  407. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +434 -0
  408. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +337 -0
  409. package/govendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +334 -0
  410. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +454 -0
  411. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +384 -0
  412. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +384 -0
  413. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +454 -0
  414. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +461 -0
  415. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +433 -0
  416. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +433 -0
  417. package/govendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +338 -0
  418. package/govendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +399 -0
  419. package/govendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +413 -0
  420. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +274 -0
  421. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +274 -0
  422. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +274 -0
  423. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go +274 -0
  424. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +219 -0
  425. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +219 -0
  426. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +219 -0
  427. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +218 -0
  428. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go +221 -0
  429. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go +217 -0
  430. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go +218 -0
  431. package/govendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go +2852 -0
  432. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +353 -0
  433. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +357 -0
  434. package/govendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +878 -0
  435. package/govendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +878 -0
  436. package/govendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +473 -0
  437. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +651 -0
  438. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +656 -0
  439. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +642 -0
  440. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +636 -0
  441. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go +638 -0
  442. package/govendor/golang.org/x/sys/unix/ztypes_linux.go +6547 -0
  443. package/govendor/golang.org/x/sys/unix/ztypes_linux_386.go +747 -0
  444. package/govendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +761 -0
  445. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm.go +741 -0
  446. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +740 -0
  447. package/govendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +741 -0
  448. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips.go +746 -0
  449. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +743 -0
  450. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +743 -0
  451. package/govendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +746 -0
  452. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +754 -0
  453. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +749 -0
  454. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +749 -0
  455. package/govendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +828 -0
  456. package/govendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +763 -0
  457. package/govendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +744 -0
  458. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +585 -0
  459. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +593 -0
  460. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +590 -0
  461. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +593 -0
  462. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +568 -0
  463. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +568 -0
  464. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +575 -0
  465. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +568 -0
  466. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +568 -0
  467. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go +570 -0
  468. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go +570 -0
  469. package/govendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +516 -0
  470. package/govendor/golang.org/x/sys/unix/ztypes_zos_s390x.go +552 -0
  471. package/govendor/golang.org/x/sys/windows/aliases.go +13 -0
  472. package/govendor/golang.org/x/sys/windows/dll_windows.go +380 -0
  473. package/govendor/golang.org/x/sys/windows/env_windows.go +57 -0
  474. package/govendor/golang.org/x/sys/windows/eventlog.go +20 -0
  475. package/govendor/golang.org/x/sys/windows/exec_windows.go +248 -0
  476. package/govendor/golang.org/x/sys/windows/memory_windows.go +48 -0
  477. package/govendor/golang.org/x/sys/windows/mkerrors.bash +70 -0
  478. package/govendor/golang.org/x/sys/windows/mkknownfolderids.bash +27 -0
  479. package/govendor/golang.org/x/sys/windows/mksyscall.go +9 -0
  480. package/govendor/golang.org/x/sys/windows/race.go +30 -0
  481. package/govendor/golang.org/x/sys/windows/race0.go +25 -0
  482. package/govendor/golang.org/x/sys/windows/security_windows.go +1537 -0
  483. package/govendor/golang.org/x/sys/windows/service.go +257 -0
  484. package/govendor/golang.org/x/sys/windows/setupapi_windows.go +1425 -0
  485. package/govendor/golang.org/x/sys/windows/str.go +22 -0
  486. package/govendor/golang.org/x/sys/windows/syscall.go +104 -0
  487. package/govendor/golang.org/x/sys/windows/syscall_windows.go +1952 -0
  488. package/govendor/golang.org/x/sys/windows/types_windows.go +4058 -0
  489. package/govendor/golang.org/x/sys/windows/types_windows_386.go +35 -0
  490. package/govendor/golang.org/x/sys/windows/types_windows_amd64.go +34 -0
  491. package/govendor/golang.org/x/sys/windows/types_windows_arm.go +35 -0
  492. package/govendor/golang.org/x/sys/windows/types_windows_arm64.go +34 -0
  493. package/govendor/golang.org/x/sys/windows/zerrors_windows.go +9468 -0
  494. package/govendor/golang.org/x/sys/windows/zknownfolderids_windows.go +149 -0
  495. package/govendor/golang.org/x/sys/windows/zsyscall_windows.go +4828 -0
  496. package/govendor/manifest.txt +7 -0
  497. package/package.json +6 -1
  498. package/types/typenative-go.d.ts +15159 -5
  499. package/types/typenative-npm.d.ts +2637 -34
  500. package/types/typenative.d.ts +651 -8
@@ -0,0 +1,2685 @@
1
+ // node:crypto keys and the rest of crypto: scrypt, callback forms, KeyObject
2
+ // (createPrivateKey / createPublicKey / createSecretKey, generateKeyPair,
3
+ // PEM / DER / JWK export), sign / verify, RSA encryption, ECDH and classic
4
+ // Diffie-Hellman, X509Certificate, primes, and webcrypto's subtle. Backed by
5
+ // Go's crypto packages (RSA, ECDSA P-256/384/521, Ed25519, X25519).
6
+ import { defineClass, defineHelper, getOption, isStringNode, isObjectLiteral, optionIsTrue } from './registry.js';
7
+ const cryptoKeysHelper = `// node:crypto keys
8
+ func tnCryptoArg(args []interface{}) interface{} {
9
+ if len(args) > 0 {
10
+ return args[0]
11
+ }
12
+ return nil
13
+ }
14
+
15
+ func tnCryptoNumber(v interface{}) (float64, bool) {
16
+ rv := reflect.ValueOf(v)
17
+ switch rv.Kind() {
18
+ case reflect.Float32, reflect.Float64:
19
+ return rv.Float(), true
20
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
21
+ return float64(rv.Int()), true
22
+ }
23
+ return 0, false
24
+ }
25
+
26
+ // An options object's own "length" (TnGet falls back to the object's size)
27
+ func tnCryptoLength(obj interface{}) (float64, bool) {
28
+ if m, ok := obj.(map[string]interface{}); ok {
29
+ return tnCryptoNumber(m["length"])
30
+ }
31
+ rv := reflect.ValueOf(obj)
32
+ if rv.Kind() == reflect.Pointer && !rv.IsNil() && rv.Elem().Kind() == reflect.Struct && rv.Elem().FieldByName("length").IsValid() {
33
+ return tnCryptoNumber(TnGet(obj, "length"))
34
+ }
35
+ return 0, false
36
+ }
37
+
38
+ func tnCryptoErr(r interface{}) *TnError {
39
+ switch e := r.(type) {
40
+ case *TnError:
41
+ return e
42
+ case error:
43
+ return TnNodeError("Error", "", e.Error())
44
+ }
45
+ return TnNodeError("Error", "", fmt.Sprint(r))
46
+ }
47
+
48
+ // Runs work on a goroutine; cb(err, result) on the loop
49
+ func tnCryptoAsync(cb interface{}, work func() interface{}) {
50
+ ctx := TnAsyncSnapshot()
51
+ TnLoopRef()
52
+ go func() {
53
+ var result, failure interface{}
54
+ func() {
55
+ defer func() {
56
+ if r := recover(); r != nil {
57
+ failure = r
58
+ }
59
+ }()
60
+ result = work()
61
+ }()
62
+ TnLoopPost(func() {
63
+ defer TnLoopUnref()
64
+ TnAsyncRun(ctx, func() {
65
+ if failure != nil {
66
+ TnInvoke(cb, tnCryptoErr(failure))
67
+ return
68
+ }
69
+ TnInvoke(cb, nil, result)
70
+ })
71
+ })
72
+ }()
73
+ }
74
+
75
+ func tnUnsupportedKey() *TnError {
76
+ return TnNodeError("Error", "ERR_OSSL_UNSUPPORTED", "error:1E08010C:DECODER routines::unsupported")
77
+ }
78
+
79
+ // --- scrypt ---
80
+
81
+ func tnSalsa208(b *[16]uint32) {
82
+ x := *b
83
+ r := bits.RotateLeft32
84
+ for i := 0; i < 8; i += 2 {
85
+ x[4] ^= r(x[0]+x[12], 7)
86
+ x[8] ^= r(x[4]+x[0], 9)
87
+ x[12] ^= r(x[8]+x[4], 13)
88
+ x[0] ^= r(x[12]+x[8], 18)
89
+ x[9] ^= r(x[5]+x[1], 7)
90
+ x[13] ^= r(x[9]+x[5], 9)
91
+ x[1] ^= r(x[13]+x[9], 13)
92
+ x[5] ^= r(x[1]+x[13], 18)
93
+ x[14] ^= r(x[10]+x[6], 7)
94
+ x[2] ^= r(x[14]+x[10], 9)
95
+ x[6] ^= r(x[2]+x[14], 13)
96
+ x[10] ^= r(x[6]+x[2], 18)
97
+ x[3] ^= r(x[15]+x[11], 7)
98
+ x[7] ^= r(x[3]+x[15], 9)
99
+ x[11] ^= r(x[7]+x[3], 13)
100
+ x[15] ^= r(x[11]+x[7], 18)
101
+ x[1] ^= r(x[0]+x[3], 7)
102
+ x[2] ^= r(x[1]+x[0], 9)
103
+ x[3] ^= r(x[2]+x[1], 13)
104
+ x[0] ^= r(x[3]+x[2], 18)
105
+ x[6] ^= r(x[5]+x[4], 7)
106
+ x[7] ^= r(x[6]+x[5], 9)
107
+ x[4] ^= r(x[7]+x[6], 13)
108
+ x[5] ^= r(x[4]+x[7], 18)
109
+ x[11] ^= r(x[10]+x[9], 7)
110
+ x[8] ^= r(x[11]+x[10], 9)
111
+ x[9] ^= r(x[8]+x[11], 13)
112
+ x[10] ^= r(x[9]+x[8], 18)
113
+ x[12] ^= r(x[15]+x[14], 7)
114
+ x[13] ^= r(x[12]+x[15], 9)
115
+ x[14] ^= r(x[13]+x[12], 13)
116
+ x[15] ^= r(x[14]+x[13], 18)
117
+ }
118
+ for i := range b {
119
+ b[i] += x[i]
120
+ }
121
+ }
122
+
123
+ func tnBlockMix(b []uint32, y []uint32, r int) {
124
+ var x [16]uint32
125
+ copy(x[:], b[(2*r-1)*16:])
126
+ for i := 0; i < 2*r; i++ {
127
+ for j := 0; j < 16; j++ {
128
+ x[j] ^= b[i*16+j]
129
+ }
130
+ tnSalsa208(&x)
131
+ copy(y[i*16:], x[:])
132
+ }
133
+ for i := 0; i < r; i++ {
134
+ copy(b[i*16:], y[2*i*16:2*i*16+16])
135
+ copy(b[(i+r)*16:], y[(2*i+1)*16:(2*i+1)*16+16])
136
+ }
137
+ }
138
+
139
+ func tnROMix(block []byte, r int, n int) {
140
+ words := 32 * r
141
+ x := make([]uint32, words)
142
+ y := make([]uint32, words)
143
+ v := make([]uint32, words*n)
144
+ for i := range x {
145
+ x[i] = binary.LittleEndian.Uint32(block[i*4:])
146
+ }
147
+ for i := 0; i < n; i++ {
148
+ copy(v[i*words:], x)
149
+ tnBlockMix(x, y, r)
150
+ }
151
+ for i := 0; i < n; i++ {
152
+ j := int(x[(2*r-1)*16] & uint32(n-1))
153
+ for k := 0; k < words; k++ {
154
+ x[k] ^= v[j*words+k]
155
+ }
156
+ tnBlockMix(x, y, r)
157
+ }
158
+ for i := range x {
159
+ binary.LittleEndian.PutUint32(block[i*4:], x[i])
160
+ }
161
+ }
162
+
163
+ // scryptSync(password, salt, keylen, { N | cost, r | blockSize, p | parallelization, maxmem })
164
+ func TnScryptSync(password interface{}, salt interface{}, keylen float64, options ...interface{}) []byte {
165
+ n, r, p, maxmem := 16384, 8, 1, 32<<20
166
+ if opts := tnCryptoArg(options); opts != nil {
167
+ for _, name := range []string{"N", "cost"} {
168
+ if v, ok := tnCryptoNumber(TnGet(opts, name)); ok {
169
+ n = int(v)
170
+ }
171
+ }
172
+ for _, name := range []string{"r", "blockSize"} {
173
+ if v, ok := tnCryptoNumber(TnGet(opts, name)); ok {
174
+ r = int(v)
175
+ }
176
+ }
177
+ for _, name := range []string{"p", "parallelization"} {
178
+ if v, ok := tnCryptoNumber(TnGet(opts, name)); ok {
179
+ p = int(v)
180
+ }
181
+ }
182
+ if v, ok := tnCryptoNumber(TnGet(opts, "maxmem")); ok {
183
+ maxmem = int(v)
184
+ }
185
+ }
186
+ if n < 2 || n&(n-1) != 0 || r < 1 || p < 1 {
187
+ panic(TnNodeError("RangeError", "ERR_CRYPTO_INVALID_SCRYPT_PARAMS", "Invalid scrypt params: N must be a power of 2 greater than 1"))
188
+ }
189
+ if 128*n*r > maxmem {
190
+ panic(TnNodeError("RangeError", "ERR_CRYPTO_INVALID_SCRYPT_PARAMS", "Invalid scrypt params: memory limit exceeded"))
191
+ }
192
+ pw := string(tnCryptoBytes(password, ""))
193
+ b, _ := pbkdf2.Key(sha256.New, pw, tnCryptoBytes(salt, ""), 1, p*128*r)
194
+ for i := 0; i < p; i++ {
195
+ tnROMix(b[i*128*r:(i+1)*128*r], r, n)
196
+ }
197
+ out, _ := pbkdf2.Key(sha256.New, pw, b, 1, int(keylen))
198
+ return out
199
+ }
200
+
201
+ // randomFillSync(buffer, offset?, size?)
202
+ func TnRandomFillSync(buf []byte, args ...float64) []byte {
203
+ start, end := 0, len(buf)
204
+ if len(args) > 0 {
205
+ start = int(args[0])
206
+ }
207
+ if len(args) > 1 {
208
+ end = start + int(args[1])
209
+ }
210
+ if start < 0 || end > len(buf) || start > end {
211
+ panic(TnNodeError("RangeError", "ERR_OUT_OF_RANGE", "The value of \\"offset\\" is out of range."))
212
+ }
213
+ cryptorand.Read(buf[start:end])
214
+ return buf
215
+ }
216
+
217
+ // --- KeyObject ---
218
+
219
+ type TnKeyObject struct {
220
+ type_ string
221
+ secret []byte
222
+ pub tncrypto.PublicKey
223
+ priv tncrypto.PrivateKey
224
+ }
225
+
226
+ func tnPublicOf(priv tncrypto.PrivateKey) tncrypto.PublicKey {
227
+ switch k := priv.(type) {
228
+ case *rsa.PrivateKey:
229
+ return &k.PublicKey
230
+ case *ecdsa.PrivateKey:
231
+ return &k.PublicKey
232
+ case ed25519.PrivateKey:
233
+ return k.Public()
234
+ case *ecdh.PrivateKey:
235
+ return k.PublicKey()
236
+ }
237
+ return nil
238
+ }
239
+
240
+ func tnPrivateKeyObject(priv tncrypto.PrivateKey) *TnKeyObject {
241
+ return &TnKeyObject{type_: "private", priv: priv, pub: tnPublicOf(priv)}
242
+ }
243
+
244
+ // A key argument: PEM / DER bytes, a KeyObject / CryptoKey, or { key, format, type, encoding }
245
+ type tnKeyInput struct {
246
+ data []byte
247
+ format string
248
+ typ string
249
+ jwk interface{}
250
+ object *TnKeyObject
251
+ }
252
+
253
+ func tnReadKeyInput(v interface{}) tnKeyInput {
254
+ in := tnKeyInput{format: "pem"}
255
+ switch x := v.(type) {
256
+ case *TnKeyObject:
257
+ in.object = x
258
+ return in
259
+ case *TnCryptoKey:
260
+ in.object = x.key
261
+ return in
262
+ case string:
263
+ in.data = []byte(x)
264
+ return in
265
+ case []byte:
266
+ in.data = x
267
+ if !bytes.HasPrefix(bytes.TrimSpace(x), []byte("-----")) {
268
+ in.format = "der"
269
+ }
270
+ return in
271
+ }
272
+ if v == nil || TnIsNil(v) {
273
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_TYPE", "The \\"key\\" argument must be of type string or an instance of ArrayBuffer, Buffer, TypedArray, DataView, KeyObject, or CryptoKey. Received undefined"))
274
+ }
275
+ if f, ok := TnGet(v, "format").(string); ok && f != "" {
276
+ in.format = f
277
+ }
278
+ if t, ok := TnGet(v, "type").(string); ok {
279
+ in.typ = t
280
+ }
281
+ switch k := TnGet(v, "key").(type) {
282
+ case *TnKeyObject:
283
+ in.object = k
284
+ case *TnCryptoKey:
285
+ in.object = k.key
286
+ case string:
287
+ enc, _ := TnGet(v, "encoding").(string)
288
+ if enc != "" && in.format != "pem" {
289
+ in.data = TnBufferFromString(k, enc)
290
+ } else {
291
+ in.data = []byte(k)
292
+ }
293
+ case []byte:
294
+ in.data = k
295
+ default:
296
+ if in.format == "jwk" {
297
+ in.jwk = k
298
+ } else {
299
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_TYPE", "The \\"key.key\\" property must be of type string or an instance of ArrayBuffer, Buffer, TypedArray, DataView, KeyObject, or CryptoKey."))
300
+ }
301
+ }
302
+ return in
303
+ }
304
+
305
+ func tnParsePrivateDER(der []byte, typ string) (tncrypto.PrivateKey, error) {
306
+ switch typ {
307
+ case "pkcs1":
308
+ return x509.ParsePKCS1PrivateKey(der)
309
+ case "sec1":
310
+ return x509.ParseECPrivateKey(der)
311
+ case "pkcs8":
312
+ return x509.ParsePKCS8PrivateKey(der)
313
+ }
314
+ if k, err := x509.ParsePKCS8PrivateKey(der); err == nil {
315
+ return k, nil
316
+ }
317
+ if k, err := x509.ParsePKCS1PrivateKey(der); err == nil {
318
+ return k, nil
319
+ }
320
+ return x509.ParseECPrivateKey(der)
321
+ }
322
+
323
+ func tnParsePublicDER(der []byte, typ string) (tncrypto.PublicKey, error) {
324
+ if typ == "pkcs1" {
325
+ return x509.ParsePKCS1PublicKey(der)
326
+ }
327
+ if k, err := x509.ParsePKIXPublicKey(der); err == nil {
328
+ return k, nil
329
+ }
330
+ if typ == "" {
331
+ if k, err := x509.ParsePKCS1PublicKey(der); err == nil {
332
+ return k, nil
333
+ }
334
+ if c, err := x509.ParseCertificate(der); err == nil {
335
+ return c.PublicKey, nil
336
+ }
337
+ }
338
+ priv, err := tnParsePrivateDER(der, "")
339
+ if err != nil {
340
+ return nil, err
341
+ }
342
+ return tnPublicOf(priv), nil
343
+ }
344
+
345
+ // Private key from PEM blocks (PRIVATE KEY / RSA PRIVATE KEY / EC PRIVATE KEY) or DER
346
+ func tnParsePrivateKey(in tnKeyInput) tncrypto.PrivateKey {
347
+ if in.jwk != nil {
348
+ _, priv := tnKeyFromJWK(in.jwk)
349
+ if priv == nil {
350
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_JWK", "Invalid JWK private key"))
351
+ }
352
+ return priv
353
+ }
354
+ der, typ := in.data, in.typ
355
+ if in.format == "pem" {
356
+ rest := in.data
357
+ found := false
358
+ for !found {
359
+ block, r := pem.Decode(rest)
360
+ if block == nil {
361
+ break
362
+ }
363
+ rest = r
364
+ switch block.Type {
365
+ case "PRIVATE KEY":
366
+ der, typ, found = block.Bytes, "pkcs8", true
367
+ case "RSA PRIVATE KEY":
368
+ der, typ, found = block.Bytes, "pkcs1", true
369
+ case "EC PRIVATE KEY":
370
+ der, typ, found = block.Bytes, "sec1", true
371
+ case "ENCRYPTED PRIVATE KEY":
372
+ panic(TnNodeError("Error", "ERR_CRYPTO_UNSUPPORTED_OPERATION", "Encrypted private keys are not supported"))
373
+ }
374
+ }
375
+ if !found {
376
+ panic(tnUnsupportedKey())
377
+ }
378
+ }
379
+ key, err := tnParsePrivateDER(der, typ)
380
+ if err != nil {
381
+ panic(tnUnsupportedKey())
382
+ }
383
+ return key
384
+ }
385
+
386
+ func tnParsePublicKey(in tnKeyInput) tncrypto.PublicKey {
387
+ if in.jwk != nil {
388
+ pub, _ := tnKeyFromJWK(in.jwk)
389
+ return pub
390
+ }
391
+ if in.format != "pem" {
392
+ key, err := tnParsePublicDER(in.data, in.typ)
393
+ if err != nil {
394
+ panic(tnUnsupportedKey())
395
+ }
396
+ return key
397
+ }
398
+ rest := in.data
399
+ for {
400
+ block, r := pem.Decode(rest)
401
+ if block == nil {
402
+ break
403
+ }
404
+ rest = r
405
+ var key tncrypto.PublicKey
406
+ var err error
407
+ switch block.Type {
408
+ case "PUBLIC KEY":
409
+ key, err = x509.ParsePKIXPublicKey(block.Bytes)
410
+ case "RSA PUBLIC KEY":
411
+ key, err = x509.ParsePKCS1PublicKey(block.Bytes)
412
+ case "CERTIFICATE":
413
+ var c *x509.Certificate
414
+ c, err = x509.ParseCertificate(block.Bytes)
415
+ if err == nil {
416
+ key = c.PublicKey
417
+ }
418
+ case "PRIVATE KEY", "RSA PRIVATE KEY", "EC PRIVATE KEY":
419
+ key = tnPublicOf(tnParsePrivateKey(tnKeyInput{data: pem.EncodeToMemory(block), format: "pem"}))
420
+ default:
421
+ continue
422
+ }
423
+ if err != nil {
424
+ panic(tnUnsupportedKey())
425
+ }
426
+ return key
427
+ }
428
+ panic(tnUnsupportedKey())
429
+ }
430
+
431
+ // createPrivateKey(key)
432
+ func TnCreatePrivateKey(v interface{}) *TnKeyObject {
433
+ in := tnReadKeyInput(v)
434
+ if in.object != nil {
435
+ if in.object.type_ != "private" {
436
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE", "Invalid key object type "+in.object.type_+", expected private."))
437
+ }
438
+ return in.object
439
+ }
440
+ return tnPrivateKeyObject(tnParsePrivateKey(in))
441
+ }
442
+
443
+ // createPublicKey(key): public keys, certificates, or the public half of a private key
444
+ func TnCreatePublicKey(v interface{}) *TnKeyObject {
445
+ in := tnReadKeyInput(v)
446
+ if in.object != nil {
447
+ switch in.object.type_ {
448
+ case "public":
449
+ return in.object
450
+ case "private":
451
+ return &TnKeyObject{type_: "public", pub: in.object.pub}
452
+ }
453
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE", "Invalid key object type secret, expected private."))
454
+ }
455
+ return &TnKeyObject{type_: "public", pub: tnParsePublicKey(in)}
456
+ }
457
+
458
+ // createSecretKey(key, encoding?)
459
+ func TnCreateSecretKey(key interface{}, enc ...string) *TnKeyObject {
460
+ e := ""
461
+ if len(enc) > 0 {
462
+ e = enc[0]
463
+ }
464
+ return &TnKeyObject{type_: "secret", secret: append([]byte{}, tnCryptoBytes(key, e)...)}
465
+ }
466
+
467
+ func (k *TnKeyObject) Get_type_() string { return k.type_ }
468
+
469
+ func tnAsymmetricType(pub tncrypto.PublicKey) string {
470
+ switch p := pub.(type) {
471
+ case *rsa.PublicKey:
472
+ return "rsa"
473
+ case *ecdsa.PublicKey:
474
+ return "ec"
475
+ case ed25519.PublicKey:
476
+ return "ed25519"
477
+ case *ecdh.PublicKey:
478
+ if p.Curve() == ecdh.X25519() {
479
+ return "x25519"
480
+ }
481
+ return "ec"
482
+ }
483
+ return ""
484
+ }
485
+
486
+ func (k *TnKeyObject) Get_asymmetricKeyType() *string {
487
+ if k.type_ == "secret" {
488
+ return nil
489
+ }
490
+ t := tnAsymmetricType(k.pub)
491
+ return &t
492
+ }
493
+
494
+ func (k *TnKeyObject) Get_symmetricKeySize() *float64 {
495
+ if k.type_ != "secret" {
496
+ return nil
497
+ }
498
+ n := float64(len(k.secret))
499
+ return &n
500
+ }
501
+
502
+ func tnOpenSSLCurve(name string) string {
503
+ switch name {
504
+ case "P-256":
505
+ return "prime256v1"
506
+ case "P-384":
507
+ return "secp384r1"
508
+ case "P-521":
509
+ return "secp521r1"
510
+ }
511
+ return name
512
+ }
513
+
514
+ type TnKeyDetails struct {
515
+ modulusLength float64
516
+ publicExponent *tnbig.Int
517
+ namedCurve string
518
+ }
519
+
520
+ func (k *TnKeyObject) Get_asymmetricKeyDetails() *TnKeyDetails {
521
+ switch p := k.pub.(type) {
522
+ case *rsa.PublicKey:
523
+ return &TnKeyDetails{modulusLength: float64(p.N.BitLen()), publicExponent: tnbig.NewInt(int64(p.E))}
524
+ case *ecdsa.PublicKey:
525
+ return &TnKeyDetails{namedCurve: tnOpenSSLCurve(p.Curve.Params().Name)}
526
+ case nil:
527
+ return nil
528
+ }
529
+ return &TnKeyDetails{}
530
+ }
531
+
532
+ func tnB64u(b []byte) string { return base64.RawURLEncoding.EncodeToString(b) }
533
+
534
+ func tnJWK(pub tncrypto.PublicKey, priv tncrypto.PrivateKey) map[string]interface{} {
535
+ m := map[string]interface{}{}
536
+ switch p := pub.(type) {
537
+ case *rsa.PublicKey:
538
+ m["kty"] = "RSA"
539
+ m["n"] = tnB64u(p.N.Bytes())
540
+ m["e"] = tnB64u(tnbig.NewInt(int64(p.E)).Bytes())
541
+ if k, ok := priv.(*rsa.PrivateKey); ok {
542
+ k.Precompute()
543
+ m["d"] = tnB64u(k.D.Bytes())
544
+ if len(k.Primes) >= 2 {
545
+ m["p"] = tnB64u(k.Primes[0].Bytes())
546
+ m["q"] = tnB64u(k.Primes[1].Bytes())
547
+ m["dp"] = tnB64u(k.Precomputed.Dp.Bytes())
548
+ m["dq"] = tnB64u(k.Precomputed.Dq.Bytes())
549
+ m["qi"] = tnB64u(k.Precomputed.Qinv.Bytes())
550
+ }
551
+ }
552
+ case *ecdsa.PublicKey:
553
+ size := (p.Curve.Params().BitSize + 7) / 8
554
+ m["kty"] = "EC"
555
+ m["crv"] = p.Curve.Params().Name
556
+ m["x"] = tnB64u(p.X.FillBytes(make([]byte, size)))
557
+ m["y"] = tnB64u(p.Y.FillBytes(make([]byte, size)))
558
+ if k, ok := priv.(*ecdsa.PrivateKey); ok {
559
+ m["d"] = tnB64u(k.D.FillBytes(make([]byte, size)))
560
+ }
561
+ case ed25519.PublicKey:
562
+ m["kty"] = "OKP"
563
+ m["crv"] = "Ed25519"
564
+ m["x"] = tnB64u(p)
565
+ if k, ok := priv.(ed25519.PrivateKey); ok {
566
+ m["d"] = tnB64u(k.Seed())
567
+ }
568
+ case *ecdh.PublicKey:
569
+ m["kty"] = "OKP"
570
+ m["crv"] = "X25519"
571
+ m["x"] = tnB64u(p.Bytes())
572
+ if k, ok := priv.(*ecdh.PrivateKey); ok {
573
+ m["d"] = tnB64u(k.Bytes())
574
+ }
575
+ }
576
+ return m
577
+ }
578
+
579
+ func tnJWKBytes(jwk interface{}, key string) []byte {
580
+ s, _ := TnGet(jwk, key).(string)
581
+ if s == "" {
582
+ return nil
583
+ }
584
+ b, err := base64.RawURLEncoding.DecodeString(strings.TrimRight(s, "="))
585
+ if err != nil {
586
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_JWK", "Invalid JWK data"))
587
+ }
588
+ return b
589
+ }
590
+
591
+ func tnNamedCurve(name string) elliptic.Curve {
592
+ switch strings.ToLower(name) {
593
+ case "p-256", "prime256v1", "secp256r1":
594
+ return elliptic.P256()
595
+ case "p-384", "secp384r1":
596
+ return elliptic.P384()
597
+ case "p-521", "secp521r1":
598
+ return elliptic.P521()
599
+ }
600
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_CURVE", "Invalid EC curve name"))
601
+ }
602
+
603
+ func tnBigFrom(b []byte) *tnbig.Int { return new(tnbig.Int).SetBytes(b) }
604
+
605
+ // Keys from a JWK object (RSA, EC, OKP Ed25519 / X25519)
606
+ func tnKeyFromJWK(jwk interface{}) (tncrypto.PublicKey, tncrypto.PrivateKey) {
607
+ kty, _ := TnGet(jwk, "kty").(string)
608
+ switch kty {
609
+ case "RSA":
610
+ pub := &rsa.PublicKey{N: tnBigFrom(tnJWKBytes(jwk, "n")), E: int(tnBigFrom(tnJWKBytes(jwk, "e")).Int64())}
611
+ d := tnJWKBytes(jwk, "d")
612
+ if d == nil {
613
+ return pub, nil
614
+ }
615
+ priv := &rsa.PrivateKey{PublicKey: *pub, D: tnBigFrom(d), Primes: []*tnbig.Int{tnBigFrom(tnJWKBytes(jwk, "p")), tnBigFrom(tnJWKBytes(jwk, "q"))}}
616
+ priv.Precompute()
617
+ return &priv.PublicKey, priv
618
+ case "EC":
619
+ crv, _ := TnGet(jwk, "crv").(string)
620
+ pub := &ecdsa.PublicKey{Curve: tnNamedCurve(crv), X: tnBigFrom(tnJWKBytes(jwk, "x")), Y: tnBigFrom(tnJWKBytes(jwk, "y"))}
621
+ d := tnJWKBytes(jwk, "d")
622
+ if d == nil {
623
+ return pub, nil
624
+ }
625
+ priv := &ecdsa.PrivateKey{PublicKey: *pub, D: tnBigFrom(d)}
626
+ return &priv.PublicKey, priv
627
+ case "OKP":
628
+ crv, _ := TnGet(jwk, "crv").(string)
629
+ x, d := tnJWKBytes(jwk, "x"), tnJWKBytes(jwk, "d")
630
+ switch crv {
631
+ case "Ed25519":
632
+ if d != nil {
633
+ priv := ed25519.NewKeyFromSeed(d)
634
+ return priv.Public(), priv
635
+ }
636
+ return ed25519.PublicKey(x), nil
637
+ case "X25519":
638
+ if d != nil {
639
+ priv, err := ecdh.X25519().NewPrivateKey(d)
640
+ if err == nil {
641
+ return priv.PublicKey(), priv
642
+ }
643
+ } else if pub, err := ecdh.X25519().NewPublicKey(x); err == nil {
644
+ return pub, nil
645
+ }
646
+ }
647
+ }
648
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_JWK", "Invalid JWK data"))
649
+ }
650
+
651
+ func tnPEMOrDER(der []byte, block string, format string) interface{} {
652
+ if format == "der" {
653
+ return der
654
+ }
655
+ return string(pem.EncodeToMemory(&pem.Block{Type: block, Bytes: der}))
656
+ }
657
+
658
+ func tnKeyEncodingError(typ string) *TnError {
659
+ return TnNodeError("Error", "ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS", "The selected key encoding "+typ+" is not supported for this key type.")
660
+ }
661
+
662
+ // export({ format: 'pem' | 'der' | 'jwk', type: 'spki' | 'pkcs1' | 'pkcs8' | 'sec1' })
663
+ func (k *TnKeyObject) export(options ...interface{}) interface{} {
664
+ opts := tnCryptoArg(options)
665
+ format, _ := TnGet(opts, "format").(string)
666
+ typ, _ := TnGet(opts, "type").(string)
667
+ switch k.type_ {
668
+ case "secret":
669
+ if format == "jwk" {
670
+ return map[string]interface{}{"kty": "oct", "k": tnB64u(k.secret)}
671
+ }
672
+ return append([]byte{}, k.secret...)
673
+ case "public":
674
+ if format == "jwk" {
675
+ return tnJWK(k.pub, nil)
676
+ }
677
+ if typ == "pkcs1" {
678
+ pub, ok := k.pub.(*rsa.PublicKey)
679
+ if !ok {
680
+ panic(tnKeyEncodingError(typ))
681
+ }
682
+ return tnPEMOrDER(x509.MarshalPKCS1PublicKey(pub), "RSA PUBLIC KEY", format)
683
+ }
684
+ der, err := x509.MarshalPKIXPublicKey(k.pub)
685
+ if err != nil {
686
+ panic(tnCryptoErr(err))
687
+ }
688
+ return tnPEMOrDER(der, "PUBLIC KEY", format)
689
+ }
690
+ if c := TnGet(opts, "cipher"); c != nil && !TnIsNil(c) {
691
+ panic(TnNodeError("Error", "ERR_CRYPTO_UNSUPPORTED_OPERATION", "Encrypted private key export is not supported"))
692
+ }
693
+ if format == "jwk" {
694
+ return tnJWK(k.pub, k.priv)
695
+ }
696
+ switch typ {
697
+ case "pkcs1":
698
+ priv, ok := k.priv.(*rsa.PrivateKey)
699
+ if !ok {
700
+ panic(tnKeyEncodingError(typ))
701
+ }
702
+ return tnPEMOrDER(x509.MarshalPKCS1PrivateKey(priv), "RSA PRIVATE KEY", format)
703
+ case "sec1":
704
+ priv, ok := k.priv.(*ecdsa.PrivateKey)
705
+ if !ok {
706
+ panic(tnKeyEncodingError(typ))
707
+ }
708
+ der, err := x509.MarshalECPrivateKey(priv)
709
+ if err != nil {
710
+ panic(tnCryptoErr(err))
711
+ }
712
+ return tnPEMOrDER(der, "EC PRIVATE KEY", format)
713
+ }
714
+ der, err := x509.MarshalPKCS8PrivateKey(k.priv)
715
+ if err != nil {
716
+ panic(tnCryptoErr(err))
717
+ }
718
+ return tnPEMOrDER(der, "PRIVATE KEY", format)
719
+ }
720
+
721
+ func (k *TnKeyObject) equals(other *TnKeyObject) bool {
722
+ if other == nil || k.type_ != other.type_ {
723
+ return false
724
+ }
725
+ switch k.type_ {
726
+ case "secret":
727
+ return len(k.secret) == len(other.secret) && subtle.ConstantTimeCompare(k.secret, other.secret) == 1
728
+ case "public":
729
+ a, _ := x509.MarshalPKIXPublicKey(k.pub)
730
+ b, _ := x509.MarshalPKIXPublicKey(other.pub)
731
+ return bytes.Equal(a, b)
732
+ }
733
+ a, _ := x509.MarshalPKCS8PrivateKey(k.priv)
734
+ b, _ := x509.MarshalPKCS8PrivateKey(other.priv)
735
+ return bytes.Equal(a, b)
736
+ }
737
+
738
+ // KeyObject.from(cryptoKey)
739
+ func TnKeyObjectFrom(key *TnCryptoKey) *TnKeyObject { return key.key }
740
+
741
+ // --- key generation ---
742
+
743
+ func tnGenerateAsymmetric(kind string, options interface{}) tncrypto.PrivateKey {
744
+ switch kind {
745
+ case "rsa":
746
+ bitsN, ok := tnCryptoNumber(TnGet(options, "modulusLength"))
747
+ if !ok {
748
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_TYPE", "The \\"options.modulusLength\\" property must be of type number. Received undefined"))
749
+ }
750
+ if e, ok := tnCryptoNumber(TnGet(options, "publicExponent")); ok && e != 65537 {
751
+ panic(TnNodeError("Error", "ERR_CRYPTO_UNSUPPORTED_OPERATION", "Only the public exponent 65537 is supported"))
752
+ }
753
+ k, err := rsa.GenerateKey(cryptorand.Reader, int(bitsN))
754
+ if err != nil {
755
+ panic(tnCryptoErr(err))
756
+ }
757
+ return k
758
+ case "ec":
759
+ name, _ := TnGet(options, "namedCurve").(string)
760
+ k, err := ecdsa.GenerateKey(tnNamedCurve(name), cryptorand.Reader)
761
+ if err != nil {
762
+ panic(tnCryptoErr(err))
763
+ }
764
+ return k
765
+ case "ed25519":
766
+ _, k, _ := ed25519.GenerateKey(cryptorand.Reader)
767
+ return k
768
+ case "x25519":
769
+ k, _ := ecdh.X25519().GenerateKey(cryptorand.Reader)
770
+ return k
771
+ }
772
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_VALUE", "The argument 'type' must be a supported key type. Received '"+kind+"'"))
773
+ }
774
+
775
+ func tnEncodeKey(k *TnKeyObject, enc interface{}) interface{} {
776
+ if enc == nil || TnIsNil(enc) {
777
+ return k
778
+ }
779
+ return k.export(enc)
780
+ }
781
+
782
+ // generateKeyPairSync(type, options): KeyObjects, or encoded keys with
783
+ // publicKeyEncoding / privateKeyEncoding
784
+ func TnGenerateKeyPairSync(kind string, options ...interface{}) (interface{}, interface{}) {
785
+ opts := tnCryptoArg(options)
786
+ priv := tnPrivateKeyObject(tnGenerateAsymmetric(kind, opts))
787
+ pub := &TnKeyObject{type_: "public", pub: priv.pub}
788
+ return tnEncodeKey(pub, TnGet(opts, "publicKeyEncoding")), tnEncodeKey(priv, TnGet(opts, "privateKeyEncoding"))
789
+ }
790
+
791
+ type TnKeyPair struct {
792
+ publicKey *TnKeyObject
793
+ privateKey *TnKeyObject
794
+ }
795
+
796
+ type TnKeyPairPem struct {
797
+ publicKey string
798
+ privateKey string
799
+ }
800
+
801
+ type TnKeyPairDer struct {
802
+ publicKey []byte
803
+ privateKey []byte
804
+ }
805
+
806
+ type TnKeyPairAny struct {
807
+ publicKey interface{}
808
+ privateKey interface{}
809
+ }
810
+
811
+ func TnKeyPairOf(pub interface{}, priv interface{}) *TnKeyPair {
812
+ return &TnKeyPair{publicKey: pub.(*TnKeyObject), privateKey: priv.(*TnKeyObject)}
813
+ }
814
+
815
+ func TnKeyPairPemOf(pub interface{}, priv interface{}) *TnKeyPairPem {
816
+ p, _ := pub.(string)
817
+ q, _ := priv.(string)
818
+ return &TnKeyPairPem{publicKey: p, privateKey: q}
819
+ }
820
+
821
+ func TnKeyPairDerOf(pub interface{}, priv interface{}) *TnKeyPairDer {
822
+ p, _ := pub.([]byte)
823
+ q, _ := priv.([]byte)
824
+ return &TnKeyPairDer{publicKey: p, privateKey: q}
825
+ }
826
+
827
+ func TnKeyPairAnyOf(pub interface{}, priv interface{}) *TnKeyPairAny {
828
+ return &TnKeyPairAny{publicKey: pub, privateKey: priv}
829
+ }
830
+
831
+ // generateKeyPair(type, options?, cb(err, publicKey, privateKey))
832
+ func TnGenerateKeyPair(kind string, options interface{}, cb interface{}) {
833
+ ctx := TnAsyncSnapshot()
834
+ TnLoopRef()
835
+ go func() {
836
+ var pub, priv, failure interface{}
837
+ func() {
838
+ defer func() {
839
+ if r := recover(); r != nil {
840
+ failure = r
841
+ }
842
+ }()
843
+ pub, priv = TnGenerateKeyPairSync(kind, options)
844
+ }()
845
+ TnLoopPost(func() {
846
+ defer TnLoopUnref()
847
+ TnAsyncRun(ctx, func() {
848
+ if failure != nil {
849
+ TnInvoke(cb, tnCryptoErr(failure))
850
+ return
851
+ }
852
+ TnInvoke(cb, nil, pub, priv)
853
+ })
854
+ })
855
+ }()
856
+ }
857
+
858
+ // generateKeySync('hmac' | 'aes', { length })
859
+ func TnGenerateKeySync(kind string, opts ...interface{}) *TnKeyObject {
860
+ options := tnCryptoArg(opts)
861
+ length, ok := tnCryptoLength(options)
862
+ if !ok {
863
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_TYPE", "The \\"options.length\\" property must be of type number. Received undefined"))
864
+ }
865
+ switch kind {
866
+ case "aes":
867
+ if length != 128 && length != 192 && length != 256 {
868
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_VALUE", "The property 'options.length' must be one of: 128, 192, 256."))
869
+ }
870
+ case "hmac":
871
+ default:
872
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_VALUE", "The argument 'type' must be a supported key type. Received '"+kind+"'"))
873
+ }
874
+ return &TnKeyObject{type_: "secret", secret: TnRandomBytes(float64(int(length) / 8))}
875
+ }
876
+
877
+ // --- sign / verify ---
878
+
879
+ func tnCryptoHash(alg string) tncrypto.Hash {
880
+ name := strings.ToLower(alg)
881
+ name = strings.TrimPrefix(name, "rsa-")
882
+ name = strings.TrimSuffix(name, "withrsaencryption")
883
+ name = strings.ReplaceAll(name, "-", "")
884
+ switch name {
885
+ case "md5":
886
+ return tncrypto.MD5
887
+ case "sha1":
888
+ return tncrypto.SHA1
889
+ case "sha224":
890
+ return tncrypto.SHA224
891
+ case "sha256":
892
+ return tncrypto.SHA256
893
+ case "sha384":
894
+ return tncrypto.SHA384
895
+ case "sha512":
896
+ return tncrypto.SHA512
897
+ case "sha512224":
898
+ return tncrypto.SHA512_224
899
+ case "sha512256":
900
+ return tncrypto.SHA512_256
901
+ case "sha3224":
902
+ return tncrypto.SHA3_224
903
+ case "sha3256":
904
+ return tncrypto.SHA3_256
905
+ case "sha3384":
906
+ return tncrypto.SHA3_384
907
+ case "sha3512":
908
+ return tncrypto.SHA3_512
909
+ }
910
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_DIGEST", "Invalid digest: "+alg))
911
+ }
912
+
913
+ func tnDigest(h tncrypto.Hash, data []byte) []byte {
914
+ w := h.New()
915
+ w.Write(data)
916
+ return w.Sum(nil)
917
+ }
918
+
919
+ // Signing options carried by { key, padding, saltLength, dsaEncoding }
920
+ type tnSignOptions struct {
921
+ padding int
922
+ saltLength int
923
+ hasSalt bool
924
+ dsaEncoding string
925
+ }
926
+
927
+ func tnReadSignOptions(key interface{}) tnSignOptions {
928
+ o := tnSignOptions{dsaEncoding: "der"}
929
+ switch key.(type) {
930
+ case string, []byte, *TnKeyObject, *TnCryptoKey, nil:
931
+ return o
932
+ }
933
+ if v, ok := tnCryptoNumber(TnGet(key, "padding")); ok {
934
+ o.padding = int(v)
935
+ }
936
+ if v, ok := tnCryptoNumber(TnGet(key, "saltLength")); ok {
937
+ o.saltLength = int(v)
938
+ o.hasSalt = true
939
+ }
940
+ if s, ok := TnGet(key, "dsaEncoding").(string); ok && s != "" {
941
+ o.dsaEncoding = s
942
+ }
943
+ return o
944
+ }
945
+
946
+ func (o tnSignOptions) pss(h tncrypto.Hash) *rsa.PSSOptions {
947
+ opts := &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthAuto, Hash: h}
948
+ if o.hasSalt {
949
+ switch o.saltLength {
950
+ case -1:
951
+ opts.SaltLength = rsa.PSSSaltLengthEqualsHash
952
+ case -2, -3:
953
+ opts.SaltLength = rsa.PSSSaltLengthAuto
954
+ default:
955
+ opts.SaltLength = o.saltLength
956
+ }
957
+ }
958
+ return opts
959
+ }
960
+
961
+ type tnECSig struct {
962
+ R, S *tnbig.Int
963
+ }
964
+
965
+ func tnDERToP1363(der []byte, size int) []byte {
966
+ var sig tnECSig
967
+ if _, err := asn1.Unmarshal(der, &sig); err != nil {
968
+ panic(tnCryptoErr(err))
969
+ }
970
+ out := make([]byte, 2*size)
971
+ sig.R.FillBytes(out[:size])
972
+ sig.S.FillBytes(out[size:])
973
+ return out
974
+ }
975
+
976
+ func tnP1363ToDER(raw []byte) []byte {
977
+ half := len(raw) / 2
978
+ der, _ := asn1.Marshal(tnECSig{R: tnBigFrom(raw[:half]), S: tnBigFrom(raw[half:])})
979
+ return der
980
+ }
981
+
982
+ func tnHashName(alg interface{}) string {
983
+ if s, ok := alg.(string); ok {
984
+ return s
985
+ }
986
+ return ""
987
+ }
988
+
989
+ // sign(algorithm, data, key)
990
+ func TnSign(alg interface{}, data interface{}, key interface{}) []byte {
991
+ k := TnCreatePrivateKey(key)
992
+ msg := tnCryptoBytes(data, "")
993
+ o := tnReadSignOptions(key)
994
+ name := tnHashName(alg)
995
+ if name == "" {
996
+ name = "sha256"
997
+ }
998
+ switch p := k.priv.(type) {
999
+ case *rsa.PrivateKey:
1000
+ h := tnCryptoHash(name)
1001
+ digest := tnDigest(h, msg)
1002
+ var sig []byte
1003
+ var err error
1004
+ if o.padding == 6 {
1005
+ sig, err = rsa.SignPSS(cryptorand.Reader, p, h, digest, o.pss(h))
1006
+ } else {
1007
+ sig, err = rsa.SignPKCS1v15(cryptorand.Reader, p, h, digest)
1008
+ }
1009
+ if err != nil {
1010
+ panic(tnCryptoErr(err))
1011
+ }
1012
+ return sig
1013
+ case *ecdsa.PrivateKey:
1014
+ digest := tnDigest(tnCryptoHash(name), msg)
1015
+ sig, err := ecdsa.SignASN1(cryptorand.Reader, p, digest)
1016
+ if err != nil {
1017
+ panic(tnCryptoErr(err))
1018
+ }
1019
+ if o.dsaEncoding == "ieee-p1363" {
1020
+ return tnDERToP1363(sig, (p.Curve.Params().BitSize+7)/8)
1021
+ }
1022
+ return sig
1023
+ case ed25519.PrivateKey:
1024
+ return ed25519.Sign(p, msg)
1025
+ }
1026
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE", "Invalid key type for signing: "+tnAsymmetricType(k.pub)))
1027
+ }
1028
+
1029
+ // verify(algorithm, data, key, signature)
1030
+ func TnVerify(alg interface{}, data interface{}, key interface{}, signature interface{}) bool {
1031
+ k := TnCreatePublicKey(key)
1032
+ msg := tnCryptoBytes(data, "")
1033
+ sig := tnCryptoBytes(signature, "")
1034
+ o := tnReadSignOptions(key)
1035
+ name := tnHashName(alg)
1036
+ if name == "" {
1037
+ name = "sha256"
1038
+ }
1039
+ switch p := k.pub.(type) {
1040
+ case *rsa.PublicKey:
1041
+ h := tnCryptoHash(name)
1042
+ digest := tnDigest(h, msg)
1043
+ if o.padding == 6 {
1044
+ return rsa.VerifyPSS(p, h, digest, sig, o.pss(h)) == nil
1045
+ }
1046
+ return rsa.VerifyPKCS1v15(p, h, digest, sig) == nil
1047
+ case *ecdsa.PublicKey:
1048
+ if o.dsaEncoding == "ieee-p1363" {
1049
+ sig = tnP1363ToDER(sig)
1050
+ }
1051
+ return ecdsa.VerifyASN1(p, tnDigest(tnCryptoHash(name), msg), sig)
1052
+ case ed25519.PublicKey:
1053
+ return ed25519.Verify(p, msg, sig)
1054
+ }
1055
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE", "Invalid key type for verification: "+tnAsymmetricType(k.pub)))
1056
+ }
1057
+
1058
+ // createSign / createVerify
1059
+ type TnSigner struct {
1060
+ alg string
1061
+ data []byte
1062
+ }
1063
+
1064
+ func TnCreateSign(alg string, options ...interface{}) *TnSigner {
1065
+ tnCryptoHash(alg)
1066
+ return &TnSigner{alg: alg}
1067
+ }
1068
+
1069
+ func (s *TnSigner) update(data interface{}, enc ...string) *TnSigner {
1070
+ e := ""
1071
+ if len(enc) > 0 {
1072
+ e = enc[0]
1073
+ }
1074
+ s.data = append(s.data, tnCryptoBytes(data, e)...)
1075
+ return s
1076
+ }
1077
+
1078
+ func (s *TnSigner) sign(key interface{}) []byte { return TnSign(s.alg, s.data, key) }
1079
+
1080
+ func (s *TnSigner) signString(key interface{}, enc string) string {
1081
+ return TnBufferToString(TnSign(s.alg, s.data, key), enc)
1082
+ }
1083
+
1084
+ func (s *TnSigner) verify(key interface{}, signature interface{}, enc ...string) bool {
1085
+ e := ""
1086
+ if len(enc) > 0 {
1087
+ e = enc[0]
1088
+ }
1089
+ return TnVerify(s.alg, s.data, key, tnCryptoBytes(signature, e))
1090
+ }
1091
+
1092
+ // --- RSA encryption ---
1093
+
1094
+ func tnRSAPublic(key interface{}) *rsa.PublicKey {
1095
+ k := TnCreatePublicKey(key)
1096
+ pub, ok := k.pub.(*rsa.PublicKey)
1097
+ if !ok {
1098
+ panic(TnNodeError("Error", "ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", "operation not supported for this keytype"))
1099
+ }
1100
+ return pub
1101
+ }
1102
+
1103
+ func tnRSAPrivate(key interface{}) *rsa.PrivateKey {
1104
+ k := TnCreatePrivateKey(key)
1105
+ priv, ok := k.priv.(*rsa.PrivateKey)
1106
+ if !ok {
1107
+ panic(TnNodeError("Error", "ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", "operation not supported for this keytype"))
1108
+ }
1109
+ return priv
1110
+ }
1111
+
1112
+ func tnRSAPadding(key interface{}, def int) (int, tncrypto.Hash, []byte) {
1113
+ padding := def
1114
+ h := tncrypto.SHA1
1115
+ var label []byte
1116
+ switch key.(type) {
1117
+ case string, []byte, *TnKeyObject, nil:
1118
+ return padding, h, label
1119
+ }
1120
+ if v, ok := tnCryptoNumber(TnGet(key, "padding")); ok {
1121
+ padding = int(v)
1122
+ }
1123
+ if s, ok := TnGet(key, "oaepHash").(string); ok && s != "" {
1124
+ h = tnCryptoHash(s)
1125
+ }
1126
+ if l := TnGet(key, "oaepLabel"); l != nil && !TnIsNil(l) {
1127
+ label = tnCryptoBytes(l, "")
1128
+ }
1129
+ return padding, h, label
1130
+ }
1131
+
1132
+ // Textbook RSA with the public or private exponent, left-padded to the key size
1133
+ func tnRSARaw(n *tnbig.Int, exp *tnbig.Int, data []byte) []byte {
1134
+ out := new(tnbig.Int).Exp(tnBigFrom(data), exp, n)
1135
+ return out.FillBytes(make([]byte, (n.BitLen()+7)/8))
1136
+ }
1137
+
1138
+ func tnRSADecryptError() *TnError {
1139
+ return TnNodeError("Error", "ERR_OSSL_RSA_OAEP_DECODING_ERROR", "error:02000079:rsa routines::oaep decoding error")
1140
+ }
1141
+
1142
+ func TnPublicEncrypt(key interface{}, data interface{}) []byte {
1143
+ pub := tnRSAPublic(key)
1144
+ padding, h, label := tnRSAPadding(key, 4)
1145
+ msg := tnCryptoBytes(data, "")
1146
+ var out []byte
1147
+ var err error
1148
+ switch padding {
1149
+ case 1:
1150
+ out, err = rsa.EncryptPKCS1v15(cryptorand.Reader, pub, msg)
1151
+ case 3:
1152
+ out = tnRSARaw(pub.N, tnbig.NewInt(int64(pub.E)), msg)
1153
+ default:
1154
+ out, err = rsa.EncryptOAEP(h.New(), cryptorand.Reader, pub, msg, label)
1155
+ }
1156
+ if err != nil {
1157
+ panic(TnNodeError("Error", "ERR_OSSL_RSA_DATA_TOO_LARGE_FOR_KEY_SIZE", "error:0200006E:rsa routines::data too large for key size"))
1158
+ }
1159
+ return out
1160
+ }
1161
+
1162
+ func TnPrivateDecrypt(key interface{}, data interface{}) []byte {
1163
+ priv := tnRSAPrivate(key)
1164
+ padding, h, label := tnRSAPadding(key, 4)
1165
+ msg := tnCryptoBytes(data, "")
1166
+ var out []byte
1167
+ var err error
1168
+ switch padding {
1169
+ case 1:
1170
+ out, err = rsa.DecryptPKCS1v15(nil, priv, msg)
1171
+ case 3:
1172
+ out = tnRSARaw(priv.N, priv.D, msg)
1173
+ default:
1174
+ out, err = rsa.DecryptOAEP(h.New(), nil, priv, msg, label)
1175
+ }
1176
+ if err != nil {
1177
+ panic(tnRSADecryptError())
1178
+ }
1179
+ return out
1180
+ }
1181
+
1182
+ func TnPrivateEncrypt(key interface{}, data interface{}) []byte {
1183
+ priv := tnRSAPrivate(key)
1184
+ padding, _, _ := tnRSAPadding(key, 1)
1185
+ msg := tnCryptoBytes(data, "")
1186
+ if padding == 3 {
1187
+ return tnRSARaw(priv.N, priv.D, msg)
1188
+ }
1189
+ out, err := rsa.SignPKCS1v15(nil, priv, 0, msg)
1190
+ if err != nil {
1191
+ panic(TnNodeError("Error", "ERR_OSSL_RSA_DATA_TOO_LARGE_FOR_KEY_SIZE", "error:0200006E:rsa routines::data too large for key size"))
1192
+ }
1193
+ return out
1194
+ }
1195
+
1196
+ func TnPublicDecrypt(key interface{}, data interface{}) []byte {
1197
+ pub := tnRSAPublic(key)
1198
+ padding, _, _ := tnRSAPadding(key, 1)
1199
+ raw := tnRSARaw(pub.N, tnbig.NewInt(int64(pub.E)), tnCryptoBytes(data, ""))
1200
+ if padding == 3 {
1201
+ return raw
1202
+ }
1203
+ // 00 01 FF … FF 00 data
1204
+ if len(raw) < 11 || raw[0] != 0 || raw[1] != 1 {
1205
+ panic(TnNodeError("Error", "ERR_OSSL_RSA_PADDING_CHECK_FAILED", "error:02000072:rsa routines::padding check failed"))
1206
+ }
1207
+ i := 2
1208
+ for i < len(raw) && raw[i] == 0xFF {
1209
+ i++
1210
+ }
1211
+ if i >= len(raw) || raw[i] != 0 {
1212
+ panic(TnNodeError("Error", "ERR_OSSL_RSA_PADDING_CHECK_FAILED", "error:02000072:rsa routines::padding check failed"))
1213
+ }
1214
+ return append([]byte{}, raw[i+1:]...)
1215
+ }
1216
+
1217
+ // --- ECDH / Diffie-Hellman ---
1218
+
1219
+ type TnECDH struct {
1220
+ name string
1221
+ curve ecdh.Curve
1222
+ ec elliptic.Curve
1223
+ priv *ecdh.PrivateKey
1224
+ }
1225
+
1226
+ func TnGetCurves() []string { return []string{"prime256v1", "secp384r1", "secp521r1"} }
1227
+
1228
+ func TnCreateECDH(name string) *TnECDH {
1229
+ switch strings.ToLower(name) {
1230
+ case "prime256v1", "secp256r1", "p-256":
1231
+ return &TnECDH{name: name, curve: ecdh.P256(), ec: elliptic.P256()}
1232
+ case "secp384r1", "p-384":
1233
+ return &TnECDH{name: name, curve: ecdh.P384(), ec: elliptic.P384()}
1234
+ case "secp521r1", "p-521":
1235
+ return &TnECDH{name: name, curve: ecdh.P521(), ec: elliptic.P521()}
1236
+ }
1237
+ panic(TnNodeError("TypeError", "ERR_CRYPTO_INVALID_CURVE", "Invalid EC curve name"))
1238
+ }
1239
+
1240
+ // Results of calls that return a Buffer or a string depending on their arguments
1241
+ func tnAsBytes(v interface{}) []byte {
1242
+ b, _ := v.([]byte)
1243
+ return b
1244
+ }
1245
+
1246
+ func tnAsString(v interface{}) string {
1247
+ s, _ := v.(string)
1248
+ return s
1249
+ }
1250
+
1251
+ func tnEncodeOut(b []byte, enc []string) interface{} {
1252
+ if len(enc) > 0 && enc[0] != "" && enc[0] != "buffer" {
1253
+ return TnBufferToString(b, enc[0])
1254
+ }
1255
+ return b
1256
+ }
1257
+
1258
+ func (e *TnECDH) publicBytes(format string) []byte {
1259
+ if e.priv == nil {
1260
+ panic(TnNodeError("Error", "ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY", "Failed to get ECDH public key"))
1261
+ }
1262
+ raw := e.priv.PublicKey().Bytes()
1263
+ if format == "compressed" {
1264
+ x, y := elliptic.Unmarshal(e.ec, raw)
1265
+ return elliptic.MarshalCompressed(e.ec, x, y)
1266
+ }
1267
+ return raw
1268
+ }
1269
+
1270
+ func (e *TnECDH) generateKeys(args ...string) interface{} {
1271
+ k, err := e.curve.GenerateKey(cryptorand.Reader)
1272
+ if err != nil {
1273
+ panic(tnCryptoErr(err))
1274
+ }
1275
+ e.priv = k
1276
+ return e.getPublicKey(args...)
1277
+ }
1278
+
1279
+ func (e *TnECDH) getPublicKey(args ...string) interface{} {
1280
+ format := ""
1281
+ if len(args) > 1 {
1282
+ format = args[1]
1283
+ }
1284
+ return tnEncodeOut(e.publicBytes(format), args)
1285
+ }
1286
+
1287
+ func (e *TnECDH) getPrivateKey(args ...string) interface{} {
1288
+ if e.priv == nil {
1289
+ panic(TnNodeError("Error", "ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY", "Failed to get ECDH private key"))
1290
+ }
1291
+ return tnEncodeOut(e.priv.Bytes(), args)
1292
+ }
1293
+
1294
+ func (e *TnECDH) setPrivateKey(key interface{}, enc ...string) {
1295
+ ee := ""
1296
+ if len(enc) > 0 {
1297
+ ee = enc[0]
1298
+ }
1299
+ k, err := e.curve.NewPrivateKey(tnCryptoBytes(key, ee))
1300
+ if err != nil {
1301
+ panic(TnNodeError("Error", "ERR_CRYPTO_INVALID_KEYTYPE", "Private key is not valid for specified curve."))
1302
+ }
1303
+ e.priv = k
1304
+ }
1305
+
1306
+ func (e *TnECDH) computeSecret(other interface{}, args ...string) interface{} {
1307
+ inEnc := ""
1308
+ if len(args) > 0 {
1309
+ inEnc = args[0]
1310
+ }
1311
+ raw := tnCryptoBytes(other, inEnc)
1312
+ if len(raw) > 0 && (raw[0] == 2 || raw[0] == 3) {
1313
+ x, y := elliptic.UnmarshalCompressed(e.ec, raw)
1314
+ if x == nil {
1315
+ panic(TnNodeError("Error", "ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY", "Public key is not valid for specified curve"))
1316
+ }
1317
+ raw = elliptic.Marshal(e.ec, x, y)
1318
+ }
1319
+ pub, err := e.curve.NewPublicKey(raw)
1320
+ if err != nil || e.priv == nil {
1321
+ panic(TnNodeError("Error", "ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY", "Public key is not valid for specified curve"))
1322
+ }
1323
+ secret, err := e.priv.ECDH(pub)
1324
+ if err != nil {
1325
+ panic(tnCryptoErr(err))
1326
+ }
1327
+ if len(args) > 1 {
1328
+ return tnEncodeOut(secret, args[1:])
1329
+ }
1330
+ return secret
1331
+ }
1332
+
1333
+ // diffieHellman({ privateKey, publicKey }): ec and x25519 KeyObjects
1334
+ func TnDiffieHellman(options interface{}) []byte {
1335
+ priv, _ := TnGet(options, "privateKey").(*TnKeyObject)
1336
+ pub, _ := TnGet(options, "publicKey").(*TnKeyObject)
1337
+ if priv == nil || pub == nil {
1338
+ panic(TnNodeError("TypeError", "ERR_INVALID_ARG_TYPE", "The \\"options.privateKey\\" and \\"options.publicKey\\" properties must be KeyObjects"))
1339
+ }
1340
+ return tnECDHSecret(priv.priv, pub.pub)
1341
+ }
1342
+
1343
+ func tnECDHSecret(privKey tncrypto.PrivateKey, pubKey tncrypto.PublicKey) []byte {
1344
+ var a *ecdh.PrivateKey
1345
+ var b *ecdh.PublicKey
1346
+ var err error
1347
+ switch k := privKey.(type) {
1348
+ case *ecdh.PrivateKey:
1349
+ a = k
1350
+ case *ecdsa.PrivateKey:
1351
+ a, err = k.ECDH()
1352
+ }
1353
+ switch k := pubKey.(type) {
1354
+ case *ecdh.PublicKey:
1355
+ b = k
1356
+ case *ecdsa.PublicKey:
1357
+ b, err = k.ECDH()
1358
+ }
1359
+ if a == nil || b == nil || err != nil {
1360
+ panic(TnNodeError("Error", "ERR_CRYPTO_INCOMPATIBLE_KEY", "Incompatible key types for Diffie-Hellman"))
1361
+ }
1362
+ secret, err := a.ECDH(b)
1363
+ if err != nil {
1364
+ panic(TnNodeError("Error", "ERR_CRYPTO_INCOMPATIBLE_KEY", "Incompatible key types for Diffie-Hellman: "+err.Error()))
1365
+ }
1366
+ return secret
1367
+ }
1368
+
1369
+ var tnModpGroups = map[string]string{
1370
+ "modp1": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF",
1371
+ "modp2": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF",
1372
+ "modp5": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",
1373
+ "modp14": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF",
1374
+ "modp15": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF",
1375
+ "modp16": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF",
1376
+ "modp17": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AACC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DCC4024FFFFFFFFFFFFFFFF",
1377
+ "modp18": "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AACC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFF",
1378
+ }
1379
+
1380
+ // Classic (finite-field) Diffie-Hellman
1381
+ type TnDiffieHellmanGroup struct {
1382
+ p, g, priv, pub *tnbig.Int
1383
+ verifyError float64
1384
+ }
1385
+
1386
+ func tnDHNumber(v interface{}, enc string) *tnbig.Int {
1387
+ switch x := v.(type) {
1388
+ case float64:
1389
+ return tnbig.NewInt(int64(x))
1390
+ case *tnbig.Int:
1391
+ return x
1392
+ }
1393
+ return tnBigFrom(tnCryptoBytes(v, enc))
1394
+ }
1395
+
1396
+ // createDiffieHellman(primeLength | prime, primeEncoding?, generator?, generatorEncoding?)
1397
+ func TnCreateDiffieHellman(prime interface{}, args ...interface{}) *TnDiffieHellmanGroup {
1398
+ dh := &TnDiffieHellmanGroup{g: tnbig.NewInt(2)}
1399
+ rest := args
1400
+ enc := ""
1401
+ if len(rest) > 0 {
1402
+ if s, ok := rest[0].(string); ok {
1403
+ enc = s
1404
+ rest = rest[1:]
1405
+ }
1406
+ }
1407
+ if n, ok := prime.(float64); ok {
1408
+ p, err := cryptorand.Prime(cryptorand.Reader, int(n))
1409
+ if err != nil {
1410
+ panic(tnCryptoErr(err))
1411
+ }
1412
+ dh.p = p
1413
+ } else {
1414
+ dh.p = tnBigFrom(tnCryptoBytes(prime, enc))
1415
+ }
1416
+ if len(rest) > 0 && rest[0] != nil {
1417
+ genEnc := ""
1418
+ if len(rest) > 1 {
1419
+ genEnc, _ = rest[1].(string)
1420
+ }
1421
+ dh.g = tnDHNumber(rest[0], genEnc)
1422
+ }
1423
+ return dh
1424
+ }
1425
+
1426
+ // getDiffieHellman(groupName) / createDiffieHellmanGroup
1427
+ func TnGetDiffieHellman(name string) *TnDiffieHellmanGroup {
1428
+ hexPrime, ok := tnModpGroups[name]
1429
+ if !ok {
1430
+ panic(TnNodeError("Error", "ERR_CRYPTO_UNKNOWN_DH_GROUP", "Unknown DH group"))
1431
+ }
1432
+ p, _ := new(tnbig.Int).SetString(hexPrime, 16)
1433
+ return &TnDiffieHellmanGroup{p: p, g: tnbig.NewInt(2)}
1434
+ }
1435
+
1436
+ func (d *TnDiffieHellmanGroup) size() int { return (d.p.BitLen() + 7) / 8 }
1437
+
1438
+ func (d *TnDiffieHellmanGroup) generateKeys(enc ...string) interface{} {
1439
+ if d.priv == nil {
1440
+ max := new(tnbig.Int).Sub(d.p, tnbig.NewInt(2))
1441
+ k, err := cryptorand.Int(cryptorand.Reader, max)
1442
+ if err != nil {
1443
+ panic(tnCryptoErr(err))
1444
+ }
1445
+ d.priv = k.Add(k, tnbig.NewInt(1))
1446
+ }
1447
+ d.pub = new(tnbig.Int).Exp(d.g, d.priv, d.p)
1448
+ return tnEncodeOut(d.pub.Bytes(), enc)
1449
+ }
1450
+
1451
+ func (d *TnDiffieHellmanGroup) computeSecret(other interface{}, args ...string) interface{} {
1452
+ inEnc := ""
1453
+ if len(args) > 0 {
1454
+ inEnc = args[0]
1455
+ }
1456
+ y := tnBigFrom(tnCryptoBytes(other, inEnc))
1457
+ secret := new(tnbig.Int).Exp(y, d.priv, d.p).FillBytes(make([]byte, d.size()))
1458
+ if len(args) > 1 {
1459
+ return tnEncodeOut(secret, args[1:])
1460
+ }
1461
+ return secret
1462
+ }
1463
+
1464
+ func (d *TnDiffieHellmanGroup) getPrime(enc ...string) interface{} { return tnEncodeOut(d.p.Bytes(), enc) }
1465
+ func (d *TnDiffieHellmanGroup) getGenerator(enc ...string) interface{} { return tnEncodeOut(d.g.Bytes(), enc) }
1466
+ func (d *TnDiffieHellmanGroup) getPublicKey(enc ...string) interface{} { return tnEncodeOut(d.pub.Bytes(), enc) }
1467
+ func (d *TnDiffieHellmanGroup) getPrivateKey(enc ...string) interface{} {
1468
+ return tnEncodeOut(d.priv.Bytes(), enc)
1469
+ }
1470
+
1471
+ func (d *TnDiffieHellmanGroup) setPublicKey(key interface{}, enc ...string) {
1472
+ e := ""
1473
+ if len(enc) > 0 {
1474
+ e = enc[0]
1475
+ }
1476
+ d.pub = tnBigFrom(tnCryptoBytes(key, e))
1477
+ }
1478
+
1479
+ func (d *TnDiffieHellmanGroup) setPrivateKey(key interface{}, enc ...string) {
1480
+ e := ""
1481
+ if len(enc) > 0 {
1482
+ e = enc[0]
1483
+ }
1484
+ d.priv = tnBigFrom(tnCryptoBytes(key, e))
1485
+ }
1486
+
1487
+ func (d *TnDiffieHellmanGroup) Get_verifyError() float64 { return d.verifyError }
1488
+
1489
+ // --- primes ---
1490
+
1491
+ func tnPrimeBig(v interface{}) *tnbig.Int {
1492
+ switch x := v.(type) {
1493
+ case *tnbig.Int:
1494
+ return x
1495
+ case float64:
1496
+ return tnbig.NewInt(int64(x))
1497
+ case nil:
1498
+ return nil
1499
+ }
1500
+ return tnBigFrom(tnCryptoBytes(v, ""))
1501
+ }
1502
+
1503
+ // generatePrimeSync(size, { safe, add, rem, bigint })
1504
+ func TnGeneratePrimeBig(size float64, options ...interface{}) *tnbig.Int {
1505
+ bitsN := int(size)
1506
+ if bitsN < 2 {
1507
+ panic(TnNodeError("RangeError", "ERR_OUT_OF_RANGE", "The value of \\"size\\" is out of range. It must be >= 2."))
1508
+ }
1509
+ opts := tnCryptoArg(options)
1510
+ safe, _ := TnGet(opts, "safe").(bool)
1511
+ add := tnPrimeBig(TnGet(opts, "add"))
1512
+ rem := tnPrimeBig(TnGet(opts, "rem"))
1513
+ if add == nil && !safe {
1514
+ p, err := cryptorand.Prime(cryptorand.Reader, bitsN)
1515
+ if err != nil {
1516
+ panic(tnCryptoErr(err))
1517
+ }
1518
+ return p
1519
+ }
1520
+ if add != nil && rem == nil {
1521
+ rem = tnbig.NewInt(1)
1522
+ if safe {
1523
+ rem = tnbig.NewInt(3)
1524
+ }
1525
+ }
1526
+ limit := new(tnbig.Int).Lsh(tnbig.NewInt(1), uint(bitsN))
1527
+ for {
1528
+ c, err := cryptorand.Int(cryptorand.Reader, limit)
1529
+ if err != nil {
1530
+ panic(tnCryptoErr(err))
1531
+ }
1532
+ c.SetBit(c, bitsN-1, 1)
1533
+ if add != nil {
1534
+ c.Sub(c, new(tnbig.Int).Mod(c, add)).Add(c, rem)
1535
+ if c.BitLen() != bitsN {
1536
+ continue
1537
+ }
1538
+ } else {
1539
+ c.SetBit(c, 0, 1)
1540
+ }
1541
+ if !c.ProbablyPrime(20) {
1542
+ continue
1543
+ }
1544
+ if safe && !new(tnbig.Int).Rsh(c, 1).ProbablyPrime(20) {
1545
+ continue
1546
+ }
1547
+ return c
1548
+ }
1549
+ }
1550
+
1551
+ func TnGeneratePrimeBytes(size float64, options ...interface{}) []byte {
1552
+ return TnGeneratePrimeBig(size, options...).Bytes()
1553
+ }
1554
+
1555
+ // checkPrimeSync(candidate, { checks })
1556
+ func TnCheckPrimeSync(candidate interface{}, options ...interface{}) bool {
1557
+ checks := 20
1558
+ if v, ok := tnCryptoNumber(TnGet(tnCryptoArg(options), "checks")); ok && v > 0 {
1559
+ checks = int(v)
1560
+ }
1561
+ return tnPrimeBig(candidate).ProbablyPrime(checks)
1562
+ }
1563
+
1564
+ // --- X509Certificate ---
1565
+
1566
+ type TnX509Certificate struct {
1567
+ cert *x509.Certificate
1568
+ }
1569
+
1570
+ func TnNewX509Certificate(data interface{}) *TnX509Certificate {
1571
+ raw := tnCryptoBytes(data, "")
1572
+ if block, _ := pem.Decode(raw); block != nil {
1573
+ raw = block.Bytes
1574
+ }
1575
+ c, err := x509.ParseCertificate(raw)
1576
+ if err != nil {
1577
+ panic(TnNodeError("Error", "ERR_OSSL_PEM_NO_START_LINE", "error:0480006C:PEM routines::no start line"))
1578
+ }
1579
+ return &TnX509Certificate{cert: c}
1580
+ }
1581
+
1582
+ var tnX509Names = map[string]string{
1583
+ "2.5.4.3": "CN", "2.5.4.6": "C", "2.5.4.7": "L", "2.5.4.8": "ST", "2.5.4.9": "street", "2.5.4.10": "O",
1584
+ "2.5.4.11": "OU", "2.5.4.5": "serialNumber", "2.5.4.17": "postalCode", "1.2.840.113549.1.9.1": "emailAddress",
1585
+ "0.9.2342.19200300.100.1.25": "DC", "0.9.2342.19200300.100.1.1": "UID",
1586
+ }
1587
+
1588
+ // "C=US\\nO=Example\\nCN=example.com", in the certificate's order
1589
+ func tnX509Name(name pkix.Name) string {
1590
+ lines := []string{}
1591
+ for _, attr := range name.Names {
1592
+ key := tnX509Names[attr.Type.String()]
1593
+ if key == "" {
1594
+ key = attr.Type.String()
1595
+ }
1596
+ lines = append(lines, key+"="+fmt.Sprint(attr.Value))
1597
+ }
1598
+ return strings.Join(lines, "\\n")
1599
+ }
1600
+
1601
+ func tnX509Fingerprint(sum []byte) string {
1602
+ parts := make([]string, len(sum))
1603
+ for i, b := range sum {
1604
+ parts[i] = fmt.Sprintf("%02X", b)
1605
+ }
1606
+ return strings.Join(parts, ":")
1607
+ }
1608
+
1609
+ func (x *TnX509Certificate) Get_subject() string { return tnX509Name(x.cert.Subject) }
1610
+ func (x *TnX509Certificate) Get_issuer() string { return tnX509Name(x.cert.Issuer) }
1611
+
1612
+ func (x *TnX509Certificate) Get_subjectAltName() *string {
1613
+ alt := []string{}
1614
+ for _, d := range x.cert.DNSNames {
1615
+ alt = append(alt, "DNS:"+d)
1616
+ }
1617
+ for _, ip := range x.cert.IPAddresses {
1618
+ alt = append(alt, "IP Address:"+ip.String())
1619
+ }
1620
+ for _, e := range x.cert.EmailAddresses {
1621
+ alt = append(alt, "email:"+e)
1622
+ }
1623
+ for _, u := range x.cert.URIs {
1624
+ alt = append(alt, "URI:"+u.String())
1625
+ }
1626
+ if len(alt) == 0 {
1627
+ return nil
1628
+ }
1629
+ s := strings.Join(alt, ", ")
1630
+ return &s
1631
+ }
1632
+
1633
+ func (x *TnX509Certificate) Get_validFrom() string {
1634
+ return x.cert.NotBefore.UTC().Format("Jan _2 15:04:05 2006 GMT")
1635
+ }
1636
+ func (x *TnX509Certificate) Get_validTo() string {
1637
+ return x.cert.NotAfter.UTC().Format("Jan _2 15:04:05 2006 GMT")
1638
+ }
1639
+ func (x *TnX509Certificate) Get_validFromDate() time.Time { return x.cert.NotBefore }
1640
+ func (x *TnX509Certificate) Get_validToDate() time.Time { return x.cert.NotAfter }
1641
+ func (x *TnX509Certificate) Get_fingerprint() string {
1642
+ sum := sha1.Sum(x.cert.Raw)
1643
+ return tnX509Fingerprint(sum[:])
1644
+ }
1645
+ func (x *TnX509Certificate) Get_fingerprint256() string {
1646
+ sum := sha256.Sum256(x.cert.Raw)
1647
+ return tnX509Fingerprint(sum[:])
1648
+ }
1649
+ func (x *TnX509Certificate) Get_fingerprint512() string {
1650
+ sum := sha512.Sum512(x.cert.Raw)
1651
+ return tnX509Fingerprint(sum[:])
1652
+ }
1653
+ func (x *TnX509Certificate) Get_serialNumber() string {
1654
+ s := strings.ToUpper(x.cert.SerialNumber.Text(16))
1655
+ if len(s)%2 == 1 {
1656
+ s = "0" + s
1657
+ }
1658
+ return s
1659
+ }
1660
+ func (x *TnX509Certificate) Get_ca() bool { return x.cert.IsCA }
1661
+ func (x *TnX509Certificate) Get_raw() []byte { return x.cert.Raw }
1662
+ func (x *TnX509Certificate) Get_publicKey() *TnKeyObject {
1663
+ return &TnKeyObject{type_: "public", pub: x.cert.PublicKey}
1664
+ }
1665
+
1666
+ func (x *TnX509Certificate) Get_keyUsage() []string {
1667
+ usages := []string{}
1668
+ for _, u := range x.cert.ExtKeyUsage {
1669
+ switch u {
1670
+ case x509.ExtKeyUsageServerAuth:
1671
+ usages = append(usages, "1.3.6.1.5.5.7.3.1")
1672
+ case x509.ExtKeyUsageClientAuth:
1673
+ usages = append(usages, "1.3.6.1.5.5.7.3.2")
1674
+ case x509.ExtKeyUsageCodeSigning:
1675
+ usages = append(usages, "1.3.6.1.5.5.7.3.3")
1676
+ case x509.ExtKeyUsageEmailProtection:
1677
+ usages = append(usages, "1.3.6.1.5.5.7.3.4")
1678
+ }
1679
+ }
1680
+ if len(usages) == 0 {
1681
+ return nil
1682
+ }
1683
+ return usages
1684
+ }
1685
+
1686
+ func (x *TnX509Certificate) checkHost(name string, options ...interface{}) *string {
1687
+ if x.cert.VerifyHostname(name) != nil {
1688
+ return nil
1689
+ }
1690
+ return &name
1691
+ }
1692
+
1693
+ func (x *TnX509Certificate) checkIP(ip string) *string {
1694
+ parsed := net.ParseIP(ip)
1695
+ for _, a := range x.cert.IPAddresses {
1696
+ if parsed != nil && a.Equal(parsed) {
1697
+ return &ip
1698
+ }
1699
+ }
1700
+ return nil
1701
+ }
1702
+
1703
+ func (x *TnX509Certificate) checkEmail(email string, options ...interface{}) *string {
1704
+ for _, e := range x.cert.EmailAddresses {
1705
+ if strings.EqualFold(e, email) {
1706
+ return &email
1707
+ }
1708
+ }
1709
+ return nil
1710
+ }
1711
+
1712
+ func (x *TnX509Certificate) checkIssued(other *TnX509Certificate) bool {
1713
+ return bytes.Equal(x.cert.RawIssuer, other.cert.RawSubject) && x.cert.CheckSignatureFrom(other.cert) == nil
1714
+ }
1715
+
1716
+ // verify(publicKey): the certificate's signature checks out against the key
1717
+ func (x *TnX509Certificate) verify(key *TnKeyObject) bool {
1718
+ c := x.cert
1719
+ var h tncrypto.Hash
1720
+ switch c.SignatureAlgorithm {
1721
+ case x509.SHA1WithRSA, x509.ECDSAWithSHA1:
1722
+ h = tncrypto.SHA1
1723
+ case x509.SHA256WithRSA, x509.ECDSAWithSHA256, x509.SHA256WithRSAPSS:
1724
+ h = tncrypto.SHA256
1725
+ case x509.SHA384WithRSA, x509.ECDSAWithSHA384, x509.SHA384WithRSAPSS:
1726
+ h = tncrypto.SHA384
1727
+ case x509.SHA512WithRSA, x509.ECDSAWithSHA512, x509.SHA512WithRSAPSS:
1728
+ h = tncrypto.SHA512
1729
+ }
1730
+ switch p := key.pub.(type) {
1731
+ case *rsa.PublicKey:
1732
+ digest := tnDigest(h, c.RawTBSCertificate)
1733
+ switch c.SignatureAlgorithm {
1734
+ case x509.SHA256WithRSAPSS, x509.SHA384WithRSAPSS, x509.SHA512WithRSAPSS:
1735
+ return rsa.VerifyPSS(p, h, digest, c.Signature, &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash}) == nil
1736
+ }
1737
+ return rsa.VerifyPKCS1v15(p, h, digest, c.Signature) == nil
1738
+ case *ecdsa.PublicKey:
1739
+ return ecdsa.VerifyASN1(p, tnDigest(h, c.RawTBSCertificate), c.Signature)
1740
+ case ed25519.PublicKey:
1741
+ return ed25519.Verify(p, c.RawTBSCertificate, c.Signature)
1742
+ }
1743
+ return false
1744
+ }
1745
+
1746
+ func (x *TnX509Certificate) toString() string {
1747
+ return string(pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: x.cert.Raw}))
1748
+ }
1749
+
1750
+ func (x *TnX509Certificate) toJSON() string { return x.toString() }
1751
+
1752
+ func (x *TnX509Certificate) toLegacyObject() map[string]interface{} {
1753
+ names := func(n pkix.Name) map[string]interface{} {
1754
+ m := map[string]interface{}{}
1755
+ for _, attr := range n.Names {
1756
+ key := tnX509Names[attr.Type.String()]
1757
+ if key == "" {
1758
+ key = attr.Type.String()
1759
+ }
1760
+ m[key] = fmt.Sprint(attr.Value)
1761
+ }
1762
+ return m
1763
+ }
1764
+ out := map[string]interface{}{
1765
+ "subject": names(x.cert.Subject),
1766
+ "issuer": names(x.cert.Issuer),
1767
+ "valid_from": x.Get_validFrom(),
1768
+ "valid_to": x.Get_validTo(),
1769
+ "fingerprint": x.Get_fingerprint(),
1770
+ "fingerprint256": x.Get_fingerprint256(),
1771
+ "fingerprint512": x.Get_fingerprint512(),
1772
+ "serialNumber": x.Get_serialNumber(),
1773
+ "ca": x.cert.IsCA,
1774
+ "raw": x.cert.Raw,
1775
+ }
1776
+ if alt := x.Get_subjectAltName(); alt != nil {
1777
+ out["subjectaltname"] = *alt
1778
+ }
1779
+ return out
1780
+ }
1781
+
1782
+ // --- webcrypto (crypto.subtle) ---
1783
+
1784
+ type TnCryptoKey struct {
1785
+ type_ string
1786
+ extractable bool
1787
+ algorithm map[string]interface{}
1788
+ usages []string
1789
+ key *TnKeyObject
1790
+ }
1791
+
1792
+ func (k *TnCryptoKey) Get_type_() string { return k.type_ }
1793
+ func (k *TnCryptoKey) Get_extractable() bool { return k.extractable }
1794
+ func (k *TnCryptoKey) Get_algorithm() *TnKeyAlgorithm { return tnKeyAlgorithm(k.algorithm) }
1795
+
1796
+ // CryptoKey#algorithm: { name, length, hash: { name }, namedCurve, modulusLength, publicExponent }
1797
+ type TnKeyAlgorithm struct {
1798
+ name string
1799
+ length float64
1800
+ hash *TnKeyAlgorithm
1801
+ namedCurve string
1802
+ modulusLength float64
1803
+ publicExponent []byte
1804
+ }
1805
+
1806
+ func tnKeyAlgorithm(m map[string]interface{}) *TnKeyAlgorithm {
1807
+ a := &TnKeyAlgorithm{}
1808
+ a.name, _ = m["name"].(string)
1809
+ a.length, _ = m["length"].(float64)
1810
+ a.namedCurve, _ = m["namedCurve"].(string)
1811
+ a.modulusLength, _ = m["modulusLength"].(float64)
1812
+ a.publicExponent, _ = m["publicExponent"].([]byte)
1813
+ if h, ok := m["hash"].(map[string]interface{}); ok {
1814
+ a.hash = tnKeyAlgorithm(h)
1815
+ }
1816
+ return a
1817
+ }
1818
+ func (k *TnCryptoKey) Get_usages() []string { return k.usages }
1819
+
1820
+ type TnCryptoKeyPair struct {
1821
+ publicKey *TnCryptoKey
1822
+ privateKey *TnCryptoKey
1823
+ }
1824
+
1825
+ func tnDOMError(name string, message string) *TnError { return TnNodeError(name, "", message) }
1826
+
1827
+ var tnSubtleNames = map[string]string{
1828
+ "AES-GCM": "AES-GCM", "AES-CBC": "AES-CBC", "AES-CTR": "AES-CTR", "HMAC": "HMAC",
1829
+ "RSASSA-PKCS1-V1_5": "RSASSA-PKCS1-v1_5", "RSA-PSS": "RSA-PSS", "RSA-OAEP": "RSA-OAEP",
1830
+ "ECDSA": "ECDSA", "ECDH": "ECDH", "ED25519": "Ed25519", "X25519": "X25519", "PBKDF2": "PBKDF2", "HKDF": "HKDF",
1831
+ }
1832
+
1833
+ func tnAlgName(alg interface{}) string {
1834
+ if s, ok := alg.(string); ok {
1835
+ return s
1836
+ }
1837
+ n, _ := TnGet(alg, "name").(string)
1838
+ return n
1839
+ }
1840
+
1841
+ func tnSubtleAlg(alg interface{}) string {
1842
+ name := tnSubtleNames[strings.ToUpper(tnAlgName(alg))]
1843
+ if name == "" {
1844
+ panic(tnDOMError("NotSupportedError", "Unrecognized algorithm name"))
1845
+ }
1846
+ return name
1847
+ }
1848
+
1849
+ func tnSubtleHash(alg interface{}) string {
1850
+ name := strings.ToUpper(tnAlgName(alg))
1851
+ switch name {
1852
+ case "SHA-1", "SHA-256", "SHA-384", "SHA-512":
1853
+ return name
1854
+ }
1855
+ panic(tnDOMError("NotSupportedError", "Unrecognized algorithm name"))
1856
+ }
1857
+
1858
+ func tnStrings(v interface{}) []string {
1859
+ out := []string{}
1860
+ rv := reflect.ValueOf(v)
1861
+ if rv.Kind() == reflect.Pointer && !rv.IsNil() {
1862
+ rv = rv.Elem()
1863
+ }
1864
+ if rv.Kind() == reflect.Slice {
1865
+ for i := 0; i < rv.Len(); i++ {
1866
+ out = append(out, fmt.Sprint(rv.Index(i).Interface()))
1867
+ }
1868
+ }
1869
+ return out
1870
+ }
1871
+
1872
+ func tnFilterUsages(usages []string, allowed ...string) []string {
1873
+ out := []string{}
1874
+ for _, u := range usages {
1875
+ for _, a := range allowed {
1876
+ if u == a {
1877
+ out = append(out, u)
1878
+ }
1879
+ }
1880
+ }
1881
+ return out
1882
+ }
1883
+
1884
+ func tnSubtle[T any](work func() T) chan T {
1885
+ ch := make(chan T, 1)
1886
+ func() {
1887
+ defer func() {
1888
+ if r := recover(); r != nil {
1889
+ if e, ok := r.(*TnError); ok && e.Get_name() == "Error" {
1890
+ r = tnDOMError("OperationError", e.message)
1891
+ }
1892
+ TnReject(ch, r)
1893
+ }
1894
+ }()
1895
+ ch <- work()
1896
+ }()
1897
+ return ch
1898
+ }
1899
+
1900
+ func tnSubtleBytes(v interface{}) []byte {
1901
+ switch x := v.(type) {
1902
+ case []byte:
1903
+ return x
1904
+ case string:
1905
+ return []byte(x)
1906
+ }
1907
+ return TnAs[[]byte](v)
1908
+ }
1909
+
1910
+ func TnSubtleDigest(alg interface{}, data interface{}) chan []byte {
1911
+ return tnSubtle(func() []byte {
1912
+ return tnDigest(tnCryptoHash(tnSubtleHash(alg)), tnSubtleBytes(data))
1913
+ })
1914
+ }
1915
+
1916
+ func tnHMACLength(hash string) float64 {
1917
+ if hash == "SHA-384" || hash == "SHA-512" {
1918
+ return 1024
1919
+ }
1920
+ return 512
1921
+ }
1922
+
1923
+ func tnSubtleGenerate(alg interface{}, extractable bool, usages interface{}) interface{} {
1924
+ name := tnSubtleAlg(alg)
1925
+ us := tnStrings(usages)
1926
+ switch name {
1927
+ case "HMAC":
1928
+ hash := tnSubtleHash(TnGet(alg, "hash"))
1929
+ length := tnHMACLength(hash)
1930
+ if n, ok := tnCryptoLength(alg); ok {
1931
+ length = n
1932
+ }
1933
+ return &TnCryptoKey{type_: "secret", extractable: extractable, usages: us,
1934
+ algorithm: map[string]interface{}{"name": name, "hash": map[string]interface{}{"name": hash}, "length": length},
1935
+ key: &TnKeyObject{type_: "secret", secret: TnRandomBytes(float64(int(length) / 8))}}
1936
+ case "AES-GCM", "AES-CBC", "AES-CTR":
1937
+ length, _ := tnCryptoLength(alg)
1938
+ if length != 128 && length != 192 && length != 256 {
1939
+ panic(tnDOMError("OperationError", "AES key length must be 128, 192, or 256 bits"))
1940
+ }
1941
+ return &TnCryptoKey{type_: "secret", extractable: extractable, usages: us,
1942
+ algorithm: map[string]interface{}{"name": name, "length": length},
1943
+ key: &TnKeyObject{type_: "secret", secret: TnRandomBytes(length / 8)}}
1944
+ }
1945
+ var priv tncrypto.PrivateKey
1946
+ algorithm := map[string]interface{}{"name": name}
1947
+ pubUsages, privUsages := []string{}, []string{}
1948
+ switch name {
1949
+ case "RSASSA-PKCS1-v1_5", "RSA-PSS", "RSA-OAEP":
1950
+ modulus, _ := tnCryptoNumber(TnGet(alg, "modulusLength"))
1951
+ if e := TnGet(alg, "publicExponent"); e != nil && !TnIsNil(e) && tnBigFrom(tnSubtleBytes(e)).Int64() != 65537 {
1952
+ panic(tnDOMError("OperationError", "Only the public exponent 65537 is supported"))
1953
+ }
1954
+ priv = tnGenerateAsymmetric("rsa", map[string]interface{}{"modulusLength": modulus})
1955
+ algorithm["modulusLength"] = modulus
1956
+ algorithm["publicExponent"] = []byte{1, 0, 1}
1957
+ algorithm["hash"] = map[string]interface{}{"name": tnSubtleHash(TnGet(alg, "hash"))}
1958
+ if name == "RSA-OAEP" {
1959
+ pubUsages, privUsages = tnFilterUsages(us, "encrypt", "wrapKey"), tnFilterUsages(us, "decrypt", "unwrapKey")
1960
+ } else {
1961
+ pubUsages, privUsages = tnFilterUsages(us, "verify"), tnFilterUsages(us, "sign")
1962
+ }
1963
+ case "ECDSA", "ECDH":
1964
+ curve, _ := TnGet(alg, "namedCurve").(string)
1965
+ priv = tnGenerateAsymmetric("ec", map[string]interface{}{"namedCurve": curve})
1966
+ algorithm["namedCurve"] = curve
1967
+ if name == "ECDSA" {
1968
+ pubUsages, privUsages = tnFilterUsages(us, "verify"), tnFilterUsages(us, "sign")
1969
+ } else {
1970
+ privUsages = tnFilterUsages(us, "deriveKey", "deriveBits")
1971
+ }
1972
+ case "Ed25519":
1973
+ priv = tnGenerateAsymmetric("ed25519", nil)
1974
+ pubUsages, privUsages = tnFilterUsages(us, "verify"), tnFilterUsages(us, "sign")
1975
+ case "X25519":
1976
+ priv = tnGenerateAsymmetric("x25519", nil)
1977
+ privUsages = tnFilterUsages(us, "deriveKey", "deriveBits")
1978
+ default:
1979
+ panic(tnDOMError("NotSupportedError", "Unable to generate a key for "+name))
1980
+ }
1981
+ k := tnPrivateKeyObject(priv)
1982
+ return &TnCryptoKeyPair{
1983
+ publicKey: &TnCryptoKey{type_: "public", extractable: true, algorithm: algorithm, usages: pubUsages, key: &TnKeyObject{type_: "public", pub: k.pub}},
1984
+ privateKey: &TnCryptoKey{type_: "private", extractable: extractable, algorithm: algorithm, usages: privUsages, key: k},
1985
+ }
1986
+ }
1987
+
1988
+ func TnSubtleGenerateKey(alg interface{}, extractable bool, usages interface{}) chan *TnCryptoKey {
1989
+ return tnSubtle(func() *TnCryptoKey {
1990
+ k, ok := tnSubtleGenerate(alg, extractable, usages).(*TnCryptoKey)
1991
+ if !ok {
1992
+ panic(tnDOMError("NotSupportedError", "The algorithm generates a key pair"))
1993
+ }
1994
+ return k
1995
+ })
1996
+ }
1997
+
1998
+ func TnSubtleGenerateKeyPair(alg interface{}, extractable bool, usages interface{}) chan *TnCryptoKeyPair {
1999
+ return tnSubtle(func() *TnCryptoKeyPair {
2000
+ k, ok := tnSubtleGenerate(alg, extractable, usages).(*TnCryptoKeyPair)
2001
+ if !ok {
2002
+ panic(tnDOMError("NotSupportedError", "The algorithm generates a secret key"))
2003
+ }
2004
+ return k
2005
+ })
2006
+ }
2007
+
2008
+ func TnSubtleGenerateAny(alg interface{}, extractable bool, usages interface{}) chan interface{} {
2009
+ return tnSubtle(func() interface{} { return tnSubtleGenerate(alg, extractable, usages) })
2010
+ }
2011
+
2012
+ // The algorithm object of an imported key
2013
+ func tnSubtleAlgorithm(name string, alg interface{}, k *TnKeyObject) map[string]interface{} {
2014
+ algorithm := map[string]interface{}{"name": name}
2015
+ switch name {
2016
+ case "HMAC":
2017
+ algorithm["hash"] = map[string]interface{}{"name": tnSubtleHash(TnGet(alg, "hash"))}
2018
+ algorithm["length"] = float64(len(k.secret) * 8)
2019
+ if n, ok := tnCryptoLength(alg); ok {
2020
+ algorithm["length"] = n
2021
+ }
2022
+ case "AES-GCM", "AES-CBC", "AES-CTR":
2023
+ algorithm["length"] = float64(len(k.secret) * 8)
2024
+ case "RSASSA-PKCS1-v1_5", "RSA-PSS", "RSA-OAEP":
2025
+ if p, ok := k.pub.(*rsa.PublicKey); ok {
2026
+ algorithm["modulusLength"] = float64(p.N.BitLen())
2027
+ algorithm["publicExponent"] = tnbig.NewInt(int64(p.E)).Bytes()
2028
+ }
2029
+ algorithm["hash"] = map[string]interface{}{"name": tnSubtleHash(TnGet(alg, "hash"))}
2030
+ case "ECDSA", "ECDH":
2031
+ if p, ok := k.pub.(*ecdsa.PublicKey); ok {
2032
+ algorithm["namedCurve"] = p.Curve.Params().Name
2033
+ }
2034
+ }
2035
+ return algorithm
2036
+ }
2037
+
2038
+ func tnSubtleImport(format string, data interface{}, alg interface{}, extractable bool, usages interface{}) *TnCryptoKey {
2039
+ name := tnSubtleAlg(alg)
2040
+ var k *TnKeyObject
2041
+ secretAlg := name == "HMAC" || name == "PBKDF2" || name == "HKDF" || strings.HasPrefix(name, "AES-")
2042
+ switch format {
2043
+ case "raw":
2044
+ raw := tnSubtleBytes(data)
2045
+ switch {
2046
+ case secretAlg:
2047
+ k = &TnKeyObject{type_: "secret", secret: append([]byte{}, raw...)}
2048
+ case name == "ECDSA" || name == "ECDH":
2049
+ curve := tnNamedCurve(fmt.Sprint(TnGet(alg, "namedCurve")))
2050
+ x, y := elliptic.Unmarshal(curve, raw)
2051
+ if x == nil {
2052
+ panic(tnDOMError("DataError", "Invalid keyData"))
2053
+ }
2054
+ k = &TnKeyObject{type_: "public", pub: &ecdsa.PublicKey{Curve: curve, X: x, Y: y}}
2055
+ case name == "Ed25519":
2056
+ k = &TnKeyObject{type_: "public", pub: ed25519.PublicKey(append([]byte{}, raw...))}
2057
+ case name == "X25519":
2058
+ pub, err := ecdh.X25519().NewPublicKey(raw)
2059
+ if err != nil {
2060
+ panic(tnDOMError("DataError", "Invalid keyData"))
2061
+ }
2062
+ k = &TnKeyObject{type_: "public", pub: pub}
2063
+ }
2064
+ case "spki":
2065
+ pub, err := x509.ParsePKIXPublicKey(tnSubtleBytes(data))
2066
+ if err != nil {
2067
+ panic(tnDOMError("DataError", "Invalid keyData"))
2068
+ }
2069
+ k = &TnKeyObject{type_: "public", pub: pub}
2070
+ case "pkcs8":
2071
+ priv, err := x509.ParsePKCS8PrivateKey(tnSubtleBytes(data))
2072
+ if err != nil {
2073
+ panic(tnDOMError("DataError", "Invalid keyData"))
2074
+ }
2075
+ k = tnPrivateKeyObject(priv)
2076
+ case "jwk":
2077
+ if kty, _ := TnGet(data, "kty").(string); kty == "oct" {
2078
+ k = &TnKeyObject{type_: "secret", secret: tnJWKBytes(data, "k")}
2079
+ } else {
2080
+ pub, priv := tnKeyFromJWK(data)
2081
+ if priv != nil {
2082
+ k = tnPrivateKeyObject(priv)
2083
+ } else {
2084
+ k = &TnKeyObject{type_: "public", pub: pub}
2085
+ }
2086
+ }
2087
+ default:
2088
+ panic(tnDOMError("NotSupportedError", "Unsupported key format "+format))
2089
+ }
2090
+ if k == nil {
2091
+ panic(tnDOMError("NotSupportedError", "Unable to import a "+format+" key for "+name))
2092
+ }
2093
+ return &TnCryptoKey{type_: k.type_, extractable: extractable, usages: tnStrings(usages), algorithm: tnSubtleAlgorithm(name, alg, k), key: k}
2094
+ }
2095
+
2096
+ func TnSubtleImportKey(format string, data interface{}, alg interface{}, extractable bool, usages interface{}) chan *TnCryptoKey {
2097
+ return tnSubtle(func() *TnCryptoKey { return tnSubtleImport(format, data, alg, extractable, usages) })
2098
+ }
2099
+
2100
+ func tnSubtleExport(format string, key *TnCryptoKey) interface{} {
2101
+ if !key.extractable {
2102
+ panic(tnDOMError("InvalidAccessException", "key is not extractable"))
2103
+ }
2104
+ k := key.key
2105
+ switch format {
2106
+ case "raw":
2107
+ switch p := k.pub.(type) {
2108
+ case *ecdsa.PublicKey:
2109
+ return elliptic.Marshal(p.Curve, p.X, p.Y)
2110
+ case ed25519.PublicKey:
2111
+ return []byte(p)
2112
+ case *ecdh.PublicKey:
2113
+ return p.Bytes()
2114
+ }
2115
+ if k.type_ == "secret" {
2116
+ return append([]byte{}, k.secret...)
2117
+ }
2118
+ case "spki":
2119
+ if k.type_ == "public" {
2120
+ return k.export(map[string]interface{}{"type": "spki", "format": "der"})
2121
+ }
2122
+ case "pkcs8":
2123
+ if k.type_ == "private" {
2124
+ return k.export(map[string]interface{}{"type": "pkcs8", "format": "der"})
2125
+ }
2126
+ case "jwk":
2127
+ jwk, _ := k.export(map[string]interface{}{"format": "jwk"}).(map[string]interface{})
2128
+ jwk["ext"] = key.extractable
2129
+ ops := []interface{}{}
2130
+ for _, u := range key.usages {
2131
+ ops = append(ops, u)
2132
+ }
2133
+ jwk["key_ops"] = ops
2134
+ if length, ok := key.algorithm["length"].(float64); ok {
2135
+ switch key.algorithm["name"] {
2136
+ case "HMAC":
2137
+ hash, _ := TnGet(key.algorithm["hash"], "name").(string)
2138
+ jwk["alg"] = "HS" + strings.TrimPrefix(hash, "SHA-")
2139
+ case "AES-GCM":
2140
+ jwk["alg"] = fmt.Sprintf("A%dGCM", int(length))
2141
+ case "AES-CBC":
2142
+ jwk["alg"] = fmt.Sprintf("A%dCBC", int(length))
2143
+ case "AES-CTR":
2144
+ jwk["alg"] = fmt.Sprintf("A%dCTR", int(length))
2145
+ }
2146
+ }
2147
+ return jwk
2148
+ }
2149
+ panic(tnDOMError("NotSupportedError", "Unable to export a "+k.type_+" key as "+format))
2150
+ }
2151
+
2152
+ func TnSubtleExportKey(format string, key *TnCryptoKey) chan []byte {
2153
+ return tnSubtle(func() []byte {
2154
+ b, ok := tnSubtleExport(format, key).([]byte)
2155
+ if !ok {
2156
+ panic(tnDOMError("NotSupportedError", "Unsupported key format "+format))
2157
+ }
2158
+ return b
2159
+ })
2160
+ }
2161
+
2162
+ func TnSubtleExportAny(format string, key *TnCryptoKey) chan interface{} {
2163
+ return tnSubtle(func() interface{} { return tnSubtleExport(format, key) })
2164
+ }
2165
+
2166
+ func tnKeyHash(key *TnCryptoKey, alg interface{}) tncrypto.Hash {
2167
+ if h := TnGet(alg, "hash"); h != nil {
2168
+ return tnCryptoHash(tnSubtleHash(h))
2169
+ }
2170
+ return tnCryptoHash(tnSubtleHash(key.algorithm["hash"]))
2171
+ }
2172
+
2173
+ func tnSubtleSign(alg interface{}, key *TnCryptoKey, data []byte) []byte {
2174
+ name := tnSubtleAlg(alg)
2175
+ k := key.key
2176
+ switch name {
2177
+ case "HMAC":
2178
+ h := tnKeyHash(key, nil)
2179
+ mac := hmac.New(h.New, k.secret)
2180
+ mac.Write(data)
2181
+ return mac.Sum(nil)
2182
+ case "RSASSA-PKCS1-v1_5":
2183
+ h := tnKeyHash(key, nil)
2184
+ sig, err := rsa.SignPKCS1v15(cryptorand.Reader, k.priv.(*rsa.PrivateKey), h, tnDigest(h, data))
2185
+ if err != nil {
2186
+ panic(tnCryptoErr(err))
2187
+ }
2188
+ return sig
2189
+ case "RSA-PSS":
2190
+ h := tnKeyHash(key, nil)
2191
+ salt, _ := tnCryptoNumber(TnGet(alg, "saltLength"))
2192
+ sig, err := rsa.SignPSS(cryptorand.Reader, k.priv.(*rsa.PrivateKey), h, tnDigest(h, data), &rsa.PSSOptions{SaltLength: int(salt), Hash: h})
2193
+ if err != nil {
2194
+ panic(tnCryptoErr(err))
2195
+ }
2196
+ return sig
2197
+ case "ECDSA":
2198
+ priv := k.priv.(*ecdsa.PrivateKey)
2199
+ der, err := ecdsa.SignASN1(cryptorand.Reader, priv, tnDigest(tnCryptoHash(tnSubtleHash(TnGet(alg, "hash"))), data))
2200
+ if err != nil {
2201
+ panic(tnCryptoErr(err))
2202
+ }
2203
+ return tnDERToP1363(der, (priv.Curve.Params().BitSize+7)/8)
2204
+ case "Ed25519":
2205
+ return ed25519.Sign(k.priv.(ed25519.PrivateKey), data)
2206
+ }
2207
+ panic(tnDOMError("NotSupportedError", "Unable to sign with "+name))
2208
+ }
2209
+
2210
+ func TnSubtleSign(alg interface{}, key *TnCryptoKey, data interface{}) chan []byte {
2211
+ return tnSubtle(func() []byte {
2212
+ if key.type_ == "public" {
2213
+ panic(tnDOMError("InvalidAccessError", "Unable to use this key to sign"))
2214
+ }
2215
+ return tnSubtleSign(alg, key, tnSubtleBytes(data))
2216
+ })
2217
+ }
2218
+
2219
+ func TnSubtleVerify(alg interface{}, key *TnCryptoKey, signature interface{}, data interface{}) chan bool {
2220
+ return tnSubtle(func() bool {
2221
+ name := tnSubtleAlg(alg)
2222
+ k := key.key
2223
+ sig, msg := tnSubtleBytes(signature), tnSubtleBytes(data)
2224
+ switch name {
2225
+ case "HMAC":
2226
+ return hmac.Equal(tnSubtleSign(alg, key, msg), sig)
2227
+ case "RSASSA-PKCS1-v1_5":
2228
+ h := tnKeyHash(key, nil)
2229
+ return rsa.VerifyPKCS1v15(k.pub.(*rsa.PublicKey), h, tnDigest(h, msg), sig) == nil
2230
+ case "RSA-PSS":
2231
+ h := tnKeyHash(key, nil)
2232
+ salt, _ := tnCryptoNumber(TnGet(alg, "saltLength"))
2233
+ return rsa.VerifyPSS(k.pub.(*rsa.PublicKey), h, tnDigest(h, msg), sig, &rsa.PSSOptions{SaltLength: int(salt), Hash: h}) == nil
2234
+ case "ECDSA":
2235
+ return ecdsa.VerifyASN1(k.pub.(*ecdsa.PublicKey), tnDigest(tnCryptoHash(tnSubtleHash(TnGet(alg, "hash"))), msg), tnP1363ToDER(sig))
2236
+ case "Ed25519":
2237
+ return ed25519.Verify(k.pub.(ed25519.PublicKey), msg, sig)
2238
+ }
2239
+ panic(tnDOMError("NotSupportedError", "Unable to verify with "+name))
2240
+ })
2241
+ }
2242
+
2243
+ func tnAESBlock(key *TnCryptoKey) cipher.Block {
2244
+ block, err := aes.NewCipher(key.key.secret)
2245
+ if err != nil {
2246
+ panic(tnDOMError("OperationError", err.Error()))
2247
+ }
2248
+ return block
2249
+ }
2250
+
2251
+ func tnSubtleCrypt(alg interface{}, key *TnCryptoKey, data []byte, decrypt bool) []byte {
2252
+ name := tnSubtleAlg(alg)
2253
+ switch name {
2254
+ case "AES-GCM":
2255
+ iv := tnSubtleBytes(TnGet(alg, "iv"))
2256
+ tagBits := 128.0
2257
+ if n, ok := tnCryptoNumber(TnGet(alg, "tagLength")); ok {
2258
+ tagBits = n
2259
+ }
2260
+ aead, err := cipher.NewGCMWithTagSize(tnAESBlock(key), int(tagBits)/8)
2261
+ if err == nil && len(iv) != aead.NonceSize() {
2262
+ aead, err = cipher.NewGCMWithNonceSize(tnAESBlock(key), len(iv))
2263
+ }
2264
+ if err != nil {
2265
+ panic(tnDOMError("OperationError", err.Error()))
2266
+ }
2267
+ var aad []byte
2268
+ if a := TnGet(alg, "additionalData"); a != nil && !TnIsNil(a) {
2269
+ aad = tnSubtleBytes(a)
2270
+ }
2271
+ if decrypt {
2272
+ out, err := aead.Open(nil, iv, data, aad)
2273
+ if err != nil {
2274
+ panic(tnDOMError("OperationError", "The operation failed for an operation-specific reason"))
2275
+ }
2276
+ return out
2277
+ }
2278
+ return aead.Seal(nil, iv, data, aad)
2279
+ case "AES-CBC":
2280
+ iv := tnSubtleBytes(TnGet(alg, "iv"))
2281
+ block := tnAESBlock(key)
2282
+ if decrypt {
2283
+ if len(data) == 0 || len(data)%aes.BlockSize != 0 {
2284
+ panic(tnDOMError("OperationError", "The provided data is not a multiple of the block size"))
2285
+ }
2286
+ out := make([]byte, len(data))
2287
+ cipher.NewCBCDecrypter(block, iv).CryptBlocks(out, data)
2288
+ pad := int(out[len(out)-1])
2289
+ if pad == 0 || pad > aes.BlockSize {
2290
+ panic(tnDOMError("OperationError", "The operation failed for an operation-specific reason"))
2291
+ }
2292
+ return out[:len(out)-pad]
2293
+ }
2294
+ pad := aes.BlockSize - len(data)%aes.BlockSize
2295
+ padded := append(append([]byte{}, data...), bytes.Repeat([]byte{byte(pad)}, pad)...)
2296
+ out := make([]byte, len(padded))
2297
+ cipher.NewCBCEncrypter(block, iv).CryptBlocks(out, padded)
2298
+ return out
2299
+ case "AES-CTR":
2300
+ counter := tnSubtleBytes(TnGet(alg, "counter"))
2301
+ out := make([]byte, len(data))
2302
+ cipher.NewCTR(tnAESBlock(key), counter).XORKeyStream(out, data)
2303
+ return out
2304
+ case "RSA-OAEP":
2305
+ h := tnKeyHash(key, nil)
2306
+ var label []byte
2307
+ if l := TnGet(alg, "label"); l != nil && !TnIsNil(l) {
2308
+ label = tnSubtleBytes(l)
2309
+ }
2310
+ if decrypt {
2311
+ out, err := rsa.DecryptOAEP(h.New(), nil, key.key.priv.(*rsa.PrivateKey), data, label)
2312
+ if err != nil {
2313
+ panic(tnDOMError("OperationError", "The operation failed for an operation-specific reason"))
2314
+ }
2315
+ return out
2316
+ }
2317
+ out, err := rsa.EncryptOAEP(h.New(), cryptorand.Reader, key.key.pub.(*rsa.PublicKey), data, label)
2318
+ if err != nil {
2319
+ panic(tnDOMError("OperationError", err.Error()))
2320
+ }
2321
+ return out
2322
+ }
2323
+ panic(tnDOMError("NotSupportedError", "Unable to encrypt with "+name))
2324
+ }
2325
+
2326
+ func TnSubtleEncrypt(alg interface{}, key *TnCryptoKey, data interface{}) chan []byte {
2327
+ return tnSubtle(func() []byte { return tnSubtleCrypt(alg, key, tnSubtleBytes(data), false) })
2328
+ }
2329
+
2330
+ func TnSubtleDecrypt(alg interface{}, key *TnCryptoKey, data interface{}) chan []byte {
2331
+ return tnSubtle(func() []byte { return tnSubtleCrypt(alg, key, tnSubtleBytes(data), true) })
2332
+ }
2333
+
2334
+ func tnSubtleDerive(alg interface{}, key *TnCryptoKey, length interface{}) []byte {
2335
+ name := tnSubtleAlg(alg)
2336
+ bitsN, hasLength := tnCryptoNumber(length)
2337
+ var out []byte
2338
+ switch name {
2339
+ case "PBKDF2":
2340
+ iterations, _ := tnCryptoNumber(TnGet(alg, "iterations"))
2341
+ h := tnCryptoHash(tnSubtleHash(TnGet(alg, "hash")))
2342
+ k, err := pbkdf2.Key(h.New, string(key.key.secret), tnSubtleBytes(TnGet(alg, "salt")), int(iterations), int(bitsN)/8)
2343
+ if err != nil {
2344
+ panic(tnDOMError("OperationError", err.Error()))
2345
+ }
2346
+ return k
2347
+ case "HKDF":
2348
+ h := tnCryptoHash(tnSubtleHash(TnGet(alg, "hash")))
2349
+ k, err := hkdf.Key(h.New, key.key.secret, tnSubtleBytes(TnGet(alg, "salt")), string(tnSubtleBytes(TnGet(alg, "info"))), int(bitsN)/8)
2350
+ if err != nil {
2351
+ panic(tnDOMError("OperationError", err.Error()))
2352
+ }
2353
+ return k
2354
+ case "ECDH", "X25519":
2355
+ pub, _ := TnGet(alg, "public").(*TnCryptoKey)
2356
+ if pub == nil {
2357
+ panic(tnDOMError("InvalidAccessError", "algorithm.public must be a public CryptoKey"))
2358
+ }
2359
+ out = tnECDHSecret(key.key.priv, pub.key.pub)
2360
+ default:
2361
+ panic(tnDOMError("NotSupportedError", "Unable to derive bits with "+name))
2362
+ }
2363
+ if hasLength && int(bitsN)/8 < len(out) {
2364
+ out = out[:int(bitsN)/8]
2365
+ }
2366
+ return out
2367
+ }
2368
+
2369
+ func TnSubtleDeriveBits(alg interface{}, key *TnCryptoKey, length ...interface{}) chan []byte {
2370
+ return tnSubtle(func() []byte { return tnSubtleDerive(alg, key, tnCryptoArg(length)) })
2371
+ }
2372
+
2373
+ func TnSubtleDeriveKey(alg interface{}, key *TnCryptoKey, derived interface{}, extractable bool, usages interface{}) chan *TnCryptoKey {
2374
+ return tnSubtle(func() *TnCryptoKey {
2375
+ length, ok := tnCryptoLength(derived)
2376
+ if !ok && strings.ToUpper(tnAlgName(derived)) == "HMAC" {
2377
+ length = tnHMACLength(tnSubtleHash(TnGet(derived, "hash")))
2378
+ ok = true
2379
+ }
2380
+ if !ok {
2381
+ panic(tnDOMError("OperationError", "derivedKeyAlgorithm.length is required"))
2382
+ }
2383
+ raw := tnSubtleDerive(alg, key, length)
2384
+ return tnSubtleImport("raw", raw, derived, extractable, usages)
2385
+ })
2386
+ }
2387
+
2388
+ // wrapKey / unwrapKey: export + encrypt, decrypt + import
2389
+ func TnSubtleWrapKey(format string, key *TnCryptoKey, wrapping *TnCryptoKey, alg interface{}) chan []byte {
2390
+ return tnSubtle(func() []byte {
2391
+ var data []byte
2392
+ if format == "jwk" {
2393
+ data = []byte(TnJSONStringify(tnSubtleExport(format, key), ""))
2394
+ } else {
2395
+ data = tnSubtleExport(format, key).([]byte)
2396
+ }
2397
+ return tnSubtleCrypt(alg, wrapping, data, false)
2398
+ })
2399
+ }
2400
+
2401
+ func TnSubtleUnwrapKey(format string, wrapped interface{}, unwrapping *TnCryptoKey, alg interface{}, keyAlg interface{}, extractable bool, usages interface{}) chan *TnCryptoKey {
2402
+ return tnSubtle(func() *TnCryptoKey {
2403
+ data := tnSubtleCrypt(alg, unwrapping, tnSubtleBytes(wrapped), true)
2404
+ var keyData interface{} = data
2405
+ if format == "jwk" {
2406
+ var parsed interface{}
2407
+ if err := json.Unmarshal(data, &parsed); err != nil {
2408
+ panic(tnDOMError("DataError", "Invalid JWK data"))
2409
+ }
2410
+ keyData = parsed
2411
+ }
2412
+ return tnSubtleImport(format, keyData, keyAlg, extractable, usages)
2413
+ })
2414
+ }`;
2415
+ // Node-style async crypto calls: (…args, cb(err, result))
2416
+ function asyncCall(r, key, goFn, result) {
2417
+ r.functions[key] = (c) => {
2418
+ r.helper('nodeCryptoKeys');
2419
+ const cb = c.args[c.args.length - 1];
2420
+ const args = c.args.slice(0, c.args.length - 1).join(', ');
2421
+ return `tnCryptoAsync(${cb}, func() interface{} { return ${goFn}(${args}) })`;
2422
+ };
2423
+ r.paramTypers[key] = (_n) => ['*TnError', result];
2424
+ }
2425
+ // Which struct generateKeyPair returns: KeyObjects, PEM strings or DER buffers
2426
+ function keyPairKind(options) {
2427
+ if (!isObjectLiteral(options))
2428
+ return 'obj';
2429
+ const enc = getOption(options, 'publicKeyEncoding') ?? getOption(options, 'privateKeyEncoding');
2430
+ if (!enc)
2431
+ return 'obj';
2432
+ const format = getOption(enc, 'format');
2433
+ if (format && isStringNode(format)) {
2434
+ if (format.text === 'pem')
2435
+ return 'pem';
2436
+ if (format.text === 'der')
2437
+ return 'der';
2438
+ }
2439
+ return 'any';
2440
+ }
2441
+ const KEY_PAIRS = {
2442
+ obj: ['TnKeyPairOf', '*TnKeyPair', '*TnKeyObject'],
2443
+ pem: ['TnKeyPairPemOf', '*TnKeyPairPem', 'string'],
2444
+ der: ['TnKeyPairDerOf', '*TnKeyPairDer', '[]byte'],
2445
+ any: ['TnKeyPairAnyOf', '*TnKeyPairAny', 'interface{}']
2446
+ };
2447
+ // The literal algorithm name of a webcrypto argument ('' when not literal)
2448
+ function algorithmName(node) {
2449
+ if (!node)
2450
+ return '';
2451
+ if (isStringNode(node))
2452
+ return String(node.text).toUpperCase();
2453
+ const name = getOption(node, 'name');
2454
+ return name && isStringNode(name) ? String(name.text).toUpperCase() : '';
2455
+ }
2456
+ const SECRET_ALGORITHMS = { HMAC: true, 'AES-GCM': true, 'AES-CBC': true, 'AES-CTR': true };
2457
+ export function registerCryptoKeys(r) {
2458
+ defineHelper(r, 'nodeCryptoKeys', [
2459
+ 'bytes',
2460
+ 'crypto',
2461
+ 'crypto/aes',
2462
+ 'crypto/cipher',
2463
+ 'crypto/ecdh',
2464
+ 'crypto/ecdsa',
2465
+ 'crypto/ed25519',
2466
+ 'crypto/elliptic',
2467
+ 'crypto/hkdf',
2468
+ 'crypto/hmac',
2469
+ 'crypto/pbkdf2',
2470
+ 'crypto/rand',
2471
+ 'crypto/rsa',
2472
+ 'crypto/sha1',
2473
+ 'crypto/sha256',
2474
+ 'crypto/sha512',
2475
+ 'crypto/subtle',
2476
+ 'crypto/x509',
2477
+ 'crypto/x509/pkix',
2478
+ 'encoding/asn1',
2479
+ 'encoding/base64',
2480
+ 'encoding/binary',
2481
+ 'encoding/json',
2482
+ 'encoding/pem',
2483
+ 'fmt',
2484
+ 'math/big',
2485
+ 'math/bits',
2486
+ 'net',
2487
+ 'reflect',
2488
+ 'strings',
2489
+ 'time'
2490
+ ], ['nodeCrypto', 'error', 'buffer', 'dynamic', 'eventLoop', 'promise', 'nodeInvoke', 'jsonStringify'], cryptoKeysHelper);
2491
+ const use = () => r.helper('nodeCryptoKeys');
2492
+ const fn = (name, result, emit) => {
2493
+ r.functions[`crypto.${name}`] = (call) => {
2494
+ use();
2495
+ return emit(call);
2496
+ };
2497
+ if (result)
2498
+ r.results[`crypto.${name}`] = result;
2499
+ };
2500
+ // scrypt and callback forms
2501
+ fn('scryptSync', '[]byte', (c) => `TnScryptSync(${c.args.join(', ')})`);
2502
+ asyncCall(r, 'crypto.scrypt', 'TnScryptSync', '[]byte');
2503
+ asyncCall(r, 'crypto.pbkdf2', 'TnPbkdf2', '[]byte');
2504
+ asyncCall(r, 'crypto.hkdf', 'TnHkdf', '[]byte');
2505
+ asyncCall(r, 'crypto.randomFill', 'TnRandomFillSync', '[]byte');
2506
+ fn('randomFillSync', '[]byte', (c) => `TnRandomFillSync(${c.args.join(', ')})`);
2507
+ // randomBytes(n, cb?)
2508
+ r.functions['crypto.randomBytes'] = (c) => {
2509
+ r.helper('nodeCrypto');
2510
+ if (c.args.length < 2)
2511
+ return `TnRandomBytes(${c.args[0]})`;
2512
+ use();
2513
+ return `tnCryptoAsync(${c.args[1]}, func() interface{} { return TnRandomBytes(${c.args[0]}) })`;
2514
+ };
2515
+ r.typers['crypto.randomBytes'] = (c) => (c.nodes.length < 2 ? '[]byte' : '');
2516
+ r.paramTypers['crypto.randomBytes'] = (_n) => ['*TnError', '[]byte'];
2517
+ // KeyObject
2518
+ defineClass(r, 'crypto.KeyObject', '*TnKeyObject', 'class', 'equals=bool', '', 'type=string; asymmetricKeyType=*string; symmetricKeySize=*float64; asymmetricKeyDetails=*TnKeyDetails', '');
2519
+ defineClass(r, 'crypto.AsymmetricKeyDetails', '*TnKeyDetails', 'class', '', 'modulusLength=float64; publicExponent=*tnbig.Int; namedCurve=string', '', '');
2520
+ r.typers['crypto.KeyObject#export'] = (c) => {
2521
+ const options = c.nodes[0];
2522
+ if (!options)
2523
+ return '[]byte';
2524
+ const format = getOption(options, 'format');
2525
+ if (format && isStringNode(format)) {
2526
+ if (format.text === 'der')
2527
+ return '[]byte';
2528
+ if (format.text === 'jwk')
2529
+ return 'interface{}';
2530
+ return 'string';
2531
+ }
2532
+ return isObjectLiteral(options) ? 'string' : 'interface{}';
2533
+ };
2534
+ r.methods['crypto.KeyObject#export'] = (c) => {
2535
+ const type = r.typers['crypto.KeyObject#export'](c);
2536
+ const call = `${c.recv}.export(${c.args.join(', ')})`;
2537
+ if (type === 'string')
2538
+ return `tnAsString(${call})`;
2539
+ if (type === '[]byte')
2540
+ return `tnAsBytes(${call})`;
2541
+ return call;
2542
+ };
2543
+ fn('createPrivateKey', '*TnKeyObject', (c) => `TnCreatePrivateKey(${c.args[0]})`);
2544
+ fn('createPublicKey', '*TnKeyObject', (c) => `TnCreatePublicKey(${c.args[0]})`);
2545
+ fn('createSecretKey', '*TnKeyObject', (c) => `TnCreateSecretKey(${c.args.join(', ')})`);
2546
+ fn('KeyObject.from', '*TnKeyObject', (c) => `TnKeyObjectFrom(${c.args[0]})`);
2547
+ // generateKeyPair(Sync) / generateKey(Sync)
2548
+ for (const kind of Object.keys(KEY_PAIRS)) {
2549
+ const [, goType, member] = KEY_PAIRS[kind];
2550
+ defineClass(r, `crypto.KeyPair_${kind}`, goType, 'class', '', `publicKey=${member}; privateKey=${member}`, '', '');
2551
+ }
2552
+ r.functions['crypto.generateKeyPairSync'] = (c) => {
2553
+ use();
2554
+ const [ctor] = KEY_PAIRS[keyPairKind(c.nodes[1])];
2555
+ return `${ctor}(TnGenerateKeyPairSync(${c.args.join(', ')}))`;
2556
+ };
2557
+ r.typers['crypto.generateKeyPairSync'] = (c) => KEY_PAIRS[keyPairKind(c.nodes[1])][1];
2558
+ r.functions['crypto.generateKeyPair'] = (c) => {
2559
+ use();
2560
+ const cb = c.args[c.args.length - 1];
2561
+ const options = c.args.length > 2 ? c.args[1] : 'nil';
2562
+ return `TnGenerateKeyPair(${c.args[0]}, ${options}, ${cb})`;
2563
+ };
2564
+ r.paramTypers['crypto.generateKeyPair'] = (nodes) => {
2565
+ const member = KEY_PAIRS[keyPairKind(nodes.length > 2 ? nodes[1] : undefined)][2];
2566
+ return ['*TnError', member, member];
2567
+ };
2568
+ fn('generateKeySync', '*TnKeyObject', (c) => `TnGenerateKeySync(${c.args.join(', ')})`);
2569
+ asyncCall(r, 'crypto.generateKey', 'TnGenerateKeySync', '*TnKeyObject');
2570
+ // sign / verify
2571
+ fn('sign', '[]byte', (c) => `TnSign(${c.args[0]}, ${c.args[1]}, ${c.args[2]})`);
2572
+ fn('verify', 'bool', (c) => `TnVerify(${c.args[0]}, ${c.args[1]}, ${c.args[2]}, ${c.args[3]})`);
2573
+ defineClass(r, 'crypto.Sign', '*TnSigner', 'class', 'update=*TnSigner; verify=bool', '', '', '');
2574
+ r.classes['crypto.Verify'] = r.classes['crypto.Sign'];
2575
+ fn('createSign', '*TnSigner', (c) => `TnCreateSign(${c.args.join(', ')})`);
2576
+ fn('createVerify', '*TnSigner', (c) => `TnCreateSign(${c.args.join(', ')})`);
2577
+ r.methods['crypto.Sign#sign'] = (c) => c.args.length > 1 ? `${c.recv}.signString(${c.args[0]}, ${c.args[1]})` : `${c.recv}.sign(${c.args[0]})`;
2578
+ r.typers['crypto.Sign#sign'] = (c) => (c.nodes.length > 1 ? 'string' : '[]byte');
2579
+ // RSA encryption
2580
+ fn('publicEncrypt', '[]byte', (c) => `TnPublicEncrypt(${c.args[0]}, ${c.args[1]})`);
2581
+ fn('privateDecrypt', '[]byte', (c) => `TnPrivateDecrypt(${c.args[0]}, ${c.args[1]})`);
2582
+ fn('privateEncrypt', '[]byte', (c) => `TnPrivateEncrypt(${c.args[0]}, ${c.args[1]})`);
2583
+ fn('publicDecrypt', '[]byte', (c) => `TnPublicDecrypt(${c.args[0]}, ${c.args[1]})`);
2584
+ const constants = {
2585
+ RSA_PKCS1_PADDING: 1,
2586
+ RSA_NO_PADDING: 3,
2587
+ RSA_PKCS1_OAEP_PADDING: 4,
2588
+ RSA_PKCS1_PSS_PADDING: 6,
2589
+ RSA_PSS_SALTLEN_DIGEST: -1,
2590
+ RSA_PSS_SALTLEN_MAX_SIGN: -2,
2591
+ RSA_PSS_SALTLEN_AUTO: -2
2592
+ };
2593
+ r.objects['crypto.constants'] = true;
2594
+ for (const name of Object.keys(constants)) {
2595
+ const value = constants[name];
2596
+ r.values[`crypto.constants.${name}`] = (_c) => `float64(${value})`;
2597
+ r.valueTypes[`crypto.constants.${name}`] = 'float64';
2598
+ }
2599
+ // ECDH / Diffie-Hellman
2600
+ // Methods with an optional output encoding return strings when it is given
2601
+ const encoded = (cls, method, encIndex) => {
2602
+ r.methods[`${cls}#${method}`] = (c) => {
2603
+ const call = `${c.recv}.${method}(${c.args.join(', ')})`;
2604
+ return c.args.length > encIndex ? `tnAsString(${call})` : `tnAsBytes(${call})`;
2605
+ };
2606
+ r.typers[`${cls}#${method}`] = (c) => (c.nodes.length > encIndex ? 'string' : '[]byte');
2607
+ };
2608
+ defineClass(r, 'crypto.ECDH', '*TnECDH', 'class', 'setPrivateKey=', '', '', '');
2609
+ for (const m of ['generateKeys', 'getPublicKey', 'getPrivateKey'])
2610
+ encoded('crypto.ECDH', m, 0);
2611
+ encoded('crypto.ECDH', 'computeSecret', 2);
2612
+ fn('createECDH', '*TnECDH', (c) => `TnCreateECDH(${c.args[0]})`);
2613
+ fn('getCurves', '[]string', (_c) => 'TnGetCurves()');
2614
+ fn('diffieHellman', '[]byte', (c) => `TnDiffieHellman(${c.args[0]})`);
2615
+ defineClass(r, 'crypto.DiffieHellman', '*TnDiffieHellmanGroup', 'class', 'setPublicKey=; setPrivateKey=', '', 'verifyError=float64', '');
2616
+ r.classes['crypto.DiffieHellmanGroup'] = r.classes['crypto.DiffieHellman'];
2617
+ for (const m of ['generateKeys', 'getPrime', 'getGenerator', 'getPublicKey', 'getPrivateKey'])
2618
+ encoded('crypto.DiffieHellman', m, 0);
2619
+ encoded('crypto.DiffieHellman', 'computeSecret', 2);
2620
+ fn('createDiffieHellman', '*TnDiffieHellmanGroup', (c) => `TnCreateDiffieHellman(${c.args.join(', ')})`);
2621
+ fn('getDiffieHellman', '*TnDiffieHellmanGroup', (c) => `TnGetDiffieHellman(${c.args[0]})`);
2622
+ fn('createDiffieHellmanGroup', '*TnDiffieHellmanGroup', (c) => `TnGetDiffieHellman(${c.args[0]})`);
2623
+ // Primes: ArrayBuffers, or bigints with { bigint: true }
2624
+ const primeIsBig = (options) => !!options && optionIsTrue(options, 'bigint');
2625
+ r.functions['crypto.generatePrimeSync'] = (c) => {
2626
+ use();
2627
+ return primeIsBig(c.nodes[1]) ? `TnGeneratePrimeBig(${c.args.join(', ')})` : `TnGeneratePrimeBytes(${c.args.join(', ')})`;
2628
+ };
2629
+ r.typers['crypto.generatePrimeSync'] = (c) => (primeIsBig(c.nodes[1]) ? '*tnbig.Int' : '[]byte');
2630
+ r.functions['crypto.generatePrime'] = (c) => {
2631
+ use();
2632
+ const cb = c.args[c.args.length - 1];
2633
+ const args = c.args.slice(0, c.args.length - 1).join(', ');
2634
+ const goFn = c.nodes.length > 2 && primeIsBig(c.nodes[1]) ? 'TnGeneratePrimeBig' : 'TnGeneratePrimeBytes';
2635
+ return `tnCryptoAsync(${cb}, func() interface{} { return ${goFn}(${args}) })`;
2636
+ };
2637
+ r.paramTypers['crypto.generatePrime'] = (nodes) => ['*TnError', nodes.length > 2 && primeIsBig(nodes[1]) ? '*tnbig.Int' : '[]byte'];
2638
+ fn('checkPrimeSync', 'bool', (c) => `TnCheckPrimeSync(${c.args.join(', ')})`);
2639
+ asyncCall(r, 'crypto.checkPrime', 'TnCheckPrimeSync', 'bool');
2640
+ // X509Certificate
2641
+ defineClass(r, 'crypto.X509Certificate', '*TnX509Certificate', 'class', 'checkHost=*string; checkIP=*string; checkEmail=*string; checkIssued=bool; verify=bool; toString=string; toJSON=string; toLegacyObject=map[string]interface{}', '', 'subject=string; issuer=string; subjectAltName=*string; validFrom=string; validTo=string; validFromDate=time.Time; validToDate=time.Time; fingerprint=string; fingerprint256=string; fingerprint512=string; serialNumber=string; ca=bool; raw=[]byte; publicKey=*TnKeyObject; keyUsage=[]string', '');
2642
+ r.constructors['crypto.X509Certificate'] = (c) => {
2643
+ use();
2644
+ return `TnNewX509Certificate(${c.args[0]})`;
2645
+ };
2646
+ // webcrypto: crypto.subtle (also crypto.webcrypto.subtle and the global crypto)
2647
+ defineClass(r, 'crypto.CryptoKey', '*TnCryptoKey', 'class', '', '', 'type=string; extractable=bool; algorithm=*TnKeyAlgorithm; usages=[]string', '');
2648
+ defineClass(r, 'crypto.KeyAlgorithm', '*TnKeyAlgorithm', 'class', '', 'name=string; length=float64; hash=*TnKeyAlgorithm; namedCurve=string; modulusLength=float64; publicExponent=[]byte', '', '');
2649
+ r.globals['CryptoKey'] = 'crypto.CryptoKey';
2650
+ defineClass(r, 'crypto.CryptoKeyPair', '*TnCryptoKeyPair', 'class', '', 'publicKey=*TnCryptoKey; privateKey=*TnCryptoKey', '', '');
2651
+ r.objects['crypto.subtle'] = true;
2652
+ const subtle = (name, result, emit) => {
2653
+ r.functions[`crypto.subtle.${name}`] = (c) => {
2654
+ use();
2655
+ return emit(c);
2656
+ };
2657
+ if (result)
2658
+ r.results[`crypto.subtle.${name}`] = result;
2659
+ };
2660
+ subtle('digest', 'chan []byte', (c) => `TnSubtleDigest(${c.args.join(', ')})`);
2661
+ subtle('generateKey', '', (c) => {
2662
+ const name = algorithmName(c.nodes[0]);
2663
+ if (!name)
2664
+ return `TnSubtleGenerateAny(${c.args.join(', ')})`;
2665
+ return SECRET_ALGORITHMS[name] ? `TnSubtleGenerateKey(${c.args.join(', ')})` : `TnSubtleGenerateKeyPair(${c.args.join(', ')})`;
2666
+ });
2667
+ r.typers['crypto.subtle.generateKey'] = (c) => {
2668
+ const name = algorithmName(c.nodes[0]);
2669
+ if (!name)
2670
+ return 'chan interface{}';
2671
+ return SECRET_ALGORITHMS[name] ? 'chan *TnCryptoKey' : 'chan *TnCryptoKeyPair';
2672
+ };
2673
+ subtle('importKey', 'chan *TnCryptoKey', (c) => `TnSubtleImportKey(${c.args.join(', ')})`);
2674
+ const formatIsJwk = (node) => !(node && isStringNode(node) && node.text !== 'jwk');
2675
+ subtle('exportKey', '', (c) => formatIsJwk(c.nodes[0]) ? `TnSubtleExportAny(${c.args.join(', ')})` : `TnSubtleExportKey(${c.args.join(', ')})`);
2676
+ r.typers['crypto.subtle.exportKey'] = (c) => (formatIsJwk(c.nodes[0]) ? 'chan interface{}' : 'chan []byte');
2677
+ subtle('sign', 'chan []byte', (c) => `TnSubtleSign(${c.args.join(', ')})`);
2678
+ subtle('verify', 'chan bool', (c) => `TnSubtleVerify(${c.args.join(', ')})`);
2679
+ subtle('encrypt', 'chan []byte', (c) => `TnSubtleEncrypt(${c.args.join(', ')})`);
2680
+ subtle('decrypt', 'chan []byte', (c) => `TnSubtleDecrypt(${c.args.join(', ')})`);
2681
+ subtle('deriveBits', 'chan []byte', (c) => `TnSubtleDeriveBits(${c.args.join(', ')})`);
2682
+ subtle('deriveKey', 'chan *TnCryptoKey', (c) => `TnSubtleDeriveKey(${c.args.join(', ')})`);
2683
+ subtle('wrapKey', 'chan []byte', (c) => `TnSubtleWrapKey(${c.args.join(', ')})`);
2684
+ subtle('unwrapKey', 'chan *TnCryptoKey', (c) => `TnSubtleUnwrapKey(${c.args.join(', ')})`);
2685
+ }