@bsv/sdk 1.0.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 (464) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  2. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  3. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +23 -0
  4. package/CHANGELOG.md +72 -0
  5. package/CONTRIBUTING.md +85 -0
  6. package/LICENSE.txt +28 -0
  7. package/README.md +87 -0
  8. package/ROADMAP.md +3 -0
  9. package/dist/cjs/mod.js +25 -0
  10. package/dist/cjs/mod.js.map +1 -0
  11. package/dist/cjs/package.json +42 -0
  12. package/dist/cjs/src/compat/BIP39.js +272 -0
  13. package/dist/cjs/src/compat/BIP39.js.map +1 -0
  14. package/dist/cjs/src/compat/BSM.js +77 -0
  15. package/dist/cjs/src/compat/BSM.js.map +1 -0
  16. package/dist/cjs/src/compat/ECIES.js +483 -0
  17. package/dist/cjs/src/compat/ECIES.js.map +1 -0
  18. package/dist/cjs/src/compat/HD.js +326 -0
  19. package/dist/cjs/src/compat/HD.js.map +1 -0
  20. package/dist/cjs/src/compat/Mnemonic.js +298 -0
  21. package/dist/cjs/src/compat/Mnemonic.js.map +1 -0
  22. package/dist/cjs/src/compat/bip-39-wordlist-en.js +2057 -0
  23. package/dist/cjs/src/compat/bip-39-wordlist-en.js.map +1 -0
  24. package/dist/cjs/src/compat/index.js +37 -0
  25. package/dist/cjs/src/compat/index.js.map +1 -0
  26. package/dist/cjs/src/messages/EncryptedMessage.js +69 -0
  27. package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -0
  28. package/dist/cjs/src/messages/SignedMessage.js +85 -0
  29. package/dist/cjs/src/messages/SignedMessage.js.map +1 -0
  30. package/dist/cjs/src/messages/index.js +29 -0
  31. package/dist/cjs/src/messages/index.js.map +1 -0
  32. package/dist/cjs/src/primitives/AESGCM.js +384 -0
  33. package/dist/cjs/src/primitives/AESGCM.js.map +1 -0
  34. package/dist/cjs/src/primitives/BasePoint.js +19 -0
  35. package/dist/cjs/src/primitives/BasePoint.js.map +1 -0
  36. package/dist/cjs/src/primitives/BigNumber.js +4269 -0
  37. package/dist/cjs/src/primitives/BigNumber.js.map +1 -0
  38. package/dist/cjs/src/primitives/Curve.js +1126 -0
  39. package/dist/cjs/src/primitives/Curve.js.map +1 -0
  40. package/dist/cjs/src/primitives/DRBG.js +99 -0
  41. package/dist/cjs/src/primitives/DRBG.js.map +1 -0
  42. package/dist/cjs/src/primitives/ECDSA.js +169 -0
  43. package/dist/cjs/src/primitives/ECDSA.js.map +1 -0
  44. package/dist/cjs/src/primitives/Hash.js +1332 -0
  45. package/dist/cjs/src/primitives/Hash.js.map +1 -0
  46. package/dist/cjs/src/primitives/JacobianPoint.js +400 -0
  47. package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -0
  48. package/dist/cjs/src/primitives/K256.js +111 -0
  49. package/dist/cjs/src/primitives/K256.js.map +1 -0
  50. package/dist/cjs/src/primitives/Mersenne.js +118 -0
  51. package/dist/cjs/src/primitives/Mersenne.js.map +1 -0
  52. package/dist/cjs/src/primitives/MontgomoryMethod.js +150 -0
  53. package/dist/cjs/src/primitives/MontgomoryMethod.js.map +1 -0
  54. package/dist/cjs/src/primitives/Point.js +819 -0
  55. package/dist/cjs/src/primitives/Point.js.map +1 -0
  56. package/dist/cjs/src/primitives/PrivateKey.js +190 -0
  57. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -0
  58. package/dist/cjs/src/primitives/PublicKey.js +151 -0
  59. package/dist/cjs/src/primitives/PublicKey.js.map +1 -0
  60. package/dist/cjs/src/primitives/Random.js +57 -0
  61. package/dist/cjs/src/primitives/Random.js.map +1 -0
  62. package/dist/cjs/src/primitives/ReductionContext.js +490 -0
  63. package/dist/cjs/src/primitives/ReductionContext.js.map +1 -0
  64. package/dist/cjs/src/primitives/Signature.js +220 -0
  65. package/dist/cjs/src/primitives/Signature.js.map +1 -0
  66. package/dist/cjs/src/primitives/SymmetricKey.js +69 -0
  67. package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -0
  68. package/dist/cjs/src/primitives/TransactionSignature.js +172 -0
  69. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -0
  70. package/dist/cjs/src/primitives/index.js +45 -0
  71. package/dist/cjs/src/primitives/index.js.map +1 -0
  72. package/dist/cjs/src/primitives/utils.js +615 -0
  73. package/dist/cjs/src/primitives/utils.js.map +1 -0
  74. package/dist/cjs/src/script/LockingScript.js +35 -0
  75. package/dist/cjs/src/script/LockingScript.js.map +1 -0
  76. package/dist/cjs/src/script/OP.js +208 -0
  77. package/dist/cjs/src/script/OP.js.map +1 -0
  78. package/dist/cjs/src/script/Script.js +429 -0
  79. package/dist/cjs/src/script/Script.js.map +1 -0
  80. package/dist/cjs/src/script/ScriptChunk.js +3 -0
  81. package/dist/cjs/src/script/ScriptChunk.js.map +1 -0
  82. package/dist/cjs/src/script/ScriptTemplate.js +3 -0
  83. package/dist/cjs/src/script/ScriptTemplate.js.map +1 -0
  84. package/dist/cjs/src/script/Spend.js +1252 -0
  85. package/dist/cjs/src/script/Spend.js.map +1 -0
  86. package/dist/cjs/src/script/UnlockingScript.js +35 -0
  87. package/dist/cjs/src/script/UnlockingScript.js.map +1 -0
  88. package/dist/cjs/src/script/index.js +32 -0
  89. package/dist/cjs/src/script/index.js.map +1 -0
  90. package/dist/cjs/src/script/templates/P2PKH.js +98 -0
  91. package/dist/cjs/src/script/templates/P2PKH.js.map +1 -0
  92. package/dist/cjs/src/script/templates/RPuzzle.js +125 -0
  93. package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -0
  94. package/dist/cjs/src/script/templates/index.js +11 -0
  95. package/dist/cjs/src/script/templates/index.js.map +1 -0
  96. package/dist/cjs/src/transaction/Broadcaster.js +3 -0
  97. package/dist/cjs/src/transaction/Broadcaster.js.map +1 -0
  98. package/dist/cjs/src/transaction/ChainTracker.js +3 -0
  99. package/dist/cjs/src/transaction/ChainTracker.js.map +1 -0
  100. package/dist/cjs/src/transaction/FeeModel.js +3 -0
  101. package/dist/cjs/src/transaction/FeeModel.js.map +1 -0
  102. package/dist/cjs/src/transaction/MerklePath.js +239 -0
  103. package/dist/cjs/src/transaction/MerklePath.js.map +1 -0
  104. package/dist/cjs/src/transaction/Transaction.js +557 -0
  105. package/dist/cjs/src/transaction/Transaction.js.map +1 -0
  106. package/dist/cjs/src/transaction/TransactionInput.js +3 -0
  107. package/dist/cjs/src/transaction/TransactionInput.js.map +1 -0
  108. package/dist/cjs/src/transaction/TransactionOutput.js +3 -0
  109. package/dist/cjs/src/transaction/TransactionOutput.js.map +1 -0
  110. package/dist/cjs/src/transaction/broadcasters/ARC.js +101 -0
  111. package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -0
  112. package/dist/cjs/src/transaction/broadcasters/index.js +9 -0
  113. package/dist/cjs/src/transaction/broadcasters/index.js.map +1 -0
  114. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js +69 -0
  115. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -0
  116. package/dist/cjs/src/transaction/fee-models/index.js +9 -0
  117. package/dist/cjs/src/transaction/fee-models/index.js.map +1 -0
  118. package/dist/cjs/src/transaction/index.js +11 -0
  119. package/dist/cjs/src/transaction/index.js.map +1 -0
  120. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  121. package/dist/esm/mod.js +9 -0
  122. package/dist/esm/mod.js.map +1 -0
  123. package/dist/esm/src/compat/BIP39.js +272 -0
  124. package/dist/esm/src/compat/BIP39.js.map +1 -0
  125. package/dist/esm/src/compat/BSM.js +45 -0
  126. package/dist/esm/src/compat/BSM.js.map +1 -0
  127. package/dist/esm/src/compat/ECIES.js +454 -0
  128. package/dist/esm/src/compat/ECIES.js.map +1 -0
  129. package/dist/esm/src/compat/HD.js +304 -0
  130. package/dist/esm/src/compat/HD.js.map +1 -0
  131. package/dist/esm/src/compat/Mnemonic.js +272 -0
  132. package/dist/esm/src/compat/Mnemonic.js.map +1 -0
  133. package/dist/esm/src/compat/bip-39-wordlist-en.js +2054 -0
  134. package/dist/esm/src/compat/bip-39-wordlist-en.js.map +1 -0
  135. package/dist/esm/src/compat/index.js +5 -0
  136. package/dist/esm/src/compat/index.js.map +1 -0
  137. package/dist/esm/src/messages/EncryptedMessage.js +61 -0
  138. package/dist/esm/src/messages/EncryptedMessage.js.map +1 -0
  139. package/dist/esm/src/messages/SignedMessage.js +77 -0
  140. package/dist/esm/src/messages/SignedMessage.js.map +1 -0
  141. package/dist/esm/src/messages/index.js +3 -0
  142. package/dist/esm/src/messages/index.js.map +1 -0
  143. package/dist/esm/src/primitives/AESGCM.js +371 -0
  144. package/dist/esm/src/primitives/AESGCM.js.map +1 -0
  145. package/dist/esm/src/primitives/BasePoint.js +16 -0
  146. package/dist/esm/src/primitives/BasePoint.js.map +1 -0
  147. package/dist/esm/src/primitives/BigNumber.js +4304 -0
  148. package/dist/esm/src/primitives/BigNumber.js.map +1 -0
  149. package/dist/esm/src/primitives/Curve.js +1141 -0
  150. package/dist/esm/src/primitives/Curve.js.map +1 -0
  151. package/dist/esm/src/primitives/DRBG.js +98 -0
  152. package/dist/esm/src/primitives/DRBG.js.map +1 -0
  153. package/dist/esm/src/primitives/ECDSA.js +161 -0
  154. package/dist/esm/src/primitives/ECDSA.js.map +1 -0
  155. package/dist/esm/src/primitives/Hash.js +1336 -0
  156. package/dist/esm/src/primitives/Hash.js.map +1 -0
  157. package/dist/esm/src/primitives/JacobianPoint.js +398 -0
  158. package/dist/esm/src/primitives/JacobianPoint.js.map +1 -0
  159. package/dist/esm/src/primitives/K256.js +105 -0
  160. package/dist/esm/src/primitives/K256.js.map +1 -0
  161. package/dist/esm/src/primitives/Mersenne.js +117 -0
  162. package/dist/esm/src/primitives/Mersenne.js.map +1 -0
  163. package/dist/esm/src/primitives/MontgomoryMethod.js +149 -0
  164. package/dist/esm/src/primitives/MontgomoryMethod.js.map +1 -0
  165. package/dist/esm/src/primitives/Point.js +816 -0
  166. package/dist/esm/src/primitives/Point.js.map +1 -0
  167. package/dist/esm/src/primitives/PrivateKey.js +184 -0
  168. package/dist/esm/src/primitives/PrivateKey.js.map +1 -0
  169. package/dist/esm/src/primitives/PublicKey.js +145 -0
  170. package/dist/esm/src/primitives/PublicKey.js.map +1 -0
  171. package/dist/esm/src/primitives/Random.js +56 -0
  172. package/dist/esm/src/primitives/Random.js.map +1 -0
  173. package/dist/esm/src/primitives/ReductionContext.js +486 -0
  174. package/dist/esm/src/primitives/ReductionContext.js.map +1 -0
  175. package/dist/esm/src/primitives/Signature.js +223 -0
  176. package/dist/esm/src/primitives/Signature.js.map +1 -0
  177. package/dist/esm/src/primitives/SymmetricKey.js +63 -0
  178. package/dist/esm/src/primitives/SymmetricKey.js.map +1 -0
  179. package/dist/esm/src/primitives/TransactionSignature.js +144 -0
  180. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -0
  181. package/dist/esm/src/primitives/index.js +9 -0
  182. package/dist/esm/src/primitives/index.js.map +1 -0
  183. package/dist/esm/src/primitives/utils.js +601 -0
  184. package/dist/esm/src/primitives/utils.js.map +1 -0
  185. package/dist/esm/src/script/LockingScript.js +29 -0
  186. package/dist/esm/src/script/LockingScript.js.map +1 -0
  187. package/dist/esm/src/script/OP.js +206 -0
  188. package/dist/esm/src/script/OP.js.map +1 -0
  189. package/dist/esm/src/script/Script.js +424 -0
  190. package/dist/esm/src/script/Script.js.map +1 -0
  191. package/dist/esm/src/script/ScriptChunk.js +2 -0
  192. package/dist/esm/src/script/ScriptChunk.js.map +1 -0
  193. package/dist/esm/src/script/ScriptTemplate.js +2 -0
  194. package/dist/esm/src/script/ScriptTemplate.js.map +1 -0
  195. package/dist/esm/src/script/Spend.js +1240 -0
  196. package/dist/esm/src/script/Spend.js.map +1 -0
  197. package/dist/esm/src/script/UnlockingScript.js +29 -0
  198. package/dist/esm/src/script/UnlockingScript.js.map +1 -0
  199. package/dist/esm/src/script/index.js +7 -0
  200. package/dist/esm/src/script/index.js.map +1 -0
  201. package/dist/esm/src/script/templates/P2PKH.js +92 -0
  202. package/dist/esm/src/script/templates/P2PKH.js.map +1 -0
  203. package/dist/esm/src/script/templates/RPuzzle.js +119 -0
  204. package/dist/esm/src/script/templates/RPuzzle.js.map +1 -0
  205. package/dist/esm/src/script/templates/index.js +3 -0
  206. package/dist/esm/src/script/templates/index.js.map +1 -0
  207. package/dist/esm/src/transaction/Broadcaster.js +2 -0
  208. package/dist/esm/src/transaction/Broadcaster.js.map +1 -0
  209. package/dist/esm/src/transaction/ChainTracker.js +2 -0
  210. package/dist/esm/src/transaction/ChainTracker.js.map +1 -0
  211. package/dist/esm/src/transaction/FeeModel.js +2 -0
  212. package/dist/esm/src/transaction/FeeModel.js.map +1 -0
  213. package/dist/esm/src/transaction/MerklePath.js +237 -0
  214. package/dist/esm/src/transaction/MerklePath.js.map +1 -0
  215. package/dist/esm/src/transaction/Transaction.js +557 -0
  216. package/dist/esm/src/transaction/Transaction.js.map +1 -0
  217. package/dist/esm/src/transaction/TransactionInput.js +2 -0
  218. package/dist/esm/src/transaction/TransactionInput.js.map +1 -0
  219. package/dist/esm/src/transaction/TransactionOutput.js +2 -0
  220. package/dist/esm/src/transaction/TransactionOutput.js.map +1 -0
  221. package/dist/esm/src/transaction/broadcasters/ARC.js +100 -0
  222. package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -0
  223. package/dist/esm/src/transaction/broadcasters/index.js +2 -0
  224. package/dist/esm/src/transaction/broadcasters/index.js.map +1 -0
  225. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js +71 -0
  226. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -0
  227. package/dist/esm/src/transaction/fee-models/index.js +2 -0
  228. package/dist/esm/src/transaction/fee-models/index.js.map +1 -0
  229. package/dist/esm/src/transaction/index.js +3 -0
  230. package/dist/esm/src/transaction/index.js.map +1 -0
  231. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  232. package/dist/types/mod.d.ts +9 -0
  233. package/dist/types/mod.d.ts.map +1 -0
  234. package/dist/types/src/compat/BIP39.d.ts +132 -0
  235. package/dist/types/src/compat/BIP39.d.ts.map +1 -0
  236. package/dist/types/src/compat/BSM.d.ts +28 -0
  237. package/dist/types/src/compat/BSM.d.ts.map +1 -0
  238. package/dist/types/src/compat/ECIES.d.ts +62 -0
  239. package/dist/types/src/compat/ECIES.d.ts.map +1 -0
  240. package/dist/types/src/compat/HD.d.ts +117 -0
  241. package/dist/types/src/compat/HD.d.ts.map +1 -0
  242. package/dist/types/src/compat/Mnemonic.d.ts +132 -0
  243. package/dist/types/src/compat/Mnemonic.d.ts.map +1 -0
  244. package/dist/types/src/compat/bip-39-wordlist-en.d.ts +5 -0
  245. package/dist/types/src/compat/bip-39-wordlist-en.d.ts.map +1 -0
  246. package/dist/types/src/compat/index.d.ts +5 -0
  247. package/dist/types/src/compat/index.d.ts.map +1 -0
  248. package/dist/types/src/messages/EncryptedMessage.d.ts +20 -0
  249. package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -0
  250. package/dist/types/src/messages/SignedMessage.d.ts +21 -0
  251. package/dist/types/src/messages/SignedMessage.d.ts.map +1 -0
  252. package/dist/types/src/messages/index.d.ts +3 -0
  253. package/dist/types/src/messages/index.d.ts.map +1 -0
  254. package/dist/types/src/primitives/AESGCM.d.ts +14 -0
  255. package/dist/types/src/primitives/AESGCM.d.ts.map +1 -0
  256. package/dist/types/src/primitives/BasePoint.d.ts +22 -0
  257. package/dist/types/src/primitives/BasePoint.d.ts.map +1 -0
  258. package/dist/types/src/primitives/BigNumber.d.ts +1895 -0
  259. package/dist/types/src/primitives/BigNumber.d.ts.map +1 -0
  260. package/dist/types/src/primitives/Curve.d.ts +55 -0
  261. package/dist/types/src/primitives/Curve.d.ts.map +1 -0
  262. package/dist/types/src/primitives/DRBG.d.ts +54 -0
  263. package/dist/types/src/primitives/DRBG.d.ts.map +1 -0
  264. package/dist/types/src/primitives/ECDSA.d.ts +39 -0
  265. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -0
  266. package/dist/types/src/primitives/Hash.d.ts +411 -0
  267. package/dist/types/src/primitives/Hash.d.ts.map +1 -0
  268. package/dist/types/src/primitives/JacobianPoint.d.ts +164 -0
  269. package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -0
  270. package/dist/types/src/primitives/K256.d.ts +53 -0
  271. package/dist/types/src/primitives/K256.d.ts.map +1 -0
  272. package/dist/types/src/primitives/Mersenne.d.ts +72 -0
  273. package/dist/types/src/primitives/Mersenne.d.ts.map +1 -0
  274. package/dist/types/src/primitives/MontgomoryMethod.d.ts +96 -0
  275. package/dist/types/src/primitives/MontgomoryMethod.d.ts.map +1 -0
  276. package/dist/types/src/primitives/Point.d.ts +303 -0
  277. package/dist/types/src/primitives/Point.d.ts.map +1 -0
  278. package/dist/types/src/primitives/PrivateKey.d.ts +143 -0
  279. package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -0
  280. package/dist/types/src/primitives/PublicKey.d.ts +108 -0
  281. package/dist/types/src/primitives/PublicKey.d.ts.map +1 -0
  282. package/dist/types/src/primitives/Random.d.ts +14 -0
  283. package/dist/types/src/primitives/Random.d.ts.map +1 -0
  284. package/dist/types/src/primitives/ReductionContext.d.ts +308 -0
  285. package/dist/types/src/primitives/ReductionContext.d.ts.map +1 -0
  286. package/dist/types/src/primitives/Signature.d.ts +100 -0
  287. package/dist/types/src/primitives/Signature.d.ts.map +1 -0
  288. package/dist/types/src/primitives/SymmetricKey.d.ts +44 -0
  289. package/dist/types/src/primitives/SymmetricKey.d.ts.map +1 -0
  290. package/dist/types/src/primitives/TransactionSignature.d.ts +36 -0
  291. package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -0
  292. package/dist/types/src/primitives/index.d.ts +9 -0
  293. package/dist/types/src/primitives/index.d.ts.map +1 -0
  294. package/dist/types/src/primitives/utils.d.ts +118 -0
  295. package/dist/types/src/primitives/utils.d.ts.map +1 -0
  296. package/dist/types/src/script/LockingScript.d.ts +25 -0
  297. package/dist/types/src/script/LockingScript.d.ts.map +1 -0
  298. package/dist/types/src/script/OP.d.ts +193 -0
  299. package/dist/types/src/script/OP.d.ts.map +1 -0
  300. package/dist/types/src/script/Script.d.ts +148 -0
  301. package/dist/types/src/script/Script.d.ts.map +1 -0
  302. package/dist/types/src/script/ScriptChunk.d.ts +8 -0
  303. package/dist/types/src/script/ScriptChunk.d.ts.map +1 -0
  304. package/dist/types/src/script/ScriptTemplate.d.ts +33 -0
  305. package/dist/types/src/script/ScriptTemplate.d.ts.map +1 -0
  306. package/dist/types/src/script/Spend.d.ts +103 -0
  307. package/dist/types/src/script/Spend.d.ts.map +1 -0
  308. package/dist/types/src/script/UnlockingScript.d.ts +25 -0
  309. package/dist/types/src/script/UnlockingScript.d.ts.map +1 -0
  310. package/dist/types/src/script/index.d.ts +8 -0
  311. package/dist/types/src/script/index.d.ts.map +1 -0
  312. package/dist/types/src/script/templates/P2PKH.d.ts +37 -0
  313. package/dist/types/src/script/templates/P2PKH.d.ts.map +1 -0
  314. package/dist/types/src/script/templates/RPuzzle.d.ts +47 -0
  315. package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -0
  316. package/dist/types/src/script/templates/index.d.ts +3 -0
  317. package/dist/types/src/script/templates/index.d.ts.map +1 -0
  318. package/dist/types/src/transaction/Broadcaster.d.ts +39 -0
  319. package/dist/types/src/transaction/Broadcaster.d.ts.map +1 -0
  320. package/dist/types/src/transaction/ChainTracker.d.ts +23 -0
  321. package/dist/types/src/transaction/ChainTracker.d.ts.map +1 -0
  322. package/dist/types/src/transaction/FeeModel.d.ts +12 -0
  323. package/dist/types/src/transaction/FeeModel.d.ts.map +1 -0
  324. package/dist/types/src/transaction/MerklePath.d.ts +91 -0
  325. package/dist/types/src/transaction/MerklePath.d.ts.map +1 -0
  326. package/dist/types/src/transaction/Transaction.d.ts +181 -0
  327. package/dist/types/src/transaction/Transaction.d.ts.map +1 -0
  328. package/dist/types/src/transaction/TransactionInput.d.ts +63 -0
  329. package/dist/types/src/transaction/TransactionInput.d.ts.map +1 -0
  330. package/dist/types/src/transaction/TransactionOutput.d.ts +36 -0
  331. package/dist/types/src/transaction/TransactionOutput.d.ts.map +1 -0
  332. package/dist/types/src/transaction/broadcasters/ARC.d.ts +28 -0
  333. package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -0
  334. package/dist/types/src/transaction/broadcasters/index.d.ts +2 -0
  335. package/dist/types/src/transaction/broadcasters/index.d.ts.map +1 -0
  336. package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts +26 -0
  337. package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts.map +1 -0
  338. package/dist/types/src/transaction/fee-models/index.d.ts +2 -0
  339. package/dist/types/src/transaction/fee-models/index.d.ts.map +1 -0
  340. package/dist/types/src/transaction/index.d.ts +7 -0
  341. package/dist/types/src/transaction/index.d.ts.map +1 -0
  342. package/dist/types/tsconfig.types.tsbuildinfo +1 -0
  343. package/docs/README.md +9 -0
  344. package/docs/compat.md +2856 -0
  345. package/docs/getting-started/COMMONJS.md +94 -0
  346. package/docs/getting-started/REACT-TS.md +131 -0
  347. package/docs/getting-started/TS-NODE.md +106 -0
  348. package/docs/getting-started/VUE.md +103 -0
  349. package/docs/messages.md +146 -0
  350. package/docs/primitives.md +7440 -0
  351. package/docs/script.md +766 -0
  352. package/docs/transaction.md +741 -0
  353. package/jest.config.js +6 -0
  354. package/mod.ts +8 -0
  355. package/package.json +137 -0
  356. package/src/compat/BSM.ts +51 -0
  357. package/src/compat/ECIES.ts +557 -0
  358. package/src/compat/HD.ts +348 -0
  359. package/src/compat/Mnemonic.ts +295 -0
  360. package/src/compat/__tests/BSM.test.ts +38 -0
  361. package/src/compat/__tests/ECIES.test.ts +90 -0
  362. package/src/compat/__tests/HD.test.ts +405 -0
  363. package/src/compat/__tests/Mnemonic.test.ts +177 -0
  364. package/src/compat/__tests/Mnemonic.vectors.ts +172 -0
  365. package/src/compat/bip-39-wordlist-en.ts +2053 -0
  366. package/src/compat/index.ts +4 -0
  367. package/src/messages/EncryptedMessage.ts +70 -0
  368. package/src/messages/SignedMessage.ts +87 -0
  369. package/src/messages/__tests/EncryptedMessage.test.ts +36 -0
  370. package/src/messages/__tests/SignedMessage.test.ts +53 -0
  371. package/src/messages/index.ts +2 -0
  372. package/src/primitives/AESGCM.ts +479 -0
  373. package/src/primitives/BasePoint.ts +21 -0
  374. package/src/primitives/BigNumber.ts +4619 -0
  375. package/src/primitives/Curve.ts +1163 -0
  376. package/src/primitives/DRBG.ts +102 -0
  377. package/src/primitives/ECDSA.ts +164 -0
  378. package/src/primitives/Hash.ts +1420 -0
  379. package/src/primitives/JacobianPoint.ts +410 -0
  380. package/src/primitives/K256.ts +116 -0
  381. package/src/primitives/Mersenne.ts +123 -0
  382. package/src/primitives/MontgomoryMethod.ts +160 -0
  383. package/src/primitives/Point.ts +852 -0
  384. package/src/primitives/PrivateKey.ts +195 -0
  385. package/src/primitives/PublicKey.ts +154 -0
  386. package/src/primitives/Random.ts +55 -0
  387. package/src/primitives/ReductionContext.ts +528 -0
  388. package/src/primitives/Signature.ts +235 -0
  389. package/src/primitives/SymmetricKey.ts +75 -0
  390. package/src/primitives/TransactionSignature.ts +189 -0
  391. package/src/primitives/__tests/AESGCM.test.ts +338 -0
  392. package/src/primitives/__tests/BRC42.private.vectors.ts +33 -0
  393. package/src/primitives/__tests/BRC42.public.vectors.ts +33 -0
  394. package/src/primitives/__tests/BigNumber.arithmatic.test.ts +572 -0
  395. package/src/primitives/__tests/BigNumber.binary.test.ts +203 -0
  396. package/src/primitives/__tests/BigNumber.constructor.test.ts +176 -0
  397. package/src/primitives/__tests/BigNumber.dhGroup.test.ts +18 -0
  398. package/src/primitives/__tests/BigNumber.fixtures.ts +264 -0
  399. package/src/primitives/__tests/BigNumber.serializers.test.ts +157 -0
  400. package/src/primitives/__tests/BigNumber.utils.test.ts +347 -0
  401. package/src/primitives/__tests/Curve.unit.test.ts +192 -0
  402. package/src/primitives/__tests/DRBG.test.ts +18 -0
  403. package/src/primitives/__tests/DRBG.vectors.ts +167 -0
  404. package/src/primitives/__tests/ECDH.test.ts +31 -0
  405. package/src/primitives/__tests/ECDSA.test.ts +58 -0
  406. package/src/primitives/__tests/HMAC.test.ts +59 -0
  407. package/src/primitives/__tests/Hash.test.ts +121 -0
  408. package/src/primitives/__tests/PBKDF2.vectors.ts +119 -0
  409. package/src/primitives/__tests/PrivateKey.test.ts +17 -0
  410. package/src/primitives/__tests/PublicKey.test.ts +66 -0
  411. package/src/primitives/__tests/Random.test.ts +14 -0
  412. package/src/primitives/__tests/Reader.test.ts +296 -0
  413. package/src/primitives/__tests/ReductionContext.test.ts +279 -0
  414. package/src/primitives/__tests/SymmetricKey.test.ts +58 -0
  415. package/src/primitives/__tests/SymmetricKey.vectors.ts +40 -0
  416. package/src/primitives/__tests/Writer.test.ts +198 -0
  417. package/src/primitives/__tests/sighash.vectors.ts +3503 -0
  418. package/src/primitives/__tests/utils.test.ts +108 -0
  419. package/src/primitives/index.ts +8 -0
  420. package/src/primitives/utils.ts +665 -0
  421. package/src/script/LockingScript.ts +30 -0
  422. package/src/script/OP.ts +219 -0
  423. package/src/script/Script.ts +426 -0
  424. package/src/script/ScriptChunk.ts +7 -0
  425. package/src/script/ScriptTemplate.ts +36 -0
  426. package/src/script/Spend.ts +1379 -0
  427. package/src/script/UnlockingScript.ts +30 -0
  428. package/src/script/__tests/Script.test.ts +369 -0
  429. package/src/script/__tests/Spend.test.ts +248 -0
  430. package/src/script/__tests/script.invalid.vectors.ts +925 -0
  431. package/src/script/__tests/script.valid.vectors.ts +1120 -0
  432. package/src/script/__tests/scriptFromVector.ts +42 -0
  433. package/src/script/__tests/spend.valid.vectors.ts +2288 -0
  434. package/src/script/index.ts +7 -0
  435. package/src/script/templates/P2PKH.ts +109 -0
  436. package/src/script/templates/RPuzzle.ts +140 -0
  437. package/src/script/templates/index.ts +2 -0
  438. package/src/transaction/Broadcaster.ts +42 -0
  439. package/src/transaction/ChainTracker.ts +22 -0
  440. package/src/transaction/FeeModel.ts +13 -0
  441. package/src/transaction/MerklePath.ts +259 -0
  442. package/src/transaction/Transaction.ts +602 -0
  443. package/src/transaction/TransactionInput.ts +63 -0
  444. package/src/transaction/TransactionOutput.ts +37 -0
  445. package/src/transaction/__tests/MerklePath.test.ts +181 -0
  446. package/src/transaction/__tests/Transaction.test.ts +413 -0
  447. package/src/transaction/__tests/bigtx.vectors.ts +4 -0
  448. package/src/transaction/__tests/bump.invalid.vectors.ts +8 -0
  449. package/src/transaction/__tests/bump.valid.vectors.ts +4 -0
  450. package/src/transaction/__tests/tx.invalid.vectors.ts +281 -0
  451. package/src/transaction/__tests/tx.valid.vectors.ts +364 -0
  452. package/src/transaction/broadcasters/ARC.ts +106 -0
  453. package/src/transaction/broadcasters/__tests/ARC.test.ts +115 -0
  454. package/src/transaction/broadcasters/index.ts +1 -0
  455. package/src/transaction/fee-models/SatoshisPerKilobyte.ts +71 -0
  456. package/src/transaction/fee-models/index.ts +1 -0
  457. package/src/transaction/index.ts +6 -0
  458. package/ts2md.json +5 -0
  459. package/tsconfig.base.json +26 -0
  460. package/tsconfig.cjs.json +11 -0
  461. package/tsconfig.eslint.json +12 -0
  462. package/tsconfig.esm.json +9 -0
  463. package/tsconfig.json +17 -0
  464. package/tsconfig.types.json +11 -0
