visaljs 0.0.0-stage → 0.0.2

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 (520) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -2
  3. package/cli.js +8084 -0
  4. package/node/include/js_node.h +46 -0
  5. package/node/prelude/async_hooks.js +88 -0
  6. package/node/prelude/buffer.js +31 -0
  7. package/node/prelude/crypto.js +114 -0
  8. package/node/prelude/events.js +227 -0
  9. package/node/prelude/fs.js +79 -0
  10. package/node/prelude/http.js +536 -0
  11. package/node/prelude/http2.js +30 -0
  12. package/node/prelude/internal/crypto/asym.js +333 -0
  13. package/node/prelude/internal/crypto/cipher.js +205 -0
  14. package/node/prelude/internal/crypto/hash.js +137 -0
  15. package/node/prelude/internal/crypto/kdf.js +182 -0
  16. package/node/prelude/internal/crypto/keys.js +603 -0
  17. package/node/prelude/internal/crypto/random.js +118 -0
  18. package/node/prelude/internal/crypto/util.js +76 -0
  19. package/node/prelude/internal/errors.js +88 -0
  20. package/node/prelude/internal/querystring.js +105 -0
  21. package/node/prelude/module.js +53 -0
  22. package/node/prelude/net.js +51 -0
  23. package/node/prelude/os.js +129 -0
  24. package/node/prelude/path.js +257 -0
  25. package/node/prelude/process.js +21 -0
  26. package/node/prelude/querystring.js +469 -0
  27. package/node/prelude/stream.js +1327 -0
  28. package/node/prelude/stream_promises.js +7 -0
  29. package/node/prelude/stream_web.js +6 -0
  30. package/node/prelude/string_decoder.js +236 -0
  31. package/node/prelude/tty.js +18 -0
  32. package/node/prelude/url.js +1156 -0
  33. package/node/prelude/util.js +64 -0
  34. package/node/prelude/zlib.js +81 -0
  35. package/node/src/host_fs.c +126 -0
  36. package/node/src/host_http.c +486 -0
  37. package/node/src/host_os.c +505 -0
  38. package/node/src/host_sys.c +78 -0
  39. package/node/third_party/libuv/LICENSE +19 -0
  40. package/node/third_party/libuv/include/uv/aix.h +32 -0
  41. package/node/third_party/libuv/include/uv/bsd.h +34 -0
  42. package/node/third_party/libuv/include/uv/darwin.h +61 -0
  43. package/node/third_party/libuv/include/uv/errno.h +483 -0
  44. package/node/third_party/libuv/include/uv/linux.h +34 -0
  45. package/node/third_party/libuv/include/uv/os390.h +33 -0
  46. package/node/third_party/libuv/include/uv/posix.h +31 -0
  47. package/node/third_party/libuv/include/uv/sunos.h +44 -0
  48. package/node/third_party/libuv/include/uv/threadpool.h +37 -0
  49. package/node/third_party/libuv/include/uv/tree.h +521 -0
  50. package/node/third_party/libuv/include/uv/unix.h +512 -0
  51. package/node/third_party/libuv/include/uv/version.h +43 -0
  52. package/node/third_party/libuv/include/uv/win.h +698 -0
  53. package/node/third_party/libuv/include/uv.h +1990 -0
  54. package/node/third_party/libuv/src/fs-poll.c +290 -0
  55. package/node/third_party/libuv/src/heap-inl.h +245 -0
  56. package/node/third_party/libuv/src/idna.c +560 -0
  57. package/node/third_party/libuv/src/idna.h +31 -0
  58. package/node/third_party/libuv/src/inet.c +298 -0
  59. package/node/third_party/libuv/src/queue.h +90 -0
  60. package/node/third_party/libuv/src/random.c +123 -0
  61. package/node/third_party/libuv/src/strscpy.c +38 -0
  62. package/node/third_party/libuv/src/strscpy.h +39 -0
  63. package/node/third_party/libuv/src/strtok.c +52 -0
  64. package/node/third_party/libuv/src/strtok.h +27 -0
  65. package/node/third_party/libuv/src/thread-common.c +175 -0
  66. package/node/third_party/libuv/src/threadpool.c +419 -0
  67. package/node/third_party/libuv/src/timer.c +200 -0
  68. package/node/third_party/libuv/src/unix/async.c +418 -0
  69. package/node/third_party/libuv/src/unix/bsd-ifaddrs.c +164 -0
  70. package/node/third_party/libuv/src/unix/core.c +2104 -0
  71. package/node/third_party/libuv/src/unix/darwin-proctitle.c +176 -0
  72. package/node/third_party/libuv/src/unix/darwin-stub.h +97 -0
  73. package/node/third_party/libuv/src/unix/darwin-syscalls.h +17 -0
  74. package/node/third_party/libuv/src/unix/darwin.c +237 -0
  75. package/node/third_party/libuv/src/unix/dl.c +80 -0
  76. package/node/third_party/libuv/src/unix/fs.c +2303 -0
  77. package/node/third_party/libuv/src/unix/fsevents.c +906 -0
  78. package/node/third_party/libuv/src/unix/getaddrinfo.c +252 -0
  79. package/node/third_party/libuv/src/unix/getnameinfo.c +121 -0
  80. package/node/third_party/libuv/src/unix/internal.h +530 -0
  81. package/node/third_party/libuv/src/unix/kqueue.c +667 -0
  82. package/node/third_party/libuv/src/unix/linux.c +2761 -0
  83. package/node/third_party/libuv/src/unix/loop-watcher.c +68 -0
  84. package/node/third_party/libuv/src/unix/loop.c +240 -0
  85. package/node/third_party/libuv/src/unix/pipe.c +555 -0
  86. package/node/third_party/libuv/src/unix/poll.c +159 -0
  87. package/node/third_party/libuv/src/unix/process.c +1123 -0
  88. package/node/third_party/libuv/src/unix/procfs-exepath.c +45 -0
  89. package/node/third_party/libuv/src/unix/proctitle.c +157 -0
  90. package/node/third_party/libuv/src/unix/random-devurandom.c +93 -0
  91. package/node/third_party/libuv/src/unix/random-getentropy.c +57 -0
  92. package/node/third_party/libuv/src/unix/random-getrandom.c +86 -0
  93. package/node/third_party/libuv/src/unix/random-sysctl-linux.c +99 -0
  94. package/node/third_party/libuv/src/unix/signal.c +581 -0
  95. package/node/third_party/libuv/src/unix/stream.c +1567 -0
  96. package/node/third_party/libuv/src/unix/tcp.c +673 -0
  97. package/node/third_party/libuv/src/unix/thread.c +975 -0
  98. package/node/third_party/libuv/src/unix/tty.c +510 -0
  99. package/node/third_party/libuv/src/unix/udp.c +1434 -0
  100. package/node/third_party/libuv/src/uv-common.c +1051 -0
  101. package/node/third_party/libuv/src/uv-common.h +474 -0
  102. package/node/third_party/libuv/src/uv-data-getter-setters.c +119 -0
  103. package/node/third_party/libuv/src/version.c +45 -0
  104. package/node/third_party/llhttp/LICENSE +22 -0
  105. package/node/third_party/llhttp/api.c +509 -0
  106. package/node/third_party/llhttp/http.c +170 -0
  107. package/node/third_party/llhttp/llhttp.c +10099 -0
  108. package/node/third_party/llhttp/llhttp.h +907 -0
  109. package/package.json +25 -4
  110. package/runtime/include/js_atoms.gen.h +68 -0
  111. package/runtime/include/js_atoms.h +54 -0
  112. package/runtime/include/js_bigint.h +93 -0
  113. package/runtime/include/js_buffer.h +79 -0
  114. package/runtime/include/js_builtins.h +168 -0
  115. package/runtime/include/js_console.h +58 -0
  116. package/runtime/include/js_convert.h +22 -0
  117. package/runtime/include/js_core.def +188 -0
  118. package/runtime/include/js_crypto.h +58 -0
  119. package/runtime/include/js_error.h +37 -0
  120. package/runtime/include/js_exception.h +65 -0
  121. package/runtime/include/js_function.h +167 -0
  122. package/runtime/include/js_gc.h +195 -0
  123. package/runtime/include/js_generator.h +96 -0
  124. package/runtime/include/js_host.h +19 -0
  125. package/runtime/include/js_jobs.h +84 -0
  126. package/runtime/include/js_module.h +16 -0
  127. package/runtime/include/js_object.h +384 -0
  128. package/runtime/include/js_ops.h +111 -0
  129. package/runtime/include/js_promise.h +45 -0
  130. package/runtime/include/js_regexp.h +25 -0
  131. package/runtime/include/js_runtime.h +30 -0
  132. package/runtime/include/js_symbol.h +62 -0
  133. package/runtime/include/js_web.h +110 -0
  134. package/runtime/include/jscell.h +48 -0
  135. package/runtime/include/jscontext.h +240 -0
  136. package/runtime/include/jsnum.h +42 -0
  137. package/runtime/include/jsstring.h +161 -0
  138. package/runtime/include/jsvalue.h +142 -0
  139. package/runtime/src/arguments.c +115 -0
  140. package/runtime/src/array.c +1145 -0
  141. package/runtime/src/arraybuffer.c +608 -0
  142. package/runtime/src/async_iter.c +479 -0
  143. package/runtime/src/atoms.c +157 -0
  144. package/runtime/src/base64.c +107 -0
  145. package/runtime/src/bigint.c +1189 -0
  146. package/runtime/src/blob.c +371 -0
  147. package/runtime/src/buffer.c +1357 -0
  148. package/runtime/src/builtin_table.c +100 -0
  149. package/runtime/src/builtins.c +987 -0
  150. package/runtime/src/builtins_util.h +53 -0
  151. package/runtime/src/collections.c +912 -0
  152. package/runtime/src/components.c +28 -0
  153. package/runtime/src/console.c +637 -0
  154. package/runtime/src/convert.c +82 -0
  155. package/runtime/src/core_all.c +21 -0
  156. package/runtime/src/crypto.c +116 -0
  157. package/runtime/src/crypto_asym.c +644 -0
  158. package/runtime/src/crypto_cipher.c +671 -0
  159. package/runtime/src/crypto_hash.c +260 -0
  160. package/runtime/src/crypto_host.c +414 -0
  161. package/runtime/src/crypto_internal.h +304 -0
  162. package/runtime/src/crypto_kdf.c +143 -0
  163. package/runtime/src/crypto_key.c +171 -0
  164. package/runtime/src/crypto_pkey.c +794 -0
  165. package/runtime/src/crypto_subtle.c +1675 -0
  166. package/runtime/src/date.c +940 -0
  167. package/runtime/src/domexception.c +169 -0
  168. package/runtime/src/elements.c +312 -0
  169. package/runtime/src/elements.h +45 -0
  170. package/runtime/src/encoding.c +485 -0
  171. package/runtime/src/error.c +297 -0
  172. package/runtime/src/events.c +793 -0
  173. package/runtime/src/exception.c +56 -0
  174. package/runtime/src/fetch.c +772 -0
  175. package/runtime/src/function.c +530 -0
  176. package/runtime/src/gc.c +803 -0
  177. package/runtime/src/generator.c +218 -0
  178. package/runtime/src/global.c +119 -0
  179. package/runtime/src/headers.c +557 -0
  180. package/runtime/src/inspect.c +1792 -0
  181. package/runtime/src/internal.h +80 -0
  182. package/runtime/src/iterate.c +94 -0
  183. package/runtime/src/iterator.c +409 -0
  184. package/runtime/src/jobs.c +337 -0
  185. package/runtime/src/jsnum.c +353 -0
  186. package/runtime/src/json.c +1028 -0
  187. package/runtime/src/math.c +243 -0
  188. package/runtime/src/module.c +336 -0
  189. package/runtime/src/number.c +176 -0
  190. package/runtime/src/object.c +1265 -0
  191. package/runtime/src/ops.c +322 -0
  192. package/runtime/src/os.c +196 -0
  193. package/runtime/src/os.h +29 -0
  194. package/runtime/src/process.c +432 -0
  195. package/runtime/src/promise.c +721 -0
  196. package/runtime/src/proxy.c +570 -0
  197. package/runtime/src/reflect.c +194 -0
  198. package/runtime/src/regexp.c +1141 -0
  199. package/runtime/src/regexp_anchor.h +34 -0
  200. package/runtime/src/regexp_message.h +32 -0
  201. package/runtime/src/shape.c +294 -0
  202. package/runtime/src/shape.h +46 -0
  203. package/runtime/src/streams.c +1046 -0
  204. package/runtime/src/streams.h +47 -0
  205. package/runtime/src/string.c +364 -0
  206. package/runtime/src/string_builtins.c +837 -0
  207. package/runtime/src/symbol.c +143 -0
  208. package/runtime/src/test_host.c +59 -0
  209. package/runtime/src/typedarray.c +1330 -0
  210. package/runtime/src/tznames.gen.h +712 -0
  211. package/runtime/src/uri.c +169 -0
  212. package/runtime/src/url.c +2116 -0
  213. package/runtime/src/weak.c +486 -0
  214. package/runtime/src/web.c +214 -0
  215. package/runtime/src/wrapper.c +59 -0
  216. package/runtime/src/writable.c +1486 -0
  217. package/runtime/third_party/ada-idna/LICENSE-MIT +18 -0
  218. package/runtime/third_party/ada-idna/README.md +27 -0
  219. package/runtime/third_party/ada-idna/convert.mjs +83 -0
  220. package/runtime/third_party/ada-idna/idna.c +416 -0
  221. package/runtime/third_party/ada-idna/idna.h +15 -0
  222. package/runtime/third_party/ada-idna/idna_tables.h +2657 -0
  223. package/runtime/third_party/bearssl/LICENSE.txt +21 -0
  224. package/runtime/third_party/bearssl/README.txt +136 -0
  225. package/runtime/third_party/bearssl/VERSION +1 -0
  226. package/runtime/third_party/bearssl/inc/bearssl.h +183 -0
  227. package/runtime/third_party/bearssl/inc/bearssl_aead.h +1059 -0
  228. package/runtime/third_party/bearssl/inc/bearssl_block.h +2618 -0
  229. package/runtime/third_party/bearssl/inc/bearssl_ec.h +967 -0
  230. package/runtime/third_party/bearssl/inc/bearssl_hash.h +1346 -0
  231. package/runtime/third_party/bearssl/inc/bearssl_hmac.h +241 -0
  232. package/runtime/third_party/bearssl/inc/bearssl_kdf.h +284 -0
  233. package/runtime/third_party/bearssl/inc/bearssl_pem.h +294 -0
  234. package/runtime/third_party/bearssl/inc/bearssl_prf.h +150 -0
  235. package/runtime/third_party/bearssl/inc/bearssl_rand.h +397 -0
  236. package/runtime/third_party/bearssl/inc/bearssl_rsa.h +1655 -0
  237. package/runtime/third_party/bearssl/inc/bearssl_ssl.h +4296 -0
  238. package/runtime/third_party/bearssl/inc/bearssl_x509.h +1474 -0
  239. package/runtime/third_party/bearssl/src/aead/ccm.c +346 -0
  240. package/runtime/third_party/bearssl/src/aead/eax.c +525 -0
  241. package/runtime/third_party/bearssl/src/aead/gcm.c +318 -0
  242. package/runtime/third_party/bearssl/src/codec/ccopy.c +44 -0
  243. package/runtime/third_party/bearssl/src/codec/dec16be.c +38 -0
  244. package/runtime/third_party/bearssl/src/codec/dec16le.c +38 -0
  245. package/runtime/third_party/bearssl/src/codec/dec32be.c +38 -0
  246. package/runtime/third_party/bearssl/src/codec/dec32le.c +38 -0
  247. package/runtime/third_party/bearssl/src/codec/dec64be.c +38 -0
  248. package/runtime/third_party/bearssl/src/codec/dec64le.c +38 -0
  249. package/runtime/third_party/bearssl/src/codec/enc16be.c +38 -0
  250. package/runtime/third_party/bearssl/src/codec/enc16le.c +38 -0
  251. package/runtime/third_party/bearssl/src/codec/enc32be.c +38 -0
  252. package/runtime/third_party/bearssl/src/codec/enc32le.c +38 -0
  253. package/runtime/third_party/bearssl/src/codec/enc64be.c +38 -0
  254. package/runtime/third_party/bearssl/src/codec/enc64le.c +38 -0
  255. package/runtime/third_party/bearssl/src/codec/pemdec.c +526 -0
  256. package/runtime/third_party/bearssl/src/codec/pemdec.t0 +314 -0
  257. package/runtime/third_party/bearssl/src/codec/pemenc.c +173 -0
  258. package/runtime/third_party/bearssl/src/config.h +247 -0
  259. package/runtime/third_party/bearssl/src/ec/ec_all_m15.c +121 -0
  260. package/runtime/third_party/bearssl/src/ec/ec_all_m31.c +171 -0
  261. package/runtime/third_party/bearssl/src/ec/ec_c25519_i15.c +398 -0
  262. package/runtime/third_party/bearssl/src/ec/ec_c25519_i31.c +390 -0
  263. package/runtime/third_party/bearssl/src/ec/ec_c25519_m15.c +1478 -0
  264. package/runtime/third_party/bearssl/src/ec/ec_c25519_m31.c +800 -0
  265. package/runtime/third_party/bearssl/src/ec/ec_c25519_m62.c +605 -0
  266. package/runtime/third_party/bearssl/src/ec/ec_c25519_m64.c +831 -0
  267. package/runtime/third_party/bearssl/src/ec/ec_curve25519.c +46 -0
  268. package/runtime/third_party/bearssl/src/ec/ec_default.c +36 -0
  269. package/runtime/third_party/bearssl/src/ec/ec_keygen.c +86 -0
  270. package/runtime/third_party/bearssl/src/ec/ec_p256_m15.c +2124 -0
  271. package/runtime/third_party/bearssl/src/ec/ec_p256_m31.c +1469 -0
  272. package/runtime/third_party/bearssl/src/ec/ec_p256_m62.c +1765 -0
  273. package/runtime/third_party/bearssl/src/ec/ec_p256_m64.c +1781 -0
  274. package/runtime/third_party/bearssl/src/ec/ec_prime_i15.c +824 -0
  275. package/runtime/third_party/bearssl/src/ec/ec_prime_i31.c +826 -0
  276. package/runtime/third_party/bearssl/src/ec/ec_pubkey.c +85 -0
  277. package/runtime/third_party/bearssl/src/ec/ec_secp256r1.c +51 -0
  278. package/runtime/third_party/bearssl/src/ec/ec_secp384r1.c +57 -0
  279. package/runtime/third_party/bearssl/src/ec/ec_secp521r1.c +64 -0
  280. package/runtime/third_party/bearssl/src/ec/ecdsa_atr.c +134 -0
  281. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_asn1.c +36 -0
  282. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_raw.c +36 -0
  283. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_asn1.c +36 -0
  284. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_raw.c +36 -0
  285. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_bits.c +47 -0
  286. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_asn1.c +45 -0
  287. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_raw.c +174 -0
  288. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_asn1.c +48 -0
  289. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_raw.c +166 -0
  290. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_bits.c +47 -0
  291. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_asn1.c +45 -0
  292. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_raw.c +173 -0
  293. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_asn1.c +48 -0
  294. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_raw.c +165 -0
  295. package/runtime/third_party/bearssl/src/ec/ecdsa_rta.c +121 -0
  296. package/runtime/third_party/bearssl/src/hash/dig_oid.c +84 -0
  297. package/runtime/third_party/bearssl/src/hash/dig_size.c +50 -0
  298. package/runtime/third_party/bearssl/src/hash/ghash_ctmul.c +345 -0
  299. package/runtime/third_party/bearssl/src/hash/ghash_ctmul32.c +251 -0
  300. package/runtime/third_party/bearssl/src/hash/ghash_ctmul64.c +154 -0
  301. package/runtime/third_party/bearssl/src/hash/ghash_pclmul.c +389 -0
  302. package/runtime/third_party/bearssl/src/hash/ghash_pwr8.c +411 -0
  303. package/runtime/third_party/bearssl/src/hash/md5.c +208 -0
  304. package/runtime/third_party/bearssl/src/hash/md5sha1.c +141 -0
  305. package/runtime/third_party/bearssl/src/hash/mgf1.c +56 -0
  306. package/runtime/third_party/bearssl/src/hash/multihash.c +166 -0
  307. package/runtime/third_party/bearssl/src/hash/sha1.c +191 -0
  308. package/runtime/third_party/bearssl/src/hash/sha2big.c +285 -0
  309. package/runtime/third_party/bearssl/src/hash/sha2small.c +341 -0
  310. package/runtime/third_party/bearssl/src/inner.h +2577 -0
  311. package/runtime/third_party/bearssl/src/int/i15_add.c +46 -0
  312. package/runtime/third_party/bearssl/src/int/i15_bitlen.c +44 -0
  313. package/runtime/third_party/bearssl/src/int/i15_decmod.c +124 -0
  314. package/runtime/third_party/bearssl/src/int/i15_decode.c +56 -0
  315. package/runtime/third_party/bearssl/src/int/i15_decred.c +100 -0
  316. package/runtime/third_party/bearssl/src/int/i15_encode.c +56 -0
  317. package/runtime/third_party/bearssl/src/int/i15_fmont.c +59 -0
  318. package/runtime/third_party/bearssl/src/int/i15_iszero.c +39 -0
  319. package/runtime/third_party/bearssl/src/int/i15_moddiv.c +465 -0
  320. package/runtime/third_party/bearssl/src/int/i15_modpow.c +50 -0
  321. package/runtime/third_party/bearssl/src/int/i15_modpow2.c +160 -0
  322. package/runtime/third_party/bearssl/src/int/i15_montmul.c +184 -0
  323. package/runtime/third_party/bearssl/src/int/i15_mulacc.c +61 -0
  324. package/runtime/third_party/bearssl/src/int/i15_muladd.c +173 -0
  325. package/runtime/third_party/bearssl/src/int/i15_ninv15.c +38 -0
  326. package/runtime/third_party/bearssl/src/int/i15_reduce.c +66 -0
  327. package/runtime/third_party/bearssl/src/int/i15_rshift.c +47 -0
  328. package/runtime/third_party/bearssl/src/int/i15_sub.c +46 -0
  329. package/runtime/third_party/bearssl/src/int/i15_tmont.c +36 -0
  330. package/runtime/third_party/bearssl/src/int/i31_add.c +46 -0
  331. package/runtime/third_party/bearssl/src/int/i31_bitlen.c +44 -0
  332. package/runtime/third_party/bearssl/src/int/i31_decmod.c +124 -0
  333. package/runtime/third_party/bearssl/src/int/i31_decode.c +57 -0
  334. package/runtime/third_party/bearssl/src/int/i31_decred.c +103 -0
  335. package/runtime/third_party/bearssl/src/int/i31_encode.c +79 -0
  336. package/runtime/third_party/bearssl/src/int/i31_fmont.c +60 -0
  337. package/runtime/third_party/bearssl/src/int/i31_iszero.c +39 -0
  338. package/runtime/third_party/bearssl/src/int/i31_moddiv.c +488 -0
  339. package/runtime/third_party/bearssl/src/int/i31_modpow.c +65 -0
  340. package/runtime/third_party/bearssl/src/int/i31_modpow2.c +160 -0
  341. package/runtime/third_party/bearssl/src/int/i31_montmul.c +127 -0
  342. package/runtime/third_party/bearssl/src/int/i31_mulacc.c +74 -0
  343. package/runtime/third_party/bearssl/src/int/i31_muladd.c +157 -0
  344. package/runtime/third_party/bearssl/src/int/i31_ninv31.c +39 -0
  345. package/runtime/third_party/bearssl/src/int/i31_reduce.c +66 -0
  346. package/runtime/third_party/bearssl/src/int/i31_rshift.c +47 -0
  347. package/runtime/third_party/bearssl/src/int/i31_sub.c +46 -0
  348. package/runtime/third_party/bearssl/src/int/i31_tmont.c +36 -0
  349. package/runtime/third_party/bearssl/src/int/i32_add.c +51 -0
  350. package/runtime/third_party/bearssl/src/int/i32_bitlen.c +44 -0
  351. package/runtime/third_party/bearssl/src/int/i32_decmod.c +77 -0
  352. package/runtime/third_party/bearssl/src/int/i32_decode.c +63 -0
  353. package/runtime/third_party/bearssl/src/int/i32_decred.c +107 -0
  354. package/runtime/third_party/bearssl/src/int/i32_div32.c +56 -0
  355. package/runtime/third_party/bearssl/src/int/i32_encode.c +72 -0
  356. package/runtime/third_party/bearssl/src/int/i32_fmont.c +60 -0
  357. package/runtime/third_party/bearssl/src/int/i32_iszero.c +39 -0
  358. package/runtime/third_party/bearssl/src/int/i32_modpow.c +65 -0
  359. package/runtime/third_party/bearssl/src/int/i32_montmul.c +69 -0
  360. package/runtime/third_party/bearssl/src/int/i32_mulacc.c +56 -0
  361. package/runtime/third_party/bearssl/src/int/i32_muladd.c +138 -0
  362. package/runtime/third_party/bearssl/src/int/i32_ninv32.c +39 -0
  363. package/runtime/third_party/bearssl/src/int/i32_reduce.c +66 -0
  364. package/runtime/third_party/bearssl/src/int/i32_sub.c +51 -0
  365. package/runtime/third_party/bearssl/src/int/i32_tmont.c +36 -0
  366. package/runtime/third_party/bearssl/src/int/i62_modpow2.c +493 -0
  367. package/runtime/third_party/bearssl/src/kdf/hkdf.c +107 -0
  368. package/runtime/third_party/bearssl/src/kdf/shake.c +590 -0
  369. package/runtime/third_party/bearssl/src/mac/hmac.c +122 -0
  370. package/runtime/third_party/bearssl/src/mac/hmac_ct.c +193 -0
  371. package/runtime/third_party/bearssl/src/rand/aesctr_drbg.c +206 -0
  372. package/runtime/third_party/bearssl/src/rand/hmac_drbg.c +157 -0
  373. package/runtime/third_party/bearssl/src/rand/sysrng.c +252 -0
  374. package/runtime/third_party/bearssl/src/rsa/rsa_default_keygen.c +38 -0
  375. package/runtime/third_party/bearssl/src/rsa/rsa_default_modulus.c +36 -0
  376. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_decrypt.c +38 -0
  377. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_encrypt.c +38 -0
  378. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_sign.c +38 -0
  379. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_vrfy.c +38 -0
  380. package/runtime/third_party/bearssl/src/rsa/rsa_default_priv.c +38 -0
  381. package/runtime/third_party/bearssl/src/rsa/rsa_default_privexp.c +36 -0
  382. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_sign.c +38 -0
  383. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_vrfy.c +38 -0
  384. package/runtime/third_party/bearssl/src/rsa/rsa_default_pub.c +38 -0
  385. package/runtime/third_party/bearssl/src/rsa/rsa_default_pubexp.c +36 -0
  386. package/runtime/third_party/bearssl/src/rsa/rsa_i15_keygen.c +583 -0
  387. package/runtime/third_party/bearssl/src/rsa/rsa_i15_modulus.c +99 -0
  388. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_decrypt.c +41 -0
  389. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_encrypt.c +44 -0
  390. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_sign.c +37 -0
  391. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_vrfy.c +43 -0
  392. package/runtime/third_party/bearssl/src/rsa/rsa_i15_priv.c +209 -0
  393. package/runtime/third_party/bearssl/src/rsa/rsa_i15_privexp.c +320 -0
  394. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_sign.c +40 -0
  395. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_vrfy.c +44 -0
  396. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pub.c +113 -0
  397. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pubexp.c +152 -0
  398. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen.c +37 -0
  399. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen_inner.c +608 -0
  400. package/runtime/third_party/bearssl/src/rsa/rsa_i31_modulus.c +99 -0
  401. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_decrypt.c +41 -0
  402. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_encrypt.c +44 -0
  403. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_sign.c +37 -0
  404. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_vrfy.c +43 -0
  405. package/runtime/third_party/bearssl/src/rsa/rsa_i31_priv.c +203 -0
  406. package/runtime/third_party/bearssl/src/rsa/rsa_i31_privexp.c +318 -0
  407. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_sign.c +40 -0
  408. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_vrfy.c +44 -0
  409. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pub.c +106 -0
  410. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pubexp.c +152 -0
  411. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_decrypt.c +41 -0
  412. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_encrypt.c +44 -0
  413. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_sign.c +37 -0
  414. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_vrfy.c +43 -0
  415. package/runtime/third_party/bearssl/src/rsa/rsa_i32_priv.c +160 -0
  416. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_sign.c +40 -0
  417. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_vrfy.c +44 -0
  418. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pub.c +77 -0
  419. package/runtime/third_party/bearssl/src/rsa/rsa_i62_keygen.c +57 -0
  420. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_decrypt.c +61 -0
  421. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_encrypt.c +64 -0
  422. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_sign.c +57 -0
  423. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_vrfy.c +63 -0
  424. package/runtime/third_party/bearssl/src/rsa/rsa_i62_priv.c +223 -0
  425. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_sign.c +60 -0
  426. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_vrfy.c +64 -0
  427. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pub.c +125 -0
  428. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_pad.c +112 -0
  429. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_unpad.c +145 -0
  430. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
  431. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_unpad.c +121 -0
  432. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_pad.c +106 -0
  433. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_unpad.c +121 -0
  434. package/runtime/third_party/bearssl/src/rsa/rsa_ssl_decrypt.c +52 -0
  435. package/runtime/third_party/bearssl/src/settings.c +306 -0
  436. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcdec.c +69 -0
  437. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcenc.c +67 -0
  438. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctr.c +84 -0
  439. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctrcbc.c +142 -0
  440. package/runtime/third_party/bearssl/src/symcipher/aes_big_dec.c +254 -0
  441. package/runtime/third_party/bearssl/src/symcipher/aes_big_enc.c +157 -0
  442. package/runtime/third_party/bearssl/src/symcipher/aes_common.c +112 -0
  443. package/runtime/third_party/bearssl/src/symcipher/aes_ct.c +328 -0
  444. package/runtime/third_party/bearssl/src/symcipher/aes_ct64.c +398 -0
  445. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcdec.c +104 -0
  446. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcenc.c +81 -0
  447. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctr.c +114 -0
  448. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctrcbc.c +433 -0
  449. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_dec.c +159 -0
  450. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_enc.c +115 -0
  451. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcdec.c +111 -0
  452. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcenc.c +91 -0
  453. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctr.c +116 -0
  454. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctrcbc.c +422 -0
  455. package/runtime/third_party/bearssl/src/symcipher/aes_ct_dec.c +170 -0
  456. package/runtime/third_party/bearssl/src/symcipher/aes_ct_enc.c +112 -0
  457. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8.c +445 -0
  458. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcdec.c +670 -0
  459. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcenc.c +417 -0
  460. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctr.c +717 -0
  461. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctrcbc.c +946 -0
  462. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcdec.c +69 -0
  463. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcenc.c +67 -0
  464. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctr.c +84 -0
  465. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctrcbc.c +142 -0
  466. package/runtime/third_party/bearssl/src/symcipher/aes_small_dec.c +176 -0
  467. package/runtime/third_party/bearssl/src/symcipher/aes_small_enc.c +129 -0
  468. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni.c +240 -0
  469. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcdec.c +223 -0
  470. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcenc.c +122 -0
  471. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctr.c +211 -0
  472. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctrcbc.c +596 -0
  473. package/runtime/third_party/bearssl/src/symcipher/chacha20_ct.c +106 -0
  474. package/runtime/third_party/bearssl/src/symcipher/chacha20_sse2.c +237 -0
  475. package/runtime/third_party/bearssl/src/symcipher/des_ct.c +411 -0
  476. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcdec.c +87 -0
  477. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcenc.c +69 -0
  478. package/runtime/third_party/bearssl/src/symcipher/des_support.c +166 -0
  479. package/runtime/third_party/bearssl/src/symcipher/des_tab.c +310 -0
  480. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcdec.c +85 -0
  481. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcenc.c +67 -0
  482. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul.c +260 -0
  483. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul32.c +297 -0
  484. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmulq.c +475 -0
  485. package/runtime/third_party/bearssl/src/symcipher/poly1305_i15.c +221 -0
  486. package/runtime/third_party/bearssl/src/x509/asn1.t0 +757 -0
  487. package/runtime/third_party/bearssl/src/x509/asn1enc.c +93 -0
  488. package/runtime/third_party/bearssl/src/x509/encode_ec_pk8der.c +110 -0
  489. package/runtime/third_party/bearssl/src/x509/encode_ec_rawder.c +161 -0
  490. package/runtime/third_party/bearssl/src/x509/encode_rsa_pk8der.c +97 -0
  491. package/runtime/third_party/bearssl/src/x509/encode_rsa_rawder.c +96 -0
  492. package/runtime/third_party/bearssl/src/x509/skey_decoder.c +653 -0
  493. package/runtime/third_party/bearssl/src/x509/skey_decoder.t0 +376 -0
  494. package/runtime/third_party/bearssl/src/x509/x509_decoder.c +776 -0
  495. package/runtime/third_party/bearssl/src/x509/x509_decoder.t0 +324 -0
  496. package/runtime/third_party/bearssl/src/x509/x509_knownkey.c +105 -0
  497. package/runtime/third_party/bearssl/src/x509/x509_minimal.c +1722 -0
  498. package/runtime/third_party/bearssl/src/x509/x509_minimal.t0 +1526 -0
  499. package/runtime/third_party/bearssl/src/x509/x509_minimal_full.c +59 -0
  500. package/runtime/third_party/quickjs-dtoa/LICENSE +22 -0
  501. package/runtime/third_party/quickjs-dtoa/README.md +23 -0
  502. package/runtime/third_party/quickjs-dtoa/dtoa.c +1640 -0
  503. package/runtime/third_party/quickjs-dtoa/dtoa.h +83 -0
  504. package/runtime/third_party/quickjs-dtoa/dtoa_compat.h +89 -0
  505. package/runtime/third_party/quickjs-regexp/LICENSE +22 -0
  506. package/runtime/third_party/quickjs-regexp/README.md +22 -0
  507. package/runtime/third_party/quickjs-regexp/cutils.c +641 -0
  508. package/runtime/third_party/quickjs-regexp/cutils.h +457 -0
  509. package/runtime/third_party/quickjs-regexp/libregexp-opcode.h +73 -0
  510. package/runtime/third_party/quickjs-regexp/libregexp.c +3448 -0
  511. package/runtime/third_party/quickjs-regexp/libregexp.h +65 -0
  512. package/runtime/third_party/quickjs-regexp/libunicode-table.h +5206 -0
  513. package/runtime/third_party/quickjs-regexp/libunicode.c +2124 -0
  514. package/runtime/third_party/quickjs-regexp/libunicode.h +196 -0
  515. package/runtime/third_party/v8-ieee754/LICENSE +61 -0
  516. package/runtime/third_party/v8-ieee754/README.md +22 -0
  517. package/runtime/third_party/v8-ieee754/convert.py +84 -0
  518. package/runtime/third_party/v8-ieee754/ieee754.c +3030 -0
  519. package/runtime/third_party/v8-ieee754/ieee754.h +27 -0
  520. package/runtime/tools/regexp_compile.c +90 -0
