var __extends = (this && this.__extends) || (function () { 
 | 
    var extendStatics = function (d, b) { 
 | 
        extendStatics = Object.setPrototypeOf || 
 | 
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 
 | 
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; 
 | 
        return extendStatics(d, b); 
 | 
    }; 
 | 
    return function (d, b) { 
 | 
        if (typeof b !== "function" && b !== null) 
 | 
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); 
 | 
        extendStatics(d, b); 
 | 
        function __() { this.constructor = d; } 
 | 
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 
 | 
    }; 
 | 
})(); 
 | 
import { hex2b64 } from "./lib/jsbn/base64"; 
 | 
import { Hex } from "./lib/asn1js/hex"; 
 | 
import { Base64 } from "./lib/asn1js/base64"; 
 | 
import { ASN1 } from "./lib/asn1js/asn1"; 
 | 
import { RSAKey } from "./lib/jsbn/rsa"; 
 | 
import { parseBigInt } from "./lib/jsbn/jsbn"; 
 | 
import { KJUR } from "./lib/jsrsasign/asn1-1.0"; 
 | 
/** 
 | 
 * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object. 
 | 
 * This object is just a decorator for parsing the key parameter 
 | 
 * @param {string|Object} key - The key in string format, or an object containing 
 | 
 * the parameters needed to build a RSAKey object. 
 | 
 * @constructor 
 | 
 */ 
 | 
