UNPKG

23.1 kBSource Map (JSON)View Raw
1{"version":3,"file":"signature.js","names":["_plistDom","require","_timestamper","_sha","_sha2","templates","join","Signature","certificate","privateKey","timestampUrl","timestampUriSignature","timestampUriPackage","_templates","Map","_packageManifest","_manifestDigest","_signedInfo","_signature","_keyInfo","_timestamp","constructor","defaults","reset","addFile","uri","data","Error","digestB64","_base64Encode","_hashSha256","uriEncoded","replace","push","_templated","digest","manifest","TextEncoder","encode","signed","sign","signedInfo","keyPrivate","keyInfo","_buildKeyInfo","signature","timestamp","message","timestamper","_createSecurityTimestamper","_hashSha1","manifestDigest","_createTimestampXml","_getTimestampDataReferenceUris","r","name","values","template","get","str","index","i","length","url","SecurityTimestamper","_createHasherSha1","HasherSha1","_createHasherSha256","HasherSha256","hasher","update","chunk","delimit","chunks","b64","base64Encode","substring","timestampBase64","result","certchain","crlValidationCerts","crls","_buildAndVerifyCertChain","out","encodeCertchain","exports"],"sources":["../src/signature.ts"],"sourcesContent":["import {base64Encode} from '@shockpkg/plist-dom';\n\nimport {SecurityCertificate} from './security/certificate';\nimport {SecurityKeyPrivate} from './security/key/private';\nimport {SecurityTimestamper} from './security/timestamper';\nimport {HasherSha1} from './hasher/sha1';\nimport {HasherSha256} from './hasher/sha256';\n\nconst templates: [string, string][] = [\n\t['certificate', '<X509Certificate>{0}</X509Certificate>'],\n\t['crl', '<X509CRL>{0}</X509CRL>'],\n\t[\n\t\t'fileReference',\n\t\t[\n\t\t\t'<Reference URI=\"{0}\">',\n\t\t\t'<DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"></DigestMethod>',\n\t\t\t'<DigestValue>{1}</DigestValue>',\n\t\t\t'</Reference>'\n\t\t].join('')\n\t],\n\t[\n\t\t'packageManifest',\n\t\t'<Manifest xmlns=\"http://www.w3.org/2000/09/xmldsig#\" Id=\"PackageContents\">{0}</Manifest>'\n\t],\n\t[\n\t\t'PackageSignature',\n\t\t[\n\t\t\t'<signatures>',\n\t\t\t' <Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\" Id=\"PackageSignature\">',\n\t\t\t' <SignedInfo>',\n\t\t\t' <CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>',\n\t\t\t' <SignatureMethod Algorithm=\"http://www.w3.org/TR/xmldsig-core#rsa-sha1\"/>',\n\t\t\t' <Reference URI=\"#PackageContents\">',\n\t\t\t' <Transforms>',\n\t\t\t' <Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>',\n\t\t\t' </Transforms>',\n\t\t\t' <DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>',\n\t\t\t' <DigestValue>{0}</DigestValue>',\n\t\t\t' </Reference>',\n\t\t\t' </SignedInfo>',\n\t\t\t// eslint-disable-next-line max-len\n\t\t\t' <SignatureValue Id=\"PackageSignatureValue\">{1}</SignatureValue>',\n\t\t\t' <KeyInfo>',\n\t\t\t' <X509Data>',\n\t\t\t' {2}',\n\t\t\t' </X509Data>',\n\t\t\t' </KeyInfo>',\n\t\t\t' <Object>',\n\t\t\t' <Manifest Id=\"PackageContents\">',\n\t\t\t' {3}',\n\t\t\t' </Manifest>',\n\t\t\t' </Object>',\n\t\t\t' {4}',\n\t\t\t' </Signature>',\n\t\t\t'</signatures>',\n\t\t\t''\n\t\t].join('\\n')\n\t],\n\t[\n\t\t'SignedInfo',\n\t\t[\n\t\t\t'<SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">',\n\t\t\t'<CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"></CanonicalizationMethod>',\n\t\t\t'<SignatureMethod Algorithm=\"http://www.w3.org/TR/xmldsig-core#rsa-sha1\"></SignatureMethod>',\n\t\t\t'<Reference URI=\"#PackageContents\">',\n\t\t\t'<Transforms>',\n\t\t\t'<Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"></Transform>',\n\t\t\t'</Transforms>',\n\t\t\t'<DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"></DigestMethod>',\n\t\t\t'<DigestValue>{0}</DigestValue>',\n\t\t\t'</Reference>',\n\t\t\t'</SignedInfo>'\n\t\t].join('')\n\t],\n\t[\n\t\t'timestamp',\n\t\t[\n\t\t\t'<Object xmlns:xades=\"http://uri.etsi.org/01903/v1.1.1#\" > ',\n\t\t\t' <xades:QualifyingProperties>',\n\t\t\t' <xades:UnsignedProperties > ',\n\t\t\t' <xades:UnsignedSignatureProperties>',\n\t\t\t' <xades:SignatureTimeStamp>',\n\t\t\t' \\t <xades:HashDataInfo uri=\"{0}\">',\n\t\t\t' \\t <Transforms>',\n\t\t\t' \\t <Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>',\n\t\t\t' </Transforms>',\n\t\t\t' <xades:EncapsulatedTimeStamp>',\n\t\t\t' {1}',\n\t\t\t' </xades:EncapsulatedTimeStamp> \\t',\n\t\t\t' \\t </xades:HashDataInfo> \\t',\n\t\t\t' </xades:SignatureTimeStamp>',\n\t\t\t' </xades:UnsignedSignatureProperties> ',\n\t\t\t' </xades:UnsignedProperties>',\n\t\t\t' </xades:QualifyingProperties>',\n\t\t\t'</Object>'\n\t\t].join('\\n')\n\t],\n\t[\n\t\t'SignatureValue',\n\t\t'<SignatureValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\" Id=\"PackageSignatureValue\">{0}</SignatureValue>'\n\t]\n];\n\n/**\n * Signature object.\n */\nexport class Signature {\n\t/**\n\t * Certificate.\n\t */\n\tpublic certificate: SecurityCertificate | null = null;\n\n\t/**\n\t * Private key.\n\t */\n\tpublic privateKey: SecurityKeyPrivate | null = null;\n\n\t/**\n\t * Timestamp URL.\n\t */\n\tpublic timestampUrl: string | null = null;\n\n\t/**\n\t * Timestamp URI for SignatureValue.\n\t */\n\tpublic timestampUriSignature = false;\n\n\t/**\n\t * Timestamp URI for #PackageSignatureValue.\n\t */\n\tpublic timestampUriPackage = true;\n\n\t/**\n\t * Template strings for signatures.\n\t */\n\tprotected _templates = new Map(templates);\n\n\t/**\n\t * File references.\n\t */\n\tprotected _packageManifest: string[] = [];\n\n\t/**\n\t * Manifest digest.\n\t */\n\tprotected _manifestDigest: Uint8Array | null = null;\n\n\t/**\n\t * Signed data.\n\t */\n\tprotected _signedInfo: string | null = null;\n\n\t/**\n\t * Signature digest.\n\t */\n\tprotected _signature: Uint8Array | null = null;\n\n\t/**\n\t * Key info.\n\t */\n\tprotected _keyInfo: string | null = null;\n\n\t/**\n\t * Timestamp info.\n\t */\n\tprotected _timestamp: Uint8Array | null = null;\n\n\t/**\n\t * Signature constructor.\n\t */\n\tconstructor() {}\n\n\t/**\n\t * Reset options to defaults.\n\t */\n\tpublic defaults() {\n\t\tthis.certificate = null;\n\t\tthis.privateKey = null;\n\t\tthis.timestampUrl = null;\n\t\tthis.timestampUriSignature = false;\n\t\tthis.timestampUriPackage = true;\n\t}\n\n\t/**\n\t * Reset the internal state.\n\t */\n\tpublic reset() {\n\t\tthis._packageManifest = [];\n\t\tthis._manifestDigest = null;\n\t\tthis._signedInfo = null;\n\t\tthis._signature = null;\n\t\tthis._keyInfo = null;\n\t\tthis._timestamp = null;\n\t}\n\n\t/**\n\t * Add file to signature.\n\t *\n\t * @param uri File URI.\n\t * @param data File data.\n\t */\n\tpublic addFile(uri: string, data: Readonly<Uint8Array>) {\n\t\tif (this._signedInfo || this._manifestDigest) {\n\t\t\tthrow new Error('Cannot call after: digest');\n\t\t}\n\n\t\tconst digestB64 = this._base64Encode(this._hashSha256(data));\n\n\t\t// Not perfect, but matches official packager.\n\t\tconst uriEncoded = uri.replace(/&/g, '&amp;');\n\n\t\tthis._packageManifest.push(\n\t\t\tthis._templated('fileReference', [uriEncoded, digestB64])\n\t\t);\n\t}\n\n\t/**\n\t * Digest contents.\n\t */\n\tpublic digest() {\n\t\tif (this._signedInfo || this._manifestDigest) {\n\t\t\tthrow new Error('Already called');\n\t\t}\n\n\t\tconst manifest = this._templated('packageManifest', [\n\t\t\tthis._packageManifest.join('')\n\t\t]);\n\t\tconst digest = this._hashSha256(new TextEncoder().encode(manifest));\n\t\tconst signed = this._templated('SignedInfo', [\n\t\t\tthis._base64Encode(digest)\n\t\t]);\n\n\t\tthis._manifestDigest = digest;\n\t\tthis._signedInfo = signed;\n\t}\n\n\t/**\n\t * Sign signature.\n\t */\n\tpublic sign() {\n\t\tif (this._signature || this._keyInfo !== null) {\n\t\t\tthrow new Error('Already called');\n\t\t}\n\n\t\tconst signedInfo = this._signedInfo;\n\t\tif (!signedInfo) {\n\t\t\tthrow new Error('Must call after: digest');\n\t\t}\n\n\t\tconst {privateKey: keyPrivate} = this;\n\t\tif (!keyPrivate) {\n\t\t\tthrow new Error('Private key not set');\n\t\t}\n\n\t\tconst keyInfo = this._buildKeyInfo();\n\t\tconst signature = keyPrivate.sign(\n\t\t\tnew TextEncoder().encode(signedInfo),\n\t\t\t'sha1'\n\t\t);\n\n\t\tthis._signature = signature;\n\t\tthis._keyInfo = keyInfo;\n\t}\n\n\t/**\n\t * Add timestamp to signature.\n\t */\n\tpublic async timestamp() {\n\t\tif (this._timestamp) {\n\t\t\tthrow new Error('Already called');\n\t\t}\n\n\t\tconst signature = this._signature;\n\t\tif (!signature) {\n\t\t\tthrow new Error('Must call after: sign');\n\t\t}\n\n\t\tconst {timestampUrl} = this;\n\t\tif (!timestampUrl) {\n\t\t\tthrow new Error('Timestamp URL not set');\n\t\t}\n\n\t\tconst message = this._templated('SignatureValue', [\n\t\t\tthis._base64Encode(signature)\n\t\t]);\n\n\t\tconst timestamper = this._createSecurityTimestamper(timestampUrl);\n\t\tconst timestamp = await timestamper.timestamp(\n\t\t\tthis._hashSha1(new TextEncoder().encode(message)),\n\t\t\t'sha1'\n\t\t);\n\n\t\tthis._timestamp = timestamp;\n\t}\n\n\t/**\n\t * Encode signature.\n\t *\n\t * @returns Encoded signature.\n\t */\n\tpublic encode() {\n\t\tconst signature = this._signature;\n\t\tif (!signature) {\n\t\t\tthrow new Error('Must call after: sign');\n\t\t}\n\n\t\tconst manifestDigest = this._manifestDigest;\n\t\tconst keyInfo = this._keyInfo;\n\t\tif (!manifestDigest || keyInfo === null) {\n\t\t\tthrow new Error('Internal error');\n\t\t}\n\n\t\tconst timestamp = this._timestamp ? this._createTimestampXml() : '';\n\n\t\treturn new TextEncoder().encode(\n\t\t\tthis._templated('PackageSignature', [\n\t\t\t\tthis._base64Encode(manifestDigest),\n\t\t\t\tthis._base64Encode(signature),\n\t\t\t\tkeyInfo,\n\t\t\t\tthis._packageManifest.join(''),\n\t\t\t\ttimestamp\n\t\t\t])\n\t\t);\n\t}\n\n\t/**\n\t * Get list of timestamp data references for URI attribute.\n\t *\n\t * @returns List of references.\n\t */\n\tprotected _getTimestampDataReferenceUris() {\n\t\tconst r: string[] = [];\n\t\tif (this.timestampUriSignature) {\n\t\t\tr.push('SignatureValue');\n\t\t}\n\t\tif (this.timestampUriPackage) {\n\t\t\tr.push('#PackageSignatureValue');\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Create string from a template string.\n\t *\n\t * @param name Template name.\n\t * @param values Indexed values.\n\t * @returns Complete string.\n\t */\n\tprotected _templated(name: string, values: Readonly<string[]>) {\n\t\tconst template = this._templates.get(name);\n\t\tif (!template) {\n\t\t\tthrow new Error(`Unknown template name: ${name}`);\n\t\t}\n\t\treturn template.replace(/\\{(\\d+)\\}/g, (str, index) => {\n\t\t\tconst i = +index;\n\t\t\tif (i >= values.length) {\n\t\t\t\tthrow new Error(`Index out of range: ${i} > ${values.length}`);\n\t\t\t}\n\t\t\treturn values[i];\n\t\t});\n\t}\n\n\t/**\n\t * Create timestamper.\n\t *\n\t * @param url Server URL.\n\t * @returns Timestamper instance.\n\t */\n\tprotected _createSecurityTimestamper(url: string) {\n\t\treturn new SecurityTimestamper(url);\n\t}\n\n\t/**\n\t * Create SHA1 hasher instance.\n\t *\n\t * @returns Hasher instance.\n\t */\n\tprotected _createHasherSha1() {\n\t\treturn new HasherSha1();\n\t}\n\n\t/**\n\t * Create SHA256 hasher instance.\n\t *\n\t * @returns Hasher instance.\n\t */\n\tprotected _createHasherSha256() {\n\t\treturn new HasherSha256();\n\t}\n\n\t/**\n\t * Hash data using SHA1.\n\t *\n\t * @param data Data to be hashed.\n\t * @returns Hash digest.\n\t */\n\tprotected _hashSha1(data: Readonly<Uint8Array>) {\n\t\tconst hasher = this._createHasherSha1();\n\t\thasher.update(data);\n\t\treturn hasher.digest();\n\t}\n\n\t/**\n\t * Hash data using SHA256.\n\t *\n\t * @param data Data to be hashed.\n\t * @returns Hash digest.\n\t */\n\tprotected _hashSha256(data: Readonly<Uint8Array>) {\n\t\tconst hasher = this._createHasherSha256();\n\t\thasher.update(data);\n\t\treturn hasher.digest();\n\t}\n\n\t/**\n\t * Base64 encode with some defaults to match official pacakger.\n\t *\n\t * @param data Data to be encoded.\n\t * @param chunk Chunk size.\n\t * @param delimit Chunk delimiter.\n\t * @returns Encoded data.\n\t */\n\tprotected _base64Encode(\n\t\tdata: Readonly<Uint8Array>,\n\t\tchunk = 76,\n\t\tdelimit = '\\n'\n\t) {\n\t\tconst chunks = [];\n\t\tfor (let b64 = base64Encode(data); b64; b64 = b64.substring(chunk)) {\n\t\t\tchunks.push(b64.substring(0, chunk));\n\t\t}\n\t\treturn chunks.join(delimit);\n\t}\n\n\t/**\n\t * Create the timestamp XML.\n\t *\n\t * @returns Timestamp XML.\n\t */\n\tprotected _createTimestampXml() {\n\t\tconst timestamp = this._timestamp;\n\t\tif (!timestamp) {\n\t\t\tthrow new Error('Internal error');\n\t\t}\n\n\t\tconst timestampBase64 = this._base64Encode(timestamp);\n\t\tconst result: string[] = [];\n\t\tfor (const uri of this._getTimestampDataReferenceUris()) {\n\t\t\tresult.push(this._templated('timestamp', [uri, timestampBase64]));\n\t\t}\n\t\treturn result.join('\\n');\n\t}\n\n\t/**\n\t * Build the key info.\n\t *\n\t * @returns Key info.\n\t */\n\tprotected _buildKeyInfo() {\n\t\tconst {certchain, crlValidationCerts, crls} =\n\t\t\tthis._buildAndVerifyCertChain();\n\n\t\tconst out = [];\n\n\t\tfor (const data of certchain) {\n\t\t\tout.push(\n\t\t\t\tthis._templated('certificate', [this._base64Encode(data)])\n\t\t\t);\n\t\t}\n\n\t\tif (crls.length) {\n\t\t\tfor (const data of crlValidationCerts) {\n\t\t\t\tout.push(\n\t\t\t\t\tthis._templated('certificate', [this._base64Encode(data)])\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfor (const data of crls) {\n\t\t\tout.push(this._templated('crl', [this._base64Encode(data)]));\n\t\t}\n\n\t\treturn out.join('');\n\t}\n\n\t/**\n\t * Build the certchain data.\n\t *\n\t * @returns Certchain data.\n\t */\n\tprotected _buildAndVerifyCertChain() {\n\t\tconst {certificate} = this;\n\t\tif (!certificate) {\n\t\t\tthrow new Error('Certificate not set');\n\t\t}\n\n\t\t// Not exactly complete, but enough for self-signed anyway.\n\t\tconst certchain: Uint8Array[] = [];\n\t\tconst crlValidationCerts: Uint8Array[] = [];\n\t\tconst crls: Uint8Array[] = [];\n\n\t\t// Add the certificate data.\n\t\tcertchain.push(certificate.encodeCertchain());\n\n\t\treturn {\n\t\t\tcertchain,\n\t\t\tcrlValidationCerts,\n\t\t\tcrls\n\t\t};\n\t}\n}\n"],"mappings":"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"}
\No newline at end of file