-
Notifications
You must be signed in to change notification settings - Fork 12.4k
Add missing tests to ECSDA #1248
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
6db5d6e
654b90b
9f6170e
1be1641
4f5abbb
2b3ab7c
c7373ef
22a38de
1ccf496
f2d2528
0d0df73
d83f04b
25a5823
fde2719
f5c8298
35907fa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,75 +14,101 @@ contract('ECDSA', function ([_, anyone]) { | |
| this.mock = await ECDSAMock.new(); | ||
| }); | ||
|
|
||
| it('recover v0', async function () { | ||
| // Signature generated outside ganache with method web3.eth.sign(signer, message) | ||
| const signer = '0x2cc1166f6212628a0deef2b33befb2187d35b86c'; | ||
| // eslint-disable-next-line max-len | ||
| const signature = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be89200'; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| context('recover with valid signature', function() { | ||
| context('with v0 signature', function() { | ||
| // Signature generated outside ganache with method web3.eth.sign(signer, message) | ||
| const signer = '0x2cc1166f6212628a0deef2b33befb2187d35b86c'; | ||
| // eslint-disable-next-line max-len | ||
| const signature_without_version = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be892'; | ||
| context('with 00 as version value', function() { | ||
| it('works', async function () { | ||
| // Signature generated outside ganache with method web3.eth.sign(signer, message) | ||
|
||
| const version = '00'; | ||
| const signature = signature_without_version + version; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
|
||
| }); | ||
| }); | ||
|
|
||
| it('recover v1', async function () { | ||
| // Signature generated outside ganache with method web3.eth.sign(signer, message) | ||
| const signer = '0x1e318623ab09fe6de3c9b8672098464aeda9100e'; | ||
| // eslint-disable-next-line max-len | ||
| const signature = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e001'; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| context('with 27 as version value', function() { | ||
| it('works', async function () { | ||
| const version = '1b'; // 27 = 1b. | ||
| const signature = signature_without_version + version; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| }); | ||
| }); | ||
|
|
||
| it('recover v27', async function () { | ||
| // Signature generated outside ganache with method web3.eth.sign(signer, message) | ||
| const signer = '0x2cc1166f6212628a0deef2b33befb2187d35b86c'; | ||
| // The last two hex digits are the signature version: 27 = 1b. | ||
| // eslint-disable-next-line max-len | ||
| const signature = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be8921b'; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| context('with v1 signature', function() { | ||
| const signer = '0x1e318623ab09fe6de3c9b8672098464aeda9100e'; | ||
| // eslint-disable-next-line max-len | ||
| const signature_without_version = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e0'; | ||
|
|
||
| it('recover v28', async function () { | ||
| // Signature generated outside ganache with method web3.eth.sign(signer, message) | ||
| const signer = '0x1e318623ab09fe6de3c9b8672098464aeda9100e'; | ||
| // The last two hex digits are the signature version: 28 = 1c. | ||
| // eslint-disable-next-line max-len | ||
| const signature = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e01c'; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| context('with 01 as version value', function() { | ||
| it('works', async function () { | ||
| const version = '01'; | ||
| const signature = signature_without_version + version; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| }); | ||
|
|
||
| it('wrong signature version', async function () { | ||
| // The last two hex digits are the signature version. | ||
| // The only valid values are 0, 1, 27 and 28. | ||
| // eslint-disable-next-line max-len | ||
| const signature = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e002'; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal( | ||
| '0x0000000000000000000000000000000000000000'); | ||
| }); | ||
| context('with 28 signature', function() { | ||
| it('works', async function () { | ||
| const version = '1c'; // 28 = 1c. | ||
| const signature = signature_without_version + version; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal(signer); | ||
| }); | ||
| }); | ||
| }); | ||
|
|
||
| it('recover using web3.eth.sign()', async function () { | ||
| // Create the signature | ||
| const signature = signMessage(anyone, TEST_MESSAGE); | ||
| context('using web3.eth.sign', function() { | ||
| context('with correct signature', function() { | ||
| it('returns signer address', async function () { | ||
| // Create the signature | ||
| const signature = signMessage(anyone, TEST_MESSAGE); | ||
|
|
||
| // Recover the signer address from the generated message and signature. | ||
| (await this.mock.recover( | ||
| toEthSignedMessageHash(TEST_MESSAGE), | ||
| signature | ||
| )).should.equal(anyone); | ||
| }); | ||
| // Recover the signer address from the generated message and signature. | ||
| (await this.mock.recover( | ||
| toEthSignedMessageHash(TEST_MESSAGE), | ||
| signature | ||
| )).should.equal(anyone); | ||
| }); | ||
| }); | ||
|
|
||
| it('recover using web3.eth.sign() should return wrong signer', async function () { | ||
| // Create the signature | ||
| const signature = signMessage(anyone, TEST_MESSAGE); | ||
| context('with wrong signature', function() { | ||
| it('does not return signer address', async function () { | ||
| // Create the signature | ||
| const signature = signMessage(anyone, TEST_MESSAGE); | ||
|
|
||
| // Recover the signer address from the generated message and wrong signature. | ||
| (await this.mock.recover(WRONG_MESSAGE, signature)).should.not.equal(anyone); | ||
| // Recover the signer address from the generated message and wrong signature. | ||
| (await this.mock.recover(WRONG_MESSAGE, signature)).should.not.equal(anyone); | ||
| }); | ||
| }); | ||
| }); | ||
| }); | ||
|
|
||
| // @TODO - remove `skip` once we upgrade to solc^0.5 | ||
| it.skip('recover should revert when a small hash is sent', async function () { | ||
| // Create the signature | ||
| const signature = signMessage(anyone, TEST_MESSAGE); | ||
| await expectThrow( | ||
| this.mock.recover(TEST_MESSAGE.substring(2), signature) | ||
| ); | ||
| context('recover with invalid signature', function() { | ||
| context('with wrong version', function() { | ||
| it('returns 0', async function () { | ||
| // The last two hex digits are the signature version. | ||
| // The only valid values are 0, 1, 27 and 28. | ||
| // eslint-disable-next-line max-len | ||
| const dummy_signature_without_version = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e0'; | ||
| const signature = dummy_signature_without_version + '02'; | ||
| (await this.mock.recover(TEST_MESSAGE, signature)).should.equal( | ||
| '0x0000000000000000000000000000000000000000'); | ||
| }); | ||
| }); | ||
|
|
||
| context('with small hash', function() { | ||
| // @TODO - remove `skip` once we upgrade to solc^0.5 | ||
| it.skip('reverts', async function () { | ||
| // Create the signature | ||
| const signature = signMessage(anyone, TEST_MESSAGE); | ||
| await expectThrow( | ||
| this.mock.recover(TEST_MESSAGE.substring(2), signature) | ||
| ); | ||
| }); | ||
| }); | ||
| }); | ||
|
|
||
| context('toEthSignedMessage', function () { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While we're at it, can you rename this to
this.ecdsaor something more descriptive?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done.