UNPKG

4.67 kBJavaScriptView Raw
1const base64EncodeToString = require("../lib/code").base64EncodeToString;
2const {base64DecodeFromString, hexStr2byteArray} = require("../lib/code");
3const EC = require('elliptic').ec;
4const { keccak256 } = require('js-sha3');
5const jsSHA = require("../lib/sha256");
6const { byte2hexStr, byteArray2hexStr } = require("./bytes");
7
8const add_pre_fix = 'a0'; //a0 + address ,a0 is version
9
10
11/**
12 * Sign A Transaction by priKey.
13 * signature is 65 bytes, r[32] || s[32] || id[1](<27)
14 * @returns a Transaction object signed
15 * @param priKeyBytes: privateKey for ECC
16 * @param transaction: a Transaction object unSigned
17 */
18function 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); //TODO: multy priKey
27 }
28 return transaction;
29}
30
31
32//return bytes of rowdata, use to sign.
33function 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//gen Ecc priKey for bytes
41function 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//return address by bytes, pubBytes is byte[]
54function 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//return address by bytes, priKeyBytes is byte[]
67function getAddressFromPriKey(priKeyBytes) {
68 let pubBytes = getPubKeyFromPriKey(priKeyBytes);
69 let addressBytes = computeAddress(pubBytes);
70 return addressBytes;
71}
72
73//return address by String, priKeyBytes is base64String
74function 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//return address by String, priKeyBytes is base64String
82function 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//return pubkey by 65 bytes, priKeyBytes is byte[]
91function 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//return sign by 65 bytes r s id. id < 27
111function 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//toDO:
132//return 32 bytes
133function 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
141function passwordToAddress(password) {
142 let com_priKeyBytes = base64DecodeFromString(password);
143 let com_addressBytes = getAddressFromPriKey(com_priKeyBytes);
144 return byteArray2hexStr(com_addressBytes);
145}
146
147module.exports = {
148 signTransaction,
149 passwordToAddress,
150 genPriKey,
151 getAddressFromPriKey,
152 getPubKeyFromPriKey,
153};