@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,557 @@
1
+ // import { AESWrappercbc } from './aescbc'
2
+ import Random from '../primitives/Random.js'
3
+ import PrivateKey from '../primitives/PrivateKey.js'
4
+ import PublicKey from '../primitives/PublicKey.js'
5
+ import Point from '../primitives/Point.js'
6
+ import * as Hash from '../primitives/Hash.js'
7
+ import { toArray, toHex, encode } from '../primitives/utils.js'
8
+
9
+ function AES(key) {
10
+ if (!this._tables[0][0][0]) this._precompute();
11
+
12
+ var tmp, encKey, decKey;
13
+ var sbox = this._tables[0][4];
14
+ var decTable = this._tables[1];
15
+ var keyLen = key.length;
16
+ var rcon = 1;
17
+
18
+ if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
19
+ throw new Error("invalid aes key size");
20
+ }
21
+
22
+ this._key = [encKey = key.slice(0), decKey = []];
23
+
24
+ // schedule encryption keys
25
+ for (var i = keyLen; i < 4 * keyLen + 28; i++) {
26
+ tmp = encKey[i - 1];
27
+
28
+ // apply sbox
29
+ if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
30
+ tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
31
+
32
+ // shift rows and add rcon
33
+ if (i % keyLen === 0) {
34
+ tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
35
+ rcon = rcon << 1 ^ (rcon >> 7) * 283;
36
+ }
37
+ }
38
+
39
+ encKey[i] = encKey[i - keyLen] ^ tmp;
40
+ }
41
+
42
+ // schedule decryption keys
43
+ for (var j = 0; i; j++, i--) {
44
+ tmp = encKey[j & 3 ? i : i - 4];
45
+ if (i <= 4 || j < 4) {
46
+ decKey[j] = tmp;
47
+ } else {
48
+ decKey[j] = decTable[0][sbox[tmp >>> 24]] ^
49
+ decTable[1][sbox[tmp >> 16 & 255]] ^
50
+ decTable[2][sbox[tmp >> 8 & 255]] ^
51
+ decTable[3][sbox[tmp & 255]];
52
+ }
53
+ }
54
+ }
55
+
56
+ AES.prototype = {
57
+
58
+ /**
59
+ * Encrypt an array of 4 big-endian words.
60
+ * @param {Array} data The plaintext.
61
+ * @return {Array} The ciphertext.
62
+ */
63
+ encrypt: function (data) { return this._crypt(data, 0); },
64
+
65
+ /**
66
+ * Decrypt an array of 4 big-endian words.
67
+ * @param {Array} data The ciphertext.
68
+ * @return {Array} The plaintext.
69
+ */
70
+ decrypt: function (data) { return this._crypt(data, 1); },
71
+
72
+ /**
73
+ * The expanded S-box and inverse S-box tables. These will be computed
74
+ * on the client so that we don't have to send them down the wire.
75
+ *
76
+ * There are two tables, _tables[0] is for encryption and
77
+ * _tables[1] is for decryption.
78
+ *
79
+ * The first 4 sub-tables are the expanded S-box with MixColumns. The
80
+ * last (_tables[01][4]) is the S-box itself.
81
+ *
82
+ * @private
83
+ */
84
+ _tables: [
85
+ [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)],
86
+ [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)]
87
+ ],
88
+
89
+ //Expand the S-box tables.
90
+ _precompute: function () {
91
+ var encTable = this._tables[0], decTable = this._tables[1],
92
+ sbox = encTable[4], sboxInv = decTable[4],
93
+ i, x, xInv, d = new Uint8Array(256), th = new Uint8Array(256), x2, x4, x8, s, tEnc, tDec;
94
+
95
+ // Compute double and third tables
96
+ for (i = 0; i < 256; i++) {
97
+ th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
98
+ }
99
+
100
+ for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
101
+ // Compute sbox
102
+ s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
103
+ s = s >> 8 ^ s & 255 ^ 99;
104
+ sbox[x] = s;
105
+ sboxInv[s] = x;
106
+
107
+ // Compute MixColumns
108
+ x8 = d[x4 = d[x2 = d[x]]];
109
+ tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
110
+ tEnc = d[s] * 0x101 ^ s * 0x1010100;
111
+
112
+ for (i = 0; i < 4; i++) {
113
+ encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
114
+ decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
115
+ }
116
+ }
117
+ },
118
+
119
+ /**
120
+ * Encryption and decryption core.
121
+ * @param {Array} input Four words to be encrypted or decrypted.
122
+ * @param dir The direction, 0 for encrypt and 1 for decrypt.
123
+ * @return {Array} The four encrypted or decrypted words.
124
+ * @private
125
+ */
126
+ _crypt: function (input, dir) {
127
+ if (input.length !== 4) {
128
+ throw new Error("invalid aes block size");
129
+ }
130
+
131
+ var key = this._key[dir],
132
+ // state variables a,b,c,d are loaded with pre-whitened data
133
+ a = input[0] ^ key[0],
134
+ b = input[dir ? 3 : 1] ^ key[1],
135
+ c = input[2] ^ key[2],
136
+ d = input[dir ? 1 : 3] ^ key[3],
137
+ a2, b2, c2,
138
+
139
+ nInnerRounds = key.length / 4 - 2,
140
+ i,
141
+ kIndex = 4,
142
+ out = new Uint32Array(4),// <--- this is slower in Node.js, about the same in Chrome */
143
+ table = this._tables[dir],
144
+
145
+ // load up the tables
146
+ t0 = table[0],
147
+ t1 = table[1],
148
+ t2 = table[2],
149
+ t3 = table[3],
150
+ sbox = table[4];
151
+
152
+ // Inner rounds. Cribbed from OpenSSL.
153
+ for (i = 0; i < nInnerRounds; i++) {
154
+ a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
155
+ b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
156
+ c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
157
+ d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
158
+ kIndex += 4;
159
+ a = a2; b = b2; c = c2;
160
+ }
161
+
162
+ // Last round.
163
+ for (i = 0; i < 4; i++) {
164
+ out[dir ? 3 & -i : i] =
165
+ sbox[a >>> 24] << 24 ^
166
+ sbox[b >> 16 & 255] << 16 ^
167
+ sbox[c >> 8 & 255] << 8 ^
168
+ sbox[d & 255] ^
169
+ key[kIndex++];
170
+ a2 = a; a = b; b = c; c = d; d = a2;
171
+ }
172
+
173
+ return out;
174
+ }
175
+ }
176
+
177
+ class AESWrapper {
178
+ public static encrypt(messageBuf: number[], keyBuf: number[]): number[] {
179
+ const key = AESWrapper.buf2Words((keyBuf))
180
+ const message = AESWrapper.buf2Words((messageBuf))
181
+ const a = new AES(key)
182
+ const enc = a.encrypt(message)
183
+ const encBuf = AESWrapper.words2Buf(enc)
184
+ return encBuf
185
+ }
186
+
187
+ public static decrypt(encBuf: number[], keyBuf: number[]): number[] {
188
+ const enc = AESWrapper.buf2Words((encBuf))
189
+ const key = AESWrapper.buf2Words((keyBuf))
190
+ const a = new AES(key)
191
+ const message = a.decrypt(enc)
192
+ const messageBuf = AESWrapper.words2Buf(message)
193
+ return messageBuf
194
+ }
195
+
196
+ public static buf2Words(buf: number[]): number[] {
197
+ if (buf.length % 4) {
198
+ throw new Error('buf length must be a multiple of 4')
199
+ }
200
+ const words = []
201
+ for (let i = 0; i < buf.length / 4; i++) {
202
+ const val =
203
+ (buf[i * 4] * 0x1000000) + // Shift the first byte by 24 bits
204
+ ((buf[i * 4 + 1] << 16) | // Shift the second byte by 16 bits
205
+ (buf[i * 4 + 2] << 8) | // Shift the third byte by 8 bits
206
+ buf[i * 4 + 3]) // The fourth byte
207
+ words.push(val)
208
+ }
209
+ return words
210
+ }
211
+
212
+ public static words2Buf(words: number[]): number[] {
213
+ const buf = new Array(words.length * 4)
214
+
215
+ for (let i = 0; i < words.length; i++) {
216
+ const word = words[i];
217
+ buf[i * 4] = (word >>> 24) & 0xFF;
218
+ buf[i * 4 + 1] = (word >>> 16) & 0xFF;
219
+ buf[i * 4 + 2] = (word >>> 8) & 0xFF;
220
+ buf[i * 4 + 3] = word & 0xFF;
221
+ }
222
+
223
+ return buf
224
+ }
225
+ }
226
+
227
+ class CBC {
228
+ public static buf2BlocksBuf(buf: number[], blockSize: number): number[][] {
229
+ const bytesize = blockSize / 8
230
+ const blockBufs = []
231
+
232
+ for (let i = 0; i <= buf.length / bytesize; i++) {
233
+ let blockBuf = buf.slice(i * bytesize, i * bytesize + bytesize)
234
+
235
+ if (blockBuf.length < blockSize) {
236
+ blockBuf = CBC.pkcs7Pad(blockBuf, blockSize)
237
+ }
238
+
239
+ blockBufs.push(blockBuf)
240
+ }
241
+
242
+ return blockBufs
243
+ }
244
+
245
+ public static blockBufs2Buf(blockBufs: number[][]): number[] {
246
+ let last = blockBufs[blockBufs.length - 1]
247
+ last = CBC.pkcs7Unpad(last)
248
+ blockBufs[blockBufs.length - 1] = last
249
+
250
+ const buf = blockBufs.flat()
251
+
252
+ return buf
253
+ }
254
+
255
+ public static encrypt(
256
+ messageBuf: number[],
257
+ ivBuf: number[],
258
+ blockCipher: any /* TODO: type */,
259
+ cipherKeyBuf: number[]
260
+ ): number[] {
261
+ const blockSize = ivBuf.length * 8
262
+ const blockBufs = CBC.buf2BlocksBuf(messageBuf, blockSize)
263
+ const encBufs = CBC.encryptBlocks(blockBufs, ivBuf, blockCipher, cipherKeyBuf)
264
+ const encBuf = encBufs.flat()
265
+ return encBuf
266
+ }
267
+
268
+ public static decrypt(
269
+ encBuf: number[],
270
+ ivBuf: number[],
271
+ blockCipher: any /* TODO: type */,
272
+ cipherKeyBuf: number[]
273
+ ): number[] {
274
+ const bytesize = ivBuf.length
275
+ const encBufs = []
276
+ for (let i = 0; i < encBuf.length / bytesize; i++) {
277
+ encBufs.push(encBuf.slice(i * bytesize, i * bytesize + bytesize))
278
+ }
279
+ const blockBufs = CBC.decryptBlocks(encBufs, ivBuf, blockCipher, cipherKeyBuf)
280
+ const buf = CBC.blockBufs2Buf(blockBufs)
281
+ return buf
282
+ }
283
+
284
+ public static encryptBlock(
285
+ blockBuf: number[],
286
+ ivBuf: number[],
287
+ blockCipher: any /* TODO: type */,
288
+ cipherKeyBuf: number[]
289
+ ): number[] {
290
+ const xorbuf = CBC.xorBufs(blockBuf, ivBuf)
291
+ const encBuf = blockCipher.encrypt(xorbuf, cipherKeyBuf)
292
+ return encBuf
293
+ }
294
+
295
+ public static decryptBlock(
296
+ encBuf: number[],
297
+ ivBuf: number[],
298
+ blockCipher: any /* TODO: type */,
299
+ cipherKeyBuf: number[]
300
+ ): number[] {
301
+ const xorbuf = blockCipher.decrypt(encBuf, cipherKeyBuf)
302
+ const blockBuf = CBC.xorBufs(xorbuf, ivBuf)
303
+ return blockBuf
304
+ }
305
+
306
+ public static encryptBlocks(
307
+ blockBufs: number[][],
308
+ ivBuf: number[],
309
+ blockCipher: any /* TODO: type */,
310
+ cipherKeyBuf: number[]
311
+ ): number[][] {
312
+ const encBufs = []
313
+
314
+ for (let i = 0; i < blockBufs.length; i++) {
315
+ const blockBuf = blockBufs[i]
316
+ const encBuf = CBC.encryptBlock(blockBuf, ivBuf, blockCipher, cipherKeyBuf)
317
+
318
+ encBufs.push(encBuf)
319
+
320
+ ivBuf = encBuf
321
+ }
322
+
323
+ return encBufs
324
+ }
325
+
326
+ public static decryptBlocks(
327
+ encBufs: number[][],
328
+ ivBuf: number[],
329
+ blockCipher: any /* TODO: type */,
330
+ cipherKeyBuf: number[]
331
+ ): number[][] {
332
+ const blockBufs = []
333
+
334
+ for (let i = 0; i < encBufs.length; i++) {
335
+ const encBuf = encBufs[i]
336
+ const blockBuf = CBC.decryptBlock(encBuf, ivBuf, blockCipher, cipherKeyBuf)
337
+
338
+ blockBufs.push(blockBuf)
339
+
340
+ ivBuf = encBuf
341
+ }
342
+
343
+ return blockBufs
344
+ }
345
+
346
+ public static pkcs7Pad(buf: number[], blockSize: number): number[] {
347
+ const bytesize = blockSize / 8
348
+ const padbytesize = bytesize - buf.length
349
+ const pad = new Array(padbytesize)
350
+ pad.fill(padbytesize)
351
+ const paddedbuf = [...buf, ...pad]
352
+ return paddedbuf
353
+ }
354
+
355
+ public static pkcs7Unpad(paddedbuf: number[]): number[] {
356
+ const padlength = paddedbuf[paddedbuf.length - 1]
357
+ const padbuf = paddedbuf.slice(paddedbuf.length - padlength, paddedbuf.length)
358
+ const padbuf2 = new Array(padlength)
359
+ padbuf2.fill(padlength)
360
+ if (toHex(padbuf) !== toHex(padbuf2)) {
361
+ throw new Error('invalid padding')
362
+ }
363
+ return paddedbuf.slice(0, paddedbuf.length - padlength)
364
+ }
365
+
366
+ public static xorBufs(buf1: number[], buf2: number[]): number[] {
367
+ if (buf1.length !== buf2.length) {
368
+ throw new Error('bufs must have the same length')
369
+ }
370
+
371
+ const buf = new Array(buf1.length)
372
+
373
+ for (let i = 0; i < buf1.length; i++) {
374
+ buf[i] = buf1[i] ^ buf2[i]
375
+ }
376
+
377
+ return buf
378
+ }
379
+ }
380
+
381
+ class AESCBC {
382
+ public static encrypt(messageBuf: number[], cipherKeyBuf: number[], ivBuf: number[], concatIvBuf = true): number[] {
383
+ ivBuf = ivBuf || new Array(128 / 8).fill(0) || Random(128 / 8)
384
+ const ctBuf = CBC.encrypt(messageBuf, ivBuf, AESWrapper, cipherKeyBuf)
385
+ if (concatIvBuf) {
386
+ return [...ivBuf, ...ctBuf]
387
+ } else {
388
+ return [...ctBuf]
389
+ }
390
+ }
391
+
392
+ public static decrypt(encBuf: number[], cipherKeyBuf: number[], ivBuf?: number[]): number[] {
393
+ if (!ivBuf) {
394
+ ivBuf = encBuf.slice(0, 128 / 8)
395
+ const ctBuf = encBuf.slice(128 / 8)
396
+ return CBC.decrypt(ctBuf, ivBuf, AESWrapper, cipherKeyBuf)
397
+ } else {
398
+ const ctBuf = encBuf
399
+ return CBC.decrypt(ctBuf, ivBuf, AESWrapper, cipherKeyBuf)
400
+ }
401
+ }
402
+ }
403
+
404
+ /**
405
+ * @class ECIES
406
+ * Implements the Electrum ECIES protocol for encrypted communication.
407
+ *
408
+ * @prprecated This class is deprecated in favor of the BRC-78 standard for portable encrypted messages,
409
+ * which provides a more comprehensive and secure solution by integrating with BRC-42 and BRC-43 standards.
410
+ */
411
+ export default class ECIES {
412
+
413
+ /**
414
+ * Generates the initialization vector (iv), encryption key (kE), and MAC key (kM)
415
+ * using the sender's private key and receiver's public key.
416
+ *
417
+ * @param {PrivateKey} privKey - The sender's private key.
418
+ * @param {PublicKey} pubKey - The receiver's public key.
419
+ * @returns {Object} An object containing the iv, kE, and kM as number arrays.
420
+ */
421
+ public static ivkEkM(privKey: PrivateKey, pubKey: PublicKey): { iv: number[]; kE: number[]; kM: number[] } {
422
+ const r = privKey
423
+ const KB = pubKey
424
+ const P = KB.mul(r)
425
+ const S = new PublicKey(P.x, P.y)
426
+ const Sbuf = S.encode(true) as number[]
427
+ const hash = Hash.sha512(Sbuf) as number[]
428
+ return {
429
+ iv: hash.slice(0, 16),
430
+ kE: hash.slice(16, 32),
431
+ kM: hash.slice(32, 64),
432
+ }
433
+ }
434
+
435
+ /**
436
+ * Encrypts a given message using the Electrum ECIES method.
437
+ *
438
+ * @param {number[]} messageBuf - The message to be encrypted, in number array format.
439
+ * @param {PublicKey} toPublicKey - The public key of the recipient.
440
+ * @param {PrivateKey} [fromPrivateKey] - The private key of the sender. If not provided, a random private key is used.
441
+ * @param {boolean} [noKey=false] - If true, does not include the sender's public key in the encrypted message.
442
+ * @returns {number[]} The encrypted message as a number array.
443
+ */
444
+ public static electrumEncrypt(messageBuf: number[], toPublicKey: PublicKey, fromPrivateKey?: PrivateKey, noKey = false): number[] {
445
+ let Rbuf
446
+ if (fromPrivateKey === null) {
447
+ fromPrivateKey = PrivateKey.fromRandom()
448
+ }
449
+ if (!noKey) {
450
+ Rbuf = fromPrivateKey.toPublicKey().encode(true)
451
+ }
452
+ const { iv, kE, kM } = ECIES.ivkEkM(fromPrivateKey, toPublicKey)
453
+ const ciphertext = AESCBC.encrypt(messageBuf, kE, iv, false)
454
+ const BIE1 = toArray('BIE1', 'utf8')
455
+ let encBuf: number[]
456
+ if (Rbuf) {
457
+ encBuf = [...BIE1, ...Rbuf, ...ciphertext]
458
+ } else {
459
+ encBuf = [...BIE1, ...ciphertext]
460
+ }
461
+ const hmac = Hash.sha256hmac(kM, encBuf) as number[]
462
+ return [...encBuf, ...hmac]
463
+ }
464
+
465
+ /**
466
+ * Decrypts a message encrypted using the Electrum ECIES method.
467
+ *
468
+ * @param {number[]} encBuf - The encrypted message buffer.
469
+ * @param {PrivateKey} toPrivateKey - The private key of the recipient.
470
+ * @param {PublicKey} [fromPublicKey=null] - The public key of the sender. If not provided, it is extracted from the message.
471
+ * @returns {number[]} The decrypted message as a number array.
472
+ */
473
+ public static electrumDecrypt(encBuf: number[], toPrivateKey: PrivateKey, fromPublicKey: PublicKey = null): number[] {
474
+ const tagLength = 32
475
+
476
+ const magic = encBuf.slice(0, 4)
477
+ if (encode(magic, 'utf8') !== 'BIE1') {
478
+ throw new Error('Invalid Magic')
479
+ }
480
+ let offset = 4
481
+ if (fromPublicKey === null) {
482
+ // BIE1 use compressed public key, length is always 33.
483
+ const pub = encBuf.slice(4, 37)
484
+ fromPublicKey = PublicKey.fromString(toHex(pub))
485
+ offset = 37
486
+ }
487
+ const { iv, kE, kM } = ECIES.ivkEkM(toPrivateKey, fromPublicKey)
488
+ const ciphertext = encBuf.slice(offset, encBuf.length - tagLength)
489
+ const hmac = encBuf.slice(encBuf.length - tagLength, encBuf.length)
490
+
491
+ const hmac2 = Hash.sha256hmac(kM, encBuf.slice(0, encBuf.length - tagLength)) as number[]
492
+
493
+ if (toHex(hmac) !== toHex(hmac2)) {
494
+ throw new Error('Invalid checksum')
495
+ }
496
+ return AESCBC.decrypt(ciphertext, kE, iv)
497
+ }
498
+
499
+ /**
500
+ * Encrypts a given message using the Bitcore variant of ECIES.
501
+ *
502
+ * @param {number[]} messageBuf - The message to be encrypted, in number array format.
503
+ * @param {PublicKey} toPublicKey - The public key of the recipient.
504
+ * @param {PrivateKey} [fromPrivateKey] - The private key of the sender. If not provided, a random private key is used.
505
+ * @param {number[]} [ivBuf] - The initialization vector for encryption. If not provided, a random IV is used.
506
+ * @returns {number[]} The encrypted message as a number array.
507
+ */
508
+ public static bitcoreEncrypt(messageBuf: number[], toPublicKey: PublicKey, fromPrivateKey?: PrivateKey, ivBuf?: number[]): number[] {
509
+ if (!fromPrivateKey) {
510
+ fromPrivateKey = PrivateKey.fromRandom()
511
+ }
512
+ const r = fromPrivateKey
513
+ const RPublicKey = fromPrivateKey.toPublicKey()
514
+ const RBuf = RPublicKey.encode(true) as number[]
515
+ const KB = toPublicKey
516
+ const P = KB.mul(r)
517
+ const S = P.getX()
518
+ const Sbuf = S.toArray('be', 32)
519
+ const kEkM = Hash.sha512(Sbuf) as number[]
520
+ const kE = kEkM.slice(0, 32)
521
+ const kM = kEkM.slice(32, 64)
522
+ const c = AESCBC.encrypt(messageBuf, kE, ivBuf)
523
+ const d = Hash.sha256hmac(kM, [...c]) as number[]
524
+ const encBuf = [...RBuf, ...c, ...d]
525
+ return encBuf
526
+ }
527
+
528
+ /**
529
+ * Decrypts a message encrypted using the Bitcore variant of ECIES.
530
+ *
531
+ * @param {number[]} encBuf - The encrypted message buffer.
532
+ * @param {PrivateKey} toPrivateKey - The private key of the recipient.
533
+ * @returns {number[]} The decrypted message as a number array.
534
+ */
535
+ public static bitcoreDecrypt(encBuf: number[], toPrivateKey: PrivateKey): number[] {
536
+ const kB = toPrivateKey
537
+ const fromPublicKey = PublicKey.fromString(toHex(encBuf.slice(0, 33)))
538
+ const R = fromPublicKey
539
+ const P = R.mul(kB)
540
+ if (P.eq(new Point(0, 0))) {
541
+ throw new Error('P equals 0')
542
+ }
543
+ const S = P.getX()
544
+ const Sbuf = S.toArray('be', 32)
545
+ const kEkM = Hash.sha512(Sbuf) as number[]
546
+ const kE = kEkM.slice(0, 32)
547
+ const kM = kEkM.slice(32, 64)
548
+ const c = encBuf.slice(33, encBuf.length - 32)
549
+ const d = encBuf.slice(encBuf.length - 32, encBuf.length)
550
+ const d2 = Hash.sha256hmac(kM, c) as number[]
551
+ if (toHex(d) !== toHex(d2)) {
552
+ throw new Error('Invalid checksum')
553
+ }
554
+ const messageBuf = AESCBC.decrypt(c, kE)
555
+ return [...messageBuf]
556
+ }
557
+ }