From e51c5e01c1621bd9134a1bd4fe83e3389e2a62ab Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 13 Mar 2018 16:30:25 +0530 Subject: [PATCH] Successfully tested --- test/helpers/hashMessage.js | 8 +++++ test/library/ECRecovery.test.js | 62 +++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 test/helpers/hashMessage.js create mode 100644 test/library/ECRecovery.test.js diff --git a/test/helpers/hashMessage.js b/test/helpers/hashMessage.js new file mode 100644 index 000000000..6e8a1f74e --- /dev/null +++ b/test/helpers/hashMessage.js @@ -0,0 +1,8 @@ +import utils from 'ethereumjs-util'; + +// Hash and add same prefix to the hash that testrpc use. +module.exports = function (message) { + const messageHex = Buffer.from(utils.sha3(message).toString('hex'), 'hex'); + const prefix = utils.toBuffer('\u0019Ethereum Signed Message:\n' + messageHex.length.toString()); + return utils.bufferToHex(utils.sha3(Buffer.concat([prefix, messageHex]))); +}; diff --git a/test/library/ECRecovery.test.js b/test/library/ECRecovery.test.js new file mode 100644 index 000000000..fd99a0ae1 --- /dev/null +++ b/test/library/ECRecovery.test.js @@ -0,0 +1,62 @@ +var ECRecoveryMock = artifacts.require('ECRecoveryMock'); +var ECRecoveryLib = artifacts.require('ECRecovery'); + +var hashMessage = require('../helpers/hashMessage.js'); + +contract('ECRecovery', function (accounts) { + let ecrecovery; + const TEST_MESSAGE = 'OpenZeppelin'; + + before(async function () { + const ecRecoveryLib = await ECRecoveryLib.new(); + ECRecoveryMock.link('ECRecovery', ecRecoveryLib.address); + ecrecovery = await ECRecoveryMock.new(); + }); + + // it('recover v0', async function () { + // // Signature generated outside testrpc with method web3.eth.sign(signer, message) + // let signer = '0x2cc1166f6212628a0deef2b33befb2187d35b86c'; + // let message = web3.sha3(TEST_MESSAGE); + // // eslint-disable-next-line max-len + // let signature = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be89200'; + // await ecrecovery.recover(message, signature); + // assert.equal(signer, await ecrecovery.addrRecovered()); + // }); + + // it('recover v1', async function () { + // // Signature generated outside testrpc with method web3.eth.sign(signer, message) + // let signer = '0x1e318623ab09fe6de3c9b8672098464aeda9100e'; + // let message = web3.sha3(TEST_MESSAGE); + // // eslint-disable-next-line max-len + // let signature = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e001'; + // await ecrecovery.recover(message, signature); + // assert.equal(signer, await ecrecovery.addrRecovered()); + // }); + + it('recover using web3.eth.sign()', async function () { + // Create the signature using account[0] + const signature = web3.eth.sign(accounts[0], web3.sha3(TEST_MESSAGE)); + + // Recover the signer address from the generated message and signature. + await ecrecovery.recover(web3.sha3(TEST_MESSAGE), signature); + assert.equal(accounts[0], await ecrecovery.addrRecovered()); + }); + + it('recover using web3.eth.sign() should return wrong signer', async function () { + // Create the signature using account[0] + const signature = web3.eth.sign(accounts[0], web3.sha3(TEST_MESSAGE)); + + // Recover the signer address from the generated message and wrong signature. + await ecrecovery.recover(web3.sha3('Test'), signature); + assert.notEqual(accounts[0], await ecrecovery.addrRecovered()); + }); + + it('recover should fail when a wrong hash is sent', async function () { + // Create the signature using account[0] + let signature = web3.eth.sign(accounts[0], web3.sha3(TEST_MESSAGE)); + + // Recover the signer address from the generated message and wrong signature. + await ecrecovery.recover(web3.sha3(TEST_MESSAGE).substring(2), signature); + assert.equal('0x0000000000000000000000000000000000000000', await ecrecovery.addrRecovered()); + }); +});