UNPKG

sp-pay

Version:
121 lines (118 loc) 3.7 kB
const fs = require('fs'); const xml2js = require('xml2js'); const rs = require("jsrsasign"); const rsu = require("jsrsasign-util"); const crypto = require("crypto"); const util = require('util') const writeFilePromise = util.promisify(fs.writeFile) class Util { constructor() { } // for submit to bank pem2raw(pem) { pem = pem.trim(); let raw_key = pem.split(/\r?\n/) // console.log(raw_key) raw_key.shift(); raw_key.pop(); // console.log(raw_key) raw_key = raw_key.join(''); // console.log(raw_key) return raw_key; } raw2pkcs8pem_pub(raw) { const pkcs8pem = `-----BEGIN PUBLIC KEY-----\n${raw.match(/.{1,64}/g).join('')}\n-----END PUBLIC KEY-----`; return pkcs8pem } raw2pkcs8pem_pri(raw) { const pkcs8pem = `-----BEGIN PRIVATE KEY-----\n${raw.match(/.{1,64}/g).join('')}\n-----END PRIVATE KEY-----`; return pkcs8pem } raw2pkcs1pem_pri(raw) { const pkcs1pem = `-----BEGIN RSA PRIVATE KEY-----\n${raw.match(/.{1,64}/g).join('')}\n-----END RSA PRIVATE KEY-----`; return pkcs1pem } gen_rsa(bits) { const key = rs.KEYUTIL.generateKeypair("RSA", bits || 2048); const pub_pkcs8 = rs.KEYUTIL.getPEM(key.pubKeyObj) // "PKCS1PRV", "PKCS5PRV" or "PKCS8PRV" const pri_pkcs8 = rs.KEYUTIL.getPEM(key.prvKeyObj, "PKCS8PRV") const pri_pkcs1 = rs.KEYUTIL.getPEM(key.prvKeyObj, "PKCS1PRV") return { pub_pkcs8, pri_pkcs8, pri_pkcs1 } } gen_keys(bits) { const key_dir = 'keys'; if (!fs.existsSync(key_dir)) { fs.mkdirSync(key_dir); } const keys = this.gen_rsa(bits); const pri_pem = writeFilePromise(`./${key_dir}/private_key_pkcs8.pem`, keys.pri_pkcs8) const pub_pem = writeFilePromise(`./${key_dir}/public_key_pkcs8.pem`, keys.pub_pkcs8) const pri_raw = writeFilePromise(`./${key_dir}/pri_key_pkcs8_raw.txt`, this.pem2raw(keys.pri_pkcs8)) const pub_raw = writeFilePromise(`./${key_dir}/pub_key_pkcs8_raw.txt`, this.pem2raw(keys.pub_pkcs8)) Promise.all([ pri_pem, pub_pem, pri_raw, pub_raw ]).then( (values)=> { console.log('新生成的密钥对已保存至keys文件夹'); }); } rsa1_sign(prvKeyPEM, data) { const sig = new rs.KJUR.crypto.Signature({ "alg": "SHA1withRSA" }); sig.init(prvKeyPEM); sig.updateString(data); const hSigVal = sig.sign(); return hSigVal; } rsa2_sign(prvKeyPEM, data) { const sig = new rs.KJUR.crypto.Signature({ "alg": "SHA256withRSA" }); sig.init(prvKeyPEM); sig.updateString(data); const hSigVal = sig.sign(); return hSigVal; } hmacsha256(source, key) { return crypto.createHmac("sha256", key).update(source, 'utf8').digest("hex").toUpperCase(); } // sign is in hex format rsa1_verify(pubkey, data, sign) { const sig = new rs.KJUR.crypto.Signature({ "alg": "SHA1withRSA" }); sig.init(pubkey); sig.updateString(data); const is_valid = sig.verify(sign); return is_valid; } rsa2_verify(pubkey, data, sign) { const sig = new rs.KJUR.crypto.Signature({ "alg": "SHA256withRSA" }); sig.init(pubkey); sig.updateString(data); const is_valid = sig.verify(sign); return is_valid; } buildXML(json) { const builder = new xml2js.Builder({ headless: true, rootName: 'xml', cdata: true }); return builder.buildObject(json); } parseXML(xml, fn) { const parser = new xml2js.Parser({ trim: true, explicitArray: false, explicitRoot: false }); parser.parseString(xml, fn || ((err, result) => { })); } generateNonceString(length) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const maxPos = chars.length; let noceStr = ""; for (let i = 0; i < (length || 32); i++) { noceStr += chars.charAt(Math.floor(Math.random() * maxPos)); } return noceStr; } } module.exports = new Util;