Implement 0x00 version of EIP-191 in ECDSA Library (#4063)
This commit is contained in:
5
.changeset/small-cars-appear.md
Normal file
5
.changeset/small-cars-appear.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
'openzeppelin-solidity': patch
|
||||
---
|
||||
|
||||
`ECDSA`: Add a function `toDataWithIntendedValidatorHash` that encodes data with version 0x00 following EIP-191.
|
||||
@ -204,4 +204,14 @@ library ECDSA {
|
||||
data := keccak256(ptr, 0x42)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Returns an Ethereum Signed Data with intended validator, created from a
|
||||
* `validator` and `data` according to the version 0 of EIP-191.
|
||||
*
|
||||
* See {recover}.
|
||||
*/
|
||||
function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
|
||||
return keccak256(abi.encodePacked("\x19\x00", validator, data));
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,6 +4,21 @@ function toEthSignedMessageHash(messageHex) {
|
||||
return web3.utils.sha3(Buffer.concat([prefix, messageBuffer]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a signed data with intended validator according to the version 0 of EIP-191
|
||||
* @param validatorAddress The address of the validator
|
||||
* @param dataHex The data to be concatenated with the prefix and signed
|
||||
*/
|
||||
function toDataWithIntendedValidatorHash(validatorAddress, dataHex) {
|
||||
const validatorBuffer = Buffer.from(web3.utils.hexToBytes(validatorAddress));
|
||||
const dataBuffer = Buffer.from(web3.utils.hexToBytes(dataHex));
|
||||
const preambleBuffer = Buffer.from('\x19');
|
||||
const versionBuffer = Buffer.from('\x00');
|
||||
const ethMessage = Buffer.concat([preambleBuffer, versionBuffer, validatorBuffer, dataBuffer]);
|
||||
|
||||
return web3.utils.sha3(ethMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a signer between a contract and a signer for a voucher of method, args, and redeemer
|
||||
* Note that `method` is the web3 method, not the truffle-contract method
|
||||
@ -43,5 +58,6 @@ const getSignFor =
|
||||
|
||||
module.exports = {
|
||||
toEthSignedMessageHash,
|
||||
toDataWithIntendedValidatorHash,
|
||||
getSignFor,
|
||||
};
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
const { expectRevert } = require('@openzeppelin/test-helpers');
|
||||
const { toEthSignedMessageHash } = require('../../helpers/sign');
|
||||
const { toEthSignedMessageHash, toDataWithIntendedValidatorHash } = require('../../helpers/sign');
|
||||
|
||||
const { expect } = require('chai');
|
||||
|
||||
@ -8,6 +8,7 @@ const ECDSA = artifacts.require('$ECDSA');
|
||||
const TEST_MESSAGE = web3.utils.sha3('OpenZeppelin');
|
||||
const WRONG_MESSAGE = web3.utils.sha3('Nope');
|
||||
const NON_HASH_MESSAGE = '0x' + Buffer.from('abcd').toString('hex');
|
||||
const RANDOM_ADDRESS = web3.utils.toChecksumAddress(web3.utils.randomHex(20));
|
||||
|
||||
function to2098Format(signature) {
|
||||
const long = web3.utils.hexToBytes(signature);
|
||||
@ -248,4 +249,12 @@ contract('ECDSA', function (accounts) {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
context('toDataWithIntendedValidatorHash', function () {
|
||||
it('returns the hash correctly', async function () {
|
||||
expect(
|
||||
await this.ecdsa.methods['$toDataWithIntendedValidatorHash(address,bytes)'](RANDOM_ADDRESS, NON_HASH_MESSAGE),
|
||||
).to.equal(toDataWithIntendedValidatorHash(RANDOM_ADDRESS, NON_HASH_MESSAGE));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user