Skip to content
This repository was archived by the owner on Aug 2, 2022. It is now read-only.

Commit 1cf9bf5

Browse files
author
Brad Hart
authored
Merge pull request #788 from EOSIO/release/21.0.x
Release for 21.0.3
2 parents 203e13e + c1acda0 commit 1cf9bf5

9 files changed

+818
-703
lines changed

docs.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"name": "eosjs",
33
"generators": [
4-
{
4+
{
55
"name": "collate_markdown",
6-
"options": {
7-
"docs_dir": "docs"
6+
"options": {
7+
"docs_dir": "docs"
88
}
99
},
1010
{
1111
"name": "typedoc",
1212
"options": {
13-
"disable_filters": true
14-
},
15-
"filters": [
16-
{ "name": "remove_extension" }
17-
]
13+
"disable_default_filters": true,
14+
"filters": [
15+
{ "name": "remove_extension" }
16+
]
17+
}
1818
}
1919
]
2020
}

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "eosjs",
3-
"version": "21.0.2",
3+
"version": "21.0.3",
44
"description": "Talk to eos API",
55
"main": "dist/index.js",
66
"scripts": {
@@ -33,18 +33,18 @@
3333
"devDependencies": {
3434
"@blockone/eslint-config-blockone": "^3.0.0",
3535
"@types/elliptic": "^6.4.12",
36-
"@types/jest": "^26.0.4",
37-
"@types/node": "^14.0.23",
36+
"@types/jest": "^26.0.9",
37+
"@types/node": "^14.0.27",
3838
"@types/pako": "^1.0.1",
39-
"cypress": "^4.10.0",
39+
"cypress": "^4.12.1",
4040
"eosjs-ecc": "^4.0.7",
4141
"eslint": "^6.8.0",
42-
"jest": "^26.1.0",
42+
"jest": "^26.3.0",
4343
"jest-fetch-mock": "^3.0.3",
44-
"ts-jest": "^26.1.2",
44+
"ts-jest": "^26.2.0",
4545
"ts-loader": "^7.0.5",
46-
"typescript": "^3.9.6",
47-
"webpack": "^4.43.0",
46+
"typescript": "^3.9.7",
47+
"webpack": "^4.44.1",
4848
"webpack-cli": "^3.3.12"
4949
},
5050
"resolutions": {

src/PrivateKey.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,12 @@ export class PrivateKey {
5858
}
5959

6060
/** Sign a message or hashed message digest with private key */
61-
public sign(data: BNInput, shouldHash: boolean = true, encoding: string = 'utf8'): Signature {
61+
public sign(data: BNInput, shouldHash: boolean = true, encoding: BufferEncoding = 'utf8'): Signature {
6262
if (shouldHash) {
63-
data = this.ec.hash().update(data, encoding).digest();
63+
if (typeof data === 'string') {
64+
data = Buffer.from(data, encoding);
65+
}
66+
data = this.ec.hash().update(data).digest();
6467
}
6568
let tries = 0;
6669
let signature: Signature;

src/Signature.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,25 @@ export class Signature {
8686
}
8787

8888
/** Verify a signature with a message or hashed message digest and public key */
89-
public verify(data: BNInput, publicKey: PublicKey, shouldHash: boolean = true, encoding: string = 'utf8'): boolean {
89+
public verify(data: BNInput, publicKey: PublicKey, shouldHash: boolean = true, encoding: BufferEncoding = 'utf8'): boolean {
9090
if (shouldHash) {
91-
data = this.ec.hash().update(data, encoding).digest();
91+
if (typeof data === 'string') {
92+
data = Buffer.from(data, encoding);
93+
}
94+
data = this.ec.hash().update(data).digest();
9295
}
9396
const ellipticSignature = this.toElliptic();
9497
const ellipticPublicKey = publicKey.toElliptic();
9598
return this.ec.verify(data, ellipticSignature, ellipticPublicKey, encoding);
9699
}
97100

98101
/** Recover a public key from a message or hashed message digest and signature */
99-
public recover(data: BNInput, shouldHash: boolean = true, encoding: string = 'utf8'): PublicKey {
102+
public recover(data: BNInput, shouldHash: boolean = true, encoding: BufferEncoding = 'utf8'): PublicKey {
100103
if (shouldHash) {
101-
data = this.ec.hash().update(data, encoding).digest();
104+
if (typeof data === 'string') {
105+
data = Buffer.from(data, encoding);
106+
}
107+
data = this.ec.hash().update(data).digest();
102108
}
103109
const ellipticSignature = this.toElliptic();
104110
const recoveredPublicKey = this.ec.recoverPubKey(

src/eosjs-ecc-migration.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,29 @@ export const ecc = {
4949
return false;
5050
}
5151
},
52-
sign: (data: string|Buffer, privateKey: string|PrivateKey, encoding: string = 'utf8'): string => {
52+
sign: (data: string|Buffer, privateKey: string|PrivateKey, encoding: BufferEncoding = 'utf8'): string => {
5353
const privKey = typeof privateKey === 'string' ? PrivateKey.fromString(privateKey) : privateKey;
5454
const signature = privKey.sign(data, true, encoding);
5555
return signature.toString();
5656
},
57-
signHash: (dataSha256: string|Buffer, privateKey: string|PrivateKey, encoding: string = 'hex') => {
57+
signHash: (dataSha256: string|Buffer, privateKey: string|PrivateKey, encoding: BufferEncoding = 'hex') => {
5858
const privKey = typeof privateKey === 'string' ? PrivateKey.fromString(privateKey) : privateKey;
5959
const signature = privKey.sign(dataSha256, false, encoding);
6060
return signature.toString();
6161
},
6262
verify: (
63-
signature: string, data: string, pubKey: string|PublicKey, encoding: string = 'utf8', hashData: boolean = true
63+
signature: string, data: string, pubKey: string|PublicKey, encoding: BufferEncoding = 'utf8', hashData: boolean = true
6464
): boolean => {
6565
const publicKey = typeof pubKey === 'string' ? PublicKey.fromString(pubKey) : pubKey;
6666
const sig = Signature.fromString(signature);
6767
return sig.verify(data, publicKey, hashData, encoding);
6868
},
69-
recover: (signature: string, data: string, encoding: string = 'utf8'): string => {
69+
recover: (signature: string, data: string, encoding: BufferEncoding = 'utf8'): string => {
7070
const sig = Signature.fromString(signature);
7171
const publicKey = sig.recover(data, true, encoding);
7272
return publicKey.toLegacyString();
7373
},
74-
recoverHash: (signature: string, dataSha256: string|Buffer, encoding: string = 'hex'): string => {
74+
recoverHash: (signature: string, dataSha256: string|Buffer, encoding: BufferEncoding = 'hex'): string => {
7575
const sig = Signature.fromString(signature);
7676
const publicKey = sig.recover(dataSha256, false, encoding);
7777
return publicKey.toLegacyString();

src/tests/eosjs-ecc-migration.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,35 +91,35 @@ describe('ecc Migration', () => {
9191

9292
it('verifies `sign`, `recover`, and `verify` functions are consistent between ecc objects', () => {
9393
const dataAsString = 'some string';
94-
const eccSig = ecc.sign(dataAsString, privateKeys[0]);
95-
const eccMigrationSig = eccMigration.sign(dataAsString, privateKeys[0]);
94+
const eccSig = ecc.sign(dataAsString, privateKeys[0], 'utf8');
95+
const eccMigrationSig = eccMigration.sign(dataAsString, privateKeys[0], 'utf8');
9696

9797
// signatures are different
9898
expect(eccSig).not.toEqual(eccMigrationSig);
9999

100-
const eccKPub = ecc.recover(eccSig, dataAsString);
101-
const eccMigrationKPub = eccMigration.recover(eccMigrationSig, dataAsString);
100+
const eccKPub = ecc.recover(eccSig, dataAsString, 'utf8');
101+
const eccMigrationKPub = eccMigration.recover(eccMigrationSig, dataAsString, 'utf8');
102102
expect(eccKPub).toEqual(eccMigrationKPub);
103103
});
104104

105105
it('verifies `signHash`, `recoverHash`, and `sha256` functions are consistent between ecc objects', () => {
106106
console.warn = jest.fn();
107107
const dataAsString = 'some string';
108108

109-
const eccHash = Buffer.from(ecc.sha256(dataAsString, 'hex', 'utf8'), 'hex');
110-
const eccMigrationHash = Buffer.from(eccMigration.sha256(dataAsString, 'hex', 'utf8') as Buffer);
109+
const eccHash = Buffer.from(ecc.sha256(dataAsString), 'hex');
110+
const eccMigrationHash = Buffer.from(eccMigration.sha256(dataAsString, 'hex', 'utf8') as string, 'hex');
111111
expect(console.warn).toBeCalledWith('Argument `encoding` is deprecated');
112112
expect(console.warn).toBeCalledWith('Argument `resultEncoding` is deprecated');
113113
expect(eccHash).toEqual(eccMigrationHash);
114114

115-
const eccSig = ecc.signHash(eccHash, privateKeys[0]);
116-
const eccMigrationSig = eccMigration.signHash(eccMigrationHash, privateKeys[0]);
115+
const eccSig = ecc.signHash(eccHash, privateKeys[0], 'utf8');
116+
const eccMigrationSig = eccMigration.signHash(eccMigrationHash, privateKeys[0], 'utf8');
117117

118118
// signatures are different
119119
expect(eccSig).not.toEqual(eccMigrationSig);
120120

121-
const eccKPub = ecc.recoverHash(eccSig, eccHash);
122-
const eccMigrationKPub = eccMigration.recoverHash(eccSig, eccMigrationHash);
121+
const eccKPub = ecc.recoverHash(eccSig, eccHash, 'utf8');
122+
const eccMigrationKPub = eccMigration.recoverHash(eccSig, eccMigrationHash, 'utf8');
123123
expect(eccKPub).toEqual(eccMigrationKPub);
124124
});
125125
});

src/tests/eosjs-ecc-verification.test.js

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const ecc = require('eosjs-ecc');
33

44
const { ec } = require('elliptic');
55

6-
const { Signature, PrivateKey, PublicKey } = require('../eosjs-key-conversions');
6+
const { Signature, PrivateKey, PublicKey, sha256 } = require('../eosjs-key-conversions');
77
const {
88
JsSignatureProvider,
99
} = require('../eosjs-jssig');
@@ -52,23 +52,25 @@ describe('JsSignatureProvider', () => {
5252
const ellipticHashedStringAsBuffer = Buffer.from(ellipticEc.hash().update(dataAsString).digest(), 'hex');
5353
expect(eccHashedString).toEqual(ellipticHashedStringAsBuffer);
5454

55-
const eccSig = ecc.sign(dataAsString, KPriv);
56-
const ellipticSig = KPrivElliptic.sign(ellipticHashedStringAsBuffer);
55+
const eccSig = ecc.sign(dataAsString, KPriv, 'utf8');
56+
const ellipticSig = KPrivElliptic.sign(ellipticHashedStringAsBuffer, 'utf8');
5757

58-
const eccKPub = ecc.recover(eccSig, dataAsString);
58+
const eccKPub = ecc.recover(eccSig, dataAsString, 'utf8');
5959
const ellipticRecoveredKPub = ellipticEc.recoverPubKey(
6060
ellipticHashedStringAsBuffer,
6161
ellipticSig,
62-
ellipticSig.recoveryParam
62+
ellipticSig.recoveryParam,
63+
'utf8'
6364
);
6465
const ellipticKPub = ellipticEc.keyFromPublic(ellipticRecoveredKPub);
6566
expect(PublicKey.fromElliptic(ellipticKPub, KeyType.k1).toString()).toEqual(k1FormatPublicKeys[idx]);
6667

67-
const eccValid = ecc.verify(eccSig, dataAsString, eccKPub);
68+
const eccValid = ecc.verify(eccSig, dataAsString, eccKPub, 'utf8');
6869
const ellipticValid = ellipticEc.verify(
6970
ellipticHashedStringAsBuffer,
7071
ellipticSig,
71-
ellipticEc.keyFromPublic(ellipticKPub)
72+
ellipticEc.keyFromPublic(ellipticKPub),
73+
'utf8'
7274
);
7375
expect(eccValid).toEqual(true);
7476
expect(ellipticValid).toEqual(true);
@@ -88,14 +90,15 @@ describe('JsSignatureProvider', () => {
8890
const ellipticHashedStringAsBuffer = Buffer.from(ellipticEc.hash().update(dataAsString).digest(), 'hex');
8991
expect(eccHashedString).toEqual(ellipticHashedStringAsBuffer);
9092

91-
const eccSig = ecc.sign(dataAsString, KPriv);
93+
const eccSig = ecc.sign(dataAsString, KPriv, 'utf8');
9294

9395
const ellipticSig = Signature.fromString(eccSig).toElliptic();
94-
const recoveredKPub = ecc.recover(eccSig, dataAsString);
96+
const recoveredKPub = ecc.recover(eccSig, dataAsString, 'utf8');
9597
const ellipticRecoveredKPub = ellipticEc.recoverPubKey(
9698
ellipticHashedStringAsBuffer,
9799
ellipticSig,
98-
ellipticSig.recoveryParam
100+
ellipticSig.recoveryParam,
101+
'utf8'
99102
);
100103

101104
const ellipticKPub = ellipticEc.keyFromPublic(ellipticRecoveredKPub);
@@ -105,7 +108,8 @@ describe('JsSignatureProvider', () => {
105108
const ellipticValid = ellipticEc.verify(
106109
ellipticHashedStringAsBuffer,
107110
ellipticSig,
108-
ellipticEc.keyFromPublic(ellipticKPub)
111+
ellipticEc.keyFromPublic(ellipticKPub),
112+
'utf8'
109113
);
110114
expect(ellipticValid).toEqual(true);
111115
}
@@ -122,19 +126,67 @@ describe('JsSignatureProvider', () => {
122126

123127
const ellipticHashedStringAsBuffer = Buffer.from(ellipticEc.hash().update(dataAsString).digest(), 'hex');
124128

125-
const ellipticSig = KPrivElliptic.sign(ellipticHashedStringAsBuffer);
129+
const ellipticSig = KPrivElliptic.sign(ellipticHashedStringAsBuffer, 'utf8');
126130
const ellipticSigAsString = Signature.fromElliptic(ellipticSig, KeyType.k1).toString();
127131

128-
const recoveredKPub = ecc.recover(ellipticSigAsString, dataAsString);
132+
const recoveredKPub = ecc.recover(ellipticSigAsString, dataAsString, 'utf8');
129133
const ellipticRecoveredKPub = ellipticEc.recoverPubKey(
130134
ellipticHashedStringAsBuffer,
131135
ellipticSig,
132-
ellipticSig.recoveryParam
136+
ellipticSig.recoveryParam,
137+
'utf8'
133138
);
134139
const ellipticKPub = ellipticEc.keyFromPublic(ellipticRecoveredKPub);
135140
expect(PublicKey.fromElliptic(ellipticKPub, KeyType.k1).toString()).toEqual(k1FormatPublicKeys[idx]);
136141

137-
const eccValid = ecc.verify(ellipticSigAsString, dataAsString, recoveredKPub);
142+
const eccValid = ecc.verify(ellipticSigAsString, dataAsString, recoveredKPub, 'utf8');
143+
expect(eccValid).toEqual(true);
144+
}
145+
});
146+
147+
it('ensure eosjs verifies eosjs-ecc\'s Sigs', () => {
148+
for (let idx=0; idx<privateKeys.length; idx++) {
149+
const KPriv = privateKeys[idx];
150+
const privateKey = PrivateKey.fromString(KPriv);
151+
152+
const dataAsString = 'some string';
153+
154+
const eccHashedString = Buffer.from(ecc.sha256(dataAsString), 'hex');
155+
const eosjsHashedStringAsBuffer = Buffer.from(sha256(dataAsString), 'hex');
156+
expect(eccHashedString).toEqual(eosjsHashedStringAsBuffer);
157+
158+
const eccSig = ecc.sign(dataAsString, KPriv, 'utf8');
159+
160+
const eosjsSig = Signature.fromString(eccSig);
161+
const recoveredKPub = ecc.recover(eccSig, dataAsString, 'utf8');
162+
const eosjsRecoveredKPub = eosjsSig.recover(dataAsString, true, 'utf8');
163+
164+
expect(eosjsRecoveredKPub.toLegacyString()).toEqual(recoveredKPub);
165+
expect(eosjsRecoveredKPub.toString()).toEqual(k1FormatPublicKeys[idx]);
166+
167+
const eosjsValid = eosjsSig.verify(dataAsString, eosjsRecoveredKPub, true, 'utf8');
168+
expect(eosjsValid).toEqual(true);
169+
}
170+
});
171+
172+
it('ensure ecc verifies eosjs\'s Sigs', () => {
173+
for (let idx=0; idx<privateKeys.length; idx++) {
174+
const KPriv = privateKeys[idx];
175+
const privateKey = PrivateKey.fromString(KPriv);
176+
177+
const dataAsString = 'some string';
178+
179+
const eosjsHashedStringAsBuffer = Buffer.from(sha256(dataAsString), 'hex');
180+
181+
const eosjsSig = privateKey.sign(eosjsHashedStringAsBuffer, false, 'utf8');
182+
const eosjsSigAsString = eosjsSig.toString();
183+
184+
const recoveredKPub = ecc.recover(eosjsSigAsString, dataAsString, 'utf8');
185+
const eosjsRecoveredKPub = eosjsSig.recover(dataAsString, true, 'utf8');
186+
expect(eosjsRecoveredKPub.toLegacyString()).toEqual(recoveredKPub);
187+
expect(eosjsRecoveredKPub.toString()).toEqual(k1FormatPublicKeys[idx]);
188+
189+
const eccValid = ecc.verify(eosjsSigAsString, dataAsString, recoveredKPub, 'utf8');
138190
expect(eccValid).toEqual(true);
139191
}
140192
});

src/tests/eosjs-jssig.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,19 @@ describe('JsSignatureProvider', () => {
196196
const valid = sig.verify(dataAsString, KPub, true);
197197
expect(valid).toEqual(true);
198198
});
199+
200+
it('Ensure elliptic sign, recover, verify flow works with shouldHash and encoding', () => {
201+
const KPrivStr = privateKeys[0];
202+
const KPriv = PrivateKey.fromString(KPrivStr);
203+
204+
const dataAsString = 'some string';
205+
const sig = KPriv.sign(dataAsString, true, 'utf8');
206+
const KPub = sig.recover(dataAsString, true, 'utf8');
207+
208+
expect(KPub.toString()).toEqual(k1FormatPublicKeys[0]);
209+
const valid = sig.verify(dataAsString, KPub, true, 'utf8');
210+
expect(valid).toEqual(true);
211+
});
199212
});
200213

201214
describe('p256 elliptic', () => {
@@ -338,5 +351,18 @@ describe('JsSignatureProvider', () => {
338351
const valid = sig.verify(dataAsString, KPub, true);
339352
expect(valid).toEqual(true);
340353
});
354+
355+
it('Ensure elliptic sign, recover, verify flow works with shouldHash and encoding', () => {
356+
const KPrivStr = privateKeysR1[0];
357+
const KPriv = PrivateKey.fromString(KPrivStr);
358+
359+
const dataAsString = 'some string';
360+
const sig = KPriv.sign(dataAsString, true, 'utf8');
361+
const KPub = sig.recover(dataAsString, true, 'utf8');
362+
363+
expect(KPub.toString()).toEqual(r1FormatPublicKeys[0]);
364+
const valid = sig.verify(dataAsString, KPub, true, 'utf8');
365+
expect(valid).toEqual(true);
366+
});
341367
});
342368
});

0 commit comments

Comments
 (0)