@shockpkg/ria-packager
Version:
Package for creating Adobe AIR packages
1 lines • 17 kB
Source Map (JSON)
{"version":3,"sources":["security/timestamper.ts"],"names":["fetch","forge","NAME","VERSION","asn1","pki","userAgent","SecurityTimestamper","Object","constructor","url","timestamp","digested","digest","encodedRequest","_encodeRequest","response","_sendRequest","_decodeResponse","_createRequest","options","cb","statusCode","encoding","res","method","headers","body","status","buffer","then","data","toString","err","message","req","Promise","resolve","reject","error","Error","toLowerCase","hashedMessage","util","decode64","certReq","hashAlgoDef","create","Class","UNIVERSAL","Type","SEQUENCE","OID","oidToDer","oids","sha1","getBytes","NULL","messageImprintDef","OCTETSTRING","reqPolicy","asn1ReqPolicy","nonceDER","asn1Extn","tsaReqDef","INTEGER","String","fromCharCode","BOOLEAN","filter","Boolean","Buffer","from","toDer","toHex","object","fromDer","validator","name","tagClass","type","constructed","value","captureAsn1","optional","UTF8","BITSTRING","capture","errors","success","validate","length","pkiStatus","pkiStatusCode","charCodeAt","tst"],"mappings":"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","sourcesContent":["import fetch from 'node-fetch';\nimport forge from 'node-forge';\n\nimport {NAME, VERSION} from '../meta';\n\nconst {\n\tasn1,\n\tpki\n} = forge;\n\nconst userAgent = `${NAME}/${VERSION}`;\n\nexport type SecurityTimestamperRequestOptions = ({\n\n\t/**\n\t * URL string.\n\t */\n\turl: string;\n\n\t/**\n\t * Request method.\n\t */\n\tmethod?: string;\n\n\t/**\n\t * Request headers.\n\t */\n\theaders?: {[key: string]: string};\n\n\t/**\n\t * Request body.\n\t */\n\tbody?: any;\n\n\t/**\n\t * Body encoding used for callback functions.\n\t */\n\tencoding?: string | null;\n});\n\nexport type SecurityTimestamperRequestResponse = ({\n\n\t/**\n\t * Status code.\n\t */\n\tstatusCode: number;\n});\n\nexport type SecurityTimestamperRequestCallback = (\n\terror: Error | null,\n\tresponse: SecurityTimestamperRequestResponse,\n\tbody: any\n) => void;\n\nexport type SecurityTimestamperRequest = (\n\tobj: SecurityTimestamperRequestOptions,\n\tcb: SecurityTimestamperRequestCallback\n) => any;\n\n/**\n * SecurityTimestamper constructor.\n *\n * @param url The timestamp server URL.\n */\nexport class SecurityTimestamper extends Object {\n\t/**\n\t * The timestamp server URL.\n\t */\n\tpublic url: string;\n\n\tconstructor(url: string) {\n\t\tsuper();\n\n\t\tthis.url = url;\n\t}\n\n\t/**\n\t * Timestamp data digested with specified algorithm.\n\t *\n\t * @param digested The data to timestamp.\n\t * @param digest Digest algorithm.\n\t * @returns Timestamp data.\n\t */\n\tpublic async timestamp(digested: Readonly<Buffer>, digest: string) {\n\t\tconst encodedRequest = this._encodeRequest(digested, digest);\n\t\tconst response = await this._sendRequest(encodedRequest);\n\t\treturn this._decodeResponse(response);\n\t}\n\n\t/**\n\t * Create a request object.\n\t *\n\t * @returns Request object.\n\t */\n\tprotected _createRequest(): SecurityTimestamperRequest {\n\t\treturn (\n\t\t\toptions: SecurityTimestamperRequestOptions,\n\t\t\tcb: SecurityTimestamperRequestCallback\n\t\t) => {\n\t\t\tlet response: SecurityTimestamperRequestResponse = {\n\t\t\t\tstatusCode: 0\n\t\t\t};\n\t\t\tconst {encoding} = options;\n\t\t\t(async () => {\n\t\t\t\tconst res = await fetch(options.url, {\n\t\t\t\t\tmethod: options.method || 'GET',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'User-Agent': userAgent,\n\t\t\t\t\t\t...(options.headers || {})\n\t\t\t\t\t},\n\t\t\t\t\tbody: options.body || null\n\t\t\t\t});\n\t\t\t\tresponse = {\n\t\t\t\t\tstatusCode: res.status\n\t\t\t\t};\n\t\t\t\treturn res.buffer();\n\t\t\t})()\n\t\t\t\t.then(\n\t\t\t\t\tdata => {\n\t\t\t\t\t\tcb(\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\tencoding === null ?\n\t\t\t\t\t\t\t\tdata :\n\t\t\t\t\t\t\t\tdata.toString(encoding as any)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\terr => {\n\t\t\t\t\t\tcb(err, response, null);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t};\n\t}\n\n\t/**\n\t * Send message request and return response or error on failure.\n\t *\n\t * @param message Encoded message.\n\t * @returns Encoded response.\n\t */\n\tprotected async _sendRequest(message: Readonly<Buffer>) {\n\t\tconst {url} = this;\n\t\tconst req = this._createRequest();\n\n\t\tconst [response, body] = await new Promise<[\n\t\t\tSecurityTimestamperRequestResponse,\n\t\t\tBuffer\n\t\t]>((resolve, reject) => {\n\t\t\treq(\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\turl,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/timestamp-query'\n\t\t\t\t\t},\n\t\t\t\t\tbody: message,\n\t\t\t\t\tencoding: null\n\t\t\t\t},\n\t\t\t\t(error, response, body) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve([response, body]);\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\n\t\tconst {statusCode} = response;\n\t\tif (statusCode !== 200) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected status code: ${statusCode}: ${body}`\n\t\t\t);\n\t\t}\n\t\treturn body;\n\t}\n\n\t/**\n\t * Encode request.\n\t *\n\t * @param digested Digested message.\n\t * @param digest Digest algorithm.\n\t * @returns Encoded request.\n\t */\n\tprotected _encodeRequest(digested: Readonly<Buffer>, digest: string) {\n\t\tdigest = digest.toLowerCase();\n\t\tif (digest !== 'sha1') {\n\t\t\tthrow new Error(`Unsupported digest algorithm: ${digest}`);\n\t\t}\n\n\t\tconst hashedMessage = forge.util.decode64(digested.toString('base64'));\n\n\t\tconst certReq = true;\n\n\t\tconst hashAlgoDef = forge.asn1.create(\n\t\t\tasn1.Class.UNIVERSAL,\n\t\t\tasn1.Type.SEQUENCE,\n\t\t\ttrue,\n\t\t\t[\n\t\t\t\tasn1.create(\n\t\t\t\t\tasn1.Class.UNIVERSAL,\n\t\t\t\t\tasn1.Type.OID,\n\t\t\t\t\tfalse,\n\t\t\t\t\tasn1.oidToDer(pki.oids.sha1).getBytes()\n\t\t\t\t),\n\t\t\t\tasn1.create(\n\t\t\t\t\tasn1.Class.UNIVERSAL,\n\t\t\t\t\tasn1.Type.NULL,\n\t\t\t\t\tfalse,\n\t\t\t\t\t''\n\t\t\t\t)\n\t\t\t]\n\t\t);\n\n\t\tconst messageImprintDef = asn1.create(\n\t\t\tasn1.Class.UNIVERSAL,\n\t\t\tasn1.Type.SEQUENCE,\n\t\t\ttrue,\n\t\t\t[\n\t\t\t\thashAlgoDef,\n\t\t\t\tasn1.create(\n\t\t\t\t\tasn1.Class.UNIVERSAL,\n\t\t\t\t\tasn1.Type.OCTETSTRING,\n\t\t\t\t\tfalse,\n\t\t\t\t\thashedMessage\n\t\t\t\t)\n\t\t\t]\n\t\t);\n\n\t\t// Could be set to some bytes.\n\t\t// ie: reqPolicy = new forge.util.DataBuffer(Buffer.from('test'));\n\t\tconst reqPolicy = null;\n\t\tconst asn1ReqPolicy = reqPolicy ?\n\t\t\tasn1.create(\n\t\t\t\tasn1.Class.UNIVERSAL,\n\t\t\t\tasn1.Type.OID,\n\t\t\t\tfalse,\n\t\t\t\treqPolicy\n\t\t\t) :\n\t\t\tnull;\n\n\t\t// Always null.\n\t\tconst nonceDER = null;\n\n\t\t// This could be a DER encodable, if extensions is set to be?\n\t\t// Just null for now.\n\t\t// const extensions = null;\n\t\t// const asn1Extn = extensions ? extensions : null;\n\t\tconst asn1Extn = null;\n\n\t\tconst tsaReqDef = asn1.create(\n\t\t\tasn1.Class.UNIVERSAL,\n\t\t\tasn1.Type.SEQUENCE,\n\t\t\ttrue,\n\t\t\t[\n\t\t\t\tasn1.create(\n\t\t\t\t\tasn1.Class.UNIVERSAL,\n\t\t\t\t\tasn1.Type.INTEGER,\n\t\t\t\t\tfalse,\n\t\t\t\t\tString.fromCharCode(1)\n\t\t\t\t),\n\t\t\t\tmessageImprintDef,\n\t\t\t\tasn1ReqPolicy,\n\t\t\t\tnonceDER,\n\t\t\t\tasn1.create(\n\t\t\t\t\tasn1.Class.UNIVERSAL,\n\t\t\t\t\tasn1.Type.BOOLEAN,\n\t\t\t\t\tfalse,\n\t\t\t\t\tString.fromCharCode(certReq ? 0xFF : 0)\n\t\t\t\t),\n\t\t\t\tasn1Extn\n\t\t\t].filter(Boolean) as forge.asn1.Asn1[]\n\t\t);\n\n\t\treturn Buffer.from(asn1.toDer(tsaReqDef).toHex(), 'hex');\n\t}\n\n\t/**\n\t * Decode response.\n\t *\n\t * @param response Encoded response.\n\t * @returns Decoded response.\n\t */\n\tprotected _decodeResponse(response: Readonly<Buffer>) {\n\t\tconst object = asn1.fromDer(\n\t\t\tforge.util.decode64(response.toString('base64'))\n\t\t);\n\n\t\tconst validator = {\n\t\t\tname: 'root',\n\t\t\ttagClass: asn1.Class.UNIVERSAL,\n\t\t\ttype: asn1.Type.SEQUENCE,\n\t\t\tconstructed: true,\n\t\t\tvalue: [\n\t\t\t\t{\n\t\t\t\t\tname: 'root.statusInfo',\n\t\t\t\t\ttagClass: asn1.Class.UNIVERSAL,\n\t\t\t\t\ttype: asn1.Type.SEQUENCE,\n\t\t\t\t\tconstructed: true,\n\t\t\t\t\tvalue: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'root.statusInfo.pkiStatus',\n\t\t\t\t\t\t\ttagClass: asn1.Class.UNIVERSAL,\n\t\t\t\t\t\t\ttype: asn1.Type.INTEGER,\n\t\t\t\t\t\t\tconstructed: false,\n\t\t\t\t\t\t\tcaptureAsn1: 'root.statusInfo.pkiStatus',\n\t\t\t\t\t\t\toptional: true\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'root.statusInfo.pkiFreeText',\n\t\t\t\t\t\t\ttagClass: asn1.Class.UNIVERSAL,\n\t\t\t\t\t\t\ttype: asn1.Type.UTF8,\n\t\t\t\t\t\t\tconstructed: false,\n\t\t\t\t\t\t\tcaptureAsn1: 'root.statusInfo.pkiFreeText',\n\t\t\t\t\t\t\toptional: true\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'root.statusInfo.pkiFailureInfo',\n\t\t\t\t\t\t\ttagClass: asn1.Class.UNIVERSAL,\n\t\t\t\t\t\t\ttype: asn1.Type.BITSTRING,\n\t\t\t\t\t\t\tconstructed: false,\n\t\t\t\t\t\t\tcaptureAsn1: 'root.statusInfo.pkiFailureInfo',\n\t\t\t\t\t\t\toptional: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'root.tst',\n\t\t\t\t\ttagClass: asn1.Class.UNIVERSAL,\n\t\t\t\t\ttype: asn1.Type.SEQUENCE,\n\t\t\t\t\tconstructed: true,\n\t\t\t\t\tcaptureAsn1: 'root.tst',\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\tconst capture: {[key: string]: any} = {};\n\t\tconst errors: string[] = [];\n\n\t\tconst success = (asn1 as any).validate(\n\t\t\tobject,\n\t\t\tvalidator,\n\t\t\tcapture,\n\t\t\terrors\n\t\t);\n\t\tif (!success || errors.length) {\n\t\t\tconst error = errors[0] || 'Unknown error';\n\t\t\tthrow new Error(`Decode error: ${error}`);\n\t\t}\n\n\t\tconst pkiStatus = capture['root.statusInfo.pkiStatus'];\n\t\tif (!pkiStatus) {\n\t\t\tthrow new Error('Missing PKI status');\n\t\t}\n\n\t\tif (pkiStatus.value.length !== 1) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected PKI status length: ${pkiStatus.value.length}`\n\t\t\t);\n\t\t}\n\n\t\tconst pkiStatusCode = pkiStatus.value.charCodeAt(0);\n\t\tif (pkiStatusCode !== 0 && pkiStatusCode !== 1) {\n\t\t\tthrow new Error(`Unexpected PKI status code: ${pkiStatusCode}`);\n\t\t}\n\n\t\tconst tst = capture['root.tst'];\n\t\tif (!tst) {\n\t\t\tthrow new Error('Missing PKI TSTInfo');\n\t\t}\n\n\t\treturn Buffer.from(asn1.toDer(tst).toHex(), 'hex');\n\t}\n}\n"],"file":"timestamper.mjs","sourceRoot":"../../src"}