diff --git a/lib/keymanagers/Keys.js b/lib/keymanagers/Keys.js index 1762642..0250c1c 100644 --- a/lib/keymanagers/Keys.js +++ b/lib/keymanagers/Keys.js @@ -1,6 +1,5 @@ 'use strict'; -// const Key = require('./keyRSA'); const Key = require('./Key'); const keyOrNull = (key) => { diff --git a/lib/keymanagers/_Keys.js b/lib/keymanagers/_Keys.js deleted file mode 100644 index 94fb1ce..0000000 --- a/lib/keymanagers/_Keys.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -const Key = require('./keyRSA'); - -const keyOrNull = key => (key ? Key(key) : null); - -module.exports = class Keys { - constructor({ - A006, - E002, - X002, - bankX002, - bankE002, - }) { - this.keys = { - A006: keyOrNull(A006), - E002: keyOrNull(E002), - X002: keyOrNull(X002), - bankX002: keyOrNull(bankX002), - bankE002: keyOrNull(bankE002), - }; - console.log('debug'); - } - - static generate() { - const keys = {}; - - Object.keys({ A006: '', X002: '', E002: '' }).forEach((key) => { - keys[key] = Key().generate(); - }); - - return new Keys(keys); - } - - setBankKeys(bankKeys) { - this.keys.bankX002 = Key().importKey(bankKeys.bankX002); - this.keys.bankE002 = Key().importKey(bankKeys.bankE002); - } - - a() { - return this.keys.A006; - } - - e() { - return this.keys.E002; - } - - x() { - return this.keys.X002; - } - - bankX() { - return this.keys.bankX002; - } - - bankE() { - return this.keys.bankE002; - } -}; diff --git a/lib/keymanagers/keyRSA.js b/lib/keymanagers/keyRSA.js deleted file mode 100644 index e359329..0000000 --- a/lib/keymanagers/keyRSA.js +++ /dev/null @@ -1,228 +0,0 @@ -'use strict'; - -/* eslint-disable camelcase */ - -function rsaPublicKeyPem(modulus_b64, exponent_b64) { - function prepadSigned(hexStr) { - const msb = hexStr[0]; - if ( - (msb >= '8' && msb <= '9') || - (msb >= 'a' && msb <= 'f') || - (msb >= 'A' && msb <= 'F')) - return `00${hexStr}`; - - return hexStr; - } - - function toHex(number) { - const nstr = number.toString(16); - if (nstr.length % 2 === 0) return nstr; - return `0${nstr}`; - } - - // encode ASN.1 DER length field - // if <=127, short from - // if >=128, long from - function encodeLengthHex(n) { - if (n <= 127) return toHex(n); - - const n_hex = toHex(n); - const length_of_length_byte = 128 + (n_hex.length / 2); // 0x80+numbytes - return toHex(length_of_length_byte) + n_hex; - } - - const modulus = Buffer.from(modulus_b64, 'base64'); - const exponent = Buffer.from(exponent_b64, 'base64'); - - let modulus_hex = modulus.toString('hex'); - let exponent_hex = exponent.toString('hex'); - - modulus_hex = prepadSigned(modulus_hex); - exponent_hex = prepadSigned(exponent_hex); - - const modlen = modulus_hex.length / 2; - const explen = exponent_hex.length / 2; - - const encoded_modlen = encodeLengthHex(modlen); - const encoded_explen = encodeLengthHex(explen); - const encoded_pubkey = `30${ - encodeLengthHex(modlen + explen + (encoded_modlen.length / 2) + (encoded_explen.length / 2) + 2) - }02${encoded_modlen}${modulus_hex - }02${encoded_explen}${exponent_hex}`; - - let seq2 = - `${'30 0d ' + - '06 09 2a 86 48 86 f7 0d 01 01 01' + - '05 00 ' + - '03'}${encodeLengthHex((encoded_pubkey.length / 2) + 1) - }00${encoded_pubkey}`; - - seq2 = seq2.replace(/ /g, ''); - - let der_hex = `30${encodeLengthHex(seq2.length / 2)}${seq2}`; - - der_hex = der_hex.replace(/ /g, ''); - - const der = Buffer.from(der_hex, 'hex'); - const der_b64 = der.toString('base64'); - - const pem = `-----BEGIN PUBLIC KEY-----\n${ - der_b64.match(/.{1,64}/g).join('\n') - }\n-----END PUBLIC KEY-----\n`; - - return pem.trim(); -} - -const BN = require('bn.js'); -const NodeRSA = require('node-rsa'); - -const { - pki: { - rsa, - publicKeyToPem, - privateKeyToPem, - publicKeyFromPem, - privateKeyFromPem, - }, - jsbn: { - BigInteger, - }, -} = require('node-forge'); - -const isKeyInstance = (obj) => { - if (typeof obj !== 'object') - return false; - return ('publicKey' in obj && 'privateKey' in obj); -}; - -const getKeyType = (str) => { - const matches = str.match(/(PRIVATE|PUBLIC) KEY/); - if (!matches) - return null; - return matches[1].toLowerCase(); -}; - -/* -class RsaKeyPair { - constructor() { - this._isPublic = null; - this._publicKey = null; - this._privateKey = null; - } - fromString(str) { - - } -} -*/ - -const keyOrNull = (encodedKey) => { - if (encodedKey === null) return {}; - if (typeof encodedKey === 'string') { - const type = getKeyType(encodedKey); - const isPublic = type === 'public'; - const key = isPublic ? publicKeyFromPem(encodedKey) : privateKeyFromPem(encodedKey); - key.isPublic = isPublic; - return key; - } - - return encodedKey; - // return (isKeyInstance(encodedKey)) ? encodedKey; - - /* const k = (encodedKey instanceof NodeRSA) ? encodedKey : new NodeRSA(encodedKey); - if (k.keyPair.e === 16777216) - k.keyPair.e = 4294967311; - return k; */ -}; - -module.exports = (encodedKey) => { - if (encodedKey && encodedKey.__RsaKey) - return encodedKey; - return { - __RsaKey: true, - key: keyOrNull(encodedKey), - - generate(keySize = 2048) { - const keyPair = rsa.generateKeyPair(keySize); - this.key = keyPair.privateKey; - this.key.isPublic = false; - this.publicKey = keyPair.publicKey; - return this; - // return rsa.generateKeyPair(keySize); - // return new NodeRSA({ b: keySize }); - }, - - importKey({ - mod, - exp, - modulus, - exponent, - }) { - this.key = rsa.setPublicKey(new BigInteger(mod.toString('hex'), 16), new BigInteger(exp.toString('hex'), 16)); - this.key.isPublic = true; - // const k = rsa.generateKeyPair(); - // k.publicKey = rsa.setPublicKey(mod, exp); - // this.key = k; - // this.key.publicKey. - - // .this.key.importKey({ n: mod, e: exp }, 'components-public'); - /* - this.pempem = modulus && exponent ? { - modulus, - exponent, - } : null; - */ - - return this; - }, - - n(to = 'buff') { - const key = this.publicKey || this.key; - const keyN = Buffer.from(key.n.toByteArray()); - - return to === 'hex' - ? keyN.toString('hex', 1) - : keyN; - }, - - e(to = 'buff') { - const key = this.publicKey || this.key; - const eKey = Buffer.from(key.e.toByteArray()); // new BN(this.key.exportKey('components-public').e).toBuffer(); - - return to === 'hex' - ? eKey.toString('hex') - : eKey; - }, - - d() { - return Buffer.from(this.key.d.toByteArray()); - // return this.key.keyPair.d.toBuffer(); - }, - - isPrivate() { - return !this.key.isPublic; - }, - - isPublic() { - return this.key.isPublic; - // return this.key.isPublic(); - }, - - size() { - return 2048; - // return this.key.getKeySize(); - }, - - toPem() { - if (this.isPublic()) - return publicKeyToPem(this.key); - return privateKeyToPem(this.key); - /* - if (this.pempem) - return rsaPublicKeyPem(this.pempem.modulus, this.pempem.exponent); - const isPrivate = this.key.isPrivate(); - const pem = isPrivate ? this.key.exportKey('pkcs1-private-pem') : this.key.exportKey('pkcs8-public-pem'); - return pem; - */ - }, - }; -}; diff --git a/lib/orders/H004/response.js b/lib/orders/H004/response.js index b82a9ab..b7344fa 100644 --- a/lib/orders/H004/response.js +++ b/lib/orders/H004/response.js @@ -2,7 +2,6 @@ const zlib = require('zlib'); const crypto = require('crypto'); -const BN = require('bn.js'); const Crypto = require('../../crypto/Crypto'); diff --git a/package.json b/package.json index 4427452..4484da1 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "lint": "eslint .", - "test": "mocha test/*/**.js" + "test": "mocha test/**/*.js" }, "repository": { "type": "git", diff --git a/test/exponentHandle.js b/test/exponentHandle.js deleted file mode 100644 index 1f85741..0000000 --- a/test/exponentHandle.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -const { assert } = require('chai'); -const H004Response = require('../lib/orders/H004/response'); - -describe('H004 response parsing', () => { - it('parses bank keys exp', () => { - const response = H004Response('', {}); - - const x002mod = 'AJ2/0OoIZydb9sgKbiwqDcwA0NtcUMIYi6GK7PqoRszu1uytGnxJjQhGt62kMslWvLgebUSwdq/T3YyGsa3KQeIGaUUn9iqyu3BoNOMdo2DLN4NdGMY1WR/HbYRKR3JHyURhTBKw27KScRRdKGl6jY+VcXcTKJL8PjXMQH5cD6Gz'; // 'ALr6oSdqbbpRxlJmKtwTjjaCA1zlA61Vd7NfPML1NxY/U3Dt8galrieRjBM0SDn4vD2+AJCQY4zzkdE2m8u/p+3KGtmZtGaaxs11TNRm9GhtwQGw2hW73RduTSwLZJrSilv/GH18vPar8uvlBAXTmtVEy2kfvT3+t1mvqrut/LnUg3t63nx3WVdWylEdVDmf9Ylp+W+2quLyE0TzTVl5OXhvB3tpVs2B4OfsmOHJAaKIdSuXDMJebPiM9uIlraiJVeRMjkW3Xxmrazc7+kuy8RZ4BBgi+Xve6lNaQHGqxPV5q5SeXR5fS0D2sPeewJWbjhaVRBObIV2ZEoEWKx79pnE='; - const e002mod = 'AOzWaiT7aGESXcI3dqLY3RRD36inlZTGmNNprKd/t9uHfoMeLwZHeMwtjCRWjsuZEyBupkNSFWb3vBlxDyhcyTgpbbbcHsDGqF2zCJaK85xUphoH9mKHxbnA8ZlXzmtHwDmwVSns0FAslIqD+Xr+WycQpeCBEK12D8Ii032YS814ZUKHJ1MkS65A5PE0lcvMTyIE7ruG1kFz85F4nX8eWq77mDEiBONkA5RSUb5duGnRohdNYBgO8K6Wn18aDdISGDyPyXHNvC70v8tfWbF9VGE3rXVGcgjpezZZxC8d47vL0x6lOeslgl7s8N456ntAa+oGHRurt5mEhDz1DZg+EJc='; - const exponent = 'AQAB'; // 'AQAAAA8='; - - response.orderData = () => ` - - - - - ${x002mod} - ${exponent} - - 2015-02-25T08:01:13.061Z - - X002 - - - - - ${e002mod} - ${exponent} - - 2015-02-25T08:01:12.344Z - - E002 - - SBKPR01 - `; - - const bankKeys = response.bankKeys(); - - assert.equal(bankKeys.bankX002.mod.toString('base64'), x002mod); - assert.equal(bankKeys.bankE002.mod.toString('base64'), e002mod); - }); -}); diff --git a/test/keys.js b/test/unit/keys.js similarity index 94% rename from test/keys.js rename to test/unit/keys.js index b911f3d..8bf3aac 100644 --- a/test/keys.js +++ b/test/unit/keys.js @@ -1,9 +1,11 @@ 'use strict'; +/* eslint-env node, mocha */ + const { assert } = require('chai'); -const fixtures = require('./fixtures/keys'); +const fixtures = require('../fixtures/keys'); // const Key = require('../lib/keymanagers/keyRSA'); -const Key = require('../lib/keymanagers/Key'); +const Key = require('../../lib/keymanagers/Key'); const stripWhitespace = str => str.replace(/\s+/g, ''); diff --git a/test/responseParser.js b/test/unit/responseParser.js similarity index 96% rename from test/responseParser.js rename to test/unit/responseParser.js index d561bdb..6d65034 100644 --- a/test/responseParser.js +++ b/test/unit/responseParser.js @@ -3,7 +3,7 @@ /* eslint-env node, mocha */ const { assert } = require('chai'); -const H004Response = require('../lib/orders/H004/response'); +const H004Response = require('../../lib/orders/H004/response'); describe('H004 response parsing', () => { it('parses bank keys', () => {