aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFabio Berger <me@fabioberger.com>2017-05-25 18:27:49 +0800
committerGitHub <noreply@github.com>2017-05-25 18:27:49 +0800
commitb1a6c895cc095b39c263ff508d98395b1b901dc6 (patch)
tree355fd7e1f9a34a88a6f190d0942f4348c553ecd6 /src
parent334d2f175fd9dcb3f9e336250d21c7916a2671ae (diff)
parent2117b4e0c87df277f5e8df54e8df922bdf19c298 (diff)
downloaddexon-0x-contracts-b1a6c895cc095b39c263ff508d98395b1b901dc6.tar.gz
dexon-0x-contracts-b1a6c895cc095b39c263ff508d98395b1b901dc6.tar.zst
dexon-0x-contracts-b1a6c895cc095b39c263ff508d98395b1b901dc6.zip
Merge pull request #10 from 0xProject/addSchemas
Add schema validation
Diffstat (limited to 'src')
-rw-r--r--src/ts/0x.js.ts3
-rw-r--r--src/ts/globals.d.ts4
-rw-r--r--src/ts/schemas/ec_signature_schema.ts20
-rw-r--r--src/ts/utils/assert.ts13
-rw-r--r--src/ts/utils/schema_validator.ts14
5 files changed, 50 insertions, 4 deletions
diff --git a/src/ts/0x.js.ts b/src/ts/0x.js.ts
index 4b9680a18..1cc2d8b44 100644
--- a/src/ts/0x.js.ts
+++ b/src/ts/0x.js.ts
@@ -1,6 +1,7 @@
import * as BigNumber from 'bignumber.js';
import * as ethUtil from 'ethereumjs-util';
import {assert} from './utils/assert';
+import {ECSignatureSchema} from './schemas/ec_signature_schema';
/**
* Elliptic Curve signature
@@ -20,7 +21,7 @@ export class ZeroEx {
*/
public static isValidSignature(data: string, signature: ECSignature, signer: ETHAddressHex): boolean {
assert.isString('data', data);
- assert.isObject('signature', signature);
+ assert.doesConformToSchema('signature', signature, ECSignatureSchema);
assert.isETHAddressHex('signer', signer);
const dataBuff = ethUtil.toBuffer(data);
diff --git a/src/ts/globals.d.ts b/src/ts/globals.d.ts
index 0f7391b39..659638a1e 100644
--- a/src/ts/globals.d.ts
+++ b/src/ts/globals.d.ts
@@ -2,6 +2,10 @@ declare type ETHPublicKey = string;
declare type ETHAddressHex = string;
declare type ETHAddressBuff = Buffer;
+declare interface Schema {
+ id: string;
+}
+
declare module 'ethereumjs-util' {
const toBuffer: (data: string) => Buffer;
const hashPersonalMessage: (msg: Buffer) => Buffer;
diff --git a/src/ts/schemas/ec_signature_schema.ts b/src/ts/schemas/ec_signature_schema.ts
new file mode 100644
index 000000000..94e58e53c
--- /dev/null
+++ b/src/ts/schemas/ec_signature_schema.ts
@@ -0,0 +1,20 @@
+export const ECSignatureParameter = {
+ id: '/ECSignatureParameter',
+ type: 'string',
+ pattern: '^0[xX][0-9A-Fa-f]{64}$',
+};
+
+export const ECSignatureSchema = {
+ id: '/ECSignature',
+ properties: {
+ v: {
+ type: 'number',
+ minimum: 27,
+ maximum: 28,
+ },
+ r: {$ref: '/ECSignatureParameter'},
+ s: {$ref: '/ECSignatureParameter'},
+ },
+ required: ['v', 'r', 's'],
+ type: 'object',
+};
diff --git a/src/ts/utils/assert.ts b/src/ts/utils/assert.ts
index a29ae922d..972047118 100644
--- a/src/ts/utils/assert.ts
+++ b/src/ts/utils/assert.ts
@@ -1,6 +1,7 @@
import * as _ from 'lodash';
import * as BigNumber from 'bignumber.js';
import Web3 = require('web3');
+import {SchemaValidator} from './schema_validator';
export const assert = {
isBigNumber(variableName: string, value: BigNumber.BigNumber) {
@@ -14,12 +15,18 @@ export const assert = {
const web3 = new Web3();
this.assert(web3.isAddress(value), this.typeAssertionMessage(variableName, 'ETHAddressHex', value));
},
- isObject(variableName: string, value: object) {
- this.assert(_.isObject(value), this.typeAssertionMessage(variableName, 'object', value));
- },
isNumber(variableName: string, value: number) {
this.assert(_.isFinite(value), this.typeAssertionMessage(variableName, 'number', value));
},
+ doesConformToSchema(variableName: string, value: object, schema: Schema) {
+ const schemaValidator = new SchemaValidator();
+ const validationResult = schemaValidator.validate(value, schema);
+ const hasValidationErrors = validationResult.errors.length > 0;
+ const msg = `Expected ${variableName} to conform to schema ${schema.id}
+Encountered: ${JSON.stringify(value, null, '\t')}
+Validation errors: ${validationResult.errors.join(', ')}`;
+ this.assert(!hasValidationErrors, msg);
+ },
assert(condition: boolean, message: string) {
if (!condition) {
throw new Error(message);
diff --git a/src/ts/utils/schema_validator.ts b/src/ts/utils/schema_validator.ts
new file mode 100644
index 000000000..bd2f97d2b
--- /dev/null
+++ b/src/ts/utils/schema_validator.ts
@@ -0,0 +1,14 @@
+import {Validator, ValidatorResult} from 'jsonschema';
+import {ECSignatureSchema, ECSignatureParameter} from '../schemas/ec_signature_schema';
+
+export class SchemaValidator {
+ private validator: Validator;
+ constructor() {
+ this.validator = new Validator();
+ this.validator.addSchema(ECSignatureParameter, ECSignatureParameter.id);
+ this.validator.addSchema(ECSignatureSchema, ECSignatureSchema.id);
+ }
+ public validate(instance: object, schema: Schema): ValidatorResult {
+ return this.validator.validate(instance, schema);
+ }
+}