Skip to content

Commit c60846a

Browse files
committed
wip: add signEth() with magic recovery byte offset
1 parent 8c9884d commit c60846a

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

key-utils.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ let Secp256k1 = require("@dashincubator/secp256k1");
77
* @typedef KeyUtilsPartial
88
* @prop {KeySet} set
99
* @prop {KeySignAsn1} signAsn1
10+
* @prop {KeySignEth} signEth
1011
* @prop {KeySignP1363} signP1363
1112
* @prop {ASN1ToP1363Signature} asn1ToP1363Signature
1213
*/
@@ -25,6 +26,13 @@ let Secp256k1 = require("@dashincubator/secp256k1");
2526
* @returns {Promise<Uint8Array>}
2627
*/
2728

29+
/**
30+
* @callback KeySignEth
31+
* @param {Uint8Array} privateKey
32+
* @param {Uint8Array} hashBytes
33+
* @returns {Promise<Uint8Array>}
34+
*/
35+
2836
/**
2937
* @callback KeySignP1363
3038
* @param {Uint8Array} privateKey
@@ -76,13 +84,32 @@ KeyUtils.signAsn1 = async function (privKeyBytes, hashBytes) {
7684
return sigBytes;
7785
};
7886

87+
KeyUtils.signEth = async function (privKeyBytes, hashBytes) {
88+
let ETH_OFFSET = 27; // maybe the right number... maybe not
89+
let testing = true;
90+
let sigOpts = { canonical: true, der: false, recovered: true };
91+
if (!testing) {
92+
Object.assign({ extraEntropy: true });
93+
}
94+
let recoverySig = await Secp256k1.sign(hashBytes, privKeyBytes, sigOpts);
95+
let ethSig = new Uint8Array(65);
96+
let recovery = ETH_OFFSET + recoverySig[1];
97+
ethSig[0] = recovery;
98+
ethSig.set(recoverySig[0], 1);
99+
// console.log(`DEBUG [SIGNATURE] rawBytes:`);
100+
// console.log(recoverySig[0]);
101+
// console.log(`DEBUG [RECOVERY] rawBytes:`);
102+
// console.log(recoverySig[1]);
103+
return ethSig;
104+
};
105+
79106
KeyUtils.signP1363 = async function (privKeyBytes, hashBytes, sigBytes) {
80107
let asn1Bytes = await KeyUtils.signAsn1(privKeyBytes, hashBytes);
81108
let p1363Bytes = KeyUtils.asn1ToP1363Signature(asn1Bytes, sigBytes);
82109
// TODO DEBUG TESTING
83-
for (let i = 0; i < p1363Bytes.length; i += 1) {
84-
p1363Bytes[i] = 0xff;
85-
}
110+
// for (let i = 0; i < p1363Bytes.length; i += 1) {
111+
// p1363Bytes[i] = 0xff;
112+
// }
86113
return p1363Bytes;
87114
};
88115

0 commit comments

Comments
 (0)