quickgame-cli
Version:
quickgame cli
1 lines • 6.58 kB
JavaScript
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault"),_crypto=_interopRequireDefault(require("crypto")),_jsrsasign=_interopRequireDefault(require("jsrsasign")),_base=_interopRequireDefault(require("./base64")),_crc=_interopRequireDefault(require("./crc32")),_utils=require("../utils");function signZip(t,e,n,r){var i,s=Buffer.from(_base.default.unarmor(r)),a=new _jsrsasign.default.X509,r=(a.readCertPEM(r.toString()),_jsrsasign.default.KEYUTIL.getPEM(a.subjectPublicKeyRSA));return!t||t.length<=4?(_utils.colorconsole.error("### App Loader ### Zip文件打开失败"),!1):67324752!==t.readInt32LE(0)?(_utils.colorconsole.error("### App Loader ### Zip文件格式错误"),!1):((i=parserZip(t)).options={files:e},i.tag?(Object.keys(i.sections).forEach(function(e){e=i.sections[e];processChunk(t,e,n)}),signChunk(i,n,r,s),saveChunk(t,i)):null)}function parserZip(e){var t={tag:!1,length:e.length,sections:{header:null,central:null,footer:null}};return t.sections.footer=readEOCD(e),t.sections.footer.tag&&(t.sections.central=readCD(e,t.sections.footer.previous,t.sections.footer.startIndex-t.sections.footer.previous),t.sections.central.tag)&&(t.sections.header=readFH(e,t.sections.central.previous,t.sections.central.startIndex-t.sections.central.previous),t.sections.header.tag)&&(t.tag=!0),t}function readEOCD(e){var t={tag:!1};if(e&&22<=e.length)for(var n=e.length-22;0<=n;){if(101010256===e.readInt32LE(n)){t.tag=!0,t.startIndex=n,t.len=e.length-n,t.previous=e.readInt32LE(n+16);break}--n}return t}function readCD(e,t,n){var r={tag:!1};return e&&e.length>=t&&33639248===e.readInt32LE(t)&&(r.tag=!0,r.startIndex=t,r.len=n,r.previous=e.readInt32LE(t+42)),r}function readFH(e,t,n){var r={tag:!1};return e&&e.length>=t&&67324752===e.readInt32LE(t)&&(r.tag=!0,r.startIndex=t,r.len=n,r.previous=-1),r}function processChunk(e,t){var n=t.startIndex,e=e.slice(n,t.startIndex+t.len),n=Buffer.alloc(5+t.len),e=(n[0]=165,n.writeInt32LE(e.length,1),e.copy(n,5),_crypto.default.createHash("SHA256"));e.update(n),t.sign=e.digest()}function getBufferDigest(e){var t=_crypto.default.createHash("SHA256");return t.update(e),t.digest()}function signChunk(e,t,n,r){var i=e.sections,s=i.header.sign.length+i.central.sign.length+i.footer.sign.length+5,a=Buffer.alloc(s),l=0;function u(e){e.copy(a,l),l+=e.length}a.writeInt8(90,0),a.writeInt32LE(3,1),l+=5,u(i.header.sign),u(i.central.sign),u(i.footer.sign);s=_crypto.default.createHash("SHA256"),s.update(a),i=s.digest(),s=makeSignChunk(e.options,i,t,n,r);e.signchunk=saveSignChunk(s)}function makeSignChunk(e,t,n,r,i){var s=Buffer.alloc(t.length+12),t=(s.writeInt32LE(t.length+8,0),s.writeInt32LE(259,4),s.writeInt32LE(t.length,8),t.copy(s,12),{len:s.length,buffer:s}),s=Buffer.alloc(i.length+4),i=(s.writeInt32LE(i.length,0),i.copy(s,4),{len:s.length,buffer:s}),s={len:12,digests:{size:0,data:[]},certs:{size:0,data:[]},additional:0},t=(s.digests.data.push(t),s.digests.size+=t.len,s.len+=t.len,s.certs.data.push(i),s.certs.size+=i.len,s.len+=i.len,Buffer.from(_base.default.unarmor(r))),i={len:16+t.length,size:12+t.length,signdata:{size:0,buffer:null},signatures:{size:0,data:[]},pubkey:{size:t.length,buffer:t}},r=(i.signdata.buffer=makeSignDataBuffer(s),i.signdata.size=s.len,i.size+=s.len,i.len+=s.len,_crypto.default.createSign("RSA-SHA256")),t=(r.update(i.signdata.buffer),r.sign(n)),s={len:t.length+12,size:t.length+8,id:259,buffer:t},r=(i.signatures.data.push(s),i.signatures.size+=s.len,i.size+=s.len,i.len+=s.len,{len:4,size:0,data:[]}),t=(r.data.push(i),r.size+=i.len,r.len+=i.len,{len:r.len+12,size:r.len+4,id:16777473,value:r}),s={len:32,size:24,data:[]};return s.data.push(t),s.size+=t.len,s.len+=t.len,e.files&&(i=signFiles(e.files,n))&&((r={len:4,size:0,data:[]}).data.push(i),r.size+=i.length,r.len+=i.length,s.data.push(t={len:r.len+12,size:r.len+4,id:16777729,value:r}),s.size+=t.len,s.len+=t.len),s}function makeSignDataBuffer(e){var t=Buffer.alloc(e.len),n=0;return t.writeInt32LE(e.digests.size,n),n+=4,e.digests.data.forEach(function(e){e.buffer.copy(t,n),n+=e.len}),t.writeInt32LE(e.certs.size,n),n+=4,e.certs.data.forEach(function(e){e.buffer.copy(t,n),n+=e.len}),t.writeInt32LE(e.additional,n),t}var SigMagic="RPK Sig Block 42";function saveSignChunk(e){var t=Buffer.alloc(e.len),n=0;return t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(0,n),n+=4,e.data.forEach(function(e){t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(0,n),n+=4,t.writeInt32LE(e.id,n),n+=4,t.writeInt32LE(e.value.size,n),n+=4,16777473===e.id?e.value.data.forEach(function(e){t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(e.signdata.size,n),n+=4,e.signdata.buffer.copy(t,n),n+=e.signdata.buffer.length,t.writeInt32LE(e.signatures.size,n),n+=4,e.signatures.data.forEach(function(e){t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(e.id,n),n+=4,t.writeInt32LE(e.buffer.length,n),n+=4,e.buffer.copy(t,n),n+=e.buffer.length}),t.writeInt32LE(e.pubkey.size,n),n+=4,e.pubkey.buffer.copy(t,n),n+=e.pubkey.buffer.length}):16777729===e.id&&e.value.data.forEach(function(e){e.copy(t,n),n+=e.length})}),t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(0,n),n+=4,Buffer.from(SigMagic).copy(t,n),t}function saveChunk(e,t){var n=Buffer.alloc(e.length+t.signchunk.length),r=0,i=t.sections;return e.copy(n,0,i.header.startIndex,i.header.startIndex+i.header.len),r+=i.header.len,t.signchunk.copy(n,r),r+=t.signchunk.length,e.copy(n,r,i.central.startIndex,i.central.startIndex+i.central.len),r+=i.central.len,e.writeInt32LE(i.central.startIndex+t.signchunk.length,i.footer.startIndex+16),e.copy(n,r,i.footer.startIndex,i.footer.startIndex+i.footer.len),i.footer.len,n}function signFiles(e,t){var i={len:8,size:4,digests:[],sign:null};return e.forEach(function(e){var t=_crc.default.digest(e.name),n=6+e.hash.length,r=Buffer.alloc(n);r.writeInt32LE(t,0),r.writeInt16LE(e.hash.length,4),e.hash.copy(r,6),e.hash.length,i.digests.push(r),i.size+=n,i.len+=n}),signDigestChunk(i,t),saveDigestChunk(i)}function signDigestChunk(e,t){var n=Buffer.alloc(e.size),r=0,i=(n.writeInt32LE(259,r),r+=4,e.digests.forEach(function(e){e.copy(n,r),r+=e.length}),e.digests=n.slice(),_crypto.default.createSign("RSA-SHA256")),i=(i.update(n),i.sign(t));e.sign={len:12+i.length,size:8+i.length,id:259,data:i},e.len+=e.sign.len}function saveDigestChunk(e){var t=Buffer.alloc(e.len),n=0;return t.writeInt32LE(e.size,0),n+=4,e.digests.copy(t,4),n+=e.digests.length,t.writeInt32LE(e.sign.size,n),t.writeInt32LE(e.sign.id,n+=4),t.writeInt32LE(e.sign.data.length,n+=4),e.sign.data.copy(t,n+=4),e.sign.data.length,t}module.exports={signZip:signZip,getBufferDigest:getBufferDigest};