UNPKG

@hap-toolkit/packager

Version:

@hap-toolkit/packager

3 lines (2 loc) 6.96 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.doSign=doSign;var _crypto=_interopRequireDefault(require("crypto")),_jsrsasign=_interopRequireDefault(require("jsrsasign")),_sharedUtils=require("@hap-toolkit/shared-utils"),_base=_interopRequireDefault(require("./base64")),_crc=_interopRequireDefault(require("./crc32")),_signer=require("./signer");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function unZipFiles(e,t){if(!e||e.length<=4)return _sharedUtils.colorconsole.error("### App Loader ### Zip文件打开失败"),!1;if(67324752!==e.readInt32LE(0))return _sharedUtils.colorconsole.error("### App Loader ### Zip文件格式错误"),!1;const n=parserZip(e);return n.options={files:t},!!n.tag&&(Object.keys(n.sections).forEach((t=>{const s=n.sections[t];processChunk(e,s)})),[n,e])}function doSign(e,t,n,s){const i=unZipFiles(e,t);if(!i)return!1;const[r]=i;signChunk(r,n,s);return saveChunk(e,r)}function parserZip(e){const 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){const t={tag:!1};if(e&&e.length>=22){let n,s=e.length-22;for(;s>=0;){if(n=e.readInt32LE(s),101010256===n){t.tag=!0,t.startIndex=s,t.len=e.length-s,t.previous=e.readInt32LE(s+16);break}s-=1}}return t}function readCD(e,t,n){const s={tag:!1};if(e&&e.length>=t){33639248===e.readInt32LE(t)&&(s.tag=!0,s.startIndex=t,s.len=n,s.previous=e.readInt32LE(t+42))}return s}function readFH(e,t,n){const s={tag:!1};if(e&&e.length>=t){67324752===e.readInt32LE(t)&&(s.tag=!0,s.startIndex=t,s.len=n,s.previous=-1)}return s}function processChunk(e,t){const n=t.startIndex,s=t.startIndex+t.len,i=e.slice(n,s),r=Buffer.alloc(5+t.len);r[0]=165,r.writeInt32LE(i.length,1),i.copy(r,5);const a=_crypto.default.createHash("SHA256");a.update(r),t.sign=a.digest()}function signChunk(e,t,n){const s=e.sections,i=s.header.sign.length+s.central.sign.length+s.footer.sign.length+5,r=Buffer.alloc(i);let a=0;function l(e){e.copy(r,a),a+=e.length}r.writeInt8(90,0),r.writeInt32LE(3,1),a+=5,l(s.header.sign),l(s.central.sign),l(s.footer.sign);const o=_crypto.default.createHash("SHA256");o.update(r);const c=o.digest(),u=makeSignChunk(e.options,c,t,n);e.signchunk=saveSignChunk(u)}function makeSignChunk(e,t,n,s){const i=Buffer.from(_base.default.unarmor(s)),r=new _jsrsasign.default.X509;r.readCertPEM(s.toString());const a=_jsrsasign.default.KEYUTIL.getPEM(r.subjectPublicKeyRSA),l=Buffer.alloc(t.length+12);l.writeInt32LE(t.length+8,0),l.writeInt32LE(259,4),l.writeInt32LE(t.length,8),t.copy(l,12);const o={len:l.length,buffer:l},c=Buffer.alloc(i.length+4);c.writeInt32LE(i.length,0),i.copy(c,4);const u={len:c.length,buffer:c},g={len:12,digests:{size:0,data:[]},certs:{size:0,data:[]},additional:0};g.digests.data.push(o),g.digests.size+=o.len,g.len+=o.len,g.certs.data.push(u),g.certs.size+=u.len,g.len+=u.len;const f=Buffer.from(_base.default.unarmor(a)),d={len:16+f.length,size:12+f.length,signdata:{size:0,buffer:null},signatures:{size:0,data:[]},pubkey:{size:f.length,buffer:f}};d.signdata.buffer=makeSignDataBuffer(g),d.signdata.size=g.len,d.size+=g.len,d.len+=g.len;const h=callCryptoSignFunction(d.signdata.buffer,n,s),p={len:h.length+12,size:h.length+8,id:259,buffer:h};d.signatures.data.push(p),d.signatures.size+=p.len,d.size+=p.len,d.len+=p.len;const I={len:4,size:0,data:[]};I.data.push(d),I.size+=d.len,I.len+=d.len;const E={len:I.len+12,size:I.len+4,id:16777473,value:I},L={len:32,size:24,data:[]};if(L.data.push(E),L.size+=E.len,L.len+=E.len,e.files){const t=signFiles(e.files,n,s);if(t){const e={len:4,size:0,data:[]};e.data.push(t),e.size+=t.length,e.len+=t.length;const n={len:e.len+12,size:e.len+4,id:16777729,value:e};L.data.push(n),L.size+=n.len,L.len+=n.len}}return L}function makeSignDataBuffer(e){const t=Buffer.alloc(e.len);let n=0;return t.writeInt32LE(e.digests.size,n),n+=4,e.digests.data.forEach((e=>{e.buffer.copy(t,n),n+=e.len})),t.writeInt32LE(e.certs.size,n),n+=4,e.certs.data.forEach((e=>{e.buffer.copy(t,n),n+=e.len})),t.writeInt32LE(e.additional,n),t}const SigMagic="RPK Sig Block 42";function saveSignChunk(e){const t=Buffer.alloc(e.len);let n=0;t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(0,n),n+=4,e.data.forEach((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((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((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((e=>{e.copy(t,n),n+=e.length}))})),t.writeInt32LE(e.size,n),n+=4,t.writeInt32LE(0,n),n+=4;return Buffer.from(SigMagic).copy(t,n),t}function saveChunk(e,t){const n=Buffer.alloc(e.length+t.signchunk.length);let s=0;const i=t.sections;return e.copy(n,s,i.header.startIndex,i.header.startIndex+i.header.len),s+=i.header.len,t.signchunk.copy(n,s),s+=t.signchunk.length,e.copy(n,s,i.central.startIndex,i.central.startIndex+i.central.len),s+=i.central.len,e.writeInt32LE(i.central.startIndex+t.signchunk.length,i.footer.startIndex+16),e.copy(n,s,i.footer.startIndex,i.footer.startIndex+i.footer.len),s+=i.footer.len,n}function signFiles(e,t,n){const s={len:8,size:4,digests:[],sign:null};return e.forEach((e=>{const t=_crc.default.digest(e.name),n=6+e.hash.length,i=Buffer.alloc(n);let r=0;i.writeInt32LE(t,r),r+=4,i.writeInt16LE(e.hash.length,r),r+=2,e.hash.copy(i,r),r+=e.hash.length,s.digests.push(i),s.size+=n,s.len+=n})),signDigestChunk(s,t,n),saveDigestChunk(s)}function signDigestChunk(e,t,n){const s=Buffer.alloc(e.size);let i=0;s.writeInt32LE(259,i),i+=4,e.digests.forEach((e=>{e.copy(s,i),i+=e.length})),e.digests=s.slice();const r=callCryptoSignFunction(s,t,n);e.sign={len:12+r.length,size:8+r.length,id:259,data:r},e.len+=e.sign.len}function saveDigestChunk(e){const t=Buffer.alloc(e.len);let n=0;return t.writeInt32LE(e.size,n),n+=4,e.digests.copy(t,n),n+=e.digests.length,t.writeInt32LE(e.sign.size,n),n+=4,t.writeInt32LE(e.sign.id,n),n+=4,t.writeInt32LE(e.sign.data.length,n),n+=4,e.sign.data.copy(t,n),n+=e.sign.data.length,t}function callCryptoSignFunction(e,t,n){let s=null;if((0,_signer.getRemoteCryptoSignFunction)()){s=(0,_signer.getRemoteCryptoSignFunction)()(e,n)}else s=(0,_signer.defaultCryptoSignFunction)(e,t);return s} //# sourceMappingURL=index.js.map