From 6921dcfae2c4fc0d651fee1af80c733194038572 Mon Sep 17 00:00:00 2001 From: Matus Zamborsky Date: Sat, 7 Apr 2018 14:13:21 +0200 Subject: [PATCH] reapply changes from reverted commit "update some test;fix issue1;fix pr #7 (#8)" Signed-off-by: Matus Zamborsky --- package.json | 6 +-- src/claim.ts | 2 +- src/consts.ts | 2 +- src/core.ts | 44 +++++++++++++--- src/crypto.ts | 23 ++++++++ src/index.ts | 3 +- src/sdk/index.ts | 60 +++++++++++++++------ src/smartcontract/data/idContract.abi.ts | 2 +- src/transaction/ddo.ts | 67 ++++++++++++++++-------- src/transaction/transaction.ts | 7 +-- src/transaction/transactionBuilder.ts | 17 ++++-- src/transaction/txSender.ts | 21 +------- test/abiInfo.test.ts | 27 +++------- test/account.test.ts | 4 +- test/claim.test.ts | 22 ++++++-- test/core.test.ts | 47 +++++++++-------- test/ddo.test.ts | 2 +- test/deployCodeTx.test.ts | 10 ++-- test/identity.test.ts | 2 +- test/scrypt.test.ts | 8 ++- test/transfer.test.ts | 6 +-- test/tx.node.ts | 40 ++++++++++++-- webpack.config.js | 2 +- 23 files changed, 279 insertions(+), 145 deletions(-) diff --git a/package.json b/package.json index ba94b80a..38ba66d5 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "main": "./lib/index.js", "types": "./lib/types/index.d.ts", "scripts": { - "test": "jest", - "build:dev": "webpack --display-error-details --config webpack.config.js --progress --color", - "build:prod": "webpack --env.prod --config webpack.config.js --progress --color" + "test": "./node_modules/.bin/jest", + "build:dev": "./node_modules/.bin/webpack --display-error-details --config webpack.config.js --progress --color", + "build:prod": "./node_modules/.bin/webpack --env.prod --config webpack.config.js --progress --color" }, "jest": { "moduleFileExtensions": [ diff --git a/src/claim.ts b/src/claim.ts index 80346a58..62edb621 100644 --- a/src/claim.ts +++ b/src/claim.ts @@ -62,7 +62,7 @@ export class Claim { this.Id = CryptoJS.SHA256(CryptoJS.enc.Hex.parse(JSON.stringify(body))).toString() } - sign( privateKey: string ) { + sign( privateKey: string ) : Signature { let claimBody = { Context: this.Context, Id: this.Id, diff --git a/src/consts.ts b/src/consts.ts index d4aaa235..d3b8e499 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -42,7 +42,7 @@ export class Algorithm { export const DEFAULT_ALGORITHM = { algorithm : "ECDSA", parameters : { - "curve": "secp256r1" + "curve": "secp256r1" // also called p256 } } diff --git a/src/core.ts b/src/core.ts index f1cb952c..171adcb5 100644 --- a/src/core.ts +++ b/src/core.ts @@ -21,10 +21,13 @@ import * as base58 from 'bs58' import * as ecurve from 'ecurve' import * as bigInteger from 'bigi' import { ab2hexstring, hexstring2ab, StringReader, hexstr2str, num2hexstring } from './utils' -import { ADDR_VERSION } from './consts' +import { ADDR_VERSION, TEST_ONT_URL } from './consts' import * as scrypt from './scrypt' import {ERROR_CODE} from './error' import { VmType } from './transaction/vmcode'; +import { buildGetDDOTx, buildRestfulParam, sendRawTxRestfulUrl} from './transaction/transactionBuilder' +import axios from 'axios' +import { DDO } from './transaction/ddo' var ec = require('elliptic').ec var wif = require('wif') @@ -147,12 +150,20 @@ export function signatureData(data: string, privateKey: string): string { return signatureValue.toString('hex'); } -export function verifySignature(data : string, signature : string, publicKey : string) { + +/* +@data original value of signature +@signature +@publicKey the public key of the signer. is array-like or buffer +*/ +export function verifySignature(data: string, signature: string, publicKey: any) { let msg = cryptoJS.enc.Hex.parse(data) let msgHash = cryptoJS.SHA256(msg) let elliptic = new ec('p256') - const result = elliptic.verify(data.toString(), signature, publicKey, null) + let r = signature.substr(0, 64) + let s = signature.substr(64, 64) + const result = elliptic.verify(msgHash.toString(), { r, s }, publicKey, null) return result } @@ -212,11 +223,30 @@ export function checkPrivateKey(encryptedPrivateKey : string, password : string) return true } - +/* +@claim claim json object +*/ export function verifyOntidClaim(claim : any) { if(!claim.Metadata || !claim.Metadata.Issuer) { throw new Error('Invalid claim.') } - let issuer = claim.Metadata.Issuer - //TODO -} \ No newline at end of file + let issuerDid = claim.Metadata.Issuer + let tx = buildGetDDOTx(issuerDid) + let param = buildRestfulParam(tx) + let url = sendRawTxRestfulUrl(TEST_ONT_URL.REST_URL, true) + return axios.post(url, param).then( (res:any) => { + if (res.data.Result && res.data.Result.length > 0) { + console.log('ddo hexstr: '+ res.data.Result[0]) + const ddo = DDO.deserialize(res.data.Result[0]) + console.log('ddo: ' + JSON.stringify(ddo)) + if(ddo.publicKeys.length > 0) { + const pk = ddo.publicKeys[0].pk + const signature = claim.Signature.Value + claim.delete('Signature') + return verifySignature(JSON.stringify(claim), signature, hexstring2ab(pk)) + } else { + return false + } + } + }) +} diff --git a/src/crypto.ts b/src/crypto.ts index 0c1e1833..9cfd4eb3 100644 --- a/src/crypto.ts +++ b/src/crypto.ts @@ -13,3 +13,26 @@ export enum SignatureSchema { SHA512withEDDSA } + +export enum CurveLabel { + P224 = 1, + P256 = 2, + P384 = 3, + P521 = 4, + + SM2P256V1 = 20, + + ED25519 = 25 +} + +export enum KeyType { + PK_ECDSA = 0x12, + PK_SM2 = 0x13, + PK_EDDSA = 0x14, +} + +export class PublicKey { + algorithm: number + curve: number + pk: string +} diff --git a/src/index.ts b/src/index.ts index 6de1218e..b5e32589 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,7 +31,6 @@ import * as core from './core' import * as utils from './utils' import * as CONST from './consts' import { SDK } from './sdk/index' -import { CompleterResult } from 'readline'; class ONT { Account : any @@ -81,7 +80,7 @@ class ONT { this.CONST.HTTP_REST_PORT = port } - setWsPortyarn(port: string) { + setSocketPort(port: string) { this.CONST.HTTP_WS_PORT = port } } diff --git a/src/sdk/index.ts b/src/sdk/index.ts index e3b4ad53..94a8f78a 100644 --- a/src/sdk/index.ts +++ b/src/sdk/index.ts @@ -32,6 +32,33 @@ import axios from 'axios' import {BigNumber} from 'bignumber.js' import {DDO} from '../transaction/ddo'; export class SDK { + static SERVER_NODE : string + static REST_PORT : string + static SOCKET_PORT : string + + static setServerNode(node : string) { + if(node) { + SDK.SERVER_NODE = node + return; + } + throw new Error('Can not set ' + node + 'as server node') + } + + static setRestPort(port: string) { + if (port) { + SDK.REST_PORT = port + return; + } + throw new Error('Can not set ' + port + ' as restful port') + } + + static setSocketPort(port: string) { + if (port) { + SDK.SOCKET_PORT = port + return; + } + throw new Error('Can not set ' + port + 'as socket port') + } static getDecryptError(err:any) { return { @@ -80,7 +107,8 @@ export class SDK { socket.close() } } - var txSender = new TxSender(ONT_NETWORK.TEST) + let socket = `ws://${SDK.SERVER_NODE}:${SDK.SOCKET_PORT}` + var txSender = new TxSender(socket) txSender.sendTxWithSocket(param, socketCallback) // callback && sendBackResult2Native(JSON.stringify(obj), callback) return obj @@ -90,10 +118,8 @@ export class SDK { password : string, callback ?: string) { let identity = new Identity() let wallet = Wallet.parseJson(walletDataStr) - let privateKey = '' try { //TODO check ontid - privateKey = scrypt.decrypt(encryptedPrivateKey, password) identity = Identity.importIdentity(label, encryptedPrivateKey, password) } catch (err) { let obj = this.getDecryptError(err) @@ -109,9 +135,10 @@ export class SDK { desc : '' } //check ontid on chain - let tx = buildGetDDOTx(identity.ontid, privateKey) + let tx = buildGetDDOTx(identity.ontid) let param = buildRestfulParam(tx) - let url = sendRawTxRestfulUrl(TEST_ONT_URL.REST_URL, true) + let restUrl = `http://${SDK.SERVER_NODE}:${SDK.REST_PORT}/` + let url = sendRawTxRestfulUrl(restUrl, true) axios.post(url, param).then((res:any) => { if (res.data.Result && res.data.Result.length > 0 && res.data.Result[0] !== '0000000000000000') { @@ -130,9 +157,7 @@ export class SDK { static importIdentity(label : string, encryptedPrivateKey : string, password : string, callback ?: string) { let identity = new Identity() let error = {} - let privateKey try { - privateKey = scrypt.decrypt(encryptedPrivateKey, password) identity = Identity.importIdentity(label, encryptedPrivateKey, password) let wallet = new Wallet() wallet.create(identity.label) @@ -145,10 +170,11 @@ export class SDK { desc: '' } //check ontid on chain - let tx = buildGetDDOTx(identity.ontid, privateKey) + let tx = buildGetDDOTx(identity.ontid) let param = buildRestfulParam(tx) - let url = sendRawTxRestfulUrl(TEST_ONT_URL.REST_URL, true) - axios.post(url, param).then((res: any) => { + let restUrl = `http://${SDK.SERVER_NODE}:${SDK.REST_PORT}/` + let url = sendRawTxRestfulUrl(restUrl, true) + return axios.post(url, param).then((res: any) => { if (res.data.Result && res.data.Result.length > 0 && res.data.Result[0] !== '0000000000000000') { } else { @@ -163,7 +189,7 @@ export class SDK { } catch(err) { error = this.getDecryptError(err) callback && sendBackResult2Native(JSON.stringify(error), callback) - return error + return Promise.reject(error) } } @@ -180,8 +206,9 @@ export class SDK { //register ontid let tx = buildRegisterOntidTx(identity.ontid, privateKey) let param = buildRestfulParam(tx) - const url = TEST_ONT_URL.sendRawTxByRestful - axios.post(url, param).then((res: any) => { + let restUrl = `http://${SDK.SERVER_NODE}:${SDK.REST_PORT}${REST_API.sendRawTx}` + + axios.post(restUrl, param).then((res: any) => { if(res.data.Error === 0) { callback && sendBackResult2Native(JSON.stringify(obj), callback) } else { @@ -322,7 +349,8 @@ export class SDK { // let txId = core.getHash(tx.serialize()) let param = buildTxParam(tx) //通过socket能获得推送的结果 - var txSender = new TxSender(ONT_NETWORK.TEST) + let socket = `ws://${SDK.SERVER_NODE}:${SDK.SOCKET_PORT}` + var txSender = new TxSender(socket) const socketCallback = function(res : any, socket : any) { console.log('res: '+ JSON.stringify(res)) if(res.Action === 'InvokeTransaction' && res.Error === 0) { @@ -365,7 +393,7 @@ export class SDK { if(address.length === 40) { address = core.u160ToAddress(address) } - let request = `http://${TEST_NODE}:${HTTP_REST_PORT}${REST_API.getBalance}/${address}` + let request = `http://${SDK.SERVER_NODE}:${SDK.REST_PORT}${REST_API.getBalance}/${address}` axios.get(request).then((res : any) => { if(res.data.Error === 0) { let result = res.data.Result @@ -423,7 +451,7 @@ export class SDK { let tx = makeTransferTransaction('ONT',from, to, value, privateKey) var param = buildRestfulParam(tx) - let request = `http://${TEST_NODE}:${HTTP_REST_PORT}${REST_API.sendRawTx}` + let request = `http://${SDK.SERVER_NODE}:${SDK.REST_PORT}${REST_API.sendRawTx}` axios.post(request, param).then( (res:any) => { console.log('transfer response: ' + JSON.stringify(res.data)) if(res.data.Error === 0) { diff --git a/src/smartcontract/data/idContract.abi.ts b/src/smartcontract/data/idContract.abi.ts index c09428ce..af63ed6d 100644 --- a/src/smartcontract/data/idContract.abi.ts +++ b/src/smartcontract/data/idContract.abi.ts @@ -1,5 +1,5 @@ export default { - "hash": "80e7d2fc22c24c466f44c7688569cc6e6d6c6f92", + "hash": "80a45524f3f6a5b98d633e5c7a7458472ec5d625", "entrypoint": "Main", "functions": [ diff --git a/src/transaction/ddo.ts b/src/transaction/ddo.ts index aeee7568..e2ed5957 100644 --- a/src/transaction/ddo.ts +++ b/src/transaction/ddo.ts @@ -17,6 +17,7 @@ */ import {StringReader, hexstr2str} from '../utils' +import {PublicKey} from '../crypto' export class DDOAttribute { path : string @@ -25,42 +26,64 @@ export class DDOAttribute { constructor() {} } export class DDO { - publicKeys : Array = [] + publicKeys : Array = [] attributes : Array = [] + recovery : string constructor() {} - static deserialize(hexstr : string) : DDO { + static deserialize(hexstr: string): DDO { const ss = new StringReader(hexstr) let ddo = new DDO() //total length of public keys - 4 bytes - const pkTotalLen = parseInt(ss.read(4), 16) - const pkNum = ss.readNextLen() - - for(let i=0; i 0) { + const pkNum = parseInt(ss.read(4), 16) + for (let i = 0; i < pkNum; i++) { + //length of public key - 4 bytes + let pkLen = parseInt(ss.read(4), 16) + let pubKey = new PublicKey() + const rawPk = ss.read(pkLen) + const type = parseInt(rawPk.substr(0, 2), 16) + const curve = parseInt(rawPk.substr(2, 2), 16) + const pk = rawPk.substr(4) + pubKey.algorithm = type + pubKey.curve = curve + pubKey.pk = pk + ddo.publicKeys.push(pubKey) + } } + //attribute number - 4bytes const attrTotalLen = parseInt(ss.read(4),16) - const attrNum = ss.readNextLen() - for(let i=0; i 0) { + const attrNum = parseInt(ss.read(4), 16) + for (let i = 0; i < attrNum; i++) { + const totalLen = parseInt(ss.read(4), 16) + + let attr = new DDOAttribute() + const pathLen = parseInt(ss.read(4), 16) + attr.path = hexstr2str(ss.read(pathLen)) - const type_value_len = parseInt(ss.read(4), 16) - const typeLen = parseInt(ss.read(1), 16) - attr.type = hexstr2str(ss.read(typeLen)) + const type_value_len = parseInt(ss.read(4), 16) + const typeLen = parseInt(ss.read(1), 16) + attr.type = hexstr2str(ss.read(typeLen)) - const valueLen = type_value_len - typeLen - 1 - attr.value = hexstr2str(ss.read(valueLen)) - ddo.attributes.push(attr) + const valueLen = type_value_len - typeLen - 1 + attr.value = hexstr2str(ss.read(valueLen)) + ddo.attributes.push(attr) + } } + + //recovery + const recoveryTotalLen = parseInt(ss.read(4), 16) + if(recoveryTotalLen > 0 ) { + const recLen = parseInt(ss.read(4), 16) + const recovery = hexstr2str(ss.read(recLen)) + ddo.recovery = recovery + } + return ddo } } \ No newline at end of file diff --git a/src/transaction/transaction.ts b/src/transaction/transaction.ts index c1120386..578b4274 100644 --- a/src/transaction/transaction.ts +++ b/src/transaction/transaction.ts @@ -26,6 +26,7 @@ import Fixed64 from '../common/fixed64' import Uint160 from '../common/uint160'; import Uint256 from '../common/uint256'; import * as core from '../core' +import { KeyType } from '../crypto' import * as cryptoJS from 'crypto-js' export enum TxType { @@ -65,12 +66,6 @@ export class Fee { payer : Uint160 } -export enum KeyType { - PK_ECDSA = 0x12, - PK_SM2 = 0x13, - PK_EDDSA = 0x14, -} - export class PubKey { type : KeyType publicKey : string diff --git a/src/transaction/transactionBuilder.ts b/src/transaction/transactionBuilder.ts index 76cd2423..ac4a3efb 100644 --- a/src/transaction/transactionBuilder.ts +++ b/src/transaction/transactionBuilder.ts @@ -21,7 +21,7 @@ import AbiFunction from "../smartcontract/abi/abiFunction"; import {Parameter, ParameterType } from '../smartcontract/abi/parameter' import InvokeCode from './payload/invokeCode' import DeployCode from './payload/deployCode' -import {Transaction, TxType, Sig, PubKey, KeyType} from './transaction' +import {Transaction, TxType, Sig, PubKey} from './transaction' import {Transfers, Contract, State} from '../smartcontract/token' import {TransactionAttribute, TransactionAttributeUsage} from './txAttribute' import {createSignatureScript, getHash, getPublicKey } from '../core' @@ -195,6 +195,11 @@ export const buildSmartContractParam = (functionName : string, params : Array } -export const makeInvokeTransaction = (func : AbiFunction, scriptHash : string, privateKey : string) => { +export const makeInvokeTransaction = (func : AbiFunction, scriptHash : string, privateKey ?: string) => { let tx = new Transaction() tx.type = TxType.Invoke tx.version = 0x00 @@ -241,7 +246,9 @@ export const makeInvokeTransaction = (func : AbiFunction, scriptHash : string, tx.payload = payload //sig - signTransaction(tx, privateKey) + if(privateKey) { + signTransaction(tx, privateKey) + } return tx } @@ -332,7 +339,7 @@ export function buildRegisterOntidTx (ontid: string, privateKey: string) { return tx } -export function buildGetDDOTx(ontid : string, privateKey : string) { +export function buildGetDDOTx(ontid : string) { let f = abiInfo.getFunction('GetDDO') if (ontid.substr(0, 3) == 'did') { ontid = str2hexstr(ontid) @@ -342,7 +349,7 @@ export function buildGetDDOTx(ontid : string, privateKey : string) { let nonce = ab2hexstring( core.generateRandomArray(10) ) let p2 = new Parameter(f.parameters[1].getName(), ParameterType.ByteArray, nonce) f.setParamsValue(p1,p2) - let tx = makeInvokeTransaction( f, abiInfo.getHash(), privateKey) + let tx = makeInvokeTransaction( f, abiInfo.getHash(), '') return tx } diff --git a/src/transaction/txSender.ts b/src/transaction/txSender.ts index 8f4b736f..b52560fe 100644 --- a/src/transaction/txSender.ts +++ b/src/transaction/txSender.ts @@ -29,16 +29,9 @@ if(typeof window != 'undefined' && (window as any).WebSocket){ export default class TxSender { SOCKET_URL : string - RPC_URL : string - constructor (net : string) { - if(net === ONT_NETWORK.MAIN) { - this.SOCKET_URL = MAIN_ONT_URL.SOCKET_URL - this.RPC_URL = MAIN_ONT_URL.RPC_URL - } else { - this.SOCKET_URL = TEST_ONT_URL.SOCKET_URL - this.RPC_URL = TEST_ONT_URL.RPC_URL - } + constructor (socketUrl : string) { + this.SOCKET_URL = socketUrl } sendTxWithSocket(param : string, callback : (res:any, socket:any) => any) { @@ -55,16 +48,6 @@ export default class TxSender { } else { res = event.data } - // console.log('response for send tx: ' + JSON.stringify(res)) - // if (callback) { - // callback(event.data) - // socket.close() - // } - // if (res.Action === 'Notify') { - // let result = parseEventNotify(res) - // console.log('paresed event notify: ' + JSON.stringify(result)) - // } - // socket.close() //pass socket to let caller decide when to close the it. if(callback) { diff --git a/test/abiInfo.test.ts b/test/abiInfo.test.ts index 8105f444..52417a91 100644 --- a/test/abiInfo.test.ts +++ b/test/abiInfo.test.ts @@ -18,7 +18,7 @@ import AbiInfo from '../src/smartcontract/abi/abiInfo' import AbiFunction from '../src/smartcontract/abi/abiFunction' -import {Parameter} from '../src/smartcontract/abi/parameter' +import {Parameter, ParameterType} from '../src/smartcontract/abi/parameter' import json from '../src/smartcontract/data/idContract.abi' import {Transaction} from '../src/transaction/transaction' @@ -35,26 +35,24 @@ describe('test AbiInfo', () => { tx : Transaction, serialized : string + a = AbiInfo.parseJson(JSON.stringify(json)) + f = a.getFunction('RegIdWithPublicKey') test('test read json', () => { - a = AbiInfo.parseJson(JSON.stringify(json)) - f = a.getFunction('RegIdByPublicKey') - + expect(f.parameters.length).toEqual(2) let ontidhex = str2hexstr('did:ont:TQLASLtT6pWbThcSCYU1biVqhMnzhTgLFq') - let p1 = new Parameter('id', 'ByteArray',ontidhex) - let p2 = new Parameter('pk', 'ByteArray', '039fbb47841f7338c0c654addd6225995642b5b6d492413563f7f8755ba83c0ecd') + let p1 = new Parameter('ontid', ParameterType.ByteArray,ontidhex) + let p2 = new Parameter('publicKey', ParameterType.ByteArray, '039fbb47841f7338c0c654addd6225995642b5b6d492413563f7f8755ba83c0ecd') f.setParamsValue(p1,p2) console.log(f) - }) test('test make invokecode tx', () => { - let privateKey = generatePrivateKeyStr() - tx = makeInvokeTransaction( f, privateKey ) + tx = makeInvokeTransaction( f, a.getHash() ) console.log(tx) serialized = tx.serialize() @@ -66,15 +64,6 @@ describe('test AbiInfo', () => { let t = Transaction.deserialize(serialized) console.log('deserialized: '+ t.toString()) - expect(t.txAttributes.length).toEqual(1) + expect(t.txAttributes.length).toEqual(0) }) - - test('test deserialize with given string', ()=> { - let str = 'd100eacecb46f117f55c80147a9d391c7c65af10bd366921039fbb47841f7338c0c654addd6225995642b5b6d492413563f7f8755ba83c0ecd2a2a6469643a6f6e743a41526a42735a32546e6f336345384e3132706631454b6a67464c37646a4247573452c1194372656174654964656e7469747942795075626c69634b6579012014082e502f35ec5cf8cc1209d0de00c550578911a700000000000000000000014140e76b00f381f0b6a7cf9946a65d619c967e705ee94a58ac34c292bc4c238d53fffe9039c6fbfc9d9d08806d54ffe4e63d56cfd6a5acc903b9bff17c982347e4842321039fbb47841f7338c0c654addd6225995642b5b6d492413563f7f8755ba83c0ecdac' - let t = Transaction.deserialize(str) - console.log('deserialized str: '+JSON.stringify(t)) - expect(t.payload.parameters.length).toEqual(2) - }) - - }) diff --git a/test/account.test.ts b/test/account.test.ts index c7688a04..4a590304 100644 --- a/test/account.test.ts +++ b/test/account.test.ts @@ -45,7 +45,7 @@ describe('test account', ()=>{ test('test import account with correct password', () => { let a try { - a = Account.importAccount(accountDataStr, encryptedPrivateKey, '123456') + a = Account.importAccount('mickey', encryptedPrivateKey, '123456') } catch(err) {} expect(a.label).toBe('mickey') @@ -56,7 +56,7 @@ describe('test account', ()=>{ test('test import with incorrect password', () => { try { - let a = Account.importAccount(accountDataStr,encryptedPrivateKey, '1234567') + let a = Account.importAccount('mickey',encryptedPrivateKey, '1234567') } catch(err) { expect(err).toEqual(ERROR_CODE.Decrypto_ERROR) } diff --git a/test/claim.test.ts b/test/claim.test.ts index 23d59b82..3285fe26 100644 --- a/test/claim.test.ts +++ b/test/claim.test.ts @@ -17,7 +17,7 @@ */ import {Claim , Metadata } from '../src/claim' -import {generatePrivateKeyStr, signatureData} from '../src/core' +import {generatePrivateKeyStr, signatureData, verifySignature, getPublicKey} from '../src/core' describe('test claim', () => { @@ -49,11 +49,27 @@ describe('test claim', () => { test('make a signature', ()=>{ const {Id, Metadata, Context, Content} = claim + //!!! the order of attributes matters let obj = { - Id, Metadata, Content, Context + Context: Context, + Id: Id, + Content: Content, + Metadata: Metadata } let signed = signatureData(JSON.stringify(obj), privateKey) let signatureValue = claim.Signature.Value expect(signed).toEqual(signatureValue) }) -}) \ No newline at end of file + + test('verify a signature', () => { + let publicKey = getPublicKey(privateKey, true) + let data = Object.assign({}, { + Context : claim.Context, + Id : claim.Id, + Content : claim.Content, + Metadata : claim.Metadata, + }) + let result = verifySignature(JSON.stringify(data), claim.Signature.Value, publicKey) + expect(result).toBeTruthy() + }) +}) diff --git a/test/core.test.ts b/test/core.test.ts index 09aa826b..1aa91d5a 100644 --- a/test/core.test.ts +++ b/test/core.test.ts @@ -32,39 +32,40 @@ describe('test core', ()=>{ privateKey = utils.ab2hexstring( core.generatePrivateKey() ) }) - test('test getWIFFromPrivateKey', () => { - wifKey = core.getWIFFromPrivateKey(privateKey) - expect(wifKey).toBeDefined() - }) + // test('test getWIFFromPrivateKey', () => { + // wifKey = core.getWIFFromPrivateKey(privateKey) + // expect(wifKey).toBeDefined() + // }) - test('test getPrivateKeyFromWIF', () => { - let key = core.getPrivateKeyFromWIF(wifKey) - expect(key).toEqual(privateKey) - }) + // test('test getPrivateKeyFromWIF', () => { + // let key = core.getPrivateKeyFromWIF(wifKey) + // expect(key).toEqual(privateKey) + // }) - test('get public key', () => { - let pkBuffer = core.getPublicKey(privateKey, true) - let pk = utils.ab2hexstring(pkBuffer) - console.log('get pk: ' + pk) - expect(pk).toBeDefined() - }) + // test('get public key', () => { + // let pkBuffer = core.getPublicKey(privateKey, true) + // let pk = utils.ab2hexstring(pkBuffer) + // console.log('get pk: ' + pk) + // expect(pk).toBeDefined() + // }) - test('encrypt private key', () => { - let privateKey = 'b02304dcb35bc9a055147f07b2a3291db4ac52f664ec38b436470c98db4200d9' - let wif = core.getWIFFromPrivateKey(privateKey) - let encrypt = scrypt.encrypt(wif, '123456') - console.log('encrypt: '+ encrypt) - }) + // test('encrypt private key', () => { + // let privateKey = 'b02304dcb35bc9a055147f07b2a3291db4ac52f664ec38b436470c98db4200d9' + // let wif = core.getWIFFromPrivateKey(privateKey) + // let encrypt = scrypt.encrypt(wif, '123456') + // console.log('encrypt: '+ encrypt) + // }) test('sign and verify', () => { let privateKey = core.generatePrivateKeyStr() let data = 'hello world' let signed = core.signatureData(data, privateKey) - console.log('signed: '+ signed) + console.log('signed: ' + signed) - let pk = ab2hexstring(core.getPublicKey(privateKey, false)) + let pk = core.getPublicKey(privateKey, true) let verifyResult = core.verifySignature(data, signed, pk) - expect(verifySignature).toBeTruthy() + console.log('verifyResult: ' + verifyResult) + expect(verifyResult).toBeTruthy() }) }) \ No newline at end of file diff --git a/test/ddo.test.ts b/test/ddo.test.ts index 8376e3f8..d9584aac 100644 --- a/test/ddo.test.ts +++ b/test/ddo.test.ts @@ -21,7 +21,7 @@ import {DDO} from '../src/transaction/ddo' const hexstring = // "000000260100000021039392ba7df4a7badc4cc498be257202f9bbb89c887502e9bcb96a6636ee050ba80000001c010000001700000004436572740000000b06537472696e6761626364" -"00000026010000002103fb3793c14e2233f01db2145307d179f0aa21ad239de61452cda4cc9278cbad2b000000d702000000a400000020b5a87bea92d52525b6eba3b670595cf8b9cbb51e972f5cbff499d48677ddee8a0000007c044a534f4e7b2254797065223a224a534f4e222c2256616c7565223a7b22436f6e74657874223a22636c61696d3a73746166665f61757468656e7469636174696f6e38222c22497373756572223a226469643a6f6e743a545675463646483150736b7a574a4146685741466731374e5369744d4445424e6f61227d7d0000002a0000000d436c61696d3a747769747465720000001506537472696e6777616e6731374074776974746572" +"0000002b0000000100000023120203fb3793c14e2233f01db2145307d179f0aa21ad239de61452cda4cc9278cbad2b000000d200000001000000ca00000046636c61696d3a623561383762656139326435323532356236656261336236373035393563663862396362623531653937326635636266663439396434383637376464656538610000007c044a534f4e7b2254797065223a224a534f4e222c2256616c7565223a7b22436f6e74657874223a22636c61696d3a73746166665f61757468656e7469636174696f6e38222c22497373756572223a226469643a6f6e743a545675463646483150736b7a574a4146685741466731374e5369744d4445424e6f61227d7d00000000" describe('test ddo', () => { test('test ddo deserialize', () => { let ddo = DDO.deserialize(hexstring) diff --git a/test/deployCodeTx.test.ts b/test/deployCodeTx.test.ts index f9c4b1fb..41389ed1 100644 --- a/test/deployCodeTx.test.ts +++ b/test/deployCodeTx.test.ts @@ -51,7 +51,7 @@ var serialized const WebSocket = require('ws'); -var txSender = new TxSender(ONT_NETWORK.TEST) +var txSender = new TxSender(TEST_ONT_URL.SOCKET_URL) const testDeployCodeTx = () => { @@ -78,7 +78,9 @@ const testDeployCodeTx = () => { console.log('param: '+JSON.stringify(param)) axios.post(url, param).then((res)=>{ console.log('deploy res: '+JSON.stringify(res.data)) - getContract() + setTimeout(function() { + getContract() + }, 6000) }).catch(err => { console.log(err) }) @@ -117,9 +119,9 @@ const getContract = () => { -// testDeployCodeTx() +testDeployCodeTx() -getContract() +// getContract() // testDeserialize() /* diff --git a/test/identity.test.ts b/test/identity.test.ts index 5c3d3aef..90d90655 100644 --- a/test/identity.test.ts +++ b/test/identity.test.ts @@ -44,7 +44,7 @@ describe('test identity', () => { console.log('encryptedkey: ' + encryptedPrivateKey) let a try { - a = Identity.importIdentity('', encryptedPrivateKey, '123456') + a = Identity.importIdentity('mickey', encryptedPrivateKey, '123456') } catch(err) { console.log(err) } diff --git a/test/scrypt.test.ts b/test/scrypt.test.ts index 11b65f61..8bbb71b7 100644 --- a/test/scrypt.test.ts +++ b/test/scrypt.test.ts @@ -18,6 +18,7 @@ import * as scrypt from '../src/scrypt' import * as core from '../src/core' +import { ERROR_CODE } from '../src/error'; describe('test scrypt', () => { it('test encrypt and decrypt', () => { @@ -28,7 +29,10 @@ describe('test scrypt', () => { let result = scrypt.decrypt(encrypt, '123456') expect(result).toEqual(privateKey) - result = scrypt.decrypt(encrypt, '1234567') - expect(result).not.toEqual(privateKey) + try { + result = scrypt.decrypt(encrypt, '1234567') + } catch(err) { + expect(err).toEqual(ERROR_CODE.Decrypto_ERROR) + } }) }) \ No newline at end of file diff --git a/test/transfer.test.ts b/test/transfer.test.ts index 8537a201..241d7f3e 100644 --- a/test/transfer.test.ts +++ b/test/transfer.test.ts @@ -25,11 +25,11 @@ import axios from 'axios' import { ab2hexstring, StringReader } from "../src/utils"; import {State} from '../src/smartcontract/token' import * as scrypt from '../src/scrypt' -import {TEST_NODE, HTTP_REST_PORT, REST_API, ONT_NETWORK} from '../src/consts' +import {TEST_NODE, HTTP_REST_PORT, REST_API, ONT_NETWORK, TEST_ONT_URL} from '../src/consts' import {BigNumber} from 'bignumber.js' import { addressToU160 } from "../src/core"; -var txSender = new TxSender(ONT_NETWORK.TEST) +var txSender = new TxSender(TEST_ONT_URL.SOCKET_URL) var accountFrom = { hexAddress: '018f0dcf09ec2f0040e6e8d7e54635dba40f7d63', @@ -82,7 +82,7 @@ const testTransferTx = () => { } const testGetBalance = (address, addressName) => { - let request = `http://${TEST_NODE}:${HTTP_REST_PORT}${REST_API.getBalance}/${address}` + let request = `https://${TEST_NODE}:${HTTP_REST_PORT}${REST_API.getBalance}/${address}` axios.get(request).then((res) => { let result = res.data.Result // console.log(result) diff --git a/test/tx.node.ts b/test/tx.node.ts index 9c53cc4c..92bb9a21 100644 --- a/test/tx.node.ts +++ b/test/tx.node.ts @@ -27,7 +27,7 @@ import AbiFunction from '../src/smartcontract/abi/abiFunction' import {Parameter, ParameterType } from '../src/smartcontract/abi/parameter' import json2 from '../src/smartcontract/data/idContract.abi' import { ab2hexstring, str2hexstr, StringReader } from '../src/utils' -import { DEFAULT_ALGORITHM, ONT_NETWORK } from '../src/consts'; +import { DEFAULT_ALGORITHM, ONT_NETWORK, TEST_NODE } from '../src/consts'; import { DDO } from '../src/transaction/ddo' import { TEST_ONT_URL} from '../src/consts' import { getHash } from '../src/core'; @@ -36,7 +36,7 @@ import axios from 'axios' const codeHash = '80e7d2fc22c24c466f44c7688569cc6e6d6c6f92' -var txSender = new TxSender(ONT_NETWORK.TEST) +var txSender = new TxSender(TEST_ONT_URL.SOCKET_URL) // const SOCKET_URL = 'ws://52.80.115.91:20335' const Default_params = { @@ -139,7 +139,7 @@ const callback = function (res, socket) { } const testDDOTx = () => { - let tx = buildGetDDOTx(ontid, privateKey) + let tx = buildGetDDOTx(ontid) // let param = buildTxParam(tx, false) @@ -326,6 +326,38 @@ const testChangeRecovery = () => { sendTx(param) } +const testVerifyOntidClaim = () => { + var claim = { + "Context": "claim:github_authentication", + "Content": { + "GistCreateTime": "2018-02-28T03:24:48Z", + "Company": "onchain", + "Email": "leewi9@yahoo.com", + "Alias": "leewi9", + "Bio": "software engineer", + "Id": "10832544", + "GistUrl": "https://gist.github.com/42298ebb0c44054c43f48e1afd763ff6", + "Avatar": "https://avatars2.githubusercontent.com/u/10832544?v=4", + "Name": "zhouzhou", + "Location": "" + }, + "Signature": { + "Format": "pgp", + "Value": "rsjaenrxJm8qDmhtOHNBNOCOlvz/GC1c6CMnUb7KOb1jmHbMNGB63VXhtKflwSggyu1cVBK14/0t7qELqIrNmQ==", + "Algorithm": "ECDSAwithSHA256" + }, + "Metadata": { + "Issuer": "did:ont:TVuF6FH1PskzWJAFhWAFg17NSitMDEBNoK", + "CreateTime": "2018-03-07T16:06:21Z", + "Subject": "did:ont:TKhyXw8o6Em5GjmJwiPT1oNXsy4p6fYZPB" + }, + "Id": "111ab2f56d106dac92e891b6f7fc4d9546fdf2eb94a364208fa65a9996b03ba0" + } + core.verifyOntidClaim(claim).then(res =>{ + console.log('verify result : '+ res) + }) +} + //uncomment one line to test one tx each time. @@ -335,6 +367,8 @@ const testChangeRecovery = () => { testDDOTx() +// testVerifyOntidClaim() + // testDDOByRpc() // testGetPublicKeys() diff --git a/webpack.config.js b/webpack.config.js index 13a257e1..42113b4c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -26,7 +26,7 @@ let common = { 'child_process': 'empty' }, plugins: [ - new CleanWebpackPlugin(['lib/*.js', 'lib/*.js.map']) + new CleanWebpackPlugin(['lib/*.js', 'lib/*.js.map', 'lib/types/*']) ] }