From af3cb84ff9229f85a8ea4a8c9c71511912ea0947 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 24 May 2017 18:06:58 +0200 Subject: Add isSignatureValid method and tests for it --- src/ts/0x.js.ts | 32 +++++++++++++++++++++++++++++--- src/ts/globals.d.ts | 1 + 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/ts/globals.d.ts (limited to 'src') diff --git a/src/ts/0x.js.ts b/src/ts/0x.js.ts index 95446ad74..6d6d5fed6 100644 --- a/src/ts/0x.js.ts +++ b/src/ts/0x.js.ts @@ -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; + } } } diff --git a/src/ts/globals.d.ts b/src/ts/globals.d.ts new file mode 100644 index 000000000..99f9cf50b --- /dev/null +++ b/src/ts/globals.d.ts @@ -0,0 +1 @@ +declare module 'ethereumjs-util'; -- cgit v1.2.3 From 6470cf54e389b45e82a08ad08225d2bb0f35ac4c Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 24 May 2017 18:49:19 +0200 Subject: Type the ethereumjs-util --- src/ts/0x.js.ts | 4 +--- src/ts/globals.d.ts | 12 +++++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ts/0x.js.ts b/src/ts/0x.js.ts index 6d6d5fed6..3b16b643b 100644 --- a/src/ts/0x.js.ts +++ b/src/ts/0x.js.ts @@ -9,13 +9,11 @@ export interface ECSignature { s: string; } -export type ETHAddress = string; - export class ZeroEx { /** * Checks if the signature is valid */ - public static isValidSignature(data: string, signature: ECSignature, signer: ETHAddress): boolean { + public static isValidSignature(data: string, signature: ECSignature, signer: ETHAddressHex): boolean { const dataBuff = ethUtil.toBuffer(data); const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff); try { diff --git a/src/ts/globals.d.ts b/src/ts/globals.d.ts index 99f9cf50b..1c3cbf47d 100644 --- a/src/ts/globals.d.ts +++ b/src/ts/globals.d.ts @@ -1 +1,11 @@ -declare module 'ethereumjs-util'; +declare type PubKey = string; +declare type ETHAddressHex = string; +declare type ETHAddressBuff = Buffer; + +declare module 'ethereumjs-util' { + const toBuffer: (data: string) => Buffer; + const hashPersonalMessage: (msg: Buffer) => Buffer; + const bufferToHex: (buff: Buffer) => string; + const ecrecover: (msgHashBuff: Buffer, v: number, r: Buffer, s: Buffer) => PubKey; + const pubToAddress: (pubKey: PubKey) => ETHAddressBuff; +} -- cgit v1.2.3 From 945a583e895dfd9488aecdfab1bec22449bf7878 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 24 May 2017 19:23:35 +0200 Subject: Address feedback --- src/ts/0x.js.ts | 3 ++- src/ts/globals.d.ts | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ts/0x.js.ts b/src/ts/0x.js.ts index 3b16b643b..dd67c49a0 100644 --- a/src/ts/0x.js.ts +++ b/src/ts/0x.js.ts @@ -11,7 +11,8 @@ export interface ECSignature { export class ZeroEx { /** - * Checks if the signature is valid + * Verifies that the elliptic curve signature `signature` was generated + * by signing `data` with the private key corresponding to the `signer` address. */ public static isValidSignature(data: string, signature: ECSignature, signer: ETHAddressHex): boolean { const dataBuff = ethUtil.toBuffer(data); diff --git a/src/ts/globals.d.ts b/src/ts/globals.d.ts index 1c3cbf47d..0f7391b39 100644 --- a/src/ts/globals.d.ts +++ b/src/ts/globals.d.ts @@ -1,4 +1,4 @@ -declare type PubKey = string; +declare type ETHPublicKey = string; declare type ETHAddressHex = string; declare type ETHAddressBuff = Buffer; @@ -6,6 +6,6 @@ declare module 'ethereumjs-util' { const toBuffer: (data: string) => Buffer; const hashPersonalMessage: (msg: Buffer) => Buffer; const bufferToHex: (buff: Buffer) => string; - const ecrecover: (msgHashBuff: Buffer, v: number, r: Buffer, s: Buffer) => PubKey; - const pubToAddress: (pubKey: PubKey) => ETHAddressBuff; + const ecrecover: (msgHashBuff: Buffer, v: number, r: Buffer, s: Buffer) => ETHPublicKey; + const pubToAddress: (pubKey: ETHPublicKey) => ETHAddressBuff; } -- cgit v1.2.3