Add isSignatureValid method and tests for it

This commit is contained in:
Leonid Logvinov 2017-05-24 18:06:58 +02:00
parent b5bd772b24
commit af3cb84ff9
No known key found for this signature in database
GPG Key ID: 0DD294BFDE8C95D4
4 changed files with 79 additions and 7 deletions

View File

@ -46,5 +46,8 @@
"typedoc": "^0.7.1", "typedoc": "^0.7.1",
"typescript": "^2.3.3", "typescript": "^2.3.3",
"webpack": "^2.6.0" "webpack": "^2.6.0"
},
"dependencies": {
"ethereumjs-util": "^5.1.1"
} }
} }

View File

@ -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 { export class ZeroEx {
/** Verifies the signature */ /**
public verifySignature() { * Checks if the signature is valid
// TODO */
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
View File

@ -0,0 +1 @@
declare module 'ethereumjs-util';

View File

@ -3,10 +3,52 @@ import {expect} from 'chai';
import 'mocha'; import 'mocha';
describe('ZeroEx library', () => { describe('ZeroEx library', () => {
describe('#verifySignature', () => { describe('#isValidSignature', () => {
it('should return undefined', () => { const data = '0xdeadbeaf';
const zeroEx = new ZeroEx(); const signature = {
expect(zeroEx.verifySignature()).to.be.undefined; 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;
}); });
}); });
}); });