@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,192 @@
1
+ /* eslint-env jest */
2
+ import Curve from '../../../dist/cjs/src/primitives/Curve.js'
3
+ import Point from '../../../dist/cjs/src/primitives/Point'
4
+ import JPoint from '../../../dist/cjs/src/primitives/JacobianPoint'
5
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
6
+
7
+ describe('Curve', () => {
8
+ it('should work with secp256k1', () => {
9
+ const curve = new Curve()
10
+
11
+ const p = new Point(
12
+ '79be667e f9dcbbac 55a06295 ce870b07 029bfcdb 2dce28d9 59f2815b 16f81798',
13
+ '483ada77 26a3c465 5da4fbfc 0e1108a8 fd17b448 a6855419 9c47d08f fb10d4b8'
14
+ )
15
+
16
+ expect(p.validate()).toBe(true)
17
+ expect(p.dbl().validate()).toBe(true)
18
+ expect(p.toJ().dbl().toP().validate()).toBe(true)
19
+ expect(p.mul(new BigNumber('79be667e f9dcbbac 55a06295 ce870b07', 16)).validate()).toBe(true)
20
+
21
+ // Endomorphism test
22
+ expect(curve.endo).toBeDefined()
23
+ expect(
24
+ curve.endo.beta.fromRed().toString(16)
25
+ ).toEqual('7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee')
26
+ expect(
27
+ curve.endo.lambda.toString(16)
28
+ ).toEqual('5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72')
29
+
30
+ const k = new BigNumber('1234567890123456789012345678901234', 16)
31
+ const split = curve._endoSplit(k)
32
+ const testK = split.k1.add(split.k2.mul(curve.endo.lambda)).umod(curve.n)
33
+
34
+ expect(testK.toString(16)).toEqual(k.toString(16))
35
+ })
36
+
37
+ it('should compute this problematic secp256k1 multiplication', () => {
38
+ const curve = new Curve()
39
+ const g1 = curve.g // precomputed g
40
+ expect(g1.precomputed).toBeDefined()
41
+ const g2 = new Point(g1.getX(), g1.getY()) // not precomputed g
42
+ expect(g2.precomputed).toBeNull()
43
+
44
+ const a = new BigNumber('6d1229a6b24c2e775c062870ad26bc261051e0198c67203167273c7c62538846', 16)
45
+ const p1 = g1.mul(a)
46
+ const p2 = g2.mul(a)
47
+
48
+ expect(p1.eq(p2)).toBe(true)
49
+ })
50
+
51
+ it('should not use fixed NAF when k is too large', () => {
52
+ const curve = new Curve()
53
+ const g1 = curve.g // precomputed g
54
+ expect(g1.precomputed).toBeDefined()
55
+ const g2 = new Point(g1.getX(), g1.getY()) // not precomputed g
56
+ expect(g2.precomputed).toBeNull()
57
+
58
+ const a = new BigNumber(
59
+ '6d1229a6b24c2e775c062870ad26bc26' +
60
+ '1051e0198c67203167273c7c6253884612345678',
61
+ 16)
62
+ const p1 = g1.mul(a)
63
+ const p2 = g2.mul(a)
64
+
65
+ expect(p1.eq(p2)).toBe(true)
66
+ })
67
+
68
+ it('should not fail on secp256k1 regression', () => {
69
+ const curve = new Curve()
70
+ const k1 = new BigNumber('32efeba414cd0c830aed727749e816a01c471831536fd2fce28c56b54f5a3bb1', 16)
71
+ const k2 = new BigNumber('5f2e49b5d64e53f9811545434706cde4de528af97bfd49fde1f6cf792ee37a8c', 16)
72
+
73
+ let p1 = curve.g.mul(k1)
74
+ let p2 = curve.g.mul(k2)
75
+
76
+ // 2 + 2 + 1 = 2 + 1 + 2
77
+ const two = p2.dbl()
78
+ const five = two.dbl().add(p2)
79
+ const three = two.add(p2)
80
+ const maybeFive = three.add(two)
81
+
82
+ expect(maybeFive.eq(five)).toBe(true)
83
+
84
+ p1 = p1.mul(k2)
85
+ p2 = p2.mul(k1)
86
+
87
+ expect(p1.validate()).toBe(true)
88
+ expect(p2.validate()).toBe(true)
89
+ expect(p1.eq(p2)).toBe(true)
90
+ })
91
+
92
+ test('should correctly double the affine point on secp256k1', () => {
93
+ let bad: any = {
94
+ x: '026a2073b1ef6fab47ace18e60e728a05180a82755bbcec9a0abc08ad9f7a3d4',
95
+ y: '9cd8cb48c3281596139f147c1364a3ede88d3f310fdb0eb98c924e599ca1b3c9',
96
+ z: 'd78587ad45e4102f48b54b5d85598296e069ce6085002e169c6bad78ddc6d9bd'
97
+ }
98
+
99
+ let good: any = {
100
+ x: 'e7789226739ac2eb3c7ccb2a9a910066beeed86cdb4e0f8a7fee8eeb29dc7016',
101
+ y: '4b76b191fd6d47d07828ea965e275b76d0e3e0196cd5056d38384fbb819f9fcb',
102
+ z: 'cbf8d99056618ba132d6145b904eee1ce566e0feedb9595139c45f84e90cfa7d'
103
+ }
104
+
105
+ // const curve = new Curve()
106
+ bad = new JPoint(bad.x, bad.y, bad.z)
107
+ good = new JPoint(good.x, good.y, good.z)
108
+
109
+ // They are the same points
110
+ expect(bad.add(good.neg()).isInfinity()).toBe(true)
111
+
112
+ // But doubling borks them out
113
+ expect(bad.dbl().add(good.dbl().neg()).isInfinity()).toBe(true)
114
+ })
115
+
116
+ test('should correctly handle scalar multiplication of zero', () => {
117
+ const curve = new Curve()
118
+ const p1 = curve.g.mul('0')
119
+ const p2 = p1.mul('2')
120
+ expect(p1.eq(p2)).toBe(true)
121
+ })
122
+ })
123
+
124
+ describe('Point codec', () => {
125
+ const makeShortTest = (definition: any): any => {
126
+ const curve = new Curve()
127
+
128
+ return () => {
129
+ const co = definition.coordinates
130
+ const p = new Point(co.x, co.y)
131
+
132
+ // Encodes as expected
133
+ expect(p.encode(false, 'hex')).toBe(definition.encoded)
134
+ expect(p.encode(true, 'hex')).toBe(definition.compactEncoded)
135
+
136
+ // Decodes as expected
137
+ expect(Point.fromString(definition.encoded).eq(p)).toBe(true)
138
+ expect(Point.fromString(definition.compactEncoded).eq(p)).toBe(true)
139
+ expect(Point.fromString(definition.hybrid).eq(p)).toBe(true)
140
+ }
141
+ }
142
+
143
+ const shortPointEvenY = {
144
+ coordinates: {
145
+ x: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
146
+ y: '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'
147
+ },
148
+ compactEncoded:
149
+ '02' +
150
+ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
151
+ encoded:
152
+ '04' +
153
+ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' +
154
+ '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
155
+ hybrid:
156
+ '06' +
157
+ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' +
158
+ '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'
159
+ }
160
+
161
+ const shortPointOddY = {
162
+ coordinates: {
163
+ x: 'fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556',
164
+ y: 'ae12777aacfbb620f3be96017f45c560de80f0f6518fe4a03c870c36b075f297'
165
+ },
166
+ compactEncoded:
167
+ '03' +
168
+ 'fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556',
169
+ encoded:
170
+ '04' +
171
+ 'fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556' +
172
+ 'ae12777aacfbb620f3be96017f45c560de80f0f6518fe4a03c870c36b075f297',
173
+ hybrid:
174
+ '07' +
175
+ 'fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556' +
176
+ 'ae12777aacfbb620f3be96017f45c560de80f0f6518fe4a03c870c36b075f297'
177
+ }
178
+
179
+ it('should throw when trying to decode random bytes', () => {
180
+ expect(() => {
181
+ Point.fromString(
182
+ '05' +
183
+ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')
184
+ }).toThrow()
185
+ })
186
+
187
+ it('should be able to encode/decode a short curve point with even Y',
188
+ makeShortTest(shortPointEvenY))
189
+
190
+ it('should be able to encode/decode a short curve point with odd Y',
191
+ makeShortTest(shortPointOddY))
192
+ })
@@ -0,0 +1,18 @@
1
+ import DRBG from '../../../dist/cjs/src/primitives/DRBG'
2
+ import DRBGVectors from './DRBG.vectors'
3
+
4
+ describe('Hmac_DRBG', () => {
5
+ describe('NIST vector', function () {
6
+ DRBGVectors.forEach(function (opt) {
7
+ it('should not fail at ' + opt.name, function () {
8
+ const drbg = new DRBG(opt.entropy, opt.nonce)
9
+
10
+ let last
11
+ for (let i = 0; i < opt.add.length; i++) {
12
+ last = drbg.generate(opt.expected.length / 2)
13
+ }
14
+ expect(last).toEqual(opt.expected)
15
+ })
16
+ })
17
+ })
18
+ })
@@ -0,0 +1,167 @@
1
+ export default [
2
+ {
3
+ name: '0',
4
+ entropy: 'ca851911349384bffe89de1cbdc46e6831e44d34a4fb935ee285dd14b71a7488',
5
+ nonce: '659ba96c601dc69fc902940805ec0ca8',
6
+ pers: null,
7
+ add: [
8
+ null,
9
+ null
10
+ ],
11
+ expected: 'e528e9abf2dece54d47c7e75e5fe302149f817ea9fb4bee6f4199697d04d5b89d54fbb978a15b5c443c9ec21036d2460b6f73ebad0dc2aba6e624abf07745bc107694bb7547bb0995f70de25d6b29e2d3011bb19d27676c07162c8b5ccde0668961df86803482cb37ed6d5c0bb8d50cf1f50d476aa0458bdaba806f48be9dcb8'
12
+ },
13
+ {
14
+ name: '1',
15
+ entropy: '79737479ba4e7642a221fcfd1b820b134e9e3540a35bb48ffae29c20f5418ea3',
16
+ nonce: '3593259c092bef4129bc2c6c9e19f343',
17
+ pers: null,
18
+ add: [
19
+ null,
20
+ null
21
+ ],
22
+ expected: 'cf5ad5984f9e43917aa9087380dac46e410ddc8a7731859c84e9d0f31bd43655b924159413e2293b17610f211e09f770f172b8fb693a35b85d3b9e5e63b1dc252ac0e115002e9bedfb4b5b6fd43f33b8e0eafb2d072e1a6fee1f159df9b51e6c8da737e60d5032dd30544ec51558c6f080bdbdab1de8a939e961e06b5f1aca37'
23
+ },
24
+ {
25
+ name: '2',
26
+ entropy: 'b340907445b97a8b589264de4a17c0bea11bb53ad72f9f33297f05d2879d898d',
27
+ nonce: '65cb27735d83c0708f72684ea58f7ee5',
28
+ pers: null,
29
+ add: [
30
+ null,
31
+ null
32
+ ],
33
+ expected: '75183aaaf3574bc68003352ad655d0e9ce9dd17552723b47fab0e84ef903694a32987eeddbdc48efd24195dbdac8a46ba2d972f5808f23a869e71343140361f58b243e62722088fe10a98e43372d252b144e00c89c215a76a121734bdc485486f65c0b16b8963524a3a70e6f38f169c12f6cbdd169dd48fe4421a235847a23ff'
34
+ },
35
+ {
36
+ name: '3',
37
+ entropy: '8e159f60060a7d6a7e6fe7c9f769c30b98acb1240b25e7ee33f1da834c0858e7',
38
+ nonce: 'c39d35052201bdcce4e127a04f04d644',
39
+ pers: null,
40
+ add: [
41
+ null,
42
+ null
43
+ ],
44
+ expected: '62910a77213967ea93d6457e255af51fc79d49629af2fccd81840cdfbb4910991f50a477cbd29edd8a47c4fec9d141f50dfde7c4d8fcab473eff3cc2ee9e7cc90871f180777a97841597b0dd7e779eff9784b9cc33689fd7d48c0dcd341515ac8fecf5c55a6327aea8d58f97220b7462373e84e3b7417a57e80ce946d6120db5'
45
+ },
46
+ {
47
+ name: '4',
48
+ entropy: '74755f196305f7fb6689b2fe6835dc1d81484fc481a6b8087f649a1952f4df6a',
49
+ nonce: 'c36387a544a5f2b78007651a7b74b749',
50
+ pers: null,
51
+ add: [
52
+ null,
53
+ null
54
+ ],
55
+ expected: 'b2896f3af4375dab67e8062d82c1a005ef4ed119d13a9f18371b1b873774418684805fd659bfd69964f83a5cfe08667ddad672cafd16befffa9faed49865214f703951b443e6dca22edb636f3308380144b9333de4bcb0735710e4d9266786342fc53babe7bdbe3c01a3addb7f23c63ce2834729fabbd419b47beceb4a460236'
56
+ },
57
+ {
58
+ name: '5',
59
+ entropy: '4b222718f56a3260b3c2625a4cf80950b7d6c1250f170bd5c28b118abdf23b2f',
60
+ nonce: '7aed52d0016fcaef0b6492bc40bbe0e9',
61
+ pers: null,
62
+ add: [
63
+ null,
64
+ null
65
+ ],
66
+ expected: 'a6da029b3665cd39fd50a54c553f99fed3626f4902ffe322dc51f0670dfe8742ed48415cf04bbad5ed3b23b18b7892d170a7dcf3ef8052d5717cb0c1a8b3010d9a9ea5de70ae5356249c0e098946030c46d9d3d209864539444374d8fbcae068e1d6548fa59e6562e6b2d1acbda8da0318c23752ebc9be0c1c1c5b3cf66dd967'
67
+ },
68
+ {
69
+ name: '6',
70
+ entropy: 'b512633f27fb182a076917e39888ba3ff35d23c3742eb8f3c635a044163768e0',
71
+ nonce: 'e2c39b84629a3de5c301db5643af1c21',
72
+ pers: null,
73
+ add: [
74
+ null,
75
+ null
76
+ ],
77
+ expected: 'fb931d0d0194a97b48d5d4c231fdad5c61aedf1c3a55ac24983ecbf38487b1c93396c6b86ff3920cfa8c77e0146de835ea5809676e702dee6a78100da9aa43d8ec0bf5720befa71f82193205ac2ea403e8d7e0e6270b366dc4200be26afd9f63b7e79286a35c688c57cbff55ac747d4c28bb80a2b2097b3b62ea439950d75dff'
78
+ },
79
+ {
80
+ name: '7',
81
+ entropy: 'aae3ffc8605a975befefcea0a7a286642bc3b95fb37bd0eb0585a4cabf8b3d1e',
82
+ nonce: '9504c3c0c4310c1c0746a036c91d9034',
83
+ pers: null,
84
+ add: [
85
+ null,
86
+ null
87
+ ],
88
+ expected: '2819bd3b0d216dad59ddd6c354c4518153a2b04374b07c49e64a8e4d055575dfbc9a8fcde68bd257ff1ba5c6000564b46d6dd7ecd9c5d684fd757df62d85211575d3562d7814008ab5c8bc00e7b5a649eae2318665b55d762de36eba00c2906c0e0ec8706edb493e51ca5eb4b9f015dc932f262f52a86b11c41e9a6d5b3bd431'
89
+ },
90
+ {
91
+ name: '8',
92
+ entropy: 'b9475210b79b87180e746df704b3cbc7bf8424750e416a7fbb5ce3ef25a82cc6',
93
+ nonce: '24baf03599c10df6ef44065d715a93f7',
94
+ pers: null,
95
+ add: [
96
+ null,
97
+ null
98
+ ],
99
+ expected: 'ae12d784f796183c50db5a1a283aa35ed9a2b685dacea97c596ff8c294906d1b1305ba1f80254eb062b874a8dfffa3378c809ab2869aa51a4e6a489692284a25038908a347342175c38401193b8afc498077e10522bec5c70882b7f760ea5946870bd9fc72961eedbe8bff4fd58c7cc1589bb4f369ed0d3bf26c5bbc62e0b2b2'
100
+ },
101
+ {
102
+ name: '9',
103
+ entropy: '27838eb44ceccb4e36210703ebf38f659bc39dd3277cd76b7a9bcd6bc964b628',
104
+ nonce: '39cfe0210db2e7b0eb52a387476e7ea1',
105
+ pers: null,
106
+ add: [
107
+ null,
108
+ null
109
+ ],
110
+ expected: 'e5e72a53605d2aaa67832f97536445ab774dd9bff7f13a0d11fd27bf6593bfb52309f2d4f09d147192199ea584503181de87002f4ee085c7dc18bf32ce5315647a3708e6f404d6588c92b2dda599c131aa350d18c747b33dc8eda15cf40e95263d1231e1b4b68f8d829f86054d49cfdb1b8d96ab0465110569c8583a424a099a'
111
+ },
112
+ {
113
+ name: '10',
114
+ entropy: 'd7129e4f47008ad60c9b5d081ff4ca8eb821a6e4deb91608bf4e2647835373a5',
115
+ nonce: 'a72882773f78c2fc4878295840a53012',
116
+ pers: null,
117
+ add: [
118
+ null,
119
+ null
120
+ ],
121
+ expected: '0cbf48585c5de9183b7ff76557f8fc9ebcfdfde07e588a8641156f61b7952725bbee954f87e9b937513b16bba0f2e523d095114658e00f0f3772175acfcb3240a01de631c19c5a834c94cc58d04a6837f0d2782fa53d2f9f65178ee9c837222494c799e64c60406069bd319549b889fa00a0032dd7ba5b1cc9edbf58de82bfcd'
122
+ },
123
+ {
124
+ name: '11',
125
+ entropy: '67fe5e300c513371976c80de4b20d4473889c9f1214bce718bc32d1da3ab7532',
126
+ nonce: 'e256d88497738a33923aa003a8d7845c',
127
+ pers: null,
128
+ add: [
129
+ null,
130
+ null
131
+ ],
132
+ expected: 'b44660d64ef7bcebc7a1ab71f8407a02285c7592d755ae6766059e894f694373ed9c776c0cfc8594413eefb400ed427e158d687e28da3ecc205e0f7370fb089676bbb0fa591ec8d916c3d5f18a3eb4a417120705f3e2198154cd60648dbfcfc901242e15711cacd501b2c2826abe870ba32da785ed6f1fdc68f203d1ab43a64f'
133
+ },
134
+ {
135
+ name: '12',
136
+ entropy: 'de8142541255c46d66efc6173b0fe3ffaf5936c897a3ce2e9d5835616aafa2cb',
137
+ nonce: 'd01f9002c407127bc3297a561d89b81d',
138
+ pers: null,
139
+ add: [
140
+ null,
141
+ null
142
+ ],
143
+ expected: '64d1020929d74716446d8a4e17205d0756b5264867811aa24d0d0da8644db25d5cde474143c57d12482f6bf0f31d10af9d1da4eb6d701bdd605a8db74fb4e77f79aaa9e450afda50b18d19fae68f03db1d7b5f1738d2fdce9ad3ee9461b58ee242daf7a1d72c45c9213eca34e14810a9fca5208d5c56d8066bab1586f1513de7'
144
+ },
145
+ {
146
+ name: '13',
147
+ entropy: '4a8e0bd90bdb12f7748ad5f147b115d7385bb1b06aee7d8b76136a25d779bcb7',
148
+ nonce: '7f3cce4af8c8ce3c45bdf23c6b181a00',
149
+ pers: null,
150
+ add: [
151
+ null,
152
+ null
153
+ ],
154
+ expected: '320c7ca4bbeb7af977bc054f604b5086a3f237aa5501658112f3e7a33d2231f5536d2c85c1dad9d9b0bf7f619c81be4854661626839c8c10ae7fdc0c0b571be34b58d66da553676167b00e7d8e49f416aacb2926c6eb2c66ec98bffae20864cf92496db15e3b09e530b7b9648be8d3916b3c20a3a779bec7d66da63396849aaf'
155
+ },
156
+ {
157
+ name: '14',
158
+ entropy: '451ed024bc4b95f1025b14ec3616f5e42e80824541dc795a2f07500f92adc665',
159
+ nonce: '2f28e6ee8de5879db1eccd58c994e5f0',
160
+ pers: null,
161
+ add: [
162
+ null,
163
+ null
164
+ ],
165
+ expected: '3fb637085ab75f4e95655faae95885166a5fbb423bb03dbf0543be063bcd48799c4f05d4e522634d9275fe02e1edd920e26d9accd43709cb0d8f6e50aa54a5f3bdd618be23cf73ef736ed0ef7524b0d14d5bef8c8aec1cf1ed3e1c38a808b35e61a44078127c7cb3a8fd7addfa50fcf3ff3bc6d6bc355d5436fe9b71eb44f7fd'
166
+ }
167
+ ]
@@ -0,0 +1,31 @@
1
+ /* eslint-env jest */
2
+ import PublicKey from '../../../dist/cjs/src/primitives/PublicKey'
3
+ import PrivateKey from '../../../dist/cjs/src/primitives/PrivateKey'
4
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
5
+
6
+ describe('ECDH', function () {
7
+ it('should work with secp256k1', function () {
8
+ const s1 = PrivateKey.fromRandom()
9
+ const s2 = PrivateKey.fromRandom()
10
+ let sh1 = s1.deriveSharedSecret(s2.toPublicKey())
11
+ let sh2 = s2.deriveSharedSecret(s1.toPublicKey())
12
+ expect(sh1.toString()).toEqual(sh2.toString())
13
+ sh1 = s1.deriveSharedSecret(PublicKey.fromString(s2.toPublicKey().toDER()))
14
+ sh2 = s2.deriveSharedSecret(PublicKey.fromString(s1.toPublicKey().toDER()))
15
+ expect(sh1.toString()).toEqual(sh2.toString())
16
+ sh1 = s1.deriveSharedSecret(PublicKey.fromPrivateKey(s2))
17
+ sh2 = s2.deriveSharedSecret(PublicKey.fromPrivateKey(s1))
18
+ expect(sh1.toString()).toEqual(sh2.toString())
19
+ })
20
+ it('should be able to prevent a twist attack for secp256k1', () => {
21
+ const bob = PrivateKey.fromRandom()
22
+ // This is a bad point that shouldn't be able to be passed to derive.
23
+ // If a bad point can be passed it's possible to perform a twist attack.
24
+ const mallory = new PublicKey(new BigNumber(14), new BigNumber(16))
25
+ expect(() => {
26
+ bob.deriveSharedSecret(mallory)
27
+ }).toThrow(new Error(
28
+ 'Public key not valid for ECDH secret derivation'
29
+ ))
30
+ })
31
+ })
@@ -0,0 +1,58 @@
1
+ import * as ECDSA from '../../../dist/cjs/src/primitives/ECDSA'
2
+ import BigNumber from '../../../dist/cjs/src/primitives/BigNumber'
3
+ import Curve from '../../../dist/cjs/src/primitives/Curve'
4
+ import Signature from '../../../dist/cjs/src/primitives/Signature'
5
+
6
+ const msg = new BigNumber('deadbeef', 16)
7
+ const key = new BigNumber('1e5edd45de6d22deebef4596b80444ffcc29143839c1dce18db470e25b4be7b5', 16)
8
+ const curve = new Curve()
9
+ const pub = curve.g.mul(key)
10
+ const wrongPub = curve.g.mul(new BigNumber(33))
11
+
12
+ describe('ECDSA', () => {
13
+ it('should sign and verify', () => {
14
+ const signature = ECDSA.sign(msg, key)
15
+ expect(ECDSA.verify(msg, signature, pub)).toBeTruthy()
16
+ })
17
+
18
+ it('should encode and decode with DER', () => {
19
+ const signature = ECDSA.sign(msg, key)
20
+ const encoded = signature.toDER()
21
+ expect(encoded.length).toBe(71)
22
+ const decoded = Signature.fromDER(encoded)
23
+ expect(decoded.r.toString(16)).toEqual(signature.r.toString(16))
24
+ expect(decoded.s.toString(16)).toEqual(signature.s.toString(16))
25
+ })
26
+
27
+ it('should encode and decode with hex DER', () => {
28
+ const signature = ECDSA.sign(msg, key)
29
+ const encoded = signature.toDER('hex')
30
+ expect(encoded.length).toBe(142)
31
+ const decoded = Signature.fromDER(encoded, 'hex')
32
+ expect(decoded.r.toString(16)).toEqual(signature.r.toString(16))
33
+ expect(decoded.s.toString(16)).toEqual(signature.s.toString(16))
34
+ })
35
+
36
+ it('should have `signature.s <= keys.ec.nh`', () => {
37
+ // key.sign(msg, options)
38
+ const sign = ECDSA.sign(msg, key, true)
39
+ expect(sign.s.cmp(curve.n.ushrn(1)) <= 0).toBeTruthy()
40
+ })
41
+
42
+ it('should support `options.k`', () => {
43
+ const sign = ECDSA.sign(msg, key, undefined, new BigNumber(1358))
44
+ expect(ECDSA.verify(msg, sign, pub)).toBeTruthy()
45
+ })
46
+
47
+ it('should not verify an incorrectly signed message', () => {
48
+ const wrongMessage = new BigNumber('BA5AABBE1AA9B6EC1E2ADB2DF99699344345678901234567890ABCDEFABCDEF02', 16)
49
+ const signature = ECDSA.sign(msg, key)
50
+ const result = ECDSA.verify(wrongMessage, signature, pub)
51
+ expect(result).toBe(false)
52
+ })
53
+
54
+ it('should not verify signature with wrong public key', () => {
55
+ const signature = ECDSA.sign(msg, key)
56
+ expect(ECDSA.verify(msg, signature, wrongPub)).toBeFalsy()
57
+ })
58
+ })
@@ -0,0 +1,59 @@
1
+ /* eslint-env jest */
2
+ import { SHA256HMAC } from '../../../dist/cjs/src/primitives/Hash'
3
+
4
+ describe('HMAC', function () {
5
+ describe('mixed test vector', function () {
6
+ test({
7
+ name: 'nist 1',
8
+ key: '00010203 04050607 08090A0B 0C0D0E0F' +
9
+ '10111213 14151617 18191A1B 1C1D1E1F 20212223 24252627' +
10
+ '28292A2B 2C2D2E2F 30313233 34353637 38393A3B 3C3D3E3F',
11
+ msg: 'Sample message for keylen=blocklen',
12
+ res: '8bb9a1db9806f20df7f77b82138c7914d174d59e13dc4d0169c9057b133e1d62'
13
+ })
14
+ test({
15
+ name: 'nist 2',
16
+ key: '00010203 04050607' +
17
+ '08090A0B 0C0D0E0F 10111213 14151617 18191A1B 1C1D1E1F',
18
+ msg: 'Sample message for keylen<blocklen',
19
+ res: 'a28cf43130ee696a98f14a37678b56bcfcbdd9e5cf69717fecf5480f0ebdf790'
20
+ })
21
+ test({
22
+ name: 'nist 3',
23
+ key: '00010203' +
24
+ '04050607 08090A0B 0C0D0E0F 10111213 14151617 18191A1B' +
25
+ '1C1D1E1F 20212223 24252627 28292A2B 2C2D2E2F 30313233' +
26
+ '34353637 38393A3B 3C3D3E3F 40414243 44454647 48494A4B' +
27
+ '4C4D4E4F 50515253 54555657 58595A5B 5C5D5E5F 60616263',
28
+ msg: 'Sample message for keylen=blocklen',
29
+ res: 'bdccb6c72ddeadb500ae768386cb38cc41c63dbb0878ddb9c7a38a431b78378d'
30
+ })
31
+ test({
32
+ name: 'nist 4',
33
+ key: '00' +
34
+ '01020304 05060708 090A0B0C 0D0E0F10 11121314 15161718' +
35
+ '191A1B1C 1D1E1F20 21222324 25262728 292A2B2C 2D2E2F30',
36
+ msg: 'Sample message for keylen<blocklen, with truncated tag',
37
+ res: '27a8b157839efeac98df070b331d593618ddb985d403c0c786d23b5d132e57c7'
38
+ })
39
+ test({
40
+ name: 'regression 1',
41
+ key: '48f38d0c6a344959cc94502b7b5e8dffb6a5f41795d9066fc9a649557167ee2f',
42
+ msg: '1d495eef7761b65dccd0a983d2d7204fea28b5c81f1758046e062eb043755ea1',
43
+ msgEnc: 'hex',
44
+ res: 'cf5ad5984f9e43917aa9087380dac46e410ddc8a7731859c84e9d0f31bd43655'
45
+ })
46
+
47
+ function test (opt): void {
48
+ it(`should not fail at ${opt.name as string}`, function (): void {
49
+ let h = new SHA256HMAC(opt.key)
50
+ expect(h.update(opt.msg, opt.msgEnc).digest('hex')).toEqual(opt.res)
51
+ h = h = new SHA256HMAC(opt.key)
52
+ expect(h
53
+ .update(opt.msg.slice(0, 10), opt.msgEnc)
54
+ .update(opt.msg.slice(10), opt.msgEnc)
55
+ .digest('hex')).toEqual(opt.res)
56
+ })
57
+ }
58
+ })
59
+ })
@@ -0,0 +1,121 @@
1
+ /* eslint-env jest */
2
+ import * as hash from '../../../dist/cjs/src/primitives/Hash'
3
+ import * as crypto from 'crypto'
4
+ import PBKDF2Vectors from './PBKDF2.vectors'
5
+ import { toArray, toHex } from '../../../dist/cjs/src/primitives/utils'
6
+
7
+ describe('Hash', function () {
8
+ function test(Hash, cases): void {
9
+ for (let i = 0; i < cases.length; i++) {
10
+ const msg = cases[i][0]
11
+ const res = cases[i][1]
12
+ const enc = cases[i][2]
13
+
14
+ let dgst = new Hash().update(msg, enc).digest('hex')
15
+ expect(dgst).toEqual(res)
16
+
17
+ // Split message
18
+ dgst = new Hash().update(msg.slice(0, 2), enc)
19
+ .update(msg.slice(2), enc)
20
+ .digest('hex')
21
+ expect(dgst).toEqual(res)
22
+ }
23
+ }
24
+
25
+ it('should support sha256', function () {
26
+ test(hash.SHA256, [
27
+ ['abc',
28
+ 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'],
29
+ ['abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq',
30
+ '248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1'],
31
+ ['deadbeef',
32
+ '5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953',
33
+ 'hex']
34
+ ])
35
+ })
36
+
37
+ it('should support ripemd160', function () {
38
+ test(hash.RIPEMD160, [
39
+ ['', '9c1185a5c5e9fc54612808977ee8f548b2258d31'],
40
+ ['abc',
41
+ '8eb208f7e05d987a9b044a8e98c6b087f15a0bfc'],
42
+ ['message digest',
43
+ '5d0689ef49d2fae572b881b123a85ffa21595f36'],
44
+ ['abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq',
45
+ '12a053384a9c0c88e405a06c27dcf49ada62eb2b'],
46
+ ['ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
47
+ 'b0e20b6e3116640286ed3a87a5713079b21f5189']
48
+ ])
49
+ })
50
+
51
+ it('should support sha1', function () {
52
+ test(hash.SHA1, [
53
+ ['',
54
+ 'da39a3ee5e6b4b0d3255bfef95601890afd80709'],
55
+ ['abc',
56
+ 'a9993e364706816aba3e25717850c26c9cd0d89d'],
57
+ ['abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq',
58
+ '84983e441c3bd26ebaae4aa1f95129e5e54670f1'],
59
+ ['deadbeef',
60
+ 'd78f8bb992a56a597f6c7a1fb918bb78271367eb',
61
+ 'hex']
62
+ ])
63
+ })
64
+
65
+ it('should support sha512', function () {
66
+ test(hash.SHA512, [
67
+ ['abc',
68
+ 'ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a' +
69
+ '2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f'
70
+ ],
71
+ [
72
+ 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn' +
73
+ 'hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu',
74
+ '8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018' +
75
+ '501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909'
76
+ ]
77
+ ])
78
+ })
79
+
80
+ it('handles utf8 in strings just like crypto', function () {
81
+ test(hash.SHA256, [
82
+ 'hello', // one byte per character
83
+ 'привет', // two bytes per character
84
+ '您好', // three bytes per character
85
+ '👋', // four bytes per character
86
+ 'hello привет 您好 👋!!!' // mixed character lengths
87
+ ].map(str => [str, crypto
88
+ .createHash('sha256')
89
+ .update(str)
90
+ .digest('hex')]))
91
+ })
92
+
93
+ describe('PBKDF2 vectors', () => {
94
+ for (let i = 0; i < PBKDF2Vectors.length; i++) {
95
+ let v = PBKDF2Vectors[i]
96
+ let key, salt
97
+ if (v.keyUint8Array) {
98
+ key = v.keyUint8Array
99
+ }
100
+ if (v.key) {
101
+ key = toArray(v.key, 'utf8')
102
+ }
103
+ if (v.keyHex) {
104
+ key = toArray(v.keyHex, 'hex')
105
+ }
106
+ if (v.saltUint8Array) {
107
+ salt = v.saltUint8Array
108
+ }
109
+ if (v.salt) {
110
+ salt = toArray(v.salt, 'utf8')
111
+ }
112
+ if (v.saltHex) {
113
+ salt = toArray(v.saltHex, 'hex')
114
+ }
115
+ it(`Passes PBKDF2 vector ${i}`, () => {
116
+ const output = hash.pbkdf2(key, salt, v.iterations, v.dkLen)
117
+ expect(toHex(output)).toEqual(v.results.sha512)
118
+ })
119
+ }
120
+ })
121
+ })