1 | const base64EncodeToString = require("../lib/code").base64EncodeToString;
|
2 | const {base64DecodeFromString, hexStr2byteArray} = require("../lib/code");
|
3 | const EC = require('elliptic').ec;
|
4 | const { keccak256 } = require('js-sha3');
|
5 | const jsSHA = require("../lib/sha256");
|
6 | const { byte2hexStr, byteArray2hexStr } = require("./bytes");
|
7 |
|
8 | const add_pre_fix = 'a0';
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | function signTransaction(priKeyBytes, transaction) {
|
19 | let raw = transaction.getRawData();
|
20 | let rawBytes = raw.serializeBinary();
|
21 | let hashBytes = SHA256(rawBytes);
|
22 | let signBytes = ECKeySign(hashBytes, priKeyBytes);
|
23 | let uint8Array = new Uint8Array(signBytes);
|
24 | let count = raw.getContractList().length;
|
25 | for (let i = 0; i < count; i++) {
|
26 | transaction.addSignature(uint8Array);
|
27 | }
|
28 | return transaction;
|
29 | }
|
30 |
|
31 |
|
32 |
|
33 | function getRowBytesFromTransactionBase64(base64Data) {
|
34 | let bytesDecode = base64DecodeFromString(base64Data);
|
35 | let transaction = proto.protocol.Transaction.deserializeBinary(bytesDecode);
|
36 | let raw = transaction.getRawData();
|
37 | return raw.serializeBinary();
|
38 | }
|
39 |
|
40 |
|
41 | function genPriKey() {
|
42 | let ec = new EC('secp256k1');
|
43 | let key = ec.genKeyPair();
|
44 | let priKey = key.getPrivate();
|
45 | let priKeyHex = priKey.toString('hex');
|
46 | while (priKeyHex.length < 64) {
|
47 | priKeyHex = "0" + priKeyHex;
|
48 | }
|
49 |
|
50 | return hexStr2byteArray(priKeyHex);
|
51 | }
|
52 |
|
53 |
|
54 | function computeAddress(pubBytes) {
|
55 | if (pubBytes.length === 65) {
|
56 | pubBytes = pubBytes.slice(1);
|
57 | }
|
58 |
|
59 | var hash = keccak256(pubBytes).toString();
|
60 | var addressHex = hash.substring(24);
|
61 | addressHex = add_pre_fix + addressHex;
|
62 | var addressBytes = hexStr2byteArray(addressHex);
|
63 | return addressBytes;
|
64 | }
|
65 |
|
66 |
|
67 | function getAddressFromPriKey(priKeyBytes) {
|
68 | let pubBytes = getPubKeyFromPriKey(priKeyBytes);
|
69 | let addressBytes = computeAddress(pubBytes);
|
70 | return addressBytes;
|
71 | }
|
72 |
|
73 |
|
74 | function getHexStrAddressFromPriKeyBase64String(priKeyBase64String) {
|
75 | let priKeyBytes = base64DecodeFromString(priKeyBase64String);
|
76 | let pubBytes = getPubKeyFromPriKey(priKeyBytes);
|
77 | let addressBytes = computeAddress(pubBytes);
|
78 | let addressHex = byteArray2hexStr(addressBytes);
|
79 | return addressHex;
|
80 | }
|
81 |
|
82 | function getAddressFromPriKeyBase64String(priKeyBase64String) {
|
83 | let priKeyBytes = base64DecodeFromString(priKeyBase64String);
|
84 | let pubBytes = getPubKeyFromPriKey(priKeyBytes);
|
85 | let addressBytes = computeAddress(pubBytes);
|
86 | let addressBase64 = base64EncodeToString(addressBytes);
|
87 | return addressBase64;
|
88 | }
|
89 |
|
90 |
|
91 | function getPubKeyFromPriKey(priKeyBytes) {
|
92 | var ec = new EC('secp256k1');
|
93 | var key = ec.keyFromPrivate(priKeyBytes, 'bytes');
|
94 | var pubkey = key.getPublic();
|
95 | var x = pubkey.x;
|
96 | var y = pubkey.y;
|
97 | var xHex = x.toString('hex');
|
98 | while (xHex.length < 64) {
|
99 | xHex = "0" + xHex;
|
100 | }
|
101 | var yHex = y.toString('hex');
|
102 | while (yHex.length < 64) {
|
103 | yHex = "0" + yHex;
|
104 | }
|
105 | var pubkeyHex = "04" + xHex + yHex;
|
106 | var pubkeyBytes = hexStr2byteArray(pubkeyHex);
|
107 | return pubkeyBytes;
|
108 | }
|
109 |
|
110 |
|
111 | function ECKeySign(hashBytes, priKeyBytes) {
|
112 | let ec = new EC('secp256k1');
|
113 | let key = ec.keyFromPrivate(priKeyBytes, 'bytes');
|
114 | let signature = key.sign(hashBytes);
|
115 | let r = signature.r;
|
116 | let s = signature.s;
|
117 | let id = signature.recoveryParam;
|
118 | let rHex = r.toString('hex');
|
119 | while (rHex.length < 64) {
|
120 | rHex = "0" + rHex;
|
121 | }
|
122 | let sHex = s.toString('hex');
|
123 | while (sHex.length < 64) {
|
124 | sHex = "0" + sHex;
|
125 | }
|
126 | let idHex = byte2hexStr(id);
|
127 | let signHex = rHex + sHex + idHex;
|
128 | return hexStr2byteArray(signHex);
|
129 | }
|
130 |
|
131 |
|
132 |
|
133 | function SHA256(msgBytes) {
|
134 | let shaObj = new jsSHA("SHA-256", "HEX");
|
135 | let msgHex = byteArray2hexStr(msgBytes);
|
136 | shaObj.update(msgHex);
|
137 | let hashHex = shaObj.getHash("HEX");
|
138 | return hexStr2byteArray(hashHex);
|
139 | }
|
140 |
|
141 | function passwordToAddress(password) {
|
142 | let com_priKeyBytes = base64DecodeFromString(password);
|
143 | let com_addressBytes = getAddressFromPriKey(com_priKeyBytes);
|
144 | return byteArray2hexStr(com_addressBytes);
|
145 | }
|
146 |
|
147 | module.exports = {
|
148 | signTransaction,
|
149 | passwordToAddress,
|
150 | genPriKey,
|
151 | getAddressFromPriKey,
|
152 | getPubKeyFromPriKey,
|
153 | };
|