Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
BEGIN LICENSE BLOCK ***** Version: CPL 1.0/GPL 2.0/LGPL 2.1 The contents of this file are subject to the Common Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.eclipse.org/legal/cpl-v10.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. Copyright (C) 2006, 2007 Ola Bini <ola@ologix.com> Alternatively, the contents of this file may be used under the terms of either of the GNU General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the CPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the CPL, the GPL or the LGPL. END LICENSE BLOCK ***
 
 package org.jruby.ext.openssl;
 
 
 
 import org.jruby.Ruby;

Author(s):
Ola Bini
 
 public class PKeyRSA extends PKey {
     private static final long serialVersionUID = 3675324750727019454L;
 
     private static ObjectAllocator PKEYRSA_ALLOCATOR = new ObjectAllocator() {
         public IRubyObject allocate(Ruby runtimeRubyClass klass) {
             return new PKeyRSA(runtimeklass);
         }
     };
     
     public static void createPKeyRSA(Ruby runtimeRubyModule mPKey) {
         RubyClass cRSA = mPKey.defineClassUnder("RSA",mPKey.getClass("PKey"),);
         RubyClass pkeyError = mPKey.getClass("PKeyError");
         mPKey.defineClassUnder("RSAError",pkeyError,pkeyError.getAllocator());
 
         cRSA.defineAnnotatedMethods(PKeyRSA.class);
 
         cRSA.setConstant("PKCS1_PADDING",runtime.newFixnum(1));
         cRSA.setConstant("SSLV23_PADDING",runtime.newFixnum(2));
         cRSA.setConstant("NO_PADDING",runtime.newFixnum(3));
         cRSA.setConstant("PKCS1_OAEP_PADDING",runtime.newFixnum(4));
    }
 
     public static RaiseException newRSAError(Ruby runtimeString message) {
         return Utils.newError(runtime"OpenSSL::PKey::RSAError"message);
     }
 
     public PKeyRSA(Ruby runtimeRubyClass type) {
        super(runtimetype);
    }
    public PKeyRSA(Ruby runtimeRubyClass typeRSAPrivateCrtKey privKeyRSAPublicKey pubKey) {
        super(runtimetype);
        this. = privKey;
        this. = pubKey;
    }
    public PKeyRSA(Ruby runtimeRubyClass typeRSAPublicKey pubKey) {
        this(runtimetypenullpubKey);
    }
    private transient volatile RSAPrivateCrtKey privKey;
    private transient volatile RSAPublicKey pubKey;
    
    // fields to hold individual RSAPublicKeySpec components. this allows
    // a public key to be constructed incrementally, as required by the
    // current implementation of Net::SSH.
    // (see net-ssh-1.1.2/lib/net/ssh/transport/ossl/buffer.rb #read_keyblob)
    private transient volatile BigInteger rsa_e;
    private transient volatile BigInteger rsa_n;
    private transient volatile BigInteger rsa_d;
    private transient volatile BigInteger rsa_p;
    private transient volatile BigInteger rsa_q;
    private transient volatile BigInteger rsa_dmp1;
    private transient volatile BigInteger rsa_dmq1;
    private transient volatile BigInteger rsa_iqmp;
    
    @Override
        return ;
    }
    @Override
        return ;
    }
    @Override
    String getAlgorithm() {
        return "RSA";
    }
    @JRubyMethod(name = "generate", meta = true, rest = true)
    public static IRubyObject generate(IRubyObject recvIRubyObject[] args) {
        BigInteger exp = .;
        if (Arity.checkArgumentCount(recv.getRuntime(), args, 1, 2) == 2) {
            if (args[1] instanceof RubyFixnum) {
                exp = BigInteger.valueOf(RubyNumeric.num2long(args[1]));
            } else {
                exp = ((RubyBignumargs[1]).getValue();
            }
        }
        int keysize = RubyNumeric.fix2int(args[0]);
        PKeyRSA rsa = new PKeyRSA(recv.getRuntime(), (RubyClassrecv);
        rsaGenerate(rsakeysizeexp);
        return rsa;
    }
    /*
     * c: rsa_generate
     */
    private static void rsaGenerate(PKeyRSA rsaint keysizeBigInteger expthrows RaiseException {
        try {
            KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
            gen.initialize(new RSAKeyGenParameterSpec(keysizeexp), new SecureRandom());
            KeyPair pair = gen.generateKeyPair();
            rsa.privKey = (RSAPrivateCrtKey) (pair.getPrivate());
            rsa.pubKey = (RSAPublicKey) (pair.getPublic());
        } catch (Exception e) {
            throw newRSAError(rsa.getRuntime(), e.getMessage());
        }
    }
    @JRubyMethod(frame = true, rest = true)
    public IRubyObject initialize(IRubyObject[] argsBlock block) {
        IRubyObject arg;
        IRubyObject pass = null;
        char[] passwd = null;
        if (org.jruby.runtime.Arity.checkArgumentCount(getRuntime(), args, 0, 2) == 0) {
             = null;
             = null;
        } else {
            arg = args[0];
            if (args.length > 1) {
                pass = args[1];
            }
            if (arg instanceof RubyFixnum) {
                int keysize = RubyNumeric.fix2int(arg);
                BigInteger exp = .;
                if (null != pass && !pass.isNil()) {
                    exp = BigInteger.valueOf(RubyNumeric.num2long(pass));
                }
                rsaGenerate(thiskeysizeexp);
            } else {
                if (pass != null && !pass.isNil()) {
                    passwd = pass.toString().toCharArray();
                }
                arg = OpenSSLImpl.to_der_if_possible(arg);
                RubyString str = arg.convertToString();
                Object val = null;
                KeyFactory fact = null;
                try {
                    fact = KeyFactory.getInstance("RSA");
                } catch (Exception e) {
                    throw getRuntime().newRuntimeError("unsupported key algorithm (RSA)");
                }
                // TODO: ugly NoClassDefFoundError catching for no BC env. How can we remove this?
                if (null == val) {
                    // PEM_read_bio_RSAPrivateKey
                    try {
                        val = PEMInputOutput.readPrivateKey(new StringReader(str.toString()), passwd);
                    } catch (NoClassDefFoundError e) {
                        val = null;
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    // PEM_read_bio_RSAPublicKey
                    try {
                        val = PEMInputOutput.readRSAPublicKey(new StringReader(str.toString()), passwd);
                    } catch (NoClassDefFoundError e) {
                        val = null;
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    // PEM_read_bio_RSA_PUBKEY
                    try {
                        val = PEMInputOutput.readRSAPubKey(new StringReader(str.toString()));
                    } catch (NoClassDefFoundError e) {
                        val = null;
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    // d2i_RSAPrivateKey_bio
                    try {
                        val = org.jruby.ext.openssl.impl.PKey.readRSAPrivateKey(str.getBytes());
                    } catch (NoClassDefFoundError e) {
                        val = null;
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    // d2i_RSAPublicKey_bio
                    try {
                        val = org.jruby.ext.openssl.impl.PKey.readRSAPublicKey(str.getBytes());
                    } catch (NoClassDefFoundError e) {
                        val = null;
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    // try to read PrivateKeyInfo.
                    try {
                        val = fact.generatePrivate(new PKCS8EncodedKeySpec(str.getBytes()));
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    // try to read SubjectPublicKeyInfo.
                    try {
                        val = fact.generatePublic(new X509EncodedKeySpec(str.getBytes()));
                    } catch (Exception e) {
                        val = null;
                    }
                }
                if (null == val) {
                    throw newRSAError(getRuntime(), "Neither PUB key nor PRIV key:");
                }
                if (val instanceof KeyPair) {
                    PrivateKey privateKey = ((KeyPairval).getPrivate();
                    PublicKey publicKey = ((KeyPairval).getPublic();
                    if (privateKey instanceof RSAPrivateCrtKey) {
                         = (RSAPrivateCrtKeyprivateKey;
                         = (RSAPublicKeypublicKey;
                    } else {
                        throw newRSAError(getRuntime(), "Neither PUB key nor PRIV key:");
                    }
                } else if (val instanceof RSAPrivateCrtKey) {
                     = (RSAPrivateCrtKeyval;
                    try {
                         = (RSAPublicKey) (fact.generatePublic(new RSAPublicKeySpec(.getModulus(), .getPublicExponent())));
                    } catch (Exception e) {
                        throw newRSAError(getRuntime(), "Something rotten with private key");
                    }
                } else if (val instanceof RSAPublicKey) {
                     = (RSAPublicKeyval;
                     = null;
                } else {
                    throw newRSAError(getRuntime(), "Neither PUB key nor PRIV key:");
                }
            }
        }
        return this;
    }
    @JRubyMethod(name="public?")
    public IRubyObject public_p() {
        return  != null ? getRuntime().getTrue() : getRuntime().getFalse();
    }
    @JRubyMethod(name="private?")
    public IRubyObject private_p() {
        return  != null ? getRuntime().getTrue() : getRuntime().getFalse();
    }
    public IRubyObject to_der() {
        try {
            byte[] bytes = org.jruby.ext.openssl.impl.PKey.toDerRSAKey();
            return RubyString.newString(getRuntime(), bytes);
        } catch (NoClassDefFoundError ncdfe) {
            throw newRSAError(getRuntime(), OpenSSLReal.bcExceptionMessage(ncdfe));
        } catch (IOException ioe) {
            throw newRSAError(getRuntime(), ioe.getMessage());
        }
    }
    public IRubyObject public_key() {
        PKeyRSA val = new PKeyRSA(getRuntime(),getMetaClass().getRealClass());
        val.privKey = null;
        val.pubKey = this.;
        return val;
    }
    public IRubyObject params() {
        ThreadContext ctx = getRuntime().getCurrentContext();
        RubyHash hash = RubyHash.newHash(getRuntime());
        if( != null) {
            hash.op_aset(ctxgetRuntime().newString("iqmp"), BN.newBN(getRuntime(), .getCrtCoefficient()));
            hash.op_aset(ctxgetRuntime().newString("n"), BN.newBN(getRuntime(), .getModulus()));
            hash.op_aset(ctxgetRuntime().newString("d"), BN.newBN(getRuntime(), .getPrivateExponent()));
            hash.op_aset(ctxgetRuntime().newString("p"), BN.newBN(getRuntime(), .getPrimeP()));
            hash.op_aset(ctxgetRuntime().newString("e"), BN.newBN(getRuntime(), .getPublicExponent()));
            hash.op_aset(ctxgetRuntime().newString("q"), BN.newBN(getRuntime(), .getPrimeQ()));
            hash.op_aset(ctxgetRuntime().newString("dmq1"), BN.newBN(getRuntime(), .getPrimeExponentQ()));
            hash.op_aset(ctxgetRuntime().newString("dmp1"), BN.newBN(getRuntime(), .getPrimeExponentP()));
            
        } else {
            hash.op_aset(ctxgetRuntime().newString("iqmp"), BN.newBN(getRuntime(), .));
            hash.op_aset(ctxgetRuntime().newString("n"), BN.newBN(getRuntime(), .getModulus()));
            hash.op_aset(ctxgetRuntime().newString("d"), BN.newBN(getRuntime(), .));
            hash.op_aset(ctxgetRuntime().newString("p"), BN.newBN(getRuntime(), .));
            hash.op_aset(ctxgetRuntime().newString("e"), BN.newBN(getRuntime(), .getPublicExponent()));
            hash.op_aset(ctxgetRuntime().newString("q"), BN.newBN(getRuntime(), .));
            hash.op_aset(ctxgetRuntime().newString("dmq1"), BN.newBN(getRuntime(), .));
            hash.op_aset(ctxgetRuntime().newString("dmp1"), BN.newBN(getRuntime(), .));
        }
        return hash;
    }
    public IRubyObject to_text() {
        StringBuilder result = new StringBuilder();
        if ( != null) {
            int len = .getModulus().bitLength();
            result.append("Private-Key: (").append(len).append(" bit)").append("\n");
            result.append("modulus:");
            addSplittedAndFormatted(result.getModulus());
            result.append("publicExponent: ").append(.getPublicExponent()).append(" (0x").append(.getPublicExponent().toString(16)).append(")\n");
            result.append("privateExponent:");
            addSplittedAndFormatted(result.getPrivateExponent());
            result.append("prime1:");
            addSplittedAndFormatted(result.getPrimeP());
            result.append("prime2:");
            addSplittedAndFormatted(result.getPrimeQ());
            result.append("exponent1:");
            addSplittedAndFormatted(result.getPrimeExponentP());
            result.append("exponent2:");
            addSplittedAndFormatted(result.getPrimeExponentQ());
            result.append("coefficient:");
            addSplittedAndFormatted(result.getCrtCoefficient());
        } else {
            int len = .getModulus().bitLength();
            result.append("Modulus (").append(len).append(" bit):");
            addSplittedAndFormatted(result.getModulus());
            result.append("Exponent: ").append(.getPublicExponent()).append(" (0x").append(.getPublicExponent().toString(16)).append(")\n");
        }
        return getRuntime().newString(result.toString());
    }
    @JRubyMethod(name = { "export""to_pem""to_s" }, rest = true)
    public IRubyObject export(IRubyObject[] args) {
        StringWriter w = new StringWriter();
        org.jruby.runtime.Arity.checkArgumentCount(getRuntime(), args, 0, 2);
        CipherSpec ciph = null;
        char[] passwd = null;
        if (args.length > 0 && !args[0].isNil()) {
            org.jruby.ext.openssl.Cipher c = (org.jruby.ext.openssl.Cipherargs[0];
            ciph = new CipherSpec(c.getCipher(), c.getName(), c.getKeyLen() * 8);
            if (args.length > 1 && !args[1].isNil()) {
                passwd = args[1].toString().toCharArray();
            }
        }
        try {
            if ( != null) {
                PEMInputOutput.writeRSAPrivateKey(wciphpasswd);
            } else {
                PEMInputOutput.writeRSAPublicKey(w);
            }
            w.close();
            return getRuntime().newString(w.toString());
        } catch (NoClassDefFoundError ncdfe) {
            throw newRSAError(getRuntime(), OpenSSLReal.bcExceptionMessage(ncdfe));
        } catch (IOException ioe) {
            throw newRSAError(getRuntime(), ioe.getMessage());
        }
    }
    private String getPadding(int padding) {
        if(padding < 1 || padding > 4) {
            throw newRSAError(getRuntime(), null);
        }
        // BC accepts "/NONE/*" but SunJCE doesn't. use "/ECB/*"
        String p = "/ECB/PKCS1Padding";
        if(padding == 3) {
            p = "/ECB/NoPadding";
        } else if(padding == 4) {
            p = "/ECB/OAEPWithMD5AndMGF1Padding";
        } else if(padding == 2) {
            p = "/ECB/ISO9796-1Padding";
        }
        return p;
    }        
    @JRubyMethod(rest = true)
    public IRubyObject private_encrypt(IRubyObject[] args) {
        int padding = 1;
        if (org.jruby.runtime.Arity.checkArgumentCount(getRuntime(), args, 1, 2) == 2 && !args[1].isNil()) {
            padding = RubyNumeric.fix2int(args[1]);
        }
        String p = getPadding(padding);
        RubyString buffer = args[0].convertToString();
        if ( == null) {
            throw newRSAError(getRuntime(), "private key needed.");
        }
        try {
            Cipher engine = Cipher.getInstance("RSA" + p);
            engine.init(.);
            byte[] outp = engine.doFinal(buffer.getBytes());
            return RubyString.newString(getRuntime(), outp);
        } catch (GeneralSecurityException gse) {
            throw newRSAError(getRuntime(), gse.getMessage());
        }
    }
    @JRubyMethod(rest = true)
    public IRubyObject private_decrypt(IRubyObject[] args) {
        int padding = 1;
        if (org.jruby.runtime.Arity.checkArgumentCount(getRuntime(), args, 1, 2) == 2 && !args[1].isNil()) {
            padding = RubyNumeric.fix2int(args[1]);
        }
        String p = getPadding(padding);
        RubyString buffer = args[0].convertToString();
        if ( == null) {
            throw newRSAError(getRuntime(), "private key needed.");
        }
        try {
            Cipher engine = Cipher.getInstance("RSA" + p);
            engine.init(.);
            byte[] outp = engine.doFinal(buffer.getBytes());
            return RubyString.newString(getRuntime(), outp);
        } catch (GeneralSecurityException gse) {
            throw newRSAError(getRuntime(), gse.getMessage());
        }
    }
    @JRubyMethod(rest = true)
    public IRubyObject public_encrypt(IRubyObject[] args) {
        int padding = 1;
        if (org.jruby.runtime.Arity.checkArgumentCount(getRuntime(), args, 1, 2) == 2 && !args[1].isNil()) {
            padding = RubyNumeric.fix2int(args[1]);
        }
        String p = getPadding(padding);
        RubyString buffer = args[0].convertToString();
        try {
            Cipher engine = Cipher.getInstance("RSA" + p);
            engine.init(.);
            byte[] outp = engine.doFinal(buffer.getBytes());
            return RubyString.newString(getRuntime(), outp);
        } catch (GeneralSecurityException gse) {
            throw newRSAError(getRuntime(), gse.getMessage());
        }
    }
    @JRubyMethod(rest = true)
    public IRubyObject public_decrypt(IRubyObject[] args) {
        int padding = 1;
        if (org.jruby.runtime.Arity.checkArgumentCount(getRuntime(), args, 1, 2) == 2 && !args[1].isNil()) {
            padding = RubyNumeric.fix2int(args[1]);
        }
        String p = getPadding(padding);
        RubyString buffer = args[0].convertToString();
        try {
            Cipher engine = Cipher.getInstance("RSA" + p);
            engine.init(.);
            byte[] outp = engine.doFinal(buffer.getBytes());
            return RubyString.newString(getRuntime(), outp);
        } catch (GeneralSecurityException gse) {
            throw newRSAError(getRuntime(), gse.getMessage());
        }
    }
    @JRubyMethod(name="d=")
    public synchronized IRubyObject set_d(IRubyObject value) {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
         = BN.getBigInteger(value);
        return value;
    }
    @JRubyMethod(name="p=")
    public synchronized IRubyObject set_p(IRubyObject value) {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
         = BN.getBigInteger(value);
        return value;
    }
    @JRubyMethod(name="q=")
    public synchronized IRubyObject set_q(IRubyObject value) {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
         = BN.getBigInteger(value);
        return value;
    }
    @JRubyMethod(name="dmp1=")
    public synchronized IRubyObject set_dmp1(IRubyObject value) {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
         = BN.getBigInteger(value);
        return value;
    }
    @JRubyMethod(name="dmq1=")
    public synchronized IRubyObject set_dmq1(IRubyObject value) {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
         = BN.getBigInteger(value);
        return value;
    }
    @JRubyMethod(name="iqmp=")
    public synchronized IRubyObject set_iqmp(IRubyObject value) {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
         = BN.getBigInteger(value);
        return value;
    }
    @JRubyMethod(name="iqmp")
    public synchronized IRubyObject get_iqmp() {
        BigInteger iqmp = null;
        if ( != null) {
            iqmp = .getCrtCoefficient();
        } else {
            iqmp = ;
        }
        if (iqmp != null) {
            return BN.newBN(getRuntime(), iqmp);
        }
        return getRuntime().getNil();
    }
    @JRubyMethod(name="dmp1")
    public synchronized IRubyObject get_dmp1() {
        BigInteger dmp1 = null;
        if ( != null) {
            dmp1 = .getPrimeExponentP();
        } else {
            dmp1 = ;
        }
        if (dmp1 != null) {
            return BN.newBN(getRuntime(), dmp1);
        }
        return getRuntime().getNil();
    }
    @JRubyMethod(name="dmq1")
    public synchronized IRubyObject get_dmq1() {
        BigInteger dmq1 = null;
        if ( != null) {
            dmq1 = .getPrimeExponentQ();
        } else {
            dmq1 = ;
        }
        if (dmq1 != null) {
            return BN.newBN(getRuntime(), dmq1);
        }
        return getRuntime().getNil();
    }
    @JRubyMethod(name="d")
    public synchronized IRubyObject get_d() {
        BigInteger d = null;
        if ( != null) {
            d = .getPrivateExponent();
        } else {
            d = ;
        }
        if (d != null) {
            return BN.newBN(getRuntime(), d);
        }
        return getRuntime().getNil();
    }
    @JRubyMethod(name="p")
    public synchronized IRubyObject get_p() {
        BigInteger p = null;
        if ( != null) {
            p = .getPrimeP();
        } else {
            p = ;
        }
        if (p != null) {
            return BN.newBN(getRuntime(), p);
        }
        return getRuntime().getNil();
    }
    @JRubyMethod(name="q")
    public synchronized IRubyObject get_q() {
        BigInteger q = null;
        if ( != null) {
            q = .getPrimeQ();
        } else {
            q = ;
        }
        if (q != null) {
            return BN.newBN(getRuntime(), q);
        }
        return getRuntime().getNil();
    }
    @JRubyMethod(name="e")
    public synchronized IRubyObject get_e() {
        RSAPublicKey key;
        BigInteger e;
        if ((key = ) != null) {
            e = key.getPublicExponent();
        } else if( != null) {
            e = .getPublicExponent();
        } else {
            e = ;
        }
        if (e != null) {
            return BN.newBN(getRuntime(), e);
        }
        return getRuntime().getNil();
    }
    
    @JRubyMethod(name="e=")
    public synchronized IRubyObject set_e(IRubyObject value) {
         = BN.getBigInteger(value);
        if( == null) {
            generatePrivateKeyIfParams();
        }
        if( == null) {
            generatePublicKeyIfParams();
        }
        return value;
    }
    
    @JRubyMethod(name="n")
    public synchronized IRubyObject get_n() {
        RSAPublicKey key;
        BigInteger n;
        if ((key = ) != null) {
            n = key.getModulus();
        } else if( != null) {
            n = .getModulus();
        } else {
            n = ;
        }
        if (n != null) {
            return BN.newBN(getRuntime(), n);
        }
        return getRuntime().getNil();
    }
    
    @JRubyMethod(name="n=")
    public synchronized IRubyObject set_n(IRubyObject value) {
         = BN.getBigInteger(value);
        if( == null) {
            generatePrivateKeyIfParams();
        }
        if( == null) {
            generatePublicKeyIfParams();
        }
        return value;
    }
    
    private void generatePublicKeyIfParams() {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
        BigInteger en;
        if ((e = ) != null && (n = ) != null) {
            KeyFactory fact;
            try {
                fact = KeyFactory.getInstance("RSA");
            } catch(Exception ex) {
                throw getRuntime().newLoadError("unsupported key algorithm (RSA)");
            }
            try {
                 = (RSAPublicKey)fact.generatePublic(new RSAPublicKeySpec(ne));
            } catch (InvalidKeySpecException ex) {
                throw newRSAError(getRuntime(), "invalid parameters");
            }
             = null;
             = null;
        }
    }
    
    private void generatePrivateKeyIfParams() {
        if ( != null) {
            throw newRSAError(getRuntime(), "illegal modification");
        }
        if ( != null &&  != null &&  != null &&  != null &&  != null &&  != null &&  != null &&  != null) {
            KeyFactory fact;
            try {
                fact = KeyFactory.getInstance("RSA");
            } catch(Exception ex) {
                throw getRuntime().newLoadError("unsupported key algorithm (RSA)");
            }
            try {
                 = (RSAPrivateCrtKey)fact.generatePrivate(new RSAPrivateCrtKeySpec());
            } catch (InvalidKeySpecException ex) {
                throw newRSAError(getRuntime(), "invalid parameters");
            }
             = null;
             = null;
             = null;
             = null;
             = null;
             = null;
             = null;
             = null;
        }
    }
}// PKeyRSA