@@ -0,0 +1,279 @@
1
+ /* eslint-env jest */
2
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
3
+ import ReductionContext from '../../../dist/cjs/src/primitives/ReductionContext'
4
+ import MontgomoryMethod from '../../../dist/cjs/src/primitives/MontgomoryMethod'
5
+ import K256 from '../../../dist/cjs/src/primitives/K256'
6
+
7
+ describe('BN.js/Reduction context', function () {
8
+ const testMethod = (name: string, Method): void => {
9
+ describe(name + ' method', function () {
10
+ it('should support add, iadd, sub, isub operations', () => {
11
+ const p = new BigNumber(257)
12
+ const m = new Method(p)
13
+ const a = new BigNumber(123).toRed(m)
14
+ const b = new BigNumber(231).toRed(m)
15
+
16
+ expect(a.redAdd(b).fromRed().toString(10)).toEqual('97')
17
+ expect(a.redSub(b).fromRed().toString(10)).toEqual('149')
18
+ expect(b.redSub(a).fromRed().toString(10)).toEqual('108')
19
+
20
+ expect(a.clone().redIAdd(b).fromRed().toString(10)).toEqual('97')
21
+ expect(a.clone().redISub(b).fromRed().toString(10)).toEqual('149')
22
+ expect(b.clone().redISub(a).fromRed().toString(10)).toEqual('108')
23
+ })
24
+
25
+ it('should support pow and mul operations', () => {
26
+ const p192 = new BigNumber(
27
+ 'fffffffffffffffffffffffffffffffeffffffffffffffff',
28
+ 16)
29
+ const m = new Method(p192)
30
+ const a = new BigNumber(123)
31
+ const b = new BigNumber(231)
32
+ const c = a.toRed(m).redMul(b.toRed(m)).fromRed()
33
+ expect(c.cmp(a.mul(b).mod(p192))).toEqual(0)
34
+
35
+ expect(a.toRed(m).redPow(new BigNumber(0)).fromRed()
36
+ .cmp(new BigNumber(1))).toEqual(0)
37
+ expect(a.toRed(m).redPow(new BigNumber(3)).fromRed()
38
+ .cmp(a.sqr().mul(a))).toEqual(0)
39
+ expect(a.toRed(m).redPow(new BigNumber(4)).fromRed()
40
+ .cmp(a.sqr().sqr())).toEqual(0)
41
+ expect(a.toRed(m).redPow(new BigNumber(8)).fromRed()
42
+ .cmp(a.sqr().sqr().sqr())).toEqual(0)
43
+ expect(a.toRed(m).redPow(new BigNumber(9)).fromRed()
44
+ .cmp(a.sqr().sqr().sqr().mul(a))).toEqual(0)
45
+ expect(a.toRed(m).redPow(new BigNumber(17)).fromRed()
46
+ .cmp(a.sqr().sqr().sqr().sqr().mul(a))).toEqual(0)
47
+ expect(
48
+ a.toRed(m).redPow(new BigNumber('deadbeefabbadead', 16)).fromRed()
49
+ .toString(16)).toEqual('3aa0e7e304e320b68ef61592bcb00341866d6fa66e11a4d6')
50
+ })
51
+
52
+ it('should sqrtm numbers', () => {
53
+ let p = new BigNumber(263)
54
+ let m = new Method(p)
55
+ let q = new BigNumber(11).toRed(m)
56
+
57
+ let qr = q.redSqrt()
58
+ expect(qr.redSqr().cmp(q)).toEqual(0)
59
+
60
+ qr = q.redSqrt()
61
+ expect(qr.redSqr().cmp(q)).toEqual(0)
62
+
63
+ p = new BigNumber(
64
+ 'fffffffffffffffffffffffffffffffeffffffffffffffff',
65
+ 16)
66
+ m = new Method(p)
67
+
68
+ q = new BigNumber(13).toRed(m)
69
+ qr = q.redSqrt(/* true, p */)
70
+ expect(qr.redSqr().cmp(q)).toEqual(0)
71
+
72
+ qr = q.redSqrt(/* false, p */)
73
+ expect(qr.redSqr().cmp(q)).toEqual(0)
74
+
75
+ // Tonelli-shanks
76
+ p = new BigNumber(13)
77
+ m = new Method(p)
78
+ q = new BigNumber(10).toRed(m)
79
+ expect(q.redSqrt().fromRed().toString(10)).toEqual('7')
80
+ })
81
+
82
+ it('should invm numbers', function () {
83
+ const p = new BigNumber(257)
84
+ const m = new Method(p)
85
+ const a = new BigNumber(3).toRed(m)
86
+ const b = a.redInvm()
87
+ expect(a.redMul(b).fromRed().toString(16)).toEqual('1')
88
+ })
89
+
90
+ it('should invm numbers (regression)', function () {
91
+ const p = new BigNumber(
92
+ 'ffffffff00000001000000000000000000000000ffffffffffffffffffffffff',
93
+ 16)
94
+ let a = new BigNumber(
95
+ 'e1d969b8192fbac73ea5b7921896d6a2263d4d4077bb8e5055361d1f7f8163f3',
96
+ 16)
97
+
98
+ const m = new Method(p)
99
+ a = a.toRed(m)
100
+
101
+ expect(a.redInvm().fromRed().negative).toEqual(0)
102
+ })
103
+
104
+ it('should imul numbers', function () {
105
+ const p = new BigNumber(
106
+ 'fffffffffffffffffffffffffffffffeffffffffffffffff',
107
+ 16)
108
+ const m = new Method(p)
109
+
110
+ const a = new BigNumber('deadbeefabbadead', 16)
111
+ const b = new BigNumber('abbadeadbeefdead', 16)
112
+ const c = a.mul(b).mod(p)
113
+
114
+ expect(a.toRed(m).redIMul(b.toRed(m)).fromRed().toString(16))
115
+ .toEqual(c.toString(16))
116
+ })
117
+
118
+ it('should pow(base, 0) == 1', function () {
119
+ const base = new BigNumber(256).toRed(new ReductionContext('k256'))
120
+ const exponent = new BigNumber(0)
121
+ const result = base.redPow(exponent)
122
+ expect(result.toString()).toEqual('1')
123
+ })
124
+
125
+ it('should shl numbers', function () {
126
+ const base = new BigNumber(256).toRed(new ReductionContext('k256'))
127
+ const result = base.redShl(1)
128
+ expect(result.toString()).toEqual('512')
129
+ })
130
+
131
+ it('should reduce when converting to red', function () {
132
+ const p = new BigNumber(257)
133
+ const m = new Method(p)
134
+ const a = new BigNumber(5).toRed(m)
135
+
136
+ expect(() => {
137
+ const b = a.redISub(new BigNumber(512).toRed(m))
138
+ b.redISub(new BigNumber(512).toRed(m))
139
+ }).not.toThrow()
140
+ })
141
+
142
+ it('redNeg and zero value', function () {
143
+ const a = new BigNumber(0).toRed(new ReductionContext('k256')).redNeg()
144
+ expect(a.isZero()).toEqual(true)
145
+ })
146
+
147
+ it('should not allow modulus <= 1', function () {
148
+ expect(() => {
149
+ return new ReductionContext(new BigNumber(0))
150
+ }).toThrow(new Error('modulus must be greater than 1'))
151
+
152
+ expect(() => {
153
+ return new ReductionContext(new BigNumber(1))
154
+ }).toThrow(new Error('modulus must be greater than 1'))
155
+
156
+ expect(() => {
157
+ return new ReductionContext(new BigNumber(2))
158
+ }).not.toThrow()
159
+ })
160
+ })
161
+ }
162
+
163
+ testMethod('Plain', ReductionContext)
164
+ testMethod('Montgomery', MontgomoryMethod)
165
+
166
+ describe('Pseudo-Mersenne Primes', function () {
167
+ it('should reduce numbers mod k256', function () {
168
+ const p = new K256()
169
+
170
+ expect(p.ireduce(new BigNumber(0xdead)).toString(16)).toEqual('dead')
171
+ expect(p.ireduce(new BigNumber('deadbeef', 16)).toString(16)).toEqual('deadbeef')
172
+
173
+ const num = new BigNumber(
174
+ 'fedcba9876543210fedcba9876543210dead' +
175
+ 'fedcba9876543210fedcba9876543210dead',
176
+ 16)
177
+ let exp = num.mod(p.p).toString(16)
178
+ expect(p.ireduce(num).toString(16)).toEqual(exp)
179
+
180
+ const regr = new BigNumber(
181
+ 'f7e46df64c1815962bf7bc9c56128798' +
182
+ '3f4fcef9cb1979573163b477eab93959' +
183
+ '335dfb29ef07a4d835d22aa3b6797760' +
184
+ '70a8b8f59ba73d56d01a79af9',
185
+ 16)
186
+ exp = regr.mod(p.p).toString(16)
187
+
188
+ expect(p.ireduce(regr).toString(16)).toEqual(exp)
189
+ })
190
+
191
+ it('should not fail to invm number mod k256', function () {
192
+ let regr2 = new BigNumber(
193
+ '6c150c4aa9a8cf1934485d40674d4a7cd494675537bda36d49405c5d2c6f496f', 16)
194
+ regr2 = regr2.toRed(new ReductionContext('k256'))
195
+ expect(regr2.redInvm().redMul(regr2).fromRed().cmpn(1)).toEqual(0)
196
+ })
197
+
198
+ it('should correctly square the number', function () {
199
+ const p = new K256().p
200
+ const red = new ReductionContext('k256')
201
+
202
+ const n = new BigNumber(
203
+ '9cd8cb48c3281596139f147c1364a3ed' +
204
+ 'e88d3f310fdb0eb98c924e599ca1b3c9',
205
+ 16)
206
+ const expected = n.sqr().mod(p)
207
+ const actual = n.toRed(red).redSqr().fromRed()
208
+
209
+ expect(actual.toString(16)).toEqual(expected.toString(16))
210
+ })
211
+
212
+ it('redISqr should return right result', function () {
213
+ const n = new BigNumber('30f28939', 16)
214
+ const actual = n.toRed(new ReductionContext('k256')).redISqr().fromRed()
215
+ expect(actual.toString(16)).toEqual('95bd93d19520eb1')
216
+ })
217
+ })
218
+
219
+ it('should avoid 4.1.0 regresion', function () {
220
+ const bits2int = (obits, q): BigNumber => {
221
+ const bits = new BigNumber(obits)
222
+ const shift = (obits.length << 3) - q.bitLength()
223
+ if (shift > 0) {
224
+ bits.ishrn(shift)
225
+ }
226
+ return bits
227
+ }
228
+ const t = Buffer.from('aff1651e4cd6036d57aa8b2a05ccf1a9d5a40166340ecbbdc55' +
229
+ 'be10b568aa0aa3d05ce9a2fcec9df8ed018e29683c6051cb83e' +
230
+ '46ce31ba4edb045356a8d0d80b', 'hex')
231
+ const g = new BigNumber(
232
+ '5c7ff6b06f8f143fe8288433493e4769c4d988ace5be25a0e24809670' +
233
+ '716c613d7b0cee6932f8faa7c44d2cb24523da53fbe4f6ec3595892d1' +
234
+ 'aa58c4328a06c46a15662e7eaa703a1decf8bbb2d05dbe2eb956c142a' +
235
+ '338661d10461c0d135472085057f3494309ffa73c611f78b32adbb574' +
236
+ '0c361c9f35be90997db2014e2ef5aa61782f52abeb8bd6432c4dd097b' +
237
+ 'c5423b285dafb60dc364e8161f4a2a35aca3a10b1c4d203cc76a470a3' +
238
+ '3afdcbdd92959859abd8b56e1725252d78eac66e71ba9ae3f1dd24871' +
239
+ '99874393cd4d832186800654760e1e34c09e4d155179f9ec0dc4473f9' +
240
+ '96bdce6eed1cabed8b6f116f7ad9cf505df0f998e34ab27514b0ffe7',
241
+ 16)
242
+ const p = new BigNumber(
243
+ '9db6fb5951b66bb6fe1e140f1d2ce5502374161fd6538df1648218642' +
244
+ 'f0b5c48c8f7a41aadfa187324b87674fa1822b00f1ecf8136943d7c55' +
245
+ '757264e5a1a44ffe012e9936e00c1d3e9310b01c7d179805d3058b2a9' +
246
+ 'f4bb6f9716bfe6117c6b5b3cc4d9be341104ad4a80ad6c94e005f4b99' +
247
+ '3e14f091eb51743bf33050c38de235567e1b34c3d6a5c0ceaa1a0f368' +
248
+ '213c3d19843d0b4b09dcb9fc72d39c8de41f1bf14d4bb4563ca283716' +
249
+ '21cad3324b6a2d392145bebfac748805236f5ca2fe92b871cd8f9c36d' +
250
+ '3292b5509ca8caa77a2adfc7bfd77dda6f71125a7456fea153e433256' +
251
+ 'a2261c6a06ed3693797e7995fad5aabbcfbe3eda2741e375404ae25b',
252
+ 16)
253
+ const q = new BigNumber('f2c3119374ce76c9356990b465374a17f23f9ed35089bd969f61c6dde' +
254
+ '9998c1f', 16)
255
+ const k = bits2int(t, q)
256
+ const expectedR = '89ec4bb1400eccff8e7d9aa515cd1de7803f2daff09693ee7fd1353e' +
257
+ '90a68307'
258
+ const r = g.toRed(new MontgomoryMethod(p)).redPow(k).fromRed().mod(q)
259
+ expect(r.toString(16)).toEqual(expectedR)
260
+ })
261
+
262
+ it('K256.split for 512 bits number should return equal numbers', function () {
263
+ const red = new ReductionContext('k256')
264
+ const input = new BigNumber(1).iushln(512).subn(1)
265
+ expect(input.bitLength()).toEqual(512)
266
+ const output = new BigNumber(0)
267
+ red.prime?.split(input, output)
268
+ expect(input.cmp(output)).toEqual(0)
269
+ })
270
+
271
+ it('imod should change host object', function () {
272
+ const red = new ReductionContext(new BigNumber(13))
273
+ const a = new BigNumber(2).toRed(red)
274
+ const b = new BigNumber(7).toRed(red)
275
+ const c = a.redIMul(b)
276
+ expect(a.toNumber()).toEqual(1)
277
+ expect(c.toNumber()).toEqual(1)
278
+ })
279
+ })
@@ -0,0 +1,58 @@
1
+ import SymmetricKey from '../../../dist/cjs/src/primitives/SymmetricKey'
2
+ import vectors from './SymmetricKey.vectors'
3
+
4
+ const KEYS: SymmetricKey[] = [
5
+ new SymmetricKey('5a90d59d829197983a54d887fdea2dc4c38098f00ba3110f2645633b6ea11458', 16),
6
+ new SymmetricKey('bac6ac492f54d7c997fadc1be593a4ace26ecdf37d30b3ad12f34077fb2629e4', 16),
7
+ new SymmetricKey('53dcdc6ea6a6910af35a48708f49228e0e6661ea885435080cbabc58e6a14f10', 16)
8
+ ]
9
+
10
+ const PLAINTEXT_1 = 'hello there'
11
+ const CIPHERTEXT_1 = '8c8d25348dfd5240be833215a123173c64919779ab8845a700a4520311504c168ade2d4b728cc53a254f0aba857caaf6af97453ac2ff61487d0d52'
12
+
13
+ describe('SymmetricKey', () => {
14
+ it('Produces output that can be decrypted', () => {
15
+ const originalValue = 'a thing to encrypt'
16
+ const encryptedValue = KEYS[2].encrypt(originalValue)
17
+ const decryptedValue = KEYS[2].decrypt(encryptedValue, 'utf8')
18
+ expect(originalValue).toEqual(decryptedValue)
19
+ })
20
+ it('Encrypts values as an array', () => {
21
+ const originalValue = [42, 99, 33, 0, 1]
22
+ const encryptedValue = KEYS[2].encrypt(
23
+ originalValue
24
+ )
25
+ const decryptedValue = KEYS[2].decrypt(
26
+ encryptedValue
27
+ )
28
+ expect(originalValue).toEqual(decryptedValue)
29
+ })
30
+ it('Decrypts a correctly-encrypted value', () => {
31
+ const result = KEYS[0].decrypt(CIPHERTEXT_1, 'hex') as string
32
+ expect(Buffer.from(result, 'hex').toString('utf8')).toEqual(PLAINTEXT_1)
33
+ })
34
+ it('Throws a useful error when decryption fails', () => {
35
+ expect(() => {
36
+ KEYS[2].decrypt(
37
+ CIPHERTEXT_1,
38
+ 'hex'
39
+ )
40
+ }).toThrow(new Error('Decryption failed!'))
41
+ })
42
+ it('decrypts values encrypted with the encrypt function', () => {
43
+ const originalValue = 'secret value'
44
+ const encryptedValue = KEYS[1].encrypt(originalValue)
45
+ const decryptedValue = KEYS[1].decrypt(encryptedValue, 'utf8')
46
+ expect(originalValue).toEqual(decryptedValue)
47
+ })
48
+ vectors.forEach((vector, index) => {
49
+ it(`Should pass test vector #${index + 1}`, () => {
50
+ const key = new SymmetricKey([...Buffer.from(vector.key, 'base64')])
51
+ const result = key.decrypt(
52
+ [...Buffer.from(vector.ciphertext, 'base64')],
53
+ 'hex'
54
+ )
55
+ expect(result).toEqual(Buffer.from(vector.plaintext).toString('hex'))
56
+ })
57
+ })
58
+ })
@@ -0,0 +1,40 @@
1
+ /**
2
+ * These vectors check our implementation of AES-GCM encryption.
3
+ *
4
+ * The first 32 bytes of the ciphertext contain the initialization vector and
5
+ * the rest is the AES-GCM ciphertext.
6
+ *
7
+ * The plaintext is whatever we want to encrypt represented as a string.
8
+ *
9
+ * Because the initialization vector is generated randomly during the
10
+ * encryption process, we cannot use determanistic test vectors to test the
11
+ * encrypt functionality. Therefore, only the test runner for the decrypt
12
+ * function will execute and validate against the vectors.
13
+ */
14
+ export default [
15
+ {
16
+ ciphertext: '1cf74FpvW0koFZk5e1VQcCtF7UdLj9mtN/L9loFlXwhf6w/06THwVirsvDShuT/KlOjO/HFALj8AcGLU1KRs4zNJDaX2wNebuPkH+qp5N/0cp3fZxgFzHJB3jBPDcdFi8O9WXIBLx9jUQ5KFQk0mZCB2k90VniInWuzqqOQAQQlBy2rgBWp4xg==',
17
+ key: 'LIe9CoVXxDDDKt9F4j2lE+GP4oPcMElwyX+LVsuRLqw=',
18
+ plaintext: '5+w9tts+i14GDfPSEJwcaAfce7zVLC7wsRAMnCBqIczkqL08I05FZTl7n14H9hnPkS7HBm3EGWNDKCZ64ckCGg=='
19
+ },
20
+ {
21
+ ciphertext: 'IFh45HxwvK7wgIZr5UDxvUiEkvjsXVV6VIksaEQoTNCPleaRxE1CE1eZj5ZSPa/Mo2HXa2kvEmVAMslY12gMb7qHAHT2fSORB8TJKubKcjwGUrRxqOWvk24lv7QKhq3uhKkJxZSkPBZS6UM+xX+x7Mb53CoC8Z+7Ork50wGRAA415C+T8FIluA==',
22
+ key: 'Di30+CTH8yKVJfXmbkRU6DOesD042IkjZCbFL1lnNqY=',
23
+ plaintext: '6pHqDrkIuGmWIpB1spu30PP848D04WlERSjrEZ/JD0jfdS814cOjs4MFkePT1IHeM4+qGFwAMk7HKgWShOKFDQ=='
24
+ },
25
+ {
26
+ ciphertext: 'JeUMCTX3hW7uH7Njfqjtjxd/8jB0Uj4eLLbLNBSMqF3XJmtq2oyX/WWS1po8cwn7jrcK0k8mVxHax/DctH6CIDMc0udBxWYLDyftvIYr448otWmn2IKQN4d3Bh2PKdiIQOo36DO2wOy+T2OJSmJ2XvAkenSZIckCdPIQVpeIi7Bt2ZpHmkObkg==',
27
+ key: 'v7kFn4JdB3OVVjy8lk7UTvWe0vY5Qyzn64Q0EVoezlU=',
28
+ plaintext: 'bSYHdJn15pcsaI8CNmfjKQ3ZvMg7zBaxuxBqyWBmCLdqj29bK54C26G1mx5e605hDrFpuJoNSDTECrk67ebffA=='
29
+ },
30
+ {
31
+ ciphertext: 'ktpzKolKsvtWrvLl0yMdGvh5ngd1hiaNcC1b5yuzo2DEKO/4S7gePO/CWOmW/dloHhzfbBQH9rKDFKK7xHHgqYRc',
32
+ key: 'qIgnjD0FfGVMiWo107bP0oHsLA402lhC7AYUFIKY1KQ=',
33
+ plaintext: 'A cat and a mouse.'
34
+ },
35
+ {
36
+ ciphertext: 'vremTalPp+NxN/loEtLMB94tEymdFk2TfBoTWNYcf4sQqYSNkx2WPdJ4LxrIsGuIg9KMOt7FOcIpDb6rRVpP',
37
+ key: 'K7E/bf3wp6hrVeW0V1KvFJS5JZMhyxwPHCIW6wKBTb0=',
38
+ plaintext: 'üñîçø∂é'
39
+ }
40
+ ]
@@ -0,0 +1,198 @@
1
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
2
+ import { Reader, Writer, encode } from '../../../dist/cjs/src/primitives/utils'
3
+
4
+ describe('Writer', () => {
5
+ it('should create a new buffer writer', () => {
6
+ const bw = new Writer()
7
+ expect(bw).toBeDefined()
8
+ })
9
+
10
+ describe('#getLength', () => {
11
+ it('should compute length correctly of two 2 byte buffers', () => {
12
+ const buf1 = Buffer.from('0000', 'hex')
13
+ const buf2 = Buffer.from('0000', 'hex')
14
+ const bw = new Writer().write(buf1).write(buf2)
15
+ expect(bw.getLength()).toEqual(4)
16
+ })
17
+ })
18
+
19
+ describe('#toArray', () => {
20
+ it('should concat these two bufs', () => {
21
+ const buf1 = [0]
22
+ const buf2 = [1]
23
+ const bw = new Writer([buf1, buf2])
24
+ expect(encode(bw.toArray(), 'hex')).toEqual('0001')
25
+ })
26
+ })
27
+
28
+ describe('#write', () => {
29
+ it('should write a buffer', () => {
30
+ const buf = [0]
31
+ const bw = new Writer()
32
+ bw.write(buf)
33
+ expect(encode(bw.toArray(), 'hex')).toEqual('00')
34
+ })
35
+ })
36
+
37
+ describe('#writeReverse', () => {
38
+ it('should write a buffer in reverse', () => {
39
+ const buf = [0, 1]
40
+ const bw = new Writer()
41
+ bw.writeReverse(buf)
42
+ expect(encode(bw.toArray(), 'hex')).toEqual('0100')
43
+ })
44
+ })
45
+
46
+ describe('#writeUInt8', () => {
47
+ it('should write 1', () => {
48
+ const bw = new Writer()
49
+ expect(encode(bw.writeUInt8(1).toArray(), 'hex')).toEqual('01')
50
+ })
51
+ })
52
+
53
+ describe('#writeInt8', () => {
54
+ it('should write 1', () => {
55
+ const bw = new Writer()
56
+ expect(encode(bw.writeInt8(1).toArray(), 'hex')).toEqual('01')
57
+ expect(
58
+ encode(new Writer().writeInt8(-1).toArray(), 'hex')
59
+ ).toEqual('ff')
60
+ })
61
+ })
62
+
63
+ describe('#writeUInt16BE', () => {
64
+ it('should write 1', () => {
65
+ const bw = new Writer()
66
+ expect(encode(bw.writeUInt16BE(1).toArray(), 'hex')).toEqual('0001')
67
+ })
68
+ })
69
+
70
+ describe('#writeInt16BE', () => {
71
+ it('should write 1', () => {
72
+ const bw = new Writer()
73
+ expect(encode(bw.writeInt16BE(1).toArray(), 'hex')).toEqual('0001')
74
+ expect(encode(new Writer().writeInt16BE(-1).toArray(), 'hex')).toEqual('ffff')
75
+ })
76
+ })
77
+
78
+ describe('#writeUInt16LE', () => {
79
+ it('should write 1', () => {
80
+ const bw = new Writer()
81
+ expect(encode(bw.writeUInt16LE(1).toArray(), 'hex')).toEqual('0100')
82
+ })
83
+ })
84
+
85
+ describe('#writeInt16LE', () => {
86
+ it('should write 1', () => {
87
+ const bw = new Writer()
88
+ expect(encode(bw.writeInt16LE(1).toArray(), 'hex')).toEqual('0100')
89
+ expect(encode(new Writer().writeInt16LE(-1).toArray(), 'hex')).toEqual('ffff')
90
+ })
91
+ })
92
+
93
+ describe('#writeUInt32BE', () => {
94
+ it('should write 1', () => {
95
+ const bw = new Writer()
96
+ expect(encode(bw.writeUInt32BE(1).toArray(), 'hex')).toEqual('00000001')
97
+ })
98
+ })
99
+
100
+ describe('#writeInt32BE', () => {
101
+ it('should write 1', () => {
102
+ const bw = new Writer()
103
+ expect(encode(bw.writeInt32BE(1).toArray(), 'hex')).toEqual('00000001')
104
+ expect(encode(new Writer().writeInt32BE(-1).toArray(), 'hex')).toEqual('ffffffff')
105
+ })
106
+ })
107
+
108
+ describe('#writeUInt32LE', () => {
109
+ it('should write 1', () => {
110
+ const bw = new Writer()
111
+ expect(encode(bw.writeUInt32LE(1).toArray(), 'hex')).toEqual('01000000')
112
+ })
113
+ })
114
+
115
+ describe('#writeInt32LE', () => {
116
+ it('should write 1', () => {
117
+ const bw = new Writer()
118
+ expect(encode(bw.writeInt32LE(1).toArray(), 'hex')).toEqual('01000000')
119
+ expect(encode(new Writer().writeInt32LE(-1).toArray(), 'hex')).toEqual('ffffffff')
120
+ })
121
+ })
122
+
123
+ describe('#writeUInt64BEBn', () => {
124
+ it('should write 1', () => {
125
+ const bw = new Writer()
126
+ expect(encode(bw.writeUInt64BEBn(new BigNumber(1)).toArray(), 'hex')).toEqual('0000000000000001')
127
+ })
128
+ })
129
+
130
+ describe('#writeUInt64LEBn', () => {
131
+ it('should write 1', () => {
132
+ const bw = new Writer()
133
+ expect(encode(bw.writeUInt64LEBn(new BigNumber(1)).toArray(), 'hex')).toEqual('0100000000000000')
134
+ })
135
+ })
136
+
137
+ describe('#writeVarInt', () => {
138
+ it('should write a 1 byte varInt', () => {
139
+ const bw = new Writer()
140
+ bw.writeVarIntNum(1)
141
+ expect(bw.toArray().length).toEqual(1)
142
+ })
143
+
144
+ it('should write a 3 byte varInt', () => {
145
+ const bw = new Writer()
146
+ bw.writeVarIntNum(1000)
147
+ expect(bw.toArray().length).toEqual(3)
148
+ })
149
+
150
+ it('should write a 5 byte varInt', () => {
151
+ const bw = new Writer()
152
+ bw.writeVarIntNum(Math.pow(2, 16 + 1))
153
+ expect(bw.toArray().length).toEqual(5)
154
+ })
155
+
156
+ it('should write a 9 byte varInt', () => {
157
+ const bw = new Writer()
158
+ bw.writeVarIntNum(Math.pow(2, 32 + 1))
159
+ expect(bw.toArray().length).toEqual(9)
160
+ })
161
+
162
+ it('should read back the same value it wrote for a 9 byte varInt', () => {
163
+ const bw = new Writer()
164
+ const n = Math.pow(2, 53)
165
+ expect(n).toEqual(n + 1) // javascript number precision limit
166
+ bw.writeVarIntNum(n)
167
+ const br = new Reader(bw.toArray())
168
+ expect(br.readVarIntBn().toHex()).toEqual('20000000000000')
169
+ })
170
+ })
171
+
172
+ describe('#writeVarIntBn', () => {
173
+ it('should write a 1 byte varInt', () => {
174
+ const bw = new Writer()
175
+ bw.writeVarIntBn(new BigNumber(1))
176
+ expect(bw.toArray().length).toEqual(1)
177
+ })
178
+
179
+ it('should write a 3 byte varInt', () => {
180
+ const bw = new Writer()
181
+ bw.writeVarIntBn(new BigNumber(1000))
182
+ expect(bw.toArray().length).toEqual(3)
183
+ })
184
+
185
+ it('should write a 5 byte varInt', () => {
186
+ const bw = new Writer()
187
+ const bn = new BigNumber(Math.pow(2, 16 + 1))
188
+ bw.writeVarIntBn(bn)
189
+ expect(bw.toArray().length).toEqual(5)
190
+ })
191
+
192
+ it('should write a 9 byte varInt', () => {
193
+ const bw = new Writer()
194
+ bw.writeVarIntBn(new BigNumber(Math.pow(2, 32 + 1)))
195
+ expect(bw.toArray().length).toEqual(9)
196
+ })
197
+ })
198
+ })