Add isSignatureValid method and tests for it
This commit is contained in:
parent
b5bd772b24
commit
af3cb84ff9
@ -46,5 +46,8 @@
|
||||
"typedoc": "^0.7.1",
|
||||
"typescript": "^2.3.3",
|
||||
"webpack": "^2.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ethereumjs-util": "^5.1.1"
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,32 @@
|
||||
import * as ethUtil from 'ethereumjs-util';
|
||||
|
||||
/**
|
||||
* Elliptic Curve signature
|
||||
*/
|
||||
export interface ECSignature {
|
||||
v: number;
|
||||
r: string;
|
||||
s: string;
|
||||
}
|
||||
|
||||
export type ETHAddress = string;
|
||||
|
||||
export class ZeroEx {
|
||||
/** Verifies the signature */
|
||||
public verifySignature() {
|
||||
// TODO
|
||||
/**
|
||||
* Checks if the signature is valid
|
||||
*/
|
||||
public static isValidSignature(data: string, signature: ECSignature, signer: ETHAddress): boolean {
|
||||
const dataBuff = ethUtil.toBuffer(data);
|
||||
const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff);
|
||||
try {
|
||||
const pubKey = ethUtil.ecrecover(msgHashBuff,
|
||||
signature.v,
|
||||
ethUtil.toBuffer(signature.r),
|
||||
ethUtil.toBuffer(signature.s));
|
||||
const retrievedAddress = ethUtil.bufferToHex(ethUtil.pubToAddress(pubKey));
|
||||
return retrievedAddress === signer;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1
src/ts/globals.d.ts
vendored
Normal file
1
src/ts/globals.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
||||
declare module 'ethereumjs-util';
|
@ -3,10 +3,52 @@ import {expect} from 'chai';
|
||||
import 'mocha';
|
||||
|
||||
describe('ZeroEx library', () => {
|
||||
describe('#verifySignature', () => {
|
||||
it('should return undefined', () => {
|
||||
const zeroEx = new ZeroEx();
|
||||
expect(zeroEx.verifySignature()).to.be.undefined;
|
||||
describe('#isValidSignature', () => {
|
||||
const data = '0xdeadbeaf';
|
||||
const signature = {
|
||||
v: 27,
|
||||
r: '0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a1',
|
||||
s: '0x2d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee',
|
||||
};
|
||||
const address = '0x9b2055d370f73ec7d8a03e965129118dc8f5bf83';
|
||||
describe('should return false for malformed signature', () => {
|
||||
it('malformed v', () => {
|
||||
const malformedSignature = {
|
||||
v: 34,
|
||||
r: signature.r,
|
||||
s: signature.s,
|
||||
};
|
||||
const isValid = ZeroEx.isValidSignature(data, malformedSignature, address);
|
||||
expect(isValid).to.be.false;
|
||||
});
|
||||
it('malformed r', () => {
|
||||
const malformedSignature = {
|
||||
v: signature.v,
|
||||
r: signature.r.replace('0x', ''),
|
||||
s: signature.s,
|
||||
};
|
||||
const isValid = ZeroEx.isValidSignature(data, malformedSignature, address);
|
||||
expect(isValid).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('should return false for invalid signature', () => {
|
||||
it('wrong data', () => {
|
||||
const isValid = ZeroEx.isValidSignature('wrong data', signature, address);
|
||||
expect(isValid).to.be.false;
|
||||
});
|
||||
it('wrong signer', () => {
|
||||
const isValid = ZeroEx.isValidSignature(data, signature, '0xIamWrong');
|
||||
expect(isValid).to.be.false;
|
||||
});
|
||||
it('wrong signature', () => {
|
||||
const wrongSignature = Object.assign({}, signature, {v: 28});
|
||||
const isValid = ZeroEx.isValidSignature(data, wrongSignature, address);
|
||||
expect(isValid).to.be.false;
|
||||
});
|
||||
});
|
||||
it('should return true for valid signature', () => {
|
||||
const isValid = ZeroEx.isValidSignature(data, signature, address);
|
||||
expect(isValid).to.be.true;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user