var JSEncryptRSAKey = /** @class */ (function (_super) { 
 | 
    __extends(JSEncryptRSAKey, _super); 
 | 
    function JSEncryptRSAKey(key) { 
 | 
        var _this = _super.call(this) || this; 
 | 
        // Call the super constructor. 
 | 
        //  RSAKey.call(this); 
 | 
        // If a key key was provided. 
 | 
        if (key) { 
 | 
            // If this is a string... 
 | 
            if (typeof key === "string") { 
 | 
                _this.parseKey(key); 
 | 
            } 
 | 
            else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) || 
 | 
                JSEncryptRSAKey.hasPublicKeyProperty(key)) { 
 | 
                // Set the values for the key. 
 | 
                _this.parsePropertiesFrom(key); 
 | 
            } 
 | 
        } 
 | 
        return _this; 
 | 
    } 
 | 
    /** 
 | 
     * Method to parse a pem encoded string containing both a public or private key. 
 | 
     * The method will translate the pem encoded string in a der encoded string and 
 | 
     * will parse private key and public key parameters. This method accepts public key 
 | 
     * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1). 
 | 
     * 
 | 
     * @todo Check how many rsa formats use the same format of pkcs #1. 
 | 
     * 
 | 
     * The format is defined as: 
 | 
     * PublicKeyInfo ::= SEQUENCE { 
 | 
     *   algorithm       AlgorithmIdentifier, 
 | 
     *   PublicKey       BIT STRING 
 | 
     * } 
 | 
     * Where AlgorithmIdentifier is: 
 | 
     * AlgorithmIdentifier ::= SEQUENCE { 
 | 
     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm 
 | 
     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1) 
 | 
     * } 
 | 
     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING 
 | 
     * RSAPublicKey ::= SEQUENCE { 
 | 
     *   modulus           INTEGER,  -- n 
 | 
     *   publicExponent    INTEGER   -- e 
 | 
     * } 
 | 
     * it's possible to examine the structure of the keys obtained from openssl using 
 | 
     * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/ 
 | 
     * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.parseKey = function (pem) { 
 | 
        try { 
 | 
            var modulus = 0; 
 | 
            var public_exponent = 0; 
 | 
            var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/; 
 | 
            var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem); 
 | 
            var asn1 = ASN1.decode(der); 
 | 
            // Fixes a bug with OpenSSL 1.0+ private keys 
 | 
            if (asn1.sub.length === 3) { 
 | 
                asn1 = asn1.sub[2].sub[0]; 
 | 
            } 
 | 
            if (asn1.sub.length === 9) { 
 | 
                // Parse the private key. 
 | 
                modulus = asn1.sub[1].getHexStringValue(); // bigint 
 | 
                this.n = parseBigInt(modulus, 16); 
 | 
                public_exponent = asn1.sub[2].getHexStringValue(); // int 
 | 
                this.e = parseInt(public_exponent, 16); 
 | 
                var private_exponent = asn1.sub[3].getHexStringValue(); // bigint 
 | 
                this.d = parseBigInt(private_exponent, 16); 
 | 
                var prime1 = asn1.sub[4].getHexStringValue(); // bigint 
 | 
                this.p = parseBigInt(prime1, 16); 
 | 
                var prime2 = asn1.sub[5].getHexStringValue(); // bigint 
 | 
                this.q = parseBigInt(prime2, 16); 
 | 
                var exponent1 = asn1.sub[6].getHexStringValue(); // bigint 
 | 
                this.dmp1 = parseBigInt(exponent1, 16); 
 | 
                var exponent2 = asn1.sub[7].getHexStringValue(); // bigint 
 | 
                this.dmq1 = parseBigInt(exponent2, 16); 
 | 
                var coefficient = asn1.sub[8].getHexStringValue(); // bigint 
 | 
                this.coeff = parseBigInt(coefficient, 16); 
 | 
            } 
 | 
            else if (asn1.sub.length === 2) { 
 | 
                if (asn1.sub[0].sub) { 
 | 
                    // Parse ASN.1 SubjectPublicKeyInfo type as defined by X.509 
 | 
                    var bit_string = asn1.sub[1]; 
 | 
                    var sequence = bit_string.sub[0]; 
 | 
                    modulus = sequence.sub[0].getHexStringValue(); 
 | 
                    this.n = parseBigInt(modulus, 16); 
 | 
                    public_exponent = sequence.sub[1].getHexStringValue(); 
 | 
                    this.e = parseInt(public_exponent, 16); 
 | 
                } 
 | 
                else { 
 | 
                    // Parse ASN.1 RSAPublicKey type as defined by PKCS #1 
 | 
                    modulus = asn1.sub[0].getHexStringValue(); 
 | 
                    this.n = parseBigInt(modulus, 16); 
 | 
                    public_exponent = asn1.sub[1].getHexStringValue(); 
 | 
                    this.e = parseInt(public_exponent, 16); 
 | 
                } 
 | 
            } 
 | 
            else { 
 | 
                return false; 
 | 
            } 
 | 
            return true; 
 | 
        } 
 | 
        catch (ex) { 
 | 
            return false; 
 | 
        } 
 | 
    }; 
 | 
    /** 
 | 
     * Translate rsa parameters in a hex encoded string representing the rsa key. 
 | 
     * 
 | 
     * The translation follow the ASN.1 notation : 
 | 
     * RSAPrivateKey ::= SEQUENCE { 
 | 
     *   version           Version, 
 | 
     *   modulus           INTEGER,  -- n 
 | 
     *   publicExponent    INTEGER,  -- e 
 | 
     *   privateExponent   INTEGER,  -- d 
 | 
     *   prime1            INTEGER,  -- p 
 | 
     *   prime2            INTEGER,  -- q 
 | 
     *   exponent1         INTEGER,  -- d mod (p1) 
 | 
     *   exponent2         INTEGER,  -- d mod (q-1) 
 | 
     *   coefficient       INTEGER,  -- (inverse of q) mod p 
 | 
     * } 
 | 
     * @returns {string}  DER Encoded String representing the rsa private key 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.getPrivateBaseKey = function () { 
 | 
        var options = { 
 | 
            array: [ 
 | 
                new KJUR.asn1.DERInteger({ int: 0 }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.n }), 
 | 
                new KJUR.asn1.DERInteger({ int: this.e }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.d }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.p }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.q }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.dmp1 }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.dmq1 }), 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.coeff }), 
 | 
            ], 
 | 
        }; 
 | 
        var seq = new KJUR.asn1.DERSequence(options); 
 | 
        return seq.getEncodedHex(); 
 | 
    }; 
 | 
    /** 
 | 
     * base64 (pem) encoded version of the DER encoded representation 
 | 
     * @returns {string} pem encoded representation without header and footer 
 | 
     * @public 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function () { 
 | 
        return hex2b64(this.getPrivateBaseKey()); 
 | 
    }; 
 | 
    /** 
 | 
     * Translate rsa parameters in a hex encoded string representing the rsa public key. 
 | 
     * The representation follow the ASN.1 notation : 
 | 
     * PublicKeyInfo ::= SEQUENCE { 
 | 
     *   algorithm       AlgorithmIdentifier, 
 | 
     *   PublicKey       BIT STRING 
 | 
     * } 
 | 
     * Where AlgorithmIdentifier is: 
 | 
     * AlgorithmIdentifier ::= SEQUENCE { 
 | 
     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm 
 | 
     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1) 
 | 
     * } 
 | 
     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING 
 | 
     * RSAPublicKey ::= SEQUENCE { 
 | 
     *   modulus           INTEGER,  -- n 
 | 
     *   publicExponent    INTEGER   -- e 
 | 
     * } 
 | 
     * @returns {string} DER Encoded String representing the rsa public key 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.getPublicBaseKey = function () { 
 | 
        var first_sequence = new KJUR.asn1.DERSequence({ 
 | 
            array: [ 
 | 
                new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }), 
 | 
                new KJUR.asn1.DERNull(), 
 | 
            ], 
 | 
        }); 
 | 
        var second_sequence = new KJUR.asn1.DERSequence({ 
 | 
            array: [ 
 | 
                new KJUR.asn1.DERInteger({ bigint: this.n }), 
 | 
                new KJUR.asn1.DERInteger({ int: this.e }), 
 | 
            ], 
 | 
        }); 
 | 
        var bit_string = new KJUR.asn1.DERBitString({ 
 | 
            hex: "00" + second_sequence.getEncodedHex(), 
 | 
        }); 
 | 
        var seq = new KJUR.asn1.DERSequence({ 
 | 
            array: [first_sequence, bit_string], 
 | 
        }); 
 | 
        return seq.getEncodedHex(); 
 | 
    }; 
 | 
    /** 
 | 
     * base64 (pem) encoded version of the DER encoded representation 
 | 
     * @returns {string} pem encoded representation without header and footer 
 | 
     * @public 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function () { 
 | 
        return hex2b64(this.getPublicBaseKey()); 
 | 
    }; 
 | 
    /** 
 | 
     * wrap the string in block of width chars. The default value for rsa keys is 64 
 | 
     * characters. 
 | 
     * @param {string} str the pem encoded string without header and footer 
 | 
     * @param {Number} [width=64] - the length the string has to be wrapped at 
 | 
     * @returns {string} 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.wordwrap = function (str, width) { 
 | 
        width = width || 64; 
 | 
        if (!str) { 
 | 
            return str; 
 | 
        } 
 | 
        var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})"; 
 | 
        return str.match(RegExp(regex, "g")).join("\n"); 
 | 
    }; 
 | 
    /** 
 | 
     * Retrieve the pem encoded private key 
 | 
     * @returns {string} the pem encoded private key with header/footer 
 | 
     * @public 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.getPrivateKey = function () { 
 | 
        var key = "-----BEGIN RSA PRIVATE KEY-----\n"; 
 | 
        key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n"; 
 | 
        key += "-----END RSA PRIVATE KEY-----"; 
 | 
        return key; 
 | 
    }; 
 | 
    /** 
 | 
     * Retrieve the pem encoded public key 
 | 
     * @returns {string} the pem encoded public key with header/footer 
 | 
     * @public 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.getPublicKey = function () { 
 | 
        var key = "-----BEGIN PUBLIC KEY-----\n"; 
 | 
        key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n"; 
 | 
        key += "-----END PUBLIC KEY-----"; 
 | 
        return key; 
 | 
    }; 
 | 
    /** 
 | 
     * Check if the object contains the necessary parameters to populate the rsa modulus 
 | 
     * and public exponent parameters. 
 | 
     * @param {Object} [obj={}] - An object that may contain the two public key 
 | 
     * parameters 
 | 
     * @returns {boolean} true if the object contains both the modulus and the public exponent 
 | 
     * properties (n and e) 
 | 
     * @todo check for types of n and e. N should be a parseable bigInt object, E should 
 | 
     * be a parseable integer number 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.hasPublicKeyProperty = function (obj) { 
 | 
        obj = obj || {}; 
 | 
        return obj.hasOwnProperty("n") && obj.hasOwnProperty("e"); 
 | 
    }; 
 | 
    /** 
 | 
     * Check if the object contains ALL the parameters of an RSA key. 
 | 
     * @param {Object} [obj={}] - An object that may contain nine rsa key 
 | 
     * parameters 
 | 
     * @returns {boolean} true if the object contains all the parameters needed 
 | 
     * @todo check for types of the parameters all the parameters but the public exponent 
 | 
     * should be parseable bigint objects, the public exponent should be a parseable integer number 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.hasPrivateKeyProperty = function (obj) { 
 | 
        obj = obj || {}; 
 | 
        return (obj.hasOwnProperty("n") && 
 | 
            obj.hasOwnProperty("e") && 
 | 
            obj.hasOwnProperty("d") && 
 | 
            obj.hasOwnProperty("p") && 
 | 
            obj.hasOwnProperty("q") && 
 | 
            obj.hasOwnProperty("dmp1") && 
 | 
            obj.hasOwnProperty("dmq1") && 
 | 
            obj.hasOwnProperty("coeff")); 
 | 
    }; 
 | 
    /** 
 | 
     * Parse the properties of obj in the current rsa object. Obj should AT LEAST 
 | 
     * include the modulus and public exponent (n, e) parameters. 
 | 
     * @param {Object} obj - the object containing rsa parameters 
 | 
     * @private 
 | 
     */ 
 | 
    JSEncryptRSAKey.prototype.parsePropertiesFrom = function (obj) { 
 | 
        this.n = obj.n; 
 | 
        this.e = obj.e; 
 | 
        if (obj.hasOwnProperty("d")) { 
 | 
            this.d = obj.d; 
 | 
            this.p = obj.p; 
 | 
            this.q = obj.q; 
 | 
            this.dmp1 = obj.dmp1; 
 | 
            this.dmq1 = obj.dmq1; 
 | 
            this.coeff = obj.coeff; 
 | 
        } 
 | 
    }; 
 | 
    return JSEncryptRSAKey; 
 | 
}(RSAKey)); 
 | 
export { JSEncryptRSAKey }; 
 |