1 line
54 KiB
JSON
1 line
54 KiB
JSON
{"ast":null,"code":"// Copyright 2018 Joyent, Inc.\nmodule.exports = {\n read: read,\n readPkcs8: readPkcs8,\n write: write,\n writePkcs8: writePkcs8,\n pkcs8ToBuffer: pkcs8ToBuffer,\n readECDSACurve: readECDSACurve,\n writeECDSACurve: writeECDSACurve\n};\n\nvar assert = require('assert-plus');\n\nvar asn1 = require('asn1');\n\nvar Buffer = require('safer-buffer').Buffer;\n\nvar algs = require('../algs');\n\nvar utils = require('../utils');\n\nvar Key = require('../key');\n\nvar PrivateKey = require('../private-key');\n\nvar pem = require('./pem');\n\nfunction read(buf, options) {\n return pem.read(buf, options, 'pkcs8');\n}\n\nfunction write(key, options) {\n return pem.write(key, options, 'pkcs8');\n}\n/* Helper to read in a single mpint */\n\n\nfunction readMPInt(der, nm) {\n assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + ' is not an Integer');\n return utils.mpNormalize(der.readString(asn1.Ber.Integer, true));\n}\n\nfunction readPkcs8(alg, type, der) {\n /* Private keys in pkcs#8 format have a weird extra int */\n if (der.peek() === asn1.Ber.Integer) {\n assert.strictEqual(type, 'private', 'unexpected Integer at start of public key');\n der.readString(asn1.Ber.Integer, true);\n }\n\n der.readSequence();\n var next = der.offset + der.length;\n var oid = der.readOID();\n\n switch (oid) {\n case '1.2.840.113549.1.1.1':\n der._offset = next;\n if (type === 'public') return readPkcs8RSAPublic(der);else return readPkcs8RSAPrivate(der);\n\n case '1.2.840.10040.4.1':\n if (type === 'public') return readPkcs8DSAPublic(der);else return readPkcs8DSAPrivate(der);\n\n case '1.2.840.10045.2.1':\n if (type === 'public') return readPkcs8ECDSAPublic(der);else return readPkcs8ECDSAPrivate(der);\n\n case '1.3.101.112':\n if (type === 'public') {\n return readPkcs8EdDSAPublic(der);\n } else {\n return readPkcs8EdDSAPrivate(der);\n }\n\n case '1.3.101.110':\n if (type === 'public') {\n return readPkcs8X25519Public(der);\n } else {\n return readPkcs8X25519Private(der);\n }\n\n default:\n throw new Error('Unknown key type OID ' + oid);\n }\n}\n\nfunction readPkcs8RSAPublic(der) {\n // bit string sequence\n der.readSequence(asn1.Ber.BitString);\n der.readByte();\n der.readSequence(); // modulus\n\n var n = readMPInt(der, 'modulus');\n var e = readMPInt(der, 'exponent'); // now, make the key\n\n var key = {\n type: 'rsa',\n source: der.originalInput,\n parts: [{\n name: 'e',\n data: e\n }, {\n name: 'n',\n data: n\n }]\n };\n return new Key(key);\n}\n\nfunction readPkcs8RSAPrivate(der) {\n der.readSequence(asn1.Ber.OctetString);\n der.readSequence();\n var ver = readMPInt(der, 'version');\n assert.equal(ver[0], 0x0, 'unknown RSA private key version'); // modulus then public exponent\n\n var n = readMPInt(der, 'modulus');\n var e = readMPInt(der, 'public exponent');\n var d = readMPInt(der, 'private exponent');\n var p = readMPInt(der, 'prime1');\n var q = readMPInt(der, 'prime2');\n var dmodp = readMPInt(der, 'exponent1');\n var dmodq = readMPInt(der, 'exponent2');\n var iqmp = readMPInt(der, 'iqmp'); // now, make the key\n\n var key = {\n type: 'rsa',\n parts: [{\n name: 'n',\n data: n\n }, {\n name: 'e',\n data: e\n }, {\n name: 'd',\n data: d\n }, {\n name: 'iqmp',\n data: iqmp\n }, {\n name: 'p',\n data: p\n }, {\n name: 'q',\n data: q\n }, {\n name: 'dmodp',\n data: dmodp\n }, {\n name: 'dmodq',\n data: dmodq\n }]\n };\n return new PrivateKey(key);\n}\n\nfunction readPkcs8DSAPublic(der) {\n der.readSequence();\n var p = readMPInt(der, 'p');\n var q = readMPInt(der, 'q');\n var g = readMPInt(der, 'g'); // bit string sequence\n\n der.readSequence(asn1.Ber.BitString);\n der.readByte();\n var y = readMPInt(der, 'y'); // now, make the key\n\n var key = {\n type: 'dsa',\n parts: [{\n name: 'p',\n data: p\n }, {\n name: 'q',\n data: q\n }, {\n name: 'g',\n data: g\n }, {\n name: 'y',\n data: y\n }]\n };\n return new Key(key);\n}\n\nfunction readPkcs8DSAPrivate(der) {\n der.readSequence();\n var p = readMPInt(der, 'p');\n var q = readMPInt(der, 'q');\n var g = readMPInt(der, 'g');\n der.readSequence(asn1.Ber.OctetString);\n var x = readMPInt(der, 'x');\n /* The pkcs#8 format does not include the public key */\n\n var y = utils.calculateDSAPublic(g, p, x);\n var key = {\n type: 'dsa',\n parts: [{\n name: 'p',\n data: p\n }, {\n name: 'q',\n data: q\n }, {\n name: 'g',\n data: g\n }, {\n name: 'y',\n data: y\n }, {\n name: 'x',\n data: x\n }]\n };\n return new PrivateKey(key);\n}\n\nfunction readECDSACurve(der) {\n var curveName, curveNames;\n var j, c, cd;\n\n if (der.peek() === asn1.Ber.OID) {\n var oid = der.readOID();\n curveNames = Object.keys(algs.curves);\n\n for (j = 0; j < curveNames.length; ++j) {\n c = curveNames[j];\n cd = algs.curves[c];\n\n if (cd.pkcs8oid === oid) {\n curveName = c;\n break;\n }\n }\n } else {\n // ECParameters sequence\n der.readSequence();\n var version = der.readString(asn1.Ber.Integer, true);\n assert.strictEqual(version[0], 1, 'ECDSA key not version 1');\n var curve = {}; // FieldID sequence\n\n der.readSequence();\n var fieldTypeOid = der.readOID();\n assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1', 'ECDSA key is not from a prime-field');\n var p = curve.p = utils.mpNormalize(der.readString(asn1.Ber.Integer, true));\n /*\n * p always starts with a 1 bit, so count the zeros to get its\n * real size.\n */\n\n curve.size = p.length * 8 - utils.countZeros(p); // Curve sequence\n\n der.readSequence();\n curve.a = utils.mpNormalize(der.readString(asn1.Ber.OctetString, true));\n curve.b = utils.mpNormalize(der.readString(asn1.Ber.OctetString, true));\n if (der.peek() === asn1.Ber.BitString) curve.s = der.readString(asn1.Ber.BitString, true); // Combined Gx and Gy\n\n curve.G = der.readString(asn1.Ber.OctetString, true);\n assert.strictEqual(curve.G[0], 0x4, 'uncompressed G is required');\n curve.n = utils.mpNormalize(der.readString(asn1.Ber.Integer, true));\n curve.h = utils.mpNormalize(der.readString(asn1.Ber.Integer, true));\n assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' + 'required');\n curveNames = Object.keys(algs.curves);\n var ks = Object.keys(curve);\n\n for (j = 0; j < curveNames.length; ++j) {\n c = curveNames[j];\n cd = algs.curves[c];\n var equal = true;\n\n for (var i = 0; i < ks.length; ++i) {\n var k = ks[i];\n if (cd[k] === undefined) continue;\n\n if (typeof cd[k] === 'object' && cd[k].equals !== undefined) {\n if (!cd[k].equals(curve[k])) {\n equal = false;\n break;\n }\n } else if (Buffer.isBuffer(cd[k])) {\n if (cd[k].toString('binary') !== curve[k].toString('binary')) {\n equal = false;\n break;\n }\n } else {\n if (cd[k] !== curve[k]) {\n equal = false;\n break;\n }\n }\n }\n\n if (equal) {\n curveName = c;\n break;\n }\n }\n }\n\n return curveName;\n}\n\nfunction readPkcs8ECDSAPrivate(der) {\n var curveName = readECDSACurve(der);\n assert.string(curveName, 'a known elliptic curve');\n der.readSequence(asn1.Ber.OctetString);\n der.readSequence();\n var version = readMPInt(der, 'version');\n assert.equal(version[0], 1, 'unknown version of ECDSA key');\n var d = der.readString(asn1.Ber.OctetString, true);\n var Q;\n\n if (der.peek() == 0xa0) {\n der.readSequence(0xa0);\n der._offset += der.length;\n }\n\n if (der.peek() == 0xa1) {\n der.readSequence(0xa1);\n Q = der.readString(asn1.Ber.BitString, true);\n Q = utils.ecNormalize(Q);\n }\n\n if (Q === undefined) {\n var pub = utils.publicFromPrivateECDSA(curveName, d);\n Q = pub.part.Q.data;\n }\n\n var key = {\n type: 'ecdsa',\n parts: [{\n name: 'curve',\n data: Buffer.from(curveName)\n }, {\n name: 'Q',\n data: Q\n }, {\n name: 'd',\n data: d\n }]\n };\n return new PrivateKey(key);\n}\n\nfunction readPkcs8ECDSAPublic(der) {\n var curveName = readECDSACurve(der);\n assert.string(curveName, 'a known elliptic curve');\n var Q = der.readString(asn1.Ber.BitString, true);\n Q = utils.ecNormalize(Q);\n var key = {\n type: 'ecdsa',\n parts: [{\n name: 'curve',\n data: Buffer.from(curveName)\n }, {\n name: 'Q',\n data: Q\n }]\n };\n return new Key(key);\n}\n\nfunction readPkcs8EdDSAPublic(der) {\n if (der.peek() === 0x00) der.readByte();\n var A = utils.readBitString(der);\n var key = {\n type: 'ed25519',\n parts: [{\n name: 'A',\n data: utils.zeroPadToLength(A, 32)\n }]\n };\n return new Key(key);\n}\n\nfunction readPkcs8X25519Public(der) {\n var A = utils.readBitString(der);\n var key = {\n type: 'curve25519',\n parts: [{\n name: 'A',\n data: utils.zeroPadToLength(A, 32)\n }]\n };\n return new Key(key);\n}\n\nfunction readPkcs8EdDSAPrivate(der) {\n if (der.peek() === 0x00) der.readByte();\n der.readSequence(asn1.Ber.OctetString);\n var k = der.readString(asn1.Ber.OctetString, true);\n k = utils.zeroPadToLength(k, 32);\n var A;\n\n if (der.peek() === asn1.Ber.BitString) {\n A = utils.readBitString(der);\n A = utils.zeroPadToLength(A, 32);\n } else {\n A = utils.calculateED25519Public(k);\n }\n\n var key = {\n type: 'ed25519',\n parts: [{\n name: 'A',\n data: utils.zeroPadToLength(A, 32)\n }, {\n name: 'k',\n data: utils.zeroPadToLength(k, 32)\n }]\n };\n return new PrivateKey(key);\n}\n\nfunction readPkcs8X25519Private(der) {\n if (der.peek() === 0x00) der.readByte();\n der.readSequence(asn1.Ber.OctetString);\n var k = der.readString(asn1.Ber.OctetString, true);\n k = utils.zeroPadToLength(k, 32);\n var A = utils.calculateX25519Public(k);\n var key = {\n type: 'curve25519',\n parts: [{\n name: 'A',\n data: utils.zeroPadToLength(A, 32)\n }, {\n name: 'k',\n data: utils.zeroPadToLength(k, 32)\n }]\n };\n return new PrivateKey(key);\n}\n\nfunction pkcs8ToBuffer(key) {\n var der = new asn1.BerWriter();\n writePkcs8(der, key);\n return der.buffer;\n}\n\nfunction writePkcs8(der, key) {\n der.startSequence();\n\n if (PrivateKey.isPrivateKey(key)) {\n var sillyInt = Buffer.from([0]);\n der.writeBuffer(sillyInt, asn1.Ber.Integer);\n }\n\n der.startSequence();\n\n switch (key.type) {\n case 'rsa':\n der.writeOID('1.2.840.113549.1.1.1');\n if (PrivateKey.isPrivateKey(key)) writePkcs8RSAPrivate(key, der);else writePkcs8RSAPublic(key, der);\n break;\n\n case 'dsa':\n der.writeOID('1.2.840.10040.4.1');\n if (PrivateKey.isPrivateKey(key)) writePkcs8DSAPrivate(key, der);else writePkcs8DSAPublic(key, der);\n break;\n\n case 'ecdsa':\n der.writeOID('1.2.840.10045.2.1');\n if (PrivateKey.isPrivateKey(key)) writePkcs8ECDSAPrivate(key, der);else writePkcs8ECDSAPublic(key, der);\n break;\n\n case 'ed25519':\n der.writeOID('1.3.101.112');\n if (PrivateKey.isPrivateKey(key)) throw new Error('Ed25519 private keys in pkcs8 ' + 'format are not supported');\n writePkcs8EdDSAPublic(key, der);\n break;\n\n default:\n throw new Error('Unsupported key type: ' + key.type);\n }\n\n der.endSequence();\n}\n\nfunction writePkcs8RSAPrivate(key, der) {\n der.writeNull();\n der.endSequence();\n der.startSequence(asn1.Ber.OctetString);\n der.startSequence();\n var version = Buffer.from([0]);\n der.writeBuffer(version, asn1.Ber.Integer);\n der.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.d.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n if (!key.part.dmodp || !key.part.dmodq) utils.addRSAMissing(key);\n der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);\n der.endSequence();\n der.endSequence();\n}\n\nfunction writePkcs8RSAPublic(key, der) {\n der.writeNull();\n der.endSequence();\n der.startSequence(asn1.Ber.BitString);\n der.writeByte(0x00);\n der.startSequence();\n der.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n der.endSequence();\n der.endSequence();\n}\n\nfunction writePkcs8DSAPrivate(key, der) {\n der.startSequence();\n der.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n der.endSequence();\n der.endSequence();\n der.startSequence(asn1.Ber.OctetString);\n der.writeBuffer(key.part.x.data, asn1.Ber.Integer);\n der.endSequence();\n}\n\nfunction writePkcs8DSAPublic(key, der) {\n der.startSequence();\n der.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n der.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n der.endSequence();\n der.endSequence();\n der.startSequence(asn1.Ber.BitString);\n der.writeByte(0x00);\n der.writeBuffer(key.part.y.data, asn1.Ber.Integer);\n der.endSequence();\n}\n\nfunction writeECDSACurve(key, der) {\n var curve = algs.curves[key.curve];\n\n if (curve.pkcs8oid) {\n /* This one has a name in pkcs#8, so just write the oid */\n der.writeOID(curve.pkcs8oid);\n } else {\n // ECParameters sequence\n der.startSequence();\n var version = Buffer.from([1]);\n der.writeBuffer(version, asn1.Ber.Integer); // FieldID sequence\n\n der.startSequence();\n der.writeOID('1.2.840.10045.1.1'); // prime-field\n\n der.writeBuffer(curve.p, asn1.Ber.Integer);\n der.endSequence(); // Curve sequence\n\n der.startSequence();\n var a = curve.p;\n if (a[0] === 0x0) a = a.slice(1);\n der.writeBuffer(a, asn1.Ber.OctetString);\n der.writeBuffer(curve.b, asn1.Ber.OctetString);\n der.writeBuffer(curve.s, asn1.Ber.BitString);\n der.endSequence();\n der.writeBuffer(curve.G, asn1.Ber.OctetString);\n der.writeBuffer(curve.n, asn1.Ber.Integer);\n var h = curve.h;\n\n if (!h) {\n h = Buffer.from([1]);\n }\n\n der.writeBuffer(h, asn1.Ber.Integer); // ECParameters\n\n der.endSequence();\n }\n}\n\nfunction writePkcs8ECDSAPublic(key, der) {\n writeECDSACurve(key, der);\n der.endSequence();\n var Q = utils.ecNormalize(key.part.Q.data, true);\n der.writeBuffer(Q, asn1.Ber.BitString);\n}\n\nfunction writePkcs8ECDSAPrivate(key, der) {\n writeECDSACurve(key, der);\n der.endSequence();\n der.startSequence(asn1.Ber.OctetString);\n der.startSequence();\n var version = Buffer.from([1]);\n der.writeBuffer(version, asn1.Ber.Integer);\n der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);\n der.startSequence(0xa1);\n var Q = utils.ecNormalize(key.part.Q.data, true);\n der.writeBuffer(Q, asn1.Ber.BitString);\n der.endSequence();\n der.endSequence();\n der.endSequence();\n}\n\nfunction writePkcs8EdDSAPublic(key, der) {\n der.endSequence();\n utils.writeBitString(der, key.part.A.data);\n}\n\nfunction writePkcs8EdDSAPrivate(key, der) {\n der.endSequence();\n var k = utils.mpNormalize(key.part.k.data, true);\n der.startSequence(asn1.Ber.OctetString);\n der.writeBuffer(k, asn1.Ber.OctetString);\n der.endSequence();\n}","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/sshpk/lib/formats/pkcs8.js"],"names":["module","exports","read","readPkcs8","write","writePkcs8","pkcs8ToBuffer","readECDSACurve","writeECDSACurve","assert","require","asn1","Buffer","algs","utils","Key","PrivateKey","pem","buf","options","key","readMPInt","der","nm","strictEqual","peek","Ber","Integer","mpNormalize","readString","alg","type","readSequence","next","offset","length","oid","readOID","_offset","readPkcs8RSAPublic","readPkcs8RSAPrivate","readPkcs8DSAPublic","readPkcs8DSAPrivate","readPkcs8ECDSAPublic","readPkcs8ECDSAPrivate","readPkcs8EdDSAPublic","readPkcs8EdDSAPrivate","readPkcs8X25519Public","readPkcs8X25519Private","Error","BitString","readByte","n","e","source","originalInput","parts","name","data","OctetString","ver","equal","d","p","q","dmodp","dmodq","iqmp","g","y","x","calculateDSAPublic","curveName","curveNames","j","c","cd","OID","Object","keys","curves","pkcs8oid","version","curve","fieldTypeOid","size","countZeros","a","b","s","G","h","ks","i","k","undefined","equals","isBuffer","toString","string","Q","ecNormalize","pub","publicFromPrivateECDSA","part","from","A","readBitString","zeroPadToLength","calculateED25519Public","calculateX25519Public","BerWriter","buffer","startSequence","isPrivateKey","sillyInt","writeBuffer","writeOID","writePkcs8RSAPrivate","writePkcs8RSAPublic","writePkcs8DSAPrivate","writePkcs8DSAPublic","writePkcs8ECDSAPrivate","writePkcs8ECDSAPublic","writePkcs8EdDSAPublic","endSequence","writeNull","addRSAMissing","writeByte","slice","writeBitString","writePkcs8EdDSAPrivate"],"mappings":"AAAA;AAEAA,MAAM,CAACC,OAAP,GAAiB;AAChBC,EAAAA,IAAI,EAAEA,IADU;AAEhBC,EAAAA,SAAS,EAAEA,SAFK;AAGhBC,EAAAA,KAAK,EAAEA,KAHS;AAIhBC,EAAAA,UAAU,EAAEA,UAJI;AAKhBC,EAAAA,aAAa,EAAEA,aALC;AAOhBC,EAAAA,cAAc,EAAEA,cAPA;AAQhBC,EAAAA,eAAe,EAAEA;AARD,CAAjB;;AAWA,IAAIC,MAAM,GAAGC,OAAO,CAAC,aAAD,CAApB;;AACA,IAAIC,IAAI,GAAGD,OAAO,CAAC,MAAD,CAAlB;;AACA,IAAIE,MAAM,GAAGF,OAAO,CAAC,cAAD,CAAP,CAAwBE,MAArC;;AACA,IAAIC,IAAI,GAAGH,OAAO,CAAC,SAAD,CAAlB;;AACA,IAAII,KAAK,GAAGJ,OAAO,CAAC,UAAD,CAAnB;;AACA,IAAIK,GAAG,GAAGL,OAAO,CAAC,QAAD,CAAjB;;AACA,IAAIM,UAAU,GAAGN,OAAO,CAAC,gBAAD,CAAxB;;AACA,IAAIO,GAAG,GAAGP,OAAO,CAAC,OAAD,CAAjB;;AAEA,SAASR,IAAT,CAAcgB,GAAd,EAAmBC,OAAnB,EAA4B;AAC3B,SAAQF,GAAG,CAACf,IAAJ,CAASgB,GAAT,EAAcC,OAAd,EAAuB,OAAvB,CAAR;AACA;;AAED,SAASf,KAAT,CAAegB,GAAf,EAAoBD,OAApB,EAA6B;AAC5B,SAAQF,GAAG,CAACb,KAAJ,CAAUgB,GAAV,EAAeD,OAAf,EAAwB,OAAxB,CAAR;AACA;AAED;;;AACA,SAASE,SAAT,CAAmBC,GAAnB,EAAwBC,EAAxB,EAA4B;AAC3Bd,EAAAA,MAAM,CAACe,WAAP,CAAmBF,GAAG,CAACG,IAAJ,EAAnB,EAA+Bd,IAAI,CAACe,GAAL,CAASC,OAAxC,EACIJ,EAAE,GAAG,oBADT;AAEA,SAAQT,KAAK,CAACc,WAAN,CAAkBN,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASC,OAAxB,EAAiC,IAAjC,CAAlB,CAAR;AACA;;AAED,SAASxB,SAAT,CAAmB2B,GAAnB,EAAwBC,IAAxB,EAA8BT,GAA9B,EAAmC;AAClC;AACA,MAAIA,GAAG,CAACG,IAAJ,OAAed,IAAI,CAACe,GAAL,CAASC,OAA5B,EAAqC;AACpClB,IAAAA,MAAM,CAACe,WAAP,CAAmBO,IAAnB,EAAyB,SAAzB,EACI,2CADJ;AAEAT,IAAAA,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASC,OAAxB,EAAiC,IAAjC;AACA;;AAEDL,EAAAA,GAAG,CAACU,YAAJ;AACA,MAAIC,IAAI,GAAGX,GAAG,CAACY,MAAJ,GAAaZ,GAAG,CAACa,MAA5B;AAEA,MAAIC,GAAG,GAAGd,GAAG,CAACe,OAAJ,EAAV;;AACA,UAAQD,GAAR;AACA,SAAK,sBAAL;AACCd,MAAAA,GAAG,CAACgB,OAAJ,GAAcL,IAAd;AACA,UAAIF,IAAI,KAAK,QAAb,EACC,OAAQQ,kBAAkB,CAACjB,GAAD,CAA1B,CADD,KAGC,OAAQkB,mBAAmB,CAAClB,GAAD,CAA3B;;AACF,SAAK,mBAAL;AACC,UAAIS,IAAI,KAAK,QAAb,EACC,OAAQU,kBAAkB,CAACnB,GAAD,CAA1B,CADD,KAGC,OAAQoB,mBAAmB,CAACpB,GAAD,CAA3B;;AACF,SAAK,mBAAL;AACC,UAAIS,IAAI,KAAK,QAAb,EACC,OAAQY,oBAAoB,CAACrB,GAAD,CAA5B,CADD,KAGC,OAAQsB,qBAAqB,CAACtB,GAAD,CAA7B;;AACF,SAAK,aAAL;AACC,UAAIS,IAAI,KAAK,QAAb,EAAuB;AACtB,eAAQc,oBAAoB,CAACvB,GAAD,CAA5B;AACA,OAFD,MAEO;AACN,eAAQwB,qBAAqB,CAACxB,GAAD,CAA7B;AACA;;AACF,SAAK,aAAL;AACC,UAAIS,IAAI,KAAK,QAAb,EAAuB;AACtB,eAAQgB,qBAAqB,CAACzB,GAAD,CAA7B;AACA,OAFD,MAEO;AACN,eAAQ0B,sBAAsB,CAAC1B,GAAD,CAA9B;AACA;;AACF;AACC,YAAO,IAAI2B,KAAJ,CAAU,0BAA0Bb,GAApC,CAAP;AA9BD;AAgCA;;AAED,SAASG,kBAAT,CAA4BjB,GAA5B,EAAiC;AAChC;AACAA,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASwB,SAA1B;AACA5B,EAAAA,GAAG,CAAC6B,QAAJ;AACA7B,EAAAA,GAAG,CAACU,YAAJ,GAJgC,CAMhC;;AACA,MAAIoB,CAAC,GAAG/B,SAAS,CAACC,GAAD,EAAM,SAAN,CAAjB;AACA,MAAI+B,CAAC,GAAGhC,SAAS,CAACC,GAAD,EAAM,UAAN,CAAjB,CARgC,CAUhC;;AACA,MAAIF,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,KADG;AAETuB,IAAAA,MAAM,EAAEhC,GAAG,CAACiC,aAFH;AAGTC,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEL;AAAnB,KADM,EAEN;AAAEI,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEN;AAAnB,KAFM;AAHE,GAAV;AASA,SAAQ,IAAIrC,GAAJ,CAAQK,GAAR,CAAR;AACA;;AAED,SAASoB,mBAAT,CAA6BlB,GAA7B,EAAkC;AACjCA,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASiC,WAA1B;AACArC,EAAAA,GAAG,CAACU,YAAJ;AAEA,MAAI4B,GAAG,GAAGvC,SAAS,CAACC,GAAD,EAAM,SAAN,CAAnB;AACAb,EAAAA,MAAM,CAACoD,KAAP,CAAaD,GAAG,CAAC,CAAD,CAAhB,EAAqB,GAArB,EAA0B,iCAA1B,EALiC,CAOjC;;AACA,MAAIR,CAAC,GAAG/B,SAAS,CAACC,GAAD,EAAM,SAAN,CAAjB;AACA,MAAI+B,CAAC,GAAGhC,SAAS,CAACC,GAAD,EAAM,iBAAN,CAAjB;AACA,MAAIwC,CAAC,GAAGzC,SAAS,CAACC,GAAD,EAAM,kBAAN,CAAjB;AACA,MAAIyC,CAAC,GAAG1C,SAAS,CAACC,GAAD,EAAM,QAAN,CAAjB;AACA,MAAI0C,CAAC,GAAG3C,SAAS,CAACC,GAAD,EAAM,QAAN,CAAjB;AACA,MAAI2C,KAAK,GAAG5C,SAAS,CAACC,GAAD,EAAM,WAAN,CAArB;AACA,MAAI4C,KAAK,GAAG7C,SAAS,CAACC,GAAD,EAAM,WAAN,CAArB;AACA,MAAI6C,IAAI,GAAG9C,SAAS,CAACC,GAAD,EAAM,MAAN,CAApB,CAfiC,CAiBjC;;AACA,MAAIF,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,KADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEN;AAAnB,KADM,EAEN;AAAEK,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEL;AAAnB,KAFM,EAGN;AAAEI,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEI;AAAnB,KAHM,EAIN;AAAEL,MAAAA,IAAI,EAAE,MAAR;AAAgBC,MAAAA,IAAI,EAAES;AAAtB,KAJM,EAKN;AAAEV,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEK;AAAnB,KALM,EAMN;AAAEN,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEM;AAAnB,KANM,EAON;AAAEP,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,IAAI,EAAEO;AAAvB,KAPM,EAQN;AAAER,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,IAAI,EAAEQ;AAAvB,KARM;AAFE,GAAV;AAcA,SAAQ,IAAIlD,UAAJ,CAAeI,GAAf,CAAR;AACA;;AAED,SAASqB,kBAAT,CAA4BnB,GAA5B,EAAiC;AAChCA,EAAAA,GAAG,CAACU,YAAJ;AAEA,MAAI+B,CAAC,GAAG1C,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB;AACA,MAAI0C,CAAC,GAAG3C,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB;AACA,MAAI8C,CAAC,GAAG/C,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB,CALgC,CAOhC;;AACAA,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASwB,SAA1B;AACA5B,EAAAA,GAAG,CAAC6B,QAAJ;AAEA,MAAIkB,CAAC,GAAGhD,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB,CAXgC,CAahC;;AACA,MAAIF,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,KADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEK;AAAnB,KADM,EAEN;AAAEN,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEM;AAAnB,KAFM,EAGN;AAAEP,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEU;AAAnB,KAHM,EAIN;AAAEX,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEW;AAAnB,KAJM;AAFE,GAAV;AAUA,SAAQ,IAAItD,GAAJ,CAAQK,GAAR,CAAR;AACA;;AAED,SAASsB,mBAAT,CAA6BpB,GAA7B,EAAkC;AACjCA,EAAAA,GAAG,CAACU,YAAJ;AAEA,MAAI+B,CAAC,GAAG1C,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB;AACA,MAAI0C,CAAC,GAAG3C,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB;AACA,MAAI8C,CAAC,GAAG/C,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB;AAEAA,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASiC,WAA1B;AACA,MAAIW,CAAC,GAAGjD,SAAS,CAACC,GAAD,EAAM,GAAN,CAAjB;AAEA;;AACA,MAAI+C,CAAC,GAAGvD,KAAK,CAACyD,kBAAN,CAAyBH,CAAzB,EAA4BL,CAA5B,EAA+BO,CAA/B,CAAR;AAEA,MAAIlD,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,KADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEK;AAAnB,KADM,EAEN;AAAEN,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEM;AAAnB,KAFM,EAGN;AAAEP,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEU;AAAnB,KAHM,EAIN;AAAEX,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEW;AAAnB,KAJM,EAKN;AAAEZ,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEY;AAAnB,KALM;AAFE,GAAV;AAWA,SAAQ,IAAItD,UAAJ,CAAeI,GAAf,CAAR;AACA;;AAED,SAASb,cAAT,CAAwBe,GAAxB,EAA6B;AAC5B,MAAIkD,SAAJ,EAAeC,UAAf;AACA,MAAIC,CAAJ,EAAOC,CAAP,EAAUC,EAAV;;AAEA,MAAItD,GAAG,CAACG,IAAJ,OAAed,IAAI,CAACe,GAAL,CAASmD,GAA5B,EAAiC;AAChC,QAAIzC,GAAG,GAAGd,GAAG,CAACe,OAAJ,EAAV;AAEAoC,IAAAA,UAAU,GAAGK,MAAM,CAACC,IAAP,CAAYlE,IAAI,CAACmE,MAAjB,CAAb;;AACA,SAAKN,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGD,UAAU,CAACtC,MAA3B,EAAmC,EAAEuC,CAArC,EAAwC;AACvCC,MAAAA,CAAC,GAAGF,UAAU,CAACC,CAAD,CAAd;AACAE,MAAAA,EAAE,GAAG/D,IAAI,CAACmE,MAAL,CAAYL,CAAZ,CAAL;;AACA,UAAIC,EAAE,CAACK,QAAH,KAAgB7C,GAApB,EAAyB;AACxBoC,QAAAA,SAAS,GAAGG,CAAZ;AACA;AACA;AACD;AAED,GAbD,MAaO;AACN;AACArD,IAAAA,GAAG,CAACU,YAAJ;AACA,QAAIkD,OAAO,GAAG5D,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASC,OAAxB,EAAiC,IAAjC,CAAd;AACAlB,IAAAA,MAAM,CAACe,WAAP,CAAmB0D,OAAO,CAAC,CAAD,CAA1B,EAA+B,CAA/B,EAAkC,yBAAlC;AAEA,QAAIC,KAAK,GAAG,EAAZ,CANM,CAQN;;AACA7D,IAAAA,GAAG,CAACU,YAAJ;AACA,QAAIoD,YAAY,GAAG9D,GAAG,CAACe,OAAJ,EAAnB;AACA5B,IAAAA,MAAM,CAACe,WAAP,CAAmB4D,YAAnB,EAAiC,mBAAjC,EACI,qCADJ;AAEA,QAAIrB,CAAC,GAAGoB,KAAK,CAACpB,CAAN,GAAUjD,KAAK,CAACc,WAAN,CACdN,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASC,OAAxB,EAAiC,IAAjC,CADc,CAAlB;AAEA;AACF;AACA;AACA;;AACEwD,IAAAA,KAAK,CAACE,IAAN,GAAatB,CAAC,CAAC5B,MAAF,GAAW,CAAX,GAAerB,KAAK,CAACwE,UAAN,CAAiBvB,CAAjB,CAA5B,CAnBM,CAqBN;;AACAzC,IAAAA,GAAG,CAACU,YAAJ;AACAmD,IAAAA,KAAK,CAACI,CAAN,GAAUzE,KAAK,CAACc,WAAN,CACNN,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASiC,WAAxB,EAAqC,IAArC,CADM,CAAV;AAEAwB,IAAAA,KAAK,CAACK,CAAN,GAAU1E,KAAK,CAACc,WAAN,CACNN,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASiC,WAAxB,EAAqC,IAArC,CADM,CAAV;AAEA,QAAIrC,GAAG,CAACG,IAAJ,OAAed,IAAI,CAACe,GAAL,CAASwB,SAA5B,EACCiC,KAAK,CAACM,CAAN,GAAUnE,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASwB,SAAxB,EAAmC,IAAnC,CAAV,CA5BK,CA8BN;;AACAiC,IAAAA,KAAK,CAACO,CAAN,GAAUpE,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASiC,WAAxB,EAAqC,IAArC,CAAV;AACAlD,IAAAA,MAAM,CAACe,WAAP,CAAmB2D,KAAK,CAACO,CAAN,CAAQ,CAAR,CAAnB,EAA+B,GAA/B,EACI,4BADJ;AAGAP,IAAAA,KAAK,CAAC/B,CAAN,GAAUtC,KAAK,CAACc,WAAN,CACNN,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASC,OAAxB,EAAiC,IAAjC,CADM,CAAV;AAEAwD,IAAAA,KAAK,CAACQ,CAAN,GAAU7E,KAAK,CAACc,WAAN,CACNN,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASC,OAAxB,EAAiC,IAAjC,CADM,CAAV;AAEAlB,IAAAA,MAAM,CAACe,WAAP,CAAmB2D,KAAK,CAACQ,CAAN,CAAQ,CAAR,CAAnB,EAA+B,GAA/B,EAAoC,2BAChC,UADJ;AAGAlB,IAAAA,UAAU,GAAGK,MAAM,CAACC,IAAP,CAAYlE,IAAI,CAACmE,MAAjB,CAAb;AACA,QAAIY,EAAE,GAAGd,MAAM,CAACC,IAAP,CAAYI,KAAZ,CAAT;;AACA,SAAKT,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGD,UAAU,CAACtC,MAA3B,EAAmC,EAAEuC,CAArC,EAAwC;AACvCC,MAAAA,CAAC,GAAGF,UAAU,CAACC,CAAD,CAAd;AACAE,MAAAA,EAAE,GAAG/D,IAAI,CAACmE,MAAL,CAAYL,CAAZ,CAAL;AACA,UAAId,KAAK,GAAG,IAAZ;;AACA,WAAK,IAAIgC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGD,EAAE,CAACzD,MAAvB,EAA+B,EAAE0D,CAAjC,EAAoC;AACnC,YAAIC,CAAC,GAAGF,EAAE,CAACC,CAAD,CAAV;AACA,YAAIjB,EAAE,CAACkB,CAAD,CAAF,KAAUC,SAAd,EACC;;AACD,YAAI,OAAQnB,EAAE,CAACkB,CAAD,CAAV,KAAmB,QAAnB,IACAlB,EAAE,CAACkB,CAAD,CAAF,CAAME,MAAN,KAAiBD,SADrB,EACgC;AAC/B,cAAI,CAACnB,EAAE,CAACkB,CAAD,CAAF,CAAME,MAAN,CAAab,KAAK,CAACW,CAAD,CAAlB,CAAL,EAA6B;AAC5BjC,YAAAA,KAAK,GAAG,KAAR;AACA;AACA;AACD,SAND,MAMO,IAAIjD,MAAM,CAACqF,QAAP,CAAgBrB,EAAE,CAACkB,CAAD,CAAlB,CAAJ,EAA4B;AAClC,cAAIlB,EAAE,CAACkB,CAAD,CAAF,CAAMI,QAAN,CAAe,QAAf,MACIf,KAAK,CAACW,CAAD,CAAL,CAASI,QAAT,CAAkB,QAAlB,CADR,EACqC;AACpCrC,YAAAA,KAAK,GAAG,KAAR;AACA;AACA;AACD,SANM,MAMA;AACN,cAAIe,EAAE,CAACkB,CAAD,CAAF,KAAUX,KAAK,CAACW,CAAD,CAAnB,EAAwB;AACvBjC,YAAAA,KAAK,GAAG,KAAR;AACA;AACA;AACD;AACD;;AACD,UAAIA,KAAJ,EAAW;AACVW,QAAAA,SAAS,GAAGG,CAAZ;AACA;AACA;AACD;AACD;;AACD,SAAQH,SAAR;AACA;;AAED,SAAS5B,qBAAT,CAA+BtB,GAA/B,EAAoC;AACnC,MAAIkD,SAAS,GAAGjE,cAAc,CAACe,GAAD,CAA9B;AACAb,EAAAA,MAAM,CAAC0F,MAAP,CAAc3B,SAAd,EAAyB,wBAAzB;AAEAlD,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASiC,WAA1B;AACArC,EAAAA,GAAG,CAACU,YAAJ;AAEA,MAAIkD,OAAO,GAAG7D,SAAS,CAACC,GAAD,EAAM,SAAN,CAAvB;AACAb,EAAAA,MAAM,CAACoD,KAAP,CAAaqB,OAAO,CAAC,CAAD,CAApB,EAAyB,CAAzB,EAA4B,8BAA5B;AAEA,MAAIpB,CAAC,GAAGxC,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASiC,WAAxB,EAAqC,IAArC,CAAR;AACA,MAAIyC,CAAJ;;AAEA,MAAI9E,GAAG,CAACG,IAAJ,MAAc,IAAlB,EAAwB;AACvBH,IAAAA,GAAG,CAACU,YAAJ,CAAiB,IAAjB;AACAV,IAAAA,GAAG,CAACgB,OAAJ,IAAehB,GAAG,CAACa,MAAnB;AACA;;AACD,MAAIb,GAAG,CAACG,IAAJ,MAAc,IAAlB,EAAwB;AACvBH,IAAAA,GAAG,CAACU,YAAJ,CAAiB,IAAjB;AACAoE,IAAAA,CAAC,GAAG9E,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASwB,SAAxB,EAAmC,IAAnC,CAAJ;AACAkD,IAAAA,CAAC,GAAGtF,KAAK,CAACuF,WAAN,CAAkBD,CAAlB,CAAJ;AACA;;AAED,MAAIA,CAAC,KAAKL,SAAV,EAAqB;AACpB,QAAIO,GAAG,GAAGxF,KAAK,CAACyF,sBAAN,CAA6B/B,SAA7B,EAAwCV,CAAxC,CAAV;AACAsC,IAAAA,CAAC,GAAGE,GAAG,CAACE,IAAJ,CAASJ,CAAT,CAAW1C,IAAf;AACA;;AAED,MAAItC,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,OADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,IAAI,EAAE9C,MAAM,CAAC6F,IAAP,CAAYjC,SAAZ;AAAvB,KADM,EAEN;AAAEf,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE0C;AAAnB,KAFM,EAGN;AAAE3C,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAEI;AAAnB,KAHM;AAFE,GAAV;AASA,SAAQ,IAAI9C,UAAJ,CAAeI,GAAf,CAAR;AACA;;AAED,SAASuB,oBAAT,CAA8BrB,GAA9B,EAAmC;AAClC,MAAIkD,SAAS,GAAGjE,cAAc,CAACe,GAAD,CAA9B;AACAb,EAAAA,MAAM,CAAC0F,MAAP,CAAc3B,SAAd,EAAyB,wBAAzB;AAEA,MAAI4B,CAAC,GAAG9E,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASwB,SAAxB,EAAmC,IAAnC,CAAR;AACAkD,EAAAA,CAAC,GAAGtF,KAAK,CAACuF,WAAN,CAAkBD,CAAlB,CAAJ;AAEA,MAAIhF,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,OADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,OAAR;AAAiBC,MAAAA,IAAI,EAAE9C,MAAM,CAAC6F,IAAP,CAAYjC,SAAZ;AAAvB,KADM,EAEN;AAAEf,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE0C;AAAnB,KAFM;AAFE,GAAV;AAQA,SAAQ,IAAIrF,GAAJ,CAAQK,GAAR,CAAR;AACA;;AAED,SAASyB,oBAAT,CAA8BvB,GAA9B,EAAmC;AAClC,MAAIA,GAAG,CAACG,IAAJ,OAAe,IAAnB,EACCH,GAAG,CAAC6B,QAAJ;AAED,MAAIuD,CAAC,GAAG5F,KAAK,CAAC6F,aAAN,CAAoBrF,GAApB,CAAR;AAEA,MAAIF,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,SADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE5C,KAAK,CAAC8F,eAAN,CAAsBF,CAAtB,EAAyB,EAAzB;AAAnB,KADM;AAFE,GAAV;AAOA,SAAQ,IAAI3F,GAAJ,CAAQK,GAAR,CAAR;AACA;;AAED,SAAS2B,qBAAT,CAA+BzB,GAA/B,EAAoC;AACnC,MAAIoF,CAAC,GAAG5F,KAAK,CAAC6F,aAAN,CAAoBrF,GAApB,CAAR;AAEA,MAAIF,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,YADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE5C,KAAK,CAAC8F,eAAN,CAAsBF,CAAtB,EAAyB,EAAzB;AAAnB,KADM;AAFE,GAAV;AAOA,SAAQ,IAAI3F,GAAJ,CAAQK,GAAR,CAAR;AACA;;AAED,SAAS0B,qBAAT,CAA+BxB,GAA/B,EAAoC;AACnC,MAAIA,GAAG,CAACG,IAAJ,OAAe,IAAnB,EACCH,GAAG,CAAC6B,QAAJ;AAED7B,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASiC,WAA1B;AACA,MAAImC,CAAC,GAAGxE,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASiC,WAAxB,EAAqC,IAArC,CAAR;AACAmC,EAAAA,CAAC,GAAGhF,KAAK,CAAC8F,eAAN,CAAsBd,CAAtB,EAAyB,EAAzB,CAAJ;AAEA,MAAIY,CAAJ;;AACA,MAAIpF,GAAG,CAACG,IAAJ,OAAed,IAAI,CAACe,GAAL,CAASwB,SAA5B,EAAuC;AACtCwD,IAAAA,CAAC,GAAG5F,KAAK,CAAC6F,aAAN,CAAoBrF,GAApB,CAAJ;AACAoF,IAAAA,CAAC,GAAG5F,KAAK,CAAC8F,eAAN,CAAsBF,CAAtB,EAAyB,EAAzB,CAAJ;AACA,GAHD,MAGO;AACNA,IAAAA,CAAC,GAAG5F,KAAK,CAAC+F,sBAAN,CAA6Bf,CAA7B,CAAJ;AACA;;AAED,MAAI1E,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,SADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE5C,KAAK,CAAC8F,eAAN,CAAsBF,CAAtB,EAAyB,EAAzB;AAAnB,KADM,EAEN;AAAEjD,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE5C,KAAK,CAAC8F,eAAN,CAAsBd,CAAtB,EAAyB,EAAzB;AAAnB,KAFM;AAFE,GAAV;AAQA,SAAQ,IAAI9E,UAAJ,CAAeI,GAAf,CAAR;AACA;;AAED,SAAS4B,sBAAT,CAAgC1B,GAAhC,EAAqC;AACpC,MAAIA,GAAG,CAACG,IAAJ,OAAe,IAAnB,EACCH,GAAG,CAAC6B,QAAJ;AAED7B,EAAAA,GAAG,CAACU,YAAJ,CAAiBrB,IAAI,CAACe,GAAL,CAASiC,WAA1B;AACA,MAAImC,CAAC,GAAGxE,GAAG,CAACO,UAAJ,CAAelB,IAAI,CAACe,GAAL,CAASiC,WAAxB,EAAqC,IAArC,CAAR;AACAmC,EAAAA,CAAC,GAAGhF,KAAK,CAAC8F,eAAN,CAAsBd,CAAtB,EAAyB,EAAzB,CAAJ;AAEA,MAAIY,CAAC,GAAG5F,KAAK,CAACgG,qBAAN,CAA4BhB,CAA5B,CAAR;AAEA,MAAI1E,GAAG,GAAG;AACTW,IAAAA,IAAI,EAAE,YADG;AAETyB,IAAAA,KAAK,EAAE,CACN;AAAEC,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE5C,KAAK,CAAC8F,eAAN,CAAsBF,CAAtB,EAAyB,EAAzB;AAAnB,KADM,EAEN;AAAEjD,MAAAA,IAAI,EAAE,GAAR;AAAaC,MAAAA,IAAI,EAAE5C,KAAK,CAAC8F,eAAN,CAAsBd,CAAtB,EAAyB,EAAzB;AAAnB,KAFM;AAFE,GAAV;AAQA,SAAQ,IAAI9E,UAAJ,CAAeI,GAAf,CAAR;AACA;;AAED,SAASd,aAAT,CAAuBc,GAAvB,EAA4B;AAC3B,MAAIE,GAAG,GAAG,IAAIX,IAAI,CAACoG,SAAT,EAAV;AACA1G,EAAAA,UAAU,CAACiB,GAAD,EAAMF,GAAN,CAAV;AACA,SAAQE,GAAG,CAAC0F,MAAZ;AACA;;AAED,SAAS3G,UAAT,CAAoBiB,GAApB,EAAyBF,GAAzB,EAA8B;AAC7BE,EAAAA,GAAG,CAAC2F,aAAJ;;AAEA,MAAIjG,UAAU,CAACkG,YAAX,CAAwB9F,GAAxB,CAAJ,EAAkC;AACjC,QAAI+F,QAAQ,GAAGvG,MAAM,CAAC6F,IAAP,CAAY,CAAC,CAAD,CAAZ,CAAf;AACAnF,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBD,QAAhB,EAA0BxG,IAAI,CAACe,GAAL,CAASC,OAAnC;AACA;;AAEDL,EAAAA,GAAG,CAAC2F,aAAJ;;AACA,UAAQ7F,GAAG,CAACW,IAAZ;AACA,SAAK,KAAL;AACCT,MAAAA,GAAG,CAAC+F,QAAJ,CAAa,sBAAb;AACA,UAAIrG,UAAU,CAACkG,YAAX,CAAwB9F,GAAxB,CAAJ,EACCkG,oBAAoB,CAAClG,GAAD,EAAME,GAAN,CAApB,CADD,KAGCiG,mBAAmB,CAACnG,GAAD,EAAME,GAAN,CAAnB;AACD;;AACD,SAAK,KAAL;AACCA,MAAAA,GAAG,CAAC+F,QAAJ,CAAa,mBAAb;AACA,UAAIrG,UAAU,CAACkG,YAAX,CAAwB9F,GAAxB,CAAJ,EACCoG,oBAAoB,CAACpG,GAAD,EAAME,GAAN,CAApB,CADD,KAGCmG,mBAAmB,CAACrG,GAAD,EAAME,GAAN,CAAnB;AACD;;AACD,SAAK,OAAL;AACCA,MAAAA,GAAG,CAAC+F,QAAJ,CAAa,mBAAb;AACA,UAAIrG,UAAU,CAACkG,YAAX,CAAwB9F,GAAxB,CAAJ,EACCsG,sBAAsB,CAACtG,GAAD,EAAME,GAAN,CAAtB,CADD,KAGCqG,qBAAqB,CAACvG,GAAD,EAAME,GAAN,CAArB;AACD;;AACD,SAAK,SAAL;AACCA,MAAAA,GAAG,CAAC+F,QAAJ,CAAa,aAAb;AACA,UAAIrG,UAAU,CAACkG,YAAX,CAAwB9F,GAAxB,CAAJ,EACC,MAAO,IAAI6B,KAAJ,CAAU,mCACb,0BADG,CAAP;AAED2E,MAAAA,qBAAqB,CAACxG,GAAD,EAAME,GAAN,CAArB;AACA;;AACD;AACC,YAAO,IAAI2B,KAAJ,CAAU,2BAA2B7B,GAAG,CAACW,IAAzC,CAAP;AA9BD;;AAiCAT,EAAAA,GAAG,CAACuG,WAAJ;AACA;;AAED,SAASP,oBAAT,CAA8BlG,GAA9B,EAAmCE,GAAnC,EAAwC;AACvCA,EAAAA,GAAG,CAACwG,SAAJ;AACAxG,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAAC2F,aAAJ,CAAkBtG,IAAI,CAACe,GAAL,CAASiC,WAA3B;AACArC,EAAAA,GAAG,CAAC2F,aAAJ;AAEA,MAAI/B,OAAO,GAAGtE,MAAM,CAAC6F,IAAP,CAAY,CAAC,CAAD,CAAZ,CAAd;AACAnF,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBlC,OAAhB,EAAyBvE,IAAI,CAACe,GAAL,CAASC,OAAlC;AAEAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASpD,CAAT,CAAWM,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASnD,CAAT,CAAWK,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAAS1C,CAAT,CAAWJ,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASzC,CAAT,CAAWL,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASxC,CAAT,CAAWN,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACA,MAAI,CAACP,GAAG,CAACoF,IAAJ,CAASvC,KAAV,IAAmB,CAAC7C,GAAG,CAACoF,IAAJ,CAAStC,KAAjC,EACCpD,KAAK,CAACiH,aAAN,CAAoB3G,GAApB;AACDE,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASvC,KAAT,CAAeP,IAA/B,EAAqC/C,IAAI,CAACe,GAAL,CAASC,OAA9C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAAStC,KAAT,CAAeR,IAA/B,EAAqC/C,IAAI,CAACe,GAAL,CAASC,OAA9C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASrC,IAAT,CAAcT,IAA9B,EAAoC/C,IAAI,CAACe,GAAL,CAASC,OAA7C;AAEAL,EAAAA,GAAG,CAACuG,WAAJ;AACAvG,EAAAA,GAAG,CAACuG,WAAJ;AACA;;AAED,SAASN,mBAAT,CAA6BnG,GAA7B,EAAkCE,GAAlC,EAAuC;AACtCA,EAAAA,GAAG,CAACwG,SAAJ;AACAxG,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAAC2F,aAAJ,CAAkBtG,IAAI,CAACe,GAAL,CAASwB,SAA3B;AACA5B,EAAAA,GAAG,CAAC0G,SAAJ,CAAc,IAAd;AAEA1G,EAAAA,GAAG,CAAC2F,aAAJ;AACA3F,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASpD,CAAT,CAAWM,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASnD,CAAT,CAAWK,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAACuG,WAAJ;AACA;;AAED,SAASL,oBAAT,CAA8BpG,GAA9B,EAAmCE,GAAnC,EAAwC;AACvCA,EAAAA,GAAG,CAAC2F,aAAJ;AACA3F,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASzC,CAAT,CAAWL,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASxC,CAAT,CAAWN,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASpC,CAAT,CAAWV,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAAC2F,aAAJ,CAAkBtG,IAAI,CAACe,GAAL,CAASiC,WAA3B;AACArC,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASlC,CAAT,CAAWZ,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAACuG,WAAJ;AACA;;AAED,SAASJ,mBAAT,CAA6BrG,GAA7B,EAAkCE,GAAlC,EAAuC;AACtCA,EAAAA,GAAG,CAAC2F,aAAJ;AACA3F,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASzC,CAAT,CAAWL,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASxC,CAAT,CAAWN,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASpC,CAAT,CAAWV,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAACuG,WAAJ;AACAvG,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAAC2F,aAAJ,CAAkBtG,IAAI,CAACe,GAAL,CAASwB,SAA3B;AACA5B,EAAAA,GAAG,CAAC0G,SAAJ,CAAc,IAAd;AACA1G,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAASnC,CAAT,CAAWX,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASC,OAA1C;AACAL,EAAAA,GAAG,CAACuG,WAAJ;AACA;;AAED,SAASrH,eAAT,CAAyBY,GAAzB,EAA8BE,GAA9B,EAAmC;AAClC,MAAI6D,KAAK,GAAGtE,IAAI,CAACmE,MAAL,CAAY5D,GAAG,CAAC+D,KAAhB,CAAZ;;AACA,MAAIA,KAAK,CAACF,QAAV,EAAoB;AACnB;AACA3D,IAAAA,GAAG,CAAC+F,QAAJ,CAAalC,KAAK,CAACF,QAAnB;AAEA,GAJD,MAIO;AACN;AACA3D,IAAAA,GAAG,CAAC2F,aAAJ;AAEA,QAAI/B,OAAO,GAAGtE,MAAM,CAAC6F,IAAP,CAAY,CAAC,CAAD,CAAZ,CAAd;AACAnF,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBlC,OAAhB,EAAyBvE,IAAI,CAACe,GAAL,CAASC,OAAlC,EALM,CAON;;AACAL,IAAAA,GAAG,CAAC2F,aAAJ;AACA3F,IAAAA,GAAG,CAAC+F,QAAJ,CAAa,mBAAb,EATM,CAS6B;;AACnC/F,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBjC,KAAK,CAACpB,CAAtB,EAAyBpD,IAAI,CAACe,GAAL,CAASC,OAAlC;AACAL,IAAAA,GAAG,CAACuG,WAAJ,GAXM,CAaN;;AACAvG,IAAAA,GAAG,CAAC2F,aAAJ;AACA,QAAI1B,CAAC,GAAGJ,KAAK,CAACpB,CAAd;AACA,QAAIwB,CAAC,CAAC,CAAD,CAAD,KAAS,GAAb,EACCA,CAAC,GAAGA,CAAC,CAAC0C,KAAF,CAAQ,CAAR,CAAJ;AACD3G,IAAAA,GAAG,CAAC8F,WAAJ,CAAgB7B,CAAhB,EAAmB5E,IAAI,CAACe,GAAL,CAASiC,WAA5B;AACArC,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBjC,KAAK,CAACK,CAAtB,EAAyB7E,IAAI,CAACe,GAAL,CAASiC,WAAlC;AACArC,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBjC,KAAK,CAACM,CAAtB,EAAyB9E,IAAI,CAACe,GAAL,CAASwB,SAAlC;AACA5B,IAAAA,GAAG,CAACuG,WAAJ;AAEAvG,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBjC,KAAK,CAACO,CAAtB,EAAyB/E,IAAI,CAACe,GAAL,CAASiC,WAAlC;AACArC,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBjC,KAAK,CAAC/B,CAAtB,EAAyBzC,IAAI,CAACe,GAAL,CAASC,OAAlC;AACA,QAAIgE,CAAC,GAAGR,KAAK,CAACQ,CAAd;;AACA,QAAI,CAACA,CAAL,EAAQ;AACPA,MAAAA,CAAC,GAAG/E,MAAM,CAAC6F,IAAP,CAAY,CAAC,CAAD,CAAZ,CAAJ;AACA;;AACDnF,IAAAA,GAAG,CAAC8F,WAAJ,CAAgBzB,CAAhB,EAAmBhF,IAAI,CAACe,GAAL,CAASC,OAA5B,EA7BM,CA+BN;;AACAL,IAAAA,GAAG,CAACuG,WAAJ;AACA;AACD;;AAED,SAASF,qBAAT,CAA+BvG,GAA/B,EAAoCE,GAApC,EAAyC;AACxCd,EAAAA,eAAe,CAACY,GAAD,EAAME,GAAN,CAAf;AACAA,EAAAA,GAAG,CAACuG,WAAJ;AAEA,MAAIzB,CAAC,GAAGtF,KAAK,CAACuF,WAAN,CAAkBjF,GAAG,CAACoF,IAAJ,CAASJ,CAAT,CAAW1C,IAA7B,EAAmC,IAAnC,CAAR;AACApC,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhB,CAAhB,EAAmBzF,IAAI,CAACe,GAAL,CAASwB,SAA5B;AACA;;AAED,SAASwE,sBAAT,CAAgCtG,GAAhC,EAAqCE,GAArC,EAA0C;AACzCd,EAAAA,eAAe,CAACY,GAAD,EAAME,GAAN,CAAf;AACAA,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAAC2F,aAAJ,CAAkBtG,IAAI,CAACe,GAAL,CAASiC,WAA3B;AACArC,EAAAA,GAAG,CAAC2F,aAAJ;AAEA,MAAI/B,OAAO,GAAGtE,MAAM,CAAC6F,IAAP,CAAY,CAAC,CAAD,CAAZ,CAAd;AACAnF,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBlC,OAAhB,EAAyBvE,IAAI,CAACe,GAAL,CAASC,OAAlC;AAEAL,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhG,GAAG,CAACoF,IAAJ,CAAS1C,CAAT,CAAWJ,IAA3B,EAAiC/C,IAAI,CAACe,GAAL,CAASiC,WAA1C;AAEArC,EAAAA,GAAG,CAAC2F,aAAJ,CAAkB,IAAlB;AACA,MAAIb,CAAC,GAAGtF,KAAK,CAACuF,WAAN,CAAkBjF,GAAG,CAACoF,IAAJ,CAASJ,CAAT,CAAW1C,IAA7B,EAAmC,IAAnC,CAAR;AACApC,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBhB,CAAhB,EAAmBzF,IAAI,CAACe,GAAL,CAASwB,SAA5B;AACA5B,EAAAA,GAAG,CAACuG,WAAJ;AAEAvG,EAAAA,GAAG,CAACuG,WAAJ;AACAvG,EAAAA,GAAG,CAACuG,WAAJ;AACA;;AAED,SAASD,qBAAT,CAA+BxG,GAA/B,EAAoCE,GAApC,EAAyC;AACxCA,EAAAA,GAAG,CAACuG,WAAJ;AAEA/G,EAAAA,KAAK,CAACoH,cAAN,CAAqB5G,GAArB,EAA0BF,GAAG,CAACoF,IAAJ,CAASE,CAAT,CAAWhD,IAArC;AACA;;AAED,SAASyE,sBAAT,CAAgC/G,GAAhC,EAAqCE,GAArC,EAA0C;AACzCA,EAAAA,GAAG,CAACuG,WAAJ;AAEA,MAAI/B,CAAC,GAAGhF,KAAK,CAACc,WAAN,CAAkBR,GAAG,CAACoF,IAAJ,CAASV,CAAT,CAAWpC,IAA7B,EAAmC,IAAnC,CAAR;AACApC,EAAAA,GAAG,CAAC2F,aAAJ,CAAkBtG,IAAI,CAACe,GAAL,CAASiC,WAA3B;AACArC,EAAAA,GAAG,CAAC8F,WAAJ,CAAgBtB,CAAhB,EAAmBnF,IAAI,CAACe,GAAL,CAASiC,WAA5B;AACArC,EAAAA,GAAG,CAACuG,WAAJ;AACA","sourcesContent":["// Copyright 2018 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\treadPkcs8: readPkcs8,\n\twrite: write,\n\twritePkcs8: writePkcs8,\n\tpkcs8ToBuffer: pkcs8ToBuffer,\n\n\treadECDSACurve: readECDSACurve,\n\twriteECDSACurve: writeECDSACurve\n};\n\nvar assert = require('assert-plus');\nvar asn1 = require('asn1');\nvar Buffer = require('safer-buffer').Buffer;\nvar algs = require('../algs');\nvar utils = require('../utils');\nvar Key = require('../key');\nvar PrivateKey = require('../private-key');\nvar pem = require('./pem');\n\nfunction read(buf, options) {\n\treturn (pem.read(buf, options, 'pkcs8'));\n}\n\nfunction write(key, options) {\n\treturn (pem.write(key, options, 'pkcs8'));\n}\n\n/* Helper to read in a single mpint */\nfunction readMPInt(der, nm) {\n\tassert.strictEqual(der.peek(), asn1.Ber.Integer,\n\t nm + ' is not an Integer');\n\treturn (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));\n}\n\nfunction readPkcs8(alg, type, der) {\n\t/* Private keys in pkcs#8 format have a weird extra int */\n\tif (der.peek() === asn1.Ber.Integer) {\n\t\tassert.strictEqual(type, 'private',\n\t\t 'unexpected Integer at start of public key');\n\t\tder.readString(asn1.Ber.Integer, true);\n\t}\n\n\tder.readSequence();\n\tvar next = der.offset + der.length;\n\n\tvar oid = der.readOID();\n\tswitch (oid) {\n\tcase '1.2.840.113549.1.1.1':\n\t\tder._offset = next;\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs8RSAPublic(der));\n\t\telse\n\t\t\treturn (readPkcs8RSAPrivate(der));\n\tcase '1.2.840.10040.4.1':\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs8DSAPublic(der));\n\t\telse\n\t\t\treturn (readPkcs8DSAPrivate(der));\n\tcase '1.2.840.10045.2.1':\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs8ECDSAPublic(der));\n\t\telse\n\t\t\treturn (readPkcs8ECDSAPrivate(der));\n\tcase '1.3.101.112':\n\t\tif (type === 'public') {\n\t\t\treturn (readPkcs8EdDSAPublic(der));\n\t\t} else {\n\t\t\treturn (readPkcs8EdDSAPrivate(der));\n\t\t}\n\tcase '1.3.101.110':\n\t\tif (type === 'public') {\n\t\t\treturn (readPkcs8X25519Public(der));\n\t\t} else {\n\t\t\treturn (readPkcs8X25519Private(der));\n\t\t}\n\tdefault:\n\t\tthrow (new Error('Unknown key type OID ' + oid));\n\t}\n}\n\nfunction readPkcs8RSAPublic(der) {\n\t// bit string sequence\n\tder.readSequence(asn1.Ber.BitString);\n\tder.readByte();\n\tder.readSequence();\n\n\t// modulus\n\tvar n = readMPInt(der, 'modulus');\n\tvar e = readMPInt(der, 'exponent');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tsource: der.originalInput,\n\t\tparts: [\n\t\t\t{ name: 'e', data: e },\n\t\t\t{ name: 'n', data: n }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8RSAPrivate(der) {\n\tder.readSequence(asn1.Ber.OctetString);\n\tder.readSequence();\n\n\tvar ver = readMPInt(der, 'version');\n\tassert.equal(ver[0], 0x0, 'unknown RSA private key version');\n\n\t// modulus then public exponent\n\tvar n = readMPInt(der, 'modulus');\n\tvar e = readMPInt(der, 'public exponent');\n\tvar d = readMPInt(der, 'private exponent');\n\tvar p = readMPInt(der, 'prime1');\n\tvar q = readMPInt(der, 'prime2');\n\tvar dmodp = readMPInt(der, 'exponent1');\n\tvar dmodq = readMPInt(der, 'exponent2');\n\tvar iqmp = readMPInt(der, 'iqmp');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tparts: [\n\t\t\t{ name: 'n', data: n },\n\t\t\t{ name: 'e', data: e },\n\t\t\t{ name: 'd', data: d },\n\t\t\t{ name: 'iqmp', data: iqmp },\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'dmodp', data: dmodp },\n\t\t\t{ name: 'dmodq', data: dmodq }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs8DSAPublic(der) {\n\tder.readSequence();\n\n\tvar p = readMPInt(der, 'p');\n\tvar q = readMPInt(der, 'q');\n\tvar g = readMPInt(der, 'g');\n\n\t// bit string sequence\n\tder.readSequence(asn1.Ber.BitString);\n\tder.readByte();\n\n\tvar y = readMPInt(der, 'y');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'dsa',\n\t\tparts: [\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'g', data: g },\n\t\t\t{ name: 'y', data: y }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8DSAPrivate(der) {\n\tder.readSequence();\n\n\tvar p = readMPInt(der, 'p');\n\tvar q = readMPInt(der, 'q');\n\tvar g = readMPInt(der, 'g');\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tvar x = readMPInt(der, 'x');\n\n\t/* The pkcs#8 format does not include the public key */\n\tvar y = utils.calculateDSAPublic(g, p, x);\n\n\tvar key = {\n\t\ttype: 'dsa',\n\t\tparts: [\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'g', data: g },\n\t\t\t{ name: 'y', data: y },\n\t\t\t{ name: 'x', data: x }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readECDSACurve(der) {\n\tvar curveName, curveNames;\n\tvar j, c, cd;\n\n\tif (der.peek() === asn1.Ber.OID) {\n\t\tvar oid = der.readOID();\n\n\t\tcurveNames = Object.keys(algs.curves);\n\t\tfor (j = 0; j < curveNames.length; ++j) {\n\t\t\tc = curveNames[j];\n\t\t\tcd = algs.curves[c];\n\t\t\tif (cd.pkcs8oid === oid) {\n\t\t\t\tcurveName = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// ECParameters sequence\n\t\tder.readSequence();\n\t\tvar version = der.readString(asn1.Ber.Integer, true);\n\t\tassert.strictEqual(version[0], 1, 'ECDSA key not version 1');\n\n\t\tvar curve = {};\n\n\t\t// FieldID sequence\n\t\tder.readSequence();\n\t\tvar fieldTypeOid = der.readOID();\n\t\tassert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1',\n\t\t 'ECDSA key is not from a prime-field');\n\t\tvar p = curve.p = utils.mpNormalize(\n\t\t der.readString(asn1.Ber.Integer, true));\n\t\t/*\n\t\t * p always starts with a 1 bit, so count the zeros to get its\n\t\t * real size.\n\t\t */\n\t\tcurve.size = p.length * 8 - utils.countZeros(p);\n\n\t\t// Curve sequence\n\t\tder.readSequence();\n\t\tcurve.a = utils.mpNormalize(\n\t\t der.readString(asn1.Ber.OctetString, true));\n\t\tcurve.b = utils.mpNormalize(\n\t\t der.readString(asn1.Ber.OctetString, true));\n\t\tif (der.peek() === asn1.Ber.BitString)\n\t\t\tcurve.s = der.readString(asn1.Ber.BitString, true);\n\n\t\t// Combined Gx and Gy\n\t\tcurve.G = der.readString(asn1.Ber.OctetString, true);\n\t\tassert.strictEqual(curve.G[0], 0x4,\n\t\t 'uncompressed G is required');\n\n\t\tcurve.n = utils.mpNormalize(\n\t\t der.readString(asn1.Ber.Integer, true));\n\t\tcurve.h = utils.mpNormalize(\n\t\t der.readString(asn1.Ber.Integer, true));\n\t\tassert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' +\n\t\t 'required');\n\n\t\tcurveNames = Object.keys(algs.curves);\n\t\tvar ks = Object.keys(curve);\n\t\tfor (j = 0; j < curveNames.length; ++j) {\n\t\t\tc = curveNames[j];\n\t\t\tcd = algs.curves[c];\n\t\t\tvar equal = true;\n\t\t\tfor (var i = 0; i < ks.length; ++i) {\n\t\t\t\tvar k = ks[i];\n\t\t\t\tif (cd[k] === undefined)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (typeof (cd[k]) === 'object' &&\n\t\t\t\t cd[k].equals !== undefined) {\n\t\t\t\t\tif (!cd[k].equals(curve[k])) {\n\t\t\t\t\t\tequal = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (Buffer.isBuffer(cd[k])) {\n\t\t\t\t\tif (cd[k].toString('binary')\n\t\t\t\t\t !== curve[k].toString('binary')) {\n\t\t\t\t\t\tequal = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (cd[k] !== curve[k]) {\n\t\t\t\t\t\tequal = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (equal) {\n\t\t\t\tcurveName = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn (curveName);\n}\n\nfunction readPkcs8ECDSAPrivate(der) {\n\tvar curveName = readECDSACurve(der);\n\tassert.string(curveName, 'a known elliptic curve');\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tder.readSequence();\n\n\tvar version = readMPInt(der, 'version');\n\tassert.equal(version[0], 1, 'unknown version of ECDSA key');\n\n\tvar d = der.readString(asn1.Ber.OctetString, true);\n\tvar Q;\n\n\tif (der.peek() == 0xa0) {\n\t\tder.readSequence(0xa0);\n\t\tder._offset += der.length;\n\t}\n\tif (der.peek() == 0xa1) {\n\t\tder.readSequence(0xa1);\n\t\tQ = der.readString(asn1.Ber.BitString, true);\n\t\tQ = utils.ecNormalize(Q);\n\t}\n\n\tif (Q === undefined) {\n\t\tvar pub = utils.publicFromPrivateECDSA(curveName, d);\n\t\tQ = pub.part.Q.data;\n\t}\n\n\tvar key = {\n\t\ttype: 'ecdsa',\n\t\tparts: [\n\t\t\t{ name: 'curve', data: Buffer.from(curveName) },\n\t\t\t{ name: 'Q', data: Q },\n\t\t\t{ name: 'd', data: d }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs8ECDSAPublic(der) {\n\tvar curveName = readECDSACurve(der);\n\tassert.string(curveName, 'a known elliptic curve');\n\n\tvar Q = der.readString(asn1.Ber.BitString, true);\n\tQ = utils.ecNormalize(Q);\n\n\tvar key = {\n\t\ttype: 'ecdsa',\n\t\tparts: [\n\t\t\t{ name: 'curve', data: Buffer.from(curveName) },\n\t\t\t{ name: 'Q', data: Q }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8EdDSAPublic(der) {\n\tif (der.peek() === 0x00)\n\t\tder.readByte();\n\n\tvar A = utils.readBitString(der);\n\n\tvar key = {\n\t\ttype: 'ed25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8X25519Public(der) {\n\tvar A = utils.readBitString(der);\n\n\tvar key = {\n\t\ttype: 'curve25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8EdDSAPrivate(der) {\n\tif (der.peek() === 0x00)\n\t\tder.readByte();\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tvar k = der.readString(asn1.Ber.OctetString, true);\n\tk = utils.zeroPadToLength(k, 32);\n\n\tvar A;\n\tif (der.peek() === asn1.Ber.BitString) {\n\t\tA = utils.readBitString(der);\n\t\tA = utils.zeroPadToLength(A, 32);\n\t} else {\n\t\tA = utils.calculateED25519Public(k);\n\t}\n\n\tvar key = {\n\t\ttype: 'ed25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) },\n\t\t\t{ name: 'k', data: utils.zeroPadToLength(k, 32) }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs8X25519Private(der) {\n\tif (der.peek() === 0x00)\n\t\tder.readByte();\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tvar k = der.readString(asn1.Ber.OctetString, true);\n\tk = utils.zeroPadToLength(k, 32);\n\n\tvar A = utils.calculateX25519Public(k);\n\n\tvar key = {\n\t\ttype: 'curve25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) },\n\t\t\t{ name: 'k', data: utils.zeroPadToLength(k, 32) }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction pkcs8ToBuffer(key) {\n\tvar der = new asn1.BerWriter();\n\twritePkcs8(der, key);\n\treturn (der.buffer);\n}\n\nfunction writePkcs8(der, key) {\n\tder.startSequence();\n\n\tif (PrivateKey.isPrivateKey(key)) {\n\t\tvar sillyInt = Buffer.from([0]);\n\t\tder.writeBuffer(sillyInt, asn1.Ber.Integer);\n\t}\n\n\tder.startSequence();\n\tswitch (key.type) {\n\tcase 'rsa':\n\t\tder.writeOID('1.2.840.113549.1.1.1');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs8RSAPrivate(key, der);\n\t\telse\n\t\t\twritePkcs8RSAPublic(key, der);\n\t\tbreak;\n\tcase 'dsa':\n\t\tder.writeOID('1.2.840.10040.4.1');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs8DSAPrivate(key, der);\n\t\telse\n\t\t\twritePkcs8DSAPublic(key, der);\n\t\tbreak;\n\tcase 'ecdsa':\n\t\tder.writeOID('1.2.840.10045.2.1');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs8ECDSAPrivate(key, der);\n\t\telse\n\t\t\twritePkcs8ECDSAPublic(key, der);\n\t\tbreak;\n\tcase 'ed25519':\n\t\tder.writeOID('1.3.101.112');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\tthrow (new Error('Ed25519 private keys in pkcs8 ' +\n\t\t\t 'format are not supported'));\n\t\twritePkcs8EdDSAPublic(key, der);\n\t\tbreak;\n\tdefault:\n\t\tthrow (new Error('Unsupported key type: ' + key.type));\n\t}\n\n\tder.endSequence();\n}\n\nfunction writePkcs8RSAPrivate(key, der) {\n\tder.writeNull();\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.startSequence();\n\n\tvar version = Buffer.from([0]);\n\tder.writeBuffer(version, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.d.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tif (!key.part.dmodp || !key.part.dmodq)\n\t\tutils.addRSAMissing(key);\n\tder.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);\n\n\tder.endSequence();\n\tder.endSequence();\n}\n\nfunction writePkcs8RSAPublic(key, der) {\n\tder.writeNull();\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.BitString);\n\tder.writeByte(0x00);\n\n\tder.startSequence();\n\tder.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n\tder.endSequence();\n\n\tder.endSequence();\n}\n\nfunction writePkcs8DSAPrivate(key, der) {\n\tder.startSequence();\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n\tder.endSequence();\n\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.writeBuffer(key.part.x.data, asn1.Ber.Integer);\n\tder.endSequence();\n}\n\nfunction writePkcs8DSAPublic(key, der) {\n\tder.startSequence();\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n\tder.endSequence();\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.BitString);\n\tder.writeByte(0x00);\n\tder.writeBuffer(key.part.y.data, asn1.Ber.Integer);\n\tder.endSequence();\n}\n\nfunction writeECDSACurve(key, der) {\n\tvar curve = algs.curves[key.curve];\n\tif (curve.pkcs8oid) {\n\t\t/* This one has a name in pkcs#8, so just write the oid */\n\t\tder.writeOID(curve.pkcs8oid);\n\n\t} else {\n\t\t// ECParameters sequence\n\t\tder.startSequence();\n\n\t\tvar version = Buffer.from([1]);\n\t\tder.writeBuffer(version, asn1.Ber.Integer);\n\n\t\t// FieldID sequence\n\t\tder.startSequence();\n\t\tder.writeOID('1.2.840.10045.1.1'); // prime-field\n\t\tder.writeBuffer(curve.p, asn1.Ber.Integer);\n\t\tder.endSequence();\n\n\t\t// Curve sequence\n\t\tder.startSequence();\n\t\tvar a = curve.p;\n\t\tif (a[0] === 0x0)\n\t\t\ta = a.slice(1);\n\t\tder.writeBuffer(a, asn1.Ber.OctetString);\n\t\tder.writeBuffer(curve.b, asn1.Ber.OctetString);\n\t\tder.writeBuffer(curve.s, asn1.Ber.BitString);\n\t\tder.endSequence();\n\n\t\tder.writeBuffer(curve.G, asn1.Ber.OctetString);\n\t\tder.writeBuffer(curve.n, asn1.Ber.Integer);\n\t\tvar h = curve.h;\n\t\tif (!h) {\n\t\t\th = Buffer.from([1]);\n\t\t}\n\t\tder.writeBuffer(h, asn1.Ber.Integer);\n\n\t\t// ECParameters\n\t\tder.endSequence();\n\t}\n}\n\nfunction writePkcs8ECDSAPublic(key, der) {\n\twriteECDSACurve(key, der);\n\tder.endSequence();\n\n\tvar Q = utils.ecNormalize(key.part.Q.data, true);\n\tder.writeBuffer(Q, asn1.Ber.BitString);\n}\n\nfunction writePkcs8ECDSAPrivate(key, der) {\n\twriteECDSACurve(key, der);\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.startSequence();\n\n\tvar version = Buffer.from([1]);\n\tder.writeBuffer(version, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.d.data, asn1.Ber.OctetString);\n\n\tder.startSequence(0xa1);\n\tvar Q = utils.ecNormalize(key.part.Q.data, true);\n\tder.writeBuffer(Q, asn1.Ber.BitString);\n\tder.endSequence();\n\n\tder.endSequence();\n\tder.endSequence();\n}\n\nfunction writePkcs8EdDSAPublic(key, der) {\n\tder.endSequence();\n\n\tutils.writeBitString(der, key.part.A.data);\n}\n\nfunction writePkcs8EdDSAPrivate(key, der) {\n\tder.endSequence();\n\n\tvar k = utils.mpNormalize(key.part.k.data, true);\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.writeBuffer(k, asn1.Ber.OctetString);\n\tder.endSequence();\n}\n"]},"metadata":{},"sourceType":"script"} |