@secux/utility
Advanced tools
Comparing version 2.0.6 to 2.0.7
@@ -10,2 +10,3 @@ /// <reference types="node" /> | ||
export declare const ow_numberString: import("ow").StringPredicate; | ||
export declare const ow_xpubString: import("ow").StringPredicate; | ||
export declare function ow_strictPath(coinType: number | Array<number>, purpose?: number | Array<number>): import("ow").StringPredicate; | ||
@@ -12,0 +13,0 @@ export declare function ow_accountPath(coinType: number | Array<number>, purpose?: number | Array<number>): import("ow").StringPredicate; |
@@ -1,1 +0,1 @@ | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isSupportedCoin=exports.supported_coin=exports.BigIntToBuffer=exports.ow_checkBufferLength=exports.ow_accountPath=exports.ow_strictPath=exports.ow_numberString=exports.ow_hashString=exports.ow_prefixedhexString=exports.ow_hexString=exports.ow_bip32String=exports.Logger=exports.toExtenededPublicKey=exports.splitPath=exports.buildPathBuffer=void 0;const e=require("bignumber.js"),t=require("ow"),r=require("./BIP32Path");var o=require("./BIP32Path");Object.defineProperty(exports,"buildPathBuffer",{enumerable:!0,get:function(){return o.buildPathBuffer}}),Object.defineProperty(exports,"splitPath",{enumerable:!0,get:function(){return o.splitPath}});var n=require("./xpub");function p(e){let t="";return e.map((e=>t+=`${e.toString()}|`)),t=`(${t.substr(0,t.length-1)})`,t}Object.defineProperty(exports,"toExtenededPublicKey",{enumerable:!0,get:function(){return n.toExtenededPublicKey}}),exports.Logger=process.env.SECUX_LOGGER,exports.ow_bip32String=t.default.string.matches(/^m(\/\d+'){3}(\/\d+){2}$/),exports.ow_hexString=t.default.string.matches(/^[0-9A-F-a-f]+$/),exports.ow_prefixedhexString=t.default.string.matches(/^0x[0-9A-F-a-f]+$/),exports.ow_hashString=t.default.string.matches(/^[0-9A-Z-a-z]+$/),exports.ow_numberString=t.default.string.matches(/^[0-9]+$/),exports.ow_strictPath=function(e,r){const o=p("number"==typeof e?[e]:e);if(r){const e=p("number"==typeof r?[r]:r);return t.default.string.matches(new RegExp(`^m/${e}'/${o}'/[0-9]+'/[0-9]+/[0-9]+$`))}return t.default.string.matches(new RegExp(`^m/(44|49|84)'/${o}'/[0-9]+'/[0-9]+/[0-9]+$`))},exports.ow_accountPath=function(e,r){const o=p("number"==typeof e?[e]:e);if(r){const e=p("number"==typeof r?[r]:r);return t.default.string.matches(new RegExp(`^m/${e}'/${o}'/[0-9]+'/[0-9]+/[0-9]+$`))}return t.default.string.matches(new RegExp(`^m/(44|49|84)'/${o}'/[0-9]+'$`))},exports.ow_checkBufferLength=function(e){return t.default.buffer.validate((t=>({validator:t.length===e,message:r=>`ArgumentError: Expected length of ${r} is ${e}, got ${t.length}`})))},exports.BigIntToBuffer=function(t,r,o=!0){let n="";"number"==typeof t?n=t.toString(16):"string"==typeof t&&(n=new e.BigNumber(t).toString(16)),n.length%2!=0&&(n="0"+n);const p=Buffer.from(n,"hex");if(p.length>r)throw Error("value is too large");const i=Buffer.concat([Buffer.alloc(r-p.length),p]);return o?i.reverse():i},exports.supported_coin=Object.freeze([{purpose:[44,49,84],cointype:0,name:"bitcoin mainnet"},{purpose:[44,49],cointype:1,name:"bitcoin testnet"},{purpose:[44,49],cointype:2,name:"litecoin"},{purpose:[44],cointype:3,name:"dogecoin"},{purpose:[44],cointype:5,name:"dash"},{purpose:[44,49],cointype:17,name:"groestl"},{purpose:[44,49],cointype:20,name:"digibyte"},{purpose:[44],cointype:60,name:"ethereum"},{purpose:[44],cointype:144,name:"ripple"},{purpose:[44],cointype:145,name:"bitcoincash"},{purpose:[44],cointype:148,name:"stellar"},{purpose:[44],cointype:195,name:"tron"},{purpose:[44],cointype:714,name:"binance"},{purpose:[1852],cointype:1815,name:"cardano"}]),exports.isSupportedCoin=function(e){const t=(0,r.splitPath)(e);for(const e of exports.supported_coin)if(e.purpose.includes(t.purpose.value)&&e.cointype===t.coinType.value)return!0;return!1},process.env.SECUX_LOGGER||Object.defineProperty(process.env,"SECUX_LOGGER",{enumerable:!1,configurable:!1,writable:!1,value:void 0}); | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isSupportedCoin=exports.supported_coin=exports.BigIntToBuffer=exports.ow_checkBufferLength=exports.ow_accountPath=exports.ow_strictPath=exports.ow_xpubString=exports.ow_numberString=exports.ow_hashString=exports.ow_prefixedhexString=exports.ow_hexString=exports.ow_bip32String=exports.Logger=exports.toExtenededPublicKey=exports.splitPath=exports.buildPathBuffer=void 0;const e=require("bignumber.js"),t=require("ow"),r=require("./BIP32Path");var o=require("./BIP32Path");Object.defineProperty(exports,"buildPathBuffer",{enumerable:!0,get:function(){return o.buildPathBuffer}}),Object.defineProperty(exports,"splitPath",{enumerable:!0,get:function(){return o.splitPath}});var n=require("./xpub");function p(e){let t="";return e.map((e=>t+=`${e.toString()}|`)),t=`(${t.substr(0,t.length-1)})`,t}Object.defineProperty(exports,"toExtenededPublicKey",{enumerable:!0,get:function(){return n.toExtenededPublicKey}}),exports.Logger=process.env.SECUX_LOGGER,exports.ow_bip32String=t.default.string.matches(/^m(\/\d+'){3}(\/\d+){2}$/),exports.ow_hexString=t.default.string.matches(/^[0-9A-F-a-f]+$/),exports.ow_prefixedhexString=t.default.string.matches(/^0x[0-9A-F-a-f]+$/),exports.ow_hashString=t.default.string.matches(/^[0-9A-Z-a-z]+$/),exports.ow_numberString=t.default.string.matches(/^[0-9]+$/),exports.ow_xpubString=t.default.string.matches(/^[1-9A-NP-Za-km-z]{111}$/),exports.ow_strictPath=function(e,r){const o=p("number"==typeof e?[e]:e);if(r){const e=p("number"==typeof r?[r]:r);return t.default.string.matches(new RegExp(`^m/${e}'/${o}'/[0-9]+'/[0-9]+/[0-9]+$`))}return t.default.string.matches(new RegExp(`^m/(44|49|84)'/${o}'/[0-9]+'/[0-9]+/[0-9]+$`))},exports.ow_accountPath=function(e,r){const o=p("number"==typeof e?[e]:e);if(r){const e=p("number"==typeof r?[r]:r);return t.default.string.matches(new RegExp(`^m/${e}'/${o}'/[0-9]+'/[0-9]+/[0-9]+$`))}return t.default.string.matches(new RegExp(`^m/(44|49|84)'/${o}'/[0-9]+'$`))},exports.ow_checkBufferLength=function(e){return t.default.buffer.validate((t=>({validator:t.length===e,message:r=>`ArgumentError: Expected length of ${r} is ${e}, got ${t.length}`})))},exports.BigIntToBuffer=function(t,r,o=!0){let n="";"number"==typeof t?n=t.toString(16):"string"==typeof t&&(n=new e.BigNumber(t).toString(16)),n.length%2!=0&&(n="0"+n);const p=Buffer.from(n,"hex");if(p.length>r)throw Error("value is too large");const i=Buffer.concat([Buffer.alloc(r-p.length),p]);return o?i.reverse():i},exports.supported_coin=Object.freeze([{purpose:[44,49,84],cointype:0,name:"bitcoin mainnet"},{purpose:[44,49],cointype:1,name:"bitcoin testnet"},{purpose:[44,49],cointype:2,name:"litecoin"},{purpose:[44],cointype:3,name:"dogecoin"},{purpose:[44],cointype:5,name:"dash"},{purpose:[44,49],cointype:17,name:"groestl"},{purpose:[44,49],cointype:20,name:"digibyte"},{purpose:[44],cointype:60,name:"ethereum"},{purpose:[44],cointype:144,name:"ripple"},{purpose:[44],cointype:145,name:"bitcoincash"},{purpose:[44],cointype:148,name:"stellar"},{purpose:[44],cointype:195,name:"tron"},{purpose:[44],cointype:714,name:"binance"},{purpose:[1852],cointype:1815,name:"cardano"}]),exports.isSupportedCoin=function(e){const t=(0,r.splitPath)(e);for(const e of exports.supported_coin)if(e.purpose.includes(t.purpose.value)&&e.cointype===t.coinType.value)return!0;return!1},process.env.SECUX_LOGGER||Object.defineProperty(process.env,"SECUX_LOGGER",{enumerable:!1,configurable:!1,writable:!1,value:void 0}); |
@@ -11,1 +11,12 @@ /// <reference types="node" /> | ||
export declare function toExtenededPublicKey(path: string, parentFingerPrint: Buffer, chainCode: Buffer, publicKey: Buffer): string; | ||
export declare function decodeXPUB(xpub: string): { | ||
purpose: number; | ||
depth: number; | ||
publickey: Buffer; | ||
chaincode: Buffer; | ||
fingerprint: Buffer; | ||
}; | ||
export declare function deriveKey(publickey: Buffer, chaincode: Buffer, indexArray: Array<number>): { | ||
publickey: Buffer; | ||
chaincode: Buffer; | ||
}; |
@@ -1,1 +0,1 @@ | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.toExtenededPublicKey=void 0;const e=require("./BIP32Path"),t=require("./bs58"),r=require("hash.js"),a=require("ow"),o=require("./utility"),u=require("groestl-hash-js");exports.toExtenededPublicKey=function(t,r,u,n){var i;(0,a.default)(t,a.default.string.matches(/^m(\/\d+'?){3}/)),(0,a.default)(r,(0,o.ow_checkBufferLength)(4)),(0,a.default)(u,(0,o.ow_checkBufferLength)(32)),(0,a.default)(n,(0,o.ow_checkBufferLength)(33));const d=Buffer.allocUnsafe(78),l=(0,e.splitPath)(t);switch(l.purpose.value){case 44:d.writeUInt32BE(76067358,0);break;case 49:d.writeUInt32BE(77429938,0);break;case 84:d.writeUInt32BE(78792518,0);break;default:throw Error("unsupported purpose of path")}const f=l.pathNum;let h;switch(d.writeUInt8(f,4),(f?r:Buffer.alloc(4)).copy(d,5),f){case 1:h=l.purpose;break;case 2:h=l.coinType;break;case 3:h=l.accountId;break;case 4:h=l.change;break;case 5:h=l.addressIndex;break;default:throw Error("Invalid Path, only support 1 to 5 depth path")}const p=h.isHardened?h.value+e.HARDENED_OFFSET:null==h?void 0:h.value;return d.writeUInt32BE(p,9),u.copy(d,13),n.copy(d,45),17===(null===(i=l.coinType)||void 0===i?void 0:i.value)?c.encode(d):s.encode(d)};const s=new t.bs58Check((function(e){const t=(0,r.sha256)().update(e).digest();return Buffer.from((0,r.sha256)().update(t).digest())})),c=new t.bs58Check((function(e){return Buffer.from(u.groestl_2(e,1,1))})); | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deriveKey=exports.decodeXPUB=exports.toExtenededPublicKey=void 0;const e=require("./BIP32Path"),r=require("./bs58"),t=require("hash.js"),o=require("elliptic"),c=require("ow"),n=require("./utility"),u=require("groestl-hash-js"),a=null===n.Logger||void 0===n.Logger?void 0:n.Logger.child({id:"utility"}),i=new o.ec("secp256k1"),s=i.curve.n.constructor;exports.toExtenededPublicKey=function(r,t,o,u){var a;(0,c.default)(r,c.default.string.matches(/^m(\/\d+'?){3}/)),(0,c.default)(t,(0,n.ow_checkBufferLength)(4)),(0,c.default)(o,(0,n.ow_checkBufferLength)(32)),(0,c.default)(u,(0,n.ow_checkBufferLength)(33));const i=Buffer.allocUnsafe(78),s=(0,e.splitPath)(r);switch(s.purpose.value){case 44:i.writeUInt32BE(76067358,0);break;case 49:i.writeUInt32BE(77429938,0);break;case 84:i.writeUInt32BE(78792518,0);break;default:throw Error("unsupported purpose of path")}const f=s.pathNum;let p;switch(i.writeUInt8(f,4),(f>0?t:Buffer.alloc(4)).copy(i,5),f){case 1:p=s.purpose;break;case 2:p=s.coinType;break;case 3:p=s.accountId;break;case 4:p=s.change;break;case 5:p=s.addressIndex;break;default:throw Error("Invalid Path, only support 1 to 5 depth path")}const h=p.isHardened?p.value+e.HARDENED_OFFSET:null==p?void 0:p.value;return i.writeUInt32BE(h,9),o.copy(i,13),u.copy(i,45),17===(null===(a=s.coinType)||void 0===a?void 0:a.value)?l.encode(i):d.encode(i)},exports.decodeXPUB=function(e){let r,t;(0,c.default)(e,n.ow_xpubString);try{r=d.decode(e)}catch(t){null==a||a.warn(`The xpub is not Bitcoin compatible, try use Groestlcoin version:\n${e}`),r=l.decode(e)}switch(r.readUInt32BE(0)){case 76067358:t=44;break;case 77429938:t=49;break;case 78792518:t=84;break;default:throw Error(`unsupport prefix, got 0x${r.slice(0,4)}`)}const o=r.readUInt8(4),u=r.slice(5,9),i=r.slice(13,45);return{purpose:t,depth:o,publickey:r.slice(45),chaincode:i,fingerprint:u}},exports.deriveKey=function(e,r,t){(0,c.default)(e,(0,n.ow_checkBufferLength)(33)),(0,c.default)(r,(0,n.ow_checkBufferLength)(32)),(0,c.default)(t,c.default.array.ofType(c.default.number.uint8));let o={publickey:e,chaincode:r};for(const e of t)o=f(o.publickey,o.chaincode,e);return o};const d=new r.bs58Check((function(e){const r=(0,t.sha256)().update(e).digest();return Buffer.from((0,t.sha256)().update(r).digest())})),l=new r.bs58Check((function(e){return Buffer.from(u.groestl_2(e,1,1))}));function f(e,r,o){const c=Buffer.allocUnsafe(37);e.copy(c,0),c.writeUInt32BE(o,33);const n=(0,t.hmac)(t.sha512,r).update(c).digest(),u=Buffer.from(n),a=u.slice(0,32),d=u.slice(32);let l;try{const r=i.keyFromPublic(e),t=new s(a);if(t.cmp(i.curve.n)>=0)throw Error("tweak error");const o=r.getPublic().add(i.curve.g.mul(t));if(o.isInfinity())throw Error("point error");l=Buffer.from(o.encode("array",!0))}catch(t){return f(e,r,o+1)}return{publickey:l,chaincode:d}} |
{ | ||
"name": "@secux/utility", | ||
"version": "2.0.6", | ||
"version": "2.0.7", | ||
"description": "SecuX Hardware Wallet internal tools for SDK", | ||
@@ -32,2 +32,3 @@ "keywords": [ | ||
"bignumber.js": "^9.0.1", | ||
"elliptic": "^6.5.4", | ||
"groestl-hash-js": "^1.0.0", | ||
@@ -34,0 +35,0 @@ "hash.js": "^1.1.7", |
16014
73
6
+ Addedelliptic@^6.5.4
+ Addedbn.js@4.12.1(transitive)
+ Addedbrorand@1.1.0(transitive)
+ Addedelliptic@6.6.1(transitive)
+ Addedhmac-drbg@1.0.1(transitive)
+ Addedminimalistic-crypto-utils@1.0.1(transitive)