@@ -0,0 +1,824 @@
1
+ /*
2
+ * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining
5
+ * a copy of this software and associated documentation files (the
6
+ * "Software"), to deal in the Software without restriction, including
7
+ * without limitation the rights to use, copy, modify, merge, publish,
8
+ * distribute, sublicense, and/or sell copies of the Software, and to
9
+ * permit persons to whom the Software is furnished to do so, subject to
10
+ * the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be
13
+ * included in all copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ */
24
+
25
+ #include "inner.h"
26
+
27
+ /*
28
+ * Parameters for supported curves:
29
+ * - field modulus p
30
+ * - R^2 mod p (R = 2^(15k) for the smallest k such that R >= p)
31
+ * - b*R mod p (b is the second curve equation parameter)
32
+ */
33
+
34
+ static const uint16_t P256_P[] = {
35
+ 0x0111,
36
+ 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x003F, 0x0000,
37
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x4000, 0x7FFF,
38
+ 0x7FFF, 0x0001
39
+ };
40
+
41
+ static const uint16_t P256_R2[] = {
42
+ 0x0111,
43
+ 0x0000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFC, 0x7FFF,
44
+ 0x7FBF, 0x7FFF, 0x7FBF, 0x7FFF, 0x7FFF, 0x7FFF, 0x77FF, 0x7FFF,
45
+ 0x4FFF, 0x0000
46
+ };
47
+
48
+ static const uint16_t P256_B[] = {
49
+ 0x0111,
50
+ 0x770C, 0x5EEF, 0x29C4, 0x3EC4, 0x6273, 0x0486, 0x4543, 0x3993,
51
+ 0x3C01, 0x6B56, 0x212E, 0x57EE, 0x4882, 0x204B, 0x7483, 0x3C16,
52
+ 0x0187, 0x0000
53
+ };
54
+
55
+ static const uint16_t P384_P[] = {
56
+ 0x0199,
57
+ 0x7FFF, 0x7FFF, 0x0003, 0x0000, 0x0000, 0x0000, 0x7FC0, 0x7FFF,
58
+ 0x7EFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
59
+ 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
60
+ 0x7FFF, 0x01FF
61
+ };
62
+
63
+ static const uint16_t P384_R2[] = {
64
+ 0x0199,
65
+ 0x1000, 0x0000, 0x0000, 0x7FFF, 0x7FFF, 0x0001, 0x0000, 0x0010,
66
+ 0x0000, 0x0000, 0x0000, 0x7F00, 0x7FFF, 0x01FF, 0x0000, 0x1000,
67
+ 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
68
+ 0x0000, 0x0000
69
+ };
70
+
71
+ static const uint16_t P384_B[] = {
72
+ 0x0199,
73
+ 0x7333, 0x2096, 0x70D1, 0x2310, 0x3020, 0x6197, 0x1464, 0x35BB,
74
+ 0x70CA, 0x0117, 0x1920, 0x4136, 0x5FC8, 0x5713, 0x4938, 0x7DD2,
75
+ 0x4DD2, 0x4A71, 0x0220, 0x683E, 0x2C87, 0x4DB1, 0x7BFF, 0x6C09,
76
+ 0x0452, 0x0084
77
+ };
78
+
79
+ static const uint16_t P521_P[] = {
80
+ 0x022B,
81
+ 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
82
+ 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
83
+ 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
84
+ 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
85
+ 0x7FFF, 0x7FFF, 0x07FF
86
+ };
87
+
88
+ static const uint16_t P521_R2[] = {
89
+ 0x022B,
90
+ 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
91
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
92
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
93
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
94
+ 0x0000, 0x0000, 0x0000
95
+ };
96
+
97
+ static const uint16_t P521_B[] = {
98
+ 0x022B,
99
+ 0x7002, 0x6A07, 0x751A, 0x228F, 0x71EF, 0x5869, 0x20F4, 0x1EFC,
100
+ 0x7357, 0x37E0, 0x4EEC, 0x605E, 0x1652, 0x26F6, 0x31FA, 0x4A8F,
101
+ 0x6193, 0x3C2A, 0x3C42, 0x48C7, 0x3489, 0x6771, 0x4C57, 0x5CCD,
102
+ 0x2725, 0x545B, 0x503B, 0x5B42, 0x21A0, 0x2534, 0x687E, 0x70E4,
103
+ 0x1618, 0x27D7, 0x0465
104
+ };
105
+
106
+ typedef struct {
107
+ const uint16_t *p;
108
+ const uint16_t *b;
109
+ const uint16_t *R2;
110
+ uint16_t p0i;
111
+ size_t point_len;
112
+ } curve_params;
113
+
114
+ static inline const curve_params *
115
+ id_to_curve(int curve)
116
+ {
117
+ static const curve_params pp[] = {
118
+ { P256_P, P256_B, P256_R2, 0x0001, 65 },
119
+ { P384_P, P384_B, P384_R2, 0x0001, 97 },
120
+ { P521_P, P521_B, P521_R2, 0x0001, 133 }
121
+ };
122
+
123
+ return &pp[curve - BR_EC_secp256r1];
124
+ }
125
+
126
+ #define I15_LEN ((BR_MAX_EC_SIZE + 29) / 15)
127
+
128
+ /*
129
+ * Type for a point in Jacobian coordinates:
130
+ * -- three values, x, y and z, in Montgomery representation
131
+ * -- affine coordinates are X = x / z^2 and Y = y / z^3
132
+ * -- for the point at infinity, z = 0
133
+ */
134
+ typedef struct {
135
+ uint16_t c[3][I15_LEN];
136
+ } jacobian;
137
+
138
+ /*
139
+ * We use a custom interpreter that uses a dozen registers, and
140
+ * only six operations:
141
+ * MSET(d, a) copy a into d
142
+ * MADD(d, a) d = d+a (modular)
143
+ * MSUB(d, a) d = d-a (modular)
144
+ * MMUL(d, a, b) d = a*b (Montgomery multiplication)
145
+ * MINV(d, a, b) invert d modulo p; a and b are used as scratch registers
146
+ * MTZ(d) clear return value if d = 0
147
+ * Destination of MMUL (d) must be distinct from operands (a and b).
148
+ * There is no such constraint for MSUB and MADD.
149
+ *
150
+ * Registers include the operand coordinates, and temporaries.
151
+ */
152
+ #define MSET(d, a) (0x0000 + ((d) << 8) + ((a) << 4))
153
+ #define MADD(d, a) (0x1000 + ((d) << 8) + ((a) << 4))
154
+ #define MSUB(d, a) (0x2000 + ((d) << 8) + ((a) << 4))
155
+ #define MMUL(d, a, b) (0x3000 + ((d) << 8) + ((a) << 4) + (b))
156
+ #define MINV(d, a, b) (0x4000 + ((d) << 8) + ((a) << 4) + (b))
157
+ #define MTZ(d) (0x5000 + ((d) << 8))
158
+ #define ENDCODE 0
159
+
160
+ /*
161
+ * Registers for the input operands.
162
+ */
163
+ #define P1x 0
164
+ #define P1y 1
165
+ #define P1z 2
166
+ #define P2x 3
167
+ #define P2y 4
168
+ #define P2z 5
169
+
170
+ /*
171
+ * Alternate names for the first input operand.
172
+ */
173
+ #define Px 0
174
+ #define Py 1
175
+ #define Pz 2
176
+
177
+ /*
178
+ * Temporaries.
179
+ */
180
+ #define t1 6
181
+ #define t2 7
182
+ #define t3 8
183
+ #define t4 9
184
+ #define t5 10
185
+ #define t6 11
186
+ #define t7 12
187
+
188
+ /*
189
+ * Extra scratch registers available when there is no second operand (e.g.
190
+ * for "double" and "affine").
191
+ */
192
+ #define t8 3
193
+ #define t9 4
194
+ #define t10 5
195
+
196
+ /*
197
+ * Doubling formulas are:
198
+ *
199
+ * s = 4*x*y^2
200
+ * m = 3*(x + z^2)*(x - z^2)
201
+ * x' = m^2 - 2*s
202
+ * y' = m*(s - x') - 8*y^4
203
+ * z' = 2*y*z
204
+ *
205
+ * If y = 0 (P has order 2) then this yields infinity (z' = 0), as it
206
+ * should. This case should not happen anyway, because our curves have
207
+ * prime order, and thus do not contain any point of order 2.
208
+ *
209
+ * If P is infinity (z = 0), then again the formulas yield infinity,
210
+ * which is correct. Thus, this code works for all points.
211
+ *
212
+ * Cost: 8 multiplications
213
+ */
214
+ static const uint16_t code_double[] = {
215
+ /*
216
+ * Compute z^2 (in t1).
217
+ */
218
+ MMUL(t1, Pz, Pz),
219
+
220
+ /*
221
+ * Compute x-z^2 (in t2) and then x+z^2 (in t1).
222
+ */
223
+ MSET(t2, Px),
224
+ MSUB(t2, t1),
225
+ MADD(t1, Px),
226
+
227
+ /*
228
+ * Compute m = 3*(x+z^2)*(x-z^2) (in t1).
229
+ */
230
+ MMUL(t3, t1, t2),
231
+ MSET(t1, t3),
232
+ MADD(t1, t3),
233
+ MADD(t1, t3),
234
+
235
+ /*
236
+ * Compute s = 4*x*y^2 (in t2) and 2*y^2 (in t3).
237
+ */
238
+ MMUL(t3, Py, Py),
239
+ MADD(t3, t3),
240
+ MMUL(t2, Px, t3),
241
+ MADD(t2, t2),
242
+
243
+ /*
244
+ * Compute x' = m^2 - 2*s.
245
+ */
246
+ MMUL(Px, t1, t1),
247
+ MSUB(Px, t2),
248
+ MSUB(Px, t2),
249
+
250
+ /*
251
+ * Compute z' = 2*y*z.
252
+ */
253
+ MMUL(t4, Py, Pz),
254
+ MSET(Pz, t4),
255
+ MADD(Pz, t4),
256
+
257
+ /*
258
+ * Compute y' = m*(s - x') - 8*y^4. Note that we already have
259
+ * 2*y^2 in t3.
260
+ */
261
+ MSUB(t2, Px),
262
+ MMUL(Py, t1, t2),
263
+ MMUL(t4, t3, t3),
264
+ MSUB(Py, t4),
265
+ MSUB(Py, t4),
266
+
267
+ ENDCODE
268
+ };
269
+
270
+ /*
271
+ * Addtions formulas are:
272
+ *
273
+ * u1 = x1 * z2^2
274
+ * u2 = x2 * z1^2
275
+ * s1 = y1 * z2^3
276
+ * s2 = y2 * z1^3
277
+ * h = u2 - u1
278
+ * r = s2 - s1
279
+ * x3 = r^2 - h^3 - 2 * u1 * h^2
280
+ * y3 = r * (u1 * h^2 - x3) - s1 * h^3
281
+ * z3 = h * z1 * z2
282
+ *
283
+ * If both P1 and P2 are infinity, then z1 == 0 and z2 == 0, implying that
284
+ * z3 == 0, so the result is correct.
285
+ * If either of P1 or P2 is infinity, but not both, then z3 == 0, which is
286
+ * not correct.
287
+ * h == 0 only if u1 == u2; this happens in two cases:
288
+ * -- if s1 == s2 then P1 and/or P2 is infinity, or P1 == P2
289
+ * -- if s1 != s2 then P1 + P2 == infinity (but neither P1 or P2 is infinity)
290
+ *
291
+ * Thus, the following situations are not handled correctly:
292
+ * -- P1 = 0 and P2 != 0
293
+ * -- P1 != 0 and P2 = 0
294
+ * -- P1 = P2
295
+ * All other cases are properly computed. However, even in "incorrect"
296
+ * situations, the three coordinates still are properly formed field
297
+ * elements.
298
+ *
299
+ * The returned flag is cleared if r == 0. This happens in the following
300
+ * cases:
301
+ * -- Both points are on the same horizontal line (same Y coordinate).
302
+ * -- Both points are infinity.
303
+ * -- One point is infinity and the other is on line Y = 0.
304
+ * The third case cannot happen with our curves (there is no valid point
305
+ * on line Y = 0 since that would be a point of order 2). If the two
306
+ * source points are non-infinity, then remains only the case where the
307
+ * two points are on the same horizontal line.
308
+ *
309
+ * This allows us to detect the "P1 == P2" case, assuming that P1 != 0 and
310
+ * P2 != 0:
311
+ * -- If the returned value is not the point at infinity, then it was properly
312
+ * computed.
313
+ * -- Otherwise, if the returned flag is 1, then P1+P2 = 0, and the result
314
+ * is indeed the point at infinity.
315
+ * -- Otherwise (result is infinity, flag is 0), then P1 = P2 and we should
316
+ * use the 'double' code.
317
+ *
318
+ * Cost: 16 multiplications
319
+ */
320
+ static const uint16_t code_add[] = {
321
+ /*
322
+ * Compute u1 = x1*z2^2 (in t1) and s1 = y1*z2^3 (in t3).
323
+ */
324
+ MMUL(t3, P2z, P2z),
325
+ MMUL(t1, P1x, t3),
326
+ MMUL(t4, P2z, t3),
327
+ MMUL(t3, P1y, t4),
328
+
329
+ /*
330
+ * Compute u2 = x2*z1^2 (in t2) and s2 = y2*z1^3 (in t4).
331
+ */
332
+ MMUL(t4, P1z, P1z),
333
+ MMUL(t2, P2x, t4),
334
+ MMUL(t5, P1z, t4),
335
+ MMUL(t4, P2y, t5),
336
+
337
+ /*
338
+ * Compute h = u2 - u1 (in t2) and r = s2 - s1 (in t4).
339
+ */
340
+ MSUB(t2, t1),
341
+ MSUB(t4, t3),
342
+
343
+ /*
344
+ * Report cases where r = 0 through the returned flag.
345
+ */
346
+ MTZ(t4),
347
+
348
+ /*
349
+ * Compute u1*h^2 (in t6) and h^3 (in t5).
350
+ */
351
+ MMUL(t7, t2, t2),
352
+ MMUL(t6, t1, t7),
353
+ MMUL(t5, t7, t2),
354
+
355
+ /*
356
+ * Compute x3 = r^2 - h^3 - 2*u1*h^2.
357
+ * t1 and t7 can be used as scratch registers.
358
+ */
359
+ MMUL(P1x, t4, t4),
360
+ MSUB(P1x, t5),
361
+ MSUB(P1x, t6),
362
+ MSUB(P1x, t6),
363
+
364
+ /*
365
+ * Compute y3 = r*(u1*h^2 - x3) - s1*h^3.
366
+ */
367
+ MSUB(t6, P1x),
368
+ MMUL(P1y, t4, t6),
369
+ MMUL(t1, t5, t3),
370
+ MSUB(P1y, t1),
371
+
372
+ /*
373
+ * Compute z3 = h*z1*z2.
374
+ */
375
+ MMUL(t1, P1z, P2z),
376
+ MMUL(P1z, t1, t2),
377
+
378
+ ENDCODE
379
+ };
380
+
381
+ /*
382
+ * Check that the point is on the curve. This code snippet assumes the
383
+ * following conventions:
384
+ * -- Coordinates x and y have been freshly decoded in P1 (but not
385
+ * converted to Montgomery coordinates yet).
386
+ * -- P2x, P2y and P2z are set to, respectively, R^2, b*R and 1.
387
+ */
388
+ static const uint16_t code_check[] = {
389
+
390
+ /* Convert x and y to Montgomery representation. */
391
+ MMUL(t1, P1x, P2x),
392
+ MMUL(t2, P1y, P2x),
393
+ MSET(P1x, t1),
394
+ MSET(P1y, t2),
395
+
396
+ /* Compute x^3 in t1. */
397
+ MMUL(t2, P1x, P1x),
398
+ MMUL(t1, P1x, t2),
399
+
400
+ /* Subtract 3*x from t1. */
401
+ MSUB(t1, P1x),
402
+ MSUB(t1, P1x),
403
+ MSUB(t1, P1x),
404
+
405
+ /* Add b. */
406
+ MADD(t1, P2y),
407
+
408
+ /* Compute y^2 in t2. */
409
+ MMUL(t2, P1y, P1y),
410
+
411
+ /* Compare y^2 with x^3 - 3*x + b; they must match. */
412
+ MSUB(t1, t2),
413
+ MTZ(t1),
414
+
415
+ /* Set z to 1 (in Montgomery representation). */
416
+ MMUL(P1z, P2x, P2z),
417
+
418
+ ENDCODE
419
+ };
420
+
421
+ /*
422
+ * Conversion back to affine coordinates. This code snippet assumes that
423
+ * the z coordinate of P2 is set to 1 (not in Montgomery representation).
424
+ */
425
+ static const uint16_t code_affine[] = {
426
+
427
+ /* Save z*R in t1. */
428
+ MSET(t1, P1z),
429
+
430
+ /* Compute z^3 in t2. */
431
+ MMUL(t2, P1z, P1z),
432
+ MMUL(t3, P1z, t2),
433
+ MMUL(t2, t3, P2z),
434
+
435
+ /* Invert to (1/z^3) in t2. */
436
+ MINV(t2, t3, t4),
437
+
438
+ /* Compute y. */
439
+ MSET(t3, P1y),
440
+ MMUL(P1y, t2, t3),
441
+
442
+ /* Compute (1/z^2) in t3. */
443
+ MMUL(t3, t2, t1),
444
+
445
+ /* Compute x. */
446
+ MSET(t2, P1x),
447
+ MMUL(P1x, t2, t3),
448
+
449
+ ENDCODE
450
+ };
451
+
452
+ static uint32_t
453
+ run_code(jacobian *P1, const jacobian *P2,
454
+ const curve_params *cc, const uint16_t *code)
455
+ {
456
+ uint32_t r;
457
+ uint16_t t[13][I15_LEN];
458
+ size_t u;
459
+
460
+ r = 1;
461
+
462
+ /*
463
+ * Copy the two operands in the dedicated registers.
464
+ */
465
+ memcpy(t[P1x], P1->c, 3 * I15_LEN * sizeof(uint16_t));
466
+ memcpy(t[P2x], P2->c, 3 * I15_LEN * sizeof(uint16_t));
467
+
468
+ /*
469
+ * Run formulas.
470
+ */
471
+ for (u = 0;; u ++) {
472
+ unsigned op, d, a, b;
473
+
474
+ op = code[u];
475
+ if (op == 0) {
476
+ break;
477
+ }
478
+ d = (op >> 8) & 0x0F;
479
+ a = (op >> 4) & 0x0F;
480
+ b = op & 0x0F;
481
+ op >>= 12;
482
+ switch (op) {
483
+ uint32_t ctl;
484
+ size_t plen;
485
+ unsigned char tp[(BR_MAX_EC_SIZE + 7) >> 3];
486
+
487
+ case 0:
488
+ memcpy(t[d], t[a], I15_LEN * sizeof(uint16_t));
489
+ break;
490
+ case 1:
491
+ ctl = br_i15_add(t[d], t[a], 1);
492
+ ctl |= NOT(br_i15_sub(t[d], cc->p, 0));
493
+ br_i15_sub(t[d], cc->p, ctl);
494
+ break;
495
+ case 2:
496
+ br_i15_add(t[d], cc->p, br_i15_sub(t[d], t[a], 1));
497
+ break;
498
+ case 3:
499
+ br_i15_montymul(t[d], t[a], t[b], cc->p, cc->p0i);
500
+ break;
501
+ case 4:
502
+ plen = (cc->p[0] - (cc->p[0] >> 4) + 7) >> 3;
503
+ br_i15_encode(tp, plen, cc->p);
504
+ tp[plen - 1] -= 2;
505
+ br_i15_modpow(t[d], tp, plen,
506
+ cc->p, cc->p0i, t[a], t[b]);
507
+ break;
508
+ default:
509
+ r &= ~br_i15_iszero(t[d]);
510
+ break;
511
+ }
512
+ }
513
+
514
+ /*
515
+ * Copy back result.
516
+ */
517
+ memcpy(P1->c, t[P1x], 3 * I15_LEN * sizeof(uint16_t));
518
+ return r;
519
+ }
520
+
521
+ static void
522
+ set_one(uint16_t *x, const uint16_t *p)
523
+ {
524
+ size_t plen;
525
+
526
+ plen = (p[0] + 31) >> 4;
527
+ memset(x, 0, plen * sizeof *x);
528
+ x[0] = p[0];
529
+ x[1] = 0x0001;
530
+ }
531
+
532
+ static void
533
+ point_zero(jacobian *P, const curve_params *cc)
534
+ {
535
+ memset(P, 0, sizeof *P);
536
+ P->c[0][0] = P->c[1][0] = P->c[2][0] = cc->p[0];
537
+ }
538
+
539
+ static inline void
540
+ point_double(jacobian *P, const curve_params *cc)
541
+ {
542
+ run_code(P, P, cc, code_double);
543
+ }
544
+
545
+ static inline uint32_t
546
+ point_add(jacobian *P1, const jacobian *P2, const curve_params *cc)
547
+ {
548
+ return run_code(P1, P2, cc, code_add);
549
+ }
550
+
551
+ static void
552
+ point_mul(jacobian *P, const unsigned char *x, size_t xlen,
553
+ const curve_params *cc)
554
+ {
555
+ /*
556
+ * We do a simple double-and-add ladder with a 2-bit window
557
+ * to make only one add every two doublings. We thus first
558
+ * precompute 2P and 3P in some local buffers.
559
+ *
560
+ * We always perform two doublings and one addition; the
561
+ * addition is with P, 2P and 3P and is done in a temporary
562
+ * array.
563
+ *
564
+ * The addition code cannot handle cases where one of the
565
+ * operands is infinity, which is the case at the start of the
566
+ * ladder. We therefore need to maintain a flag that controls
567
+ * this situation.
568
+ */
569
+ uint32_t qz;
570
+ jacobian P2, P3, Q, T, U;
571
+
572
+ memcpy(&P2, P, sizeof P2);
573
+ point_double(&P2, cc);
574
+ memcpy(&P3, P, sizeof P3);
575
+ point_add(&P3, &P2, cc);
576
+
577
+ point_zero(&Q, cc);
578
+ qz = 1;
579
+ while (xlen -- > 0) {
580
+ int k;
581
+
582
+ for (k = 6; k >= 0; k -= 2) {
583
+ uint32_t bits;
584
+ uint32_t bnz;
585
+
586
+ point_double(&Q, cc);
587
+ point_double(&Q, cc);
588
+ memcpy(&T, P, sizeof T);
589
+ memcpy(&U, &Q, sizeof U);
590
+ bits = (*x >> k) & (uint32_t)3;
591
+ bnz = NEQ(bits, 0);
592
+ CCOPY(EQ(bits, 2), &T, &P2, sizeof T);
593
+ CCOPY(EQ(bits, 3), &T, &P3, sizeof T);
594
+ point_add(&U, &T, cc);
595
+ CCOPY(bnz & qz, &Q, &T, sizeof Q);
596
+ CCOPY(bnz & ~qz, &Q, &U, sizeof Q);
597
+ qz &= ~bnz;
598
+ }
599
+ x ++;
600
+ }
601
+ memcpy(P, &Q, sizeof Q);
602
+ }
603
+
604
+ /*
605
+ * Decode point into Jacobian coordinates. This function does not support
606
+ * the point at infinity. If the point is invalid then this returns 0, but
607
+ * the coordinates are still set to properly formed field elements.
608
+ */
609
+ static uint32_t
610
+ point_decode(jacobian *P, const void *src, size_t len, const curve_params *cc)
611
+ {
612
+ /*
613
+ * Points must use uncompressed format:
614
+ * -- first byte is 0x04;
615
+ * -- coordinates X and Y use unsigned big-endian, with the same
616
+ * length as the field modulus.
617
+ *
618
+ * We don't support hybrid format (uncompressed, but first byte
619
+ * has value 0x06 or 0x07, depending on the least significant bit
620
+ * of Y) because it is rather useless, and explicitly forbidden
621
+ * by PKIX (RFC 5480, section 2.2).
622
+ *
623
+ * We don't support compressed format either, because it is not
624
+ * much used in practice (there are or were patent-related
625
+ * concerns about point compression, which explains the lack of
626
+ * generalised support). Also, point compression support would
627
+ * need a bit more code.
628
+ */
629
+ const unsigned char *buf;
630
+ size_t plen, zlen;
631
+ uint32_t r;
632
+ jacobian Q;
633
+
634
+ buf = src;
635
+ point_zero(P, cc);
636
+ plen = (cc->p[0] - (cc->p[0] >> 4) + 7) >> 3;
637
+ if (len != 1 + (plen << 1)) {
638
+ return 0;
639
+ }
640
+ r = br_i15_decode_mod(P->c[0], buf + 1, plen, cc->p);
641
+ r &= br_i15_decode_mod(P->c[1], buf + 1 + plen, plen, cc->p);
642
+
643
+ /*
644
+ * Check first byte.
645
+ */
646
+ r &= EQ(buf[0], 0x04);
647
+ /* obsolete
648
+ r &= EQ(buf[0], 0x04) | (EQ(buf[0] & 0xFE, 0x06)
649
+ & ~(uint32_t)(buf[0] ^ buf[plen << 1]));
650
+ */
651
+
652
+ /*
653
+ * Convert coordinates and check that the point is valid.
654
+ */
655
+ zlen = ((cc->p[0] + 31) >> 4) * sizeof(uint16_t);
656
+ memcpy(Q.c[0], cc->R2, zlen);
657
+ memcpy(Q.c[1], cc->b, zlen);
658
+ set_one(Q.c[2], cc->p);
659
+ r &= ~run_code(P, &Q, cc, code_check);
660
+ return r;
661
+ }
662
+
663
+ /*
664
+ * Encode a point. This method assumes that the point is correct and is
665
+ * not the point at infinity. Encoded size is always 1+2*plen, where
666
+ * plen is the field modulus length, in bytes.
667
+ */
668
+ static void
669
+ point_encode(void *dst, const jacobian *P, const curve_params *cc)
670
+ {
671
+ unsigned char *buf;
672
+ size_t plen;
673
+ jacobian Q, T;
674
+
675
+ buf = dst;
676
+ plen = (cc->p[0] - (cc->p[0] >> 4) + 7) >> 3;
677
+ buf[0] = 0x04;
678
+ memcpy(&Q, P, sizeof *P);
679
+ set_one(T.c[2], cc->p);
680
+ run_code(&Q, &T, cc, code_affine);
681
+ br_i15_encode(buf + 1, plen, Q.c[0]);
682
+ br_i15_encode(buf + 1 + plen, plen, Q.c[1]);
683
+ }
684
+
685
+ static const br_ec_curve_def *
686
+ id_to_curve_def(int curve)
687
+ {
688
+ switch (curve) {
689
+ case BR_EC_secp256r1:
690
+ return &br_secp256r1;
691
+ case BR_EC_secp384r1:
692
+ return &br_secp384r1;
693
+ case BR_EC_secp521r1:
694
+ return &br_secp521r1;
695
+ }
696
+ return NULL;
697
+ }
698
+
699
+ static const unsigned char *
700
+ api_generator(int curve, size_t *len)
701
+ {
702
+ const br_ec_curve_def *cd;
703
+
704
+ cd = id_to_curve_def(curve);
705
+ *len = cd->generator_len;
706
+ return cd->generator;
707
+ }
708
+
709
+ static const unsigned char *
710
+ api_order(int curve, size_t *len)
711
+ {
712
+ const br_ec_curve_def *cd;
713
+
714
+ cd = id_to_curve_def(curve);
715
+ *len = cd->order_len;
716
+ return cd->order;
717
+ }
718
+
719
+ static size_t
720
+ api_xoff(int curve, size_t *len)
721
+ {
722
+ api_generator(curve, len);
723
+ *len >>= 1;
724
+ return 1;
725
+ }
726
+
727
+ static uint32_t
728
+ api_mul(unsigned char *G, size_t Glen,
729
+ const unsigned char *x, size_t xlen, int curve)
730
+ {
731
+ uint32_t r;
732
+ const curve_params *cc;
733
+ jacobian P;
734
+
735
+ cc = id_to_curve(curve);
736
+ if (Glen != cc->point_len) {
737
+ return 0;
738
+ }
739
+ r = point_decode(&P, G, Glen, cc);
740
+ point_mul(&P, x, xlen, cc);
741
+ point_encode(G, &P, cc);
742
+ return r;
743
+ }
744
+
745
+ static size_t
746
+ api_mulgen(unsigned char *R,
747
+ const unsigned char *x, size_t xlen, int curve)
748
+ {
749
+ const unsigned char *G;
750
+ size_t Glen;
751
+
752
+ G = api_generator(curve, &Glen);
753
+ memcpy(R, G, Glen);
754
+ api_mul(R, Glen, x, xlen, curve);
755
+ return Glen;
756
+ }
757
+
758
+ static uint32_t
759
+ api_muladd(unsigned char *A, const unsigned char *B, size_t len,
760
+ const unsigned char *x, size_t xlen,
761
+ const unsigned char *y, size_t ylen, int curve)
762
+ {
763
+ uint32_t r, t, z;
764
+ const curve_params *cc;
765
+ jacobian P, Q;
766
+
767
+ /*
768
+ * TODO: see about merging the two ladders. Right now, we do
769
+ * two independent point multiplications, which is a bit
770
+ * wasteful of CPU resources (but yields short code).
771
+ */
772
+
773
+ cc = id_to_curve(curve);
774
+ if (len != cc->point_len) {
775
+ return 0;
776
+ }
777
+ r = point_decode(&P, A, len, cc);
778
+ if (B == NULL) {
779
+ size_t Glen;
780
+
781
+ B = api_generator(curve, &Glen);
782
+ }
783
+ r &= point_decode(&Q, B, len, cc);
784
+ point_mul(&P, x, xlen, cc);
785
+ point_mul(&Q, y, ylen, cc);
786
+
787
+ /*
788
+ * We want to compute P+Q. Since the base points A and B are distinct
789
+ * from infinity, and the multipliers are non-zero and lower than the
790
+ * curve order, then we know that P and Q are non-infinity. This
791
+ * leaves two special situations to test for:
792
+ * -- If P = Q then we must use point_double().
793
+ * -- If P+Q = 0 then we must report an error.
794
+ */
795
+ t = point_add(&P, &Q, cc);
796
+ point_double(&Q, cc);
797
+ z = br_i15_iszero(P.c[2]);
798
+
799
+ /*
800
+ * If z is 1 then either P+Q = 0 (t = 1) or P = Q (t = 0). So we
801
+ * have the following:
802
+ *
803
+ * z = 0, t = 0 return P (normal addition)
804
+ * z = 0, t = 1 return P (normal addition)
805
+ * z = 1, t = 0 return Q (a 'double' case)
806
+ * z = 1, t = 1 report an error (P+Q = 0)
807
+ */
808
+ CCOPY(z & ~t, &P, &Q, sizeof Q);
809
+ point_encode(A, &P, cc);
810
+ r &= ~(z & t);
811
+
812
+ return r;
813
+ }
814
+
815
+ /* see bearssl_ec.h */
816
+ const br_ec_impl br_ec_prime_i15 = {
817
+ (uint32_t)0x03800000,
818
+ &api_generator,
819
+ &api_order,
820
+ &api_xoff,
821
+ &api_mul,
822
+ &api_mulgen,
823
+ &api_muladd
824
+ };