crypto.js 9.5 KB

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