crypto.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.getBase58CheckAddress = getBase58CheckAddress;
  4. exports.decodeBase58Address = decodeBase58Address;
  5. exports.signTransaction = signTransaction;
  6. exports.ecRecover = ecRecover;
  7. exports.arrayToBase64String = arrayToBase64String;
  8. exports.signBytes = signBytes;
  9. exports.getRowBytesFromTransactionBase64 = getRowBytesFromTransactionBase64;
  10. exports.genPriKey = genPriKey;
  11. exports.computeAddress = computeAddress;
  12. exports.getAddressFromPriKey = getAddressFromPriKey;
  13. exports.decode58Check = decode58Check;
  14. exports.isAddressValid = isAddressValid;
  15. exports.getBase58CheckAddressFromPriKeyBase64String = getBase58CheckAddressFromPriKeyBase64String;
  16. exports.getHexStrAddressFromPriKeyBase64String = getHexStrAddressFromPriKeyBase64String;
  17. exports.getAddressFromPriKeyBase64String = getAddressFromPriKeyBase64String;
  18. exports.getPubKeyFromPriKey = getPubKeyFromPriKey;
  19. exports.ECKeySign = ECKeySign;
  20. exports.SHA256 = SHA256;
  21. exports.passwordToAddress = passwordToAddress;
  22. exports.pkToAddress = pkToAddress;
  23. exports.sha3 = sha3;
  24. const constants_js_1 = require("./constants.js");
  25. const code_js_1 = require("./code.js");
  26. const base58_js_1 = require("./base58.js");
  27. const bytes_js_1 = require("./bytes.js");
  28. const ethersUtils_js_1 = require("./ethersUtils.js");
  29. const secp256k1_1 = require("ethereum-cryptography/secp256k1");
  30. function normalizePrivateKeyBytes(priKeyBytes) {
  31. return (0, code_js_1.hexStr2byteArray)((0, bytes_js_1.byteArray2hexStr)(priKeyBytes).padStart(64, '0'));
  32. }
  33. function getBase58CheckAddress(addressBytes) {
  34. const hash0 = SHA256(addressBytes);
  35. const hash1 = SHA256(hash0);
  36. let checkSum = hash1.slice(0, 4);
  37. checkSum = addressBytes.concat(checkSum);
  38. return (0, base58_js_1.encode58)(checkSum);
  39. }
  40. function decodeBase58Address(base58Sting) {
  41. if (typeof base58Sting != 'string')
  42. return false;
  43. if (base58Sting.length <= 4)
  44. return false;
  45. let address = (0, base58_js_1.decode58)(base58Sting);
  46. if (base58Sting.length <= 4)
  47. return false;
  48. const len = address.length;
  49. const offset = len - 4;
  50. const checkSum = address.slice(offset);
  51. address = address.slice(0, offset);
  52. const hash0 = SHA256(address);
  53. const hash1 = SHA256(hash0);
  54. const checkSum1 = hash1.slice(0, 4);
  55. if (checkSum[0] == checkSum1[0] &&
  56. checkSum[1] == checkSum1[1] &&
  57. checkSum[2] == checkSum1[2] &&
  58. checkSum[3] == checkSum1[3]) {
  59. return address;
  60. }
  61. throw new Error('Invalid address provided');
  62. }
  63. // @TODO transaction type should be determined.
  64. function signTransaction(priKeyBytes, transaction) {
  65. if (typeof priKeyBytes === 'string')
  66. priKeyBytes = (0, code_js_1.hexStr2byteArray)(priKeyBytes);
  67. const txID = transaction.txID;
  68. const signature = ECKeySign((0, code_js_1.hexStr2byteArray)(txID), priKeyBytes);
  69. if (Array.isArray(transaction.signature)) {
  70. if (!transaction.signature.includes(signature))
  71. transaction.signature.push(signature);
  72. }
  73. else
  74. transaction.signature = [signature];
  75. return transaction;
  76. }
  77. function ecRecover(signedData, signature) {
  78. signedData = '0x' + signedData.replace(/^0x/, '');
  79. signature = '0x' + signature.replace(/^0x/, '');
  80. const recovered = (0, ethersUtils_js_1.recoverAddress)((0, ethersUtils_js_1.arrayify)(signedData), ethersUtils_js_1.Signature.from(signature));
  81. const tronAddress = constants_js_1.ADDRESS_PREFIX + recovered.substring(2);
  82. return tronAddress;
  83. }
  84. function arrayToBase64String(a) {
  85. return btoa(String.fromCharCode(...a));
  86. }
  87. function signBytes(privateKey, contents) {
  88. if (typeof privateKey === 'string')
  89. privateKey = (0, code_js_1.hexStr2byteArray)(privateKey);
  90. const hashBytes = SHA256(contents);
  91. const signBytes = ECKeySign(hashBytes, privateKey);
  92. return signBytes;
  93. }
  94. function getRowBytesFromTransactionBase64(base64Data) {
  95. const bytesDecode = (0, code_js_1.base64DecodeFromString)(base64Data);
  96. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  97. // @ts-ignore
  98. const transaction = globalThis.proto.protocol.Transaction.deserializeBinary(bytesDecode);
  99. const raw = transaction.getRawData();
  100. return raw.serializeBinary();
  101. }
  102. function genPriKey() {
  103. const priKey = secp256k1_1.secp256k1.utils.randomPrivateKey();
  104. let priKeyHex = (0, bytes_js_1.byteArray2hexStr)(priKey);
  105. priKeyHex = priKeyHex.padStart(64, '0');
  106. return (0, code_js_1.hexStr2byteArray)(priKeyHex);
  107. }
  108. function computeAddress(pubBytes) {
  109. if (pubBytes.length === 65)
  110. pubBytes = pubBytes.slice(1);
  111. const hash = (0, ethersUtils_js_1.keccak256)(new Uint8Array(pubBytes)).toString().substring(2);
  112. const addressHex = constants_js_1.ADDRESS_PREFIX + hash.substring(24);
  113. return (0, code_js_1.hexStr2byteArray)(addressHex);
  114. }
  115. function getAddressFromPriKey(priKeyBytes) {
  116. const pubBytes = getPubKeyFromPriKey(priKeyBytes);
  117. return computeAddress(pubBytes);
  118. }
  119. function decode58Check(addressStr) {
  120. const decodeCheck = (0, base58_js_1.decode58)(addressStr);
  121. if (decodeCheck.length <= 4)
  122. return false;
  123. const decodeData = decodeCheck.slice(0, decodeCheck.length - 4);
  124. const hash0 = SHA256(decodeData);
  125. const hash1 = SHA256(hash0);
  126. if (hash1[0] === decodeCheck[decodeData.length] &&
  127. hash1[1] === decodeCheck[decodeData.length + 1] &&
  128. hash1[2] === decodeCheck[decodeData.length + 2] &&
  129. hash1[3] === decodeCheck[decodeData.length + 3]) {
  130. return decodeData;
  131. }
  132. return false;
  133. }
  134. function isAddressValid(base58Str) {
  135. if (typeof base58Str !== 'string')
  136. return false;
  137. if (base58Str.length !== constants_js_1.ADDRESS_SIZE)
  138. return false;
  139. let address = (0, base58_js_1.decode58)(base58Str);
  140. if (address.length !== 25)
  141. return false;
  142. if (address[0] !== constants_js_1.ADDRESS_PREFIX_BYTE)
  143. return false;
  144. const checkSum = address.slice(21);
  145. address = address.slice(0, 21);
  146. const hash0 = SHA256(address);
  147. const hash1 = SHA256(hash0);
  148. const checkSum1 = hash1.slice(0, 4);
  149. if (checkSum[0] == checkSum1[0] &&
  150. checkSum[1] == checkSum1[1] &&
  151. checkSum[2] == checkSum1[2] &&
  152. checkSum[3] == checkSum1[3]) {
  153. return true;
  154. }
  155. return false;
  156. }
  157. function getBase58CheckAddressFromPriKeyBase64String(priKeyBase64String) {
  158. const priKeyBytes = (0, code_js_1.base64DecodeFromString)(priKeyBase64String);
  159. const pubBytes = getPubKeyFromPriKey(priKeyBytes);
  160. const addressBytes = computeAddress(pubBytes);
  161. return getBase58CheckAddress(addressBytes);
  162. }
  163. function getHexStrAddressFromPriKeyBase64String(priKeyBase64String) {
  164. const priKeyBytes = (0, code_js_1.base64DecodeFromString)(priKeyBase64String);
  165. const pubBytes = getPubKeyFromPriKey(priKeyBytes);
  166. const addressBytes = computeAddress(pubBytes);
  167. const addressHex = (0, bytes_js_1.byteArray2hexStr)(addressBytes);
  168. return addressHex;
  169. }
  170. function getAddressFromPriKeyBase64String(priKeyBase64String) {
  171. const priKeyBytes = (0, code_js_1.base64DecodeFromString)(priKeyBase64String);
  172. const pubBytes = getPubKeyFromPriKey(priKeyBytes);
  173. const addressBytes = computeAddress(pubBytes);
  174. const addressBase64 = (0, code_js_1.base64EncodeToString)(addressBytes);
  175. return addressBase64;
  176. }
  177. function getPubKeyFromPriKey(priKeyBytes) {
  178. const pubkey = secp256k1_1.secp256k1.ProjectivePoint.fromPrivateKey(new Uint8Array(normalizePrivateKeyBytes(priKeyBytes)));
  179. const x = pubkey.x;
  180. const y = pubkey.y;
  181. const xHex = x.toString(16).padStart(64, '0');
  182. const yHex = y.toString(16).padStart(64, '0');
  183. const pubkeyHex = `04${xHex}${yHex}`;
  184. const pubkeyBytes = (0, code_js_1.hexStr2byteArray)(pubkeyHex);
  185. return pubkeyBytes;
  186. }
  187. function ECKeySign(hashBytes, priKeyBytes) {
  188. const signature = secp256k1_1.secp256k1.sign((0, bytes_js_1.byteArray2hexStr)(hashBytes), (0, bytes_js_1.byteArray2hexStr)(priKeyBytes));
  189. const r = signature.r.toString(16);
  190. const s = signature.s.toString(16);
  191. const v = signature.recovery + 27;
  192. return r.padStart(64, '0') + s.padStart(64, '0') + (0, bytes_js_1.byte2hexStr)(v);
  193. }
  194. function SHA256(msgBytes) {
  195. const msgHex = (0, bytes_js_1.byteArray2hexStr)(msgBytes);
  196. const hashHex = (0, ethersUtils_js_1.sha256)('0x' + msgHex).replace(/^0x/, '');
  197. return (0, code_js_1.hexStr2byteArray)(hashHex);
  198. }
  199. function passwordToAddress(password) {
  200. const com_priKeyBytes = (0, code_js_1.base64DecodeFromString)(password);
  201. const com_addressBytes = getAddressFromPriKey(com_priKeyBytes);
  202. return getBase58CheckAddress(com_addressBytes);
  203. }
  204. function pkToAddress(privateKey, strict = false) {
  205. const com_priKeyBytes = (0, code_js_1.hexStr2byteArray)(privateKey, strict);
  206. const com_addressBytes = getAddressFromPriKey(com_priKeyBytes);
  207. return getBase58CheckAddress(com_addressBytes);
  208. }
  209. function sha3(string, prefix = true) {
  210. return (prefix ? '0x' : '') + (0, ethersUtils_js_1.keccak256)(Buffer.from(string, 'utf-8')).toString().substring(2);
  211. }
  212. //# sourceMappingURL=crypto.js.map