aboutsummaryrefslogtreecommitdiffstats
path: root/java/com/jcraft/jsch/IdentityFile.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/jcraft/jsch/IdentityFile.java')
-rw-r--r--java/com/jcraft/jsch/IdentityFile.java950
1 files changed, 62 insertions, 888 deletions
diff --git a/java/com/jcraft/jsch/IdentityFile.java b/java/com/jcraft/jsch/IdentityFile.java
index cc66dfe2..4ffdaa7a 100644
--- a/java/com/jcraft/jsch/IdentityFile.java
+++ b/java/com/jcraft/jsch/IdentityFile.java
@@ -1,6 +1,6 @@
/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
/*
-Copyright (c) 2002-2012 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2002-2015 ymnk, JCraft,Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -31,926 +31,100 @@ package com.jcraft.jsch;
import java.io.*;
-@SuppressWarnings({"rawtypes","static"})
class IdentityFile implements Identity{
- String identity;
- byte[] key;
- byte[] iv;
private JSch jsch;
- private HASH hash;
- private byte[] encoded_data;
-
- private Cipher cipher;
-
- // DSA
- private byte[] P_array;
- private byte[] Q_array;
- private byte[] G_array;
- private byte[] pub_array;
- private byte[] prv_array;
-
- // RSA
- private byte[] n_array; // modulus
- private byte[] e_array; // public exponent
- private byte[] d_array; // private exponent
-
-// private String algname="ssh-dss";
- private String algname="ssh-rsa";
-
- private static final int ERROR=0;
- private static final int RSA=1;
- private static final int DSS=2;
- private static final int UNKNOWN=3;
-
- private static final int OPENSSH=0;
- private static final int FSECURE=1;
- private static final int PUTTY=2;
-
- private int type=ERROR;
- private int keytype=OPENSSH;
-
- private byte[] publickeyblob=null;
-
- private boolean encrypted=true;
+ private KeyPair kpair;
+ private String identity;
static IdentityFile newInstance(String prvfile, String pubfile, JSch jsch) throws JSchException{
- byte[] prvkey=null;
- byte[] pubkey=null;
-
- File file=null;
- FileInputStream fis=null;
- try{
- file=new File(prvfile);
- fis=new FileInputStream(prvfile);
- prvkey=new byte[(int)(file.length())];
- int len=0;
- while(true){
- int i=fis.read(prvkey, len, prvkey.length-len);
- if(i<=0)
- break;
- len+=i;
- }
- fis.close();
- }
- catch(Exception e){
- try{ if(fis!=null) fis.close();}
- catch(Exception ee){}
- if(e instanceof Throwable)
- throw new JSchException(e.toString(), (Throwable)e);
- throw new JSchException(e.toString());
- }
-
- String _pubfile=pubfile;
- if(pubfile==null){
- _pubfile=prvfile+".pub";
- }
-
- try{
- file=new File(_pubfile);
- fis = new FileInputStream(_pubfile);
- pubkey=new byte[(int)(file.length())];
- int len=0;
- while(true){
- int i=fis.read(pubkey, len, pubkey.length-len);
- if(i<=0)
- break;
- len+=i;
- }
- fis.close();
- }
- catch(Exception e){
- try{ if(fis!=null) fis.close();}
- catch(Exception ee){}
- if(pubfile!=null){
- // The pubfile is explicitry given, but not accessible.
- if(e instanceof Throwable)
- throw new JSchException(e.toString(), (Throwable)e);
- throw new JSchException(e.toString());
- }
- }
- return newInstance(prvfile, prvkey, pubkey, jsch);
+ KeyPair kpair = KeyPair.load(jsch, prvfile, pubfile);
+ return new IdentityFile(jsch, prvfile, kpair);
}
static IdentityFile newInstance(String name, byte[] prvkey, byte[] pubkey, JSch jsch) throws JSchException{
- try{
- return new IdentityFile(name, prvkey, pubkey, jsch);
- }
- finally{
- Util.bzero(prvkey);
- }
- }
-
- private IdentityFile(String name, byte[] prvkey, byte[] pubkey, JSch jsch) throws JSchException{
- this.identity=name;
- this.jsch=jsch;
-
- // prvkey from "ssh-add" command on the remote.
- if(pubkey==null &&
- prvkey!=null &&
- (prvkey.length>11 &&
- prvkey[0]==0 && prvkey[1]==0 && prvkey[2]==0 && prvkey[3]==7)){
-
- Buffer buf=new Buffer(prvkey);
- String _type = new String(buf.getString()); // ssh-rsa
-
- if(_type.equals("ssh-rsa")){
- type=RSA;
- n_array=buf.getString();
- e_array=buf.getString();
- d_array=buf.getString();
- buf.getString();
- buf.getString();
- buf.getString();
- this.identity += new String(buf.getString());
- }
- else if(_type.equals("ssh-dss")){
- type=DSS;
- P_array=buf.getString();
- Q_array=buf.getString();
- G_array=buf.getString();
- pub_array=buf.getString();
- prv_array=buf.getString();
- this.identity += new String(buf.getString());
- }
- else{
- throw new JSchException("privatekey: invalid key "+new String(prvkey, 4, 7));
- }
- encoded_data=prvkey;
- encrypted=false;
- keytype=OPENSSH;
- return;
- }
-
- /* TODO: IdentityFile should use KeyPair.
- * The following logic exists also in KeyPair. It is redundant.
- */
- try{
- Class c;
- c=Class.forName((String)jsch.getConfig("3des-cbc"));
- cipher=(Cipher)(c.newInstance());
- key=new byte[cipher.getBlockSize()]; // 24
- iv=new byte[cipher.getIVSize()]; // 8
- c=Class.forName((String)jsch.getConfig("md5"));
- hash=(HASH)(c.newInstance());
- hash.init();
-
- byte[] buf=prvkey;
- int len=buf.length;
-
- int i=0;
-
- while(i<len){
- if(buf[i] == '-' && i+4<len &&
- buf[i+1] == '-' && buf[i+2] == '-' &&
- buf[i+3] == '-' && buf[i+4] == '-'){
- break;
- }
- i++;
- }
-
- while(i<len){
- if(buf[i]=='B'&& i+3<len && buf[i+1]=='E'&& buf[i+2]=='G'&& buf[i+3]=='I'){
- i+=6;
- if(buf[i]=='D'&& buf[i+1]=='S'&& buf[i+2]=='A'){ type=DSS; }
- else if(buf[i]=='R'&& buf[i+1]=='S'&& buf[i+2]=='A'){ type=RSA; }
- else if(buf[i]=='S'&& buf[i+1]=='S'&& buf[i+2]=='H'){ // FSecure
- type=UNKNOWN;
- keytype=FSECURE;
- }
- else{
- //System.err.println("invalid format: "+identity);
- throw new JSchException("invalid privatekey: "+identity);
- }
- i+=3;
- continue;
- }
- if(buf[i]=='A'&& i+7<len && buf[i+1]=='E'&& buf[i+2]=='S'&& buf[i+3]=='-' &&
- buf[i+4]=='2'&& buf[i+5]=='5'&& buf[i+6]=='6'&& buf[i+7]=='-'){
- i+=8;
- if(Session.checkCipher((String)jsch.getConfig("aes256-cbc"))){
- c=Class.forName((String)jsch.getConfig("aes256-cbc"));
- cipher=(Cipher)(c.newInstance());
- key=new byte[cipher.getBlockSize()];
- iv=new byte[cipher.getIVSize()];
- }
- else{
- throw new JSchException("privatekey: aes256-cbc is not available "+identity);
- }
- continue;
- }
- if(buf[i]=='A'&& i+7<len && buf[i+1]=='E'&& buf[i+2]=='S'&& buf[i+3]=='-' &&
- buf[i+4]=='1'&& buf[i+5]=='9'&& buf[i+6]=='2'&& buf[i+7]=='-'){
- i+=8;
- if(Session.checkCipher((String)jsch.getConfig("aes192-cbc"))){
- c=Class.forName((String)jsch.getConfig("aes192-cbc"));
- cipher=(Cipher)(c.newInstance());
- key=new byte[cipher.getBlockSize()];
- iv=new byte[cipher.getIVSize()];
- }
- else{
- throw new JSchException("privatekey: aes192-cbc is not available "+identity);
- }
- continue;
- }
- if(buf[i]=='A'&& i+7<len && buf[i+1]=='E'&& buf[i+2]=='S'&& buf[i+3]=='-' &&
- buf[i+4]=='1'&& buf[i+5]=='2'&& buf[i+6]=='8'&& buf[i+7]=='-'){
- i+=8;
- if(Session.checkCipher((String)jsch.getConfig("aes128-cbc"))){
- c=Class.forName((String)jsch.getConfig("aes128-cbc"));
- cipher=(Cipher)(c.newInstance());
- key=new byte[cipher.getBlockSize()];
- iv=new byte[cipher.getIVSize()];
- }
- else{
- throw new JSchException("privatekey: aes128-cbc is not available "+identity);
- }
- continue;
- }
- if(buf[i]=='C'&& i+3<len && buf[i+1]=='B'&& buf[i+2]=='C'&& buf[i+3]==','){
- i+=4;
- for(int ii=0; ii<iv.length; ii++){
- iv[ii]=(byte)(((a2b(buf[i++])<<4)&0xf0)+
- (a2b(buf[i++])&0xf));
- }
- continue;
- }
- if(buf[i]==0x0d && i+1<len && buf[i+1]==0x0a){
- i++;
- continue;
- }
- if(buf[i]==0x0a && i+1<len){
- if(buf[i+1]==0x0a){ i+=2; break; }
- if(buf[i+1]==0x0d &&
- i+2<len && buf[i+2]==0x0a){
- i+=3; break;
- }
- boolean inheader=false;
- for(int j=i+1; j<len; j++){
- if(buf[j]==0x0a) break;
- //if(buf[j]==0x0d) break;
- if(buf[j]==':'){inheader=true; break;}
- }
- if(!inheader){
- i++;
- encrypted=false; // no passphrase
- break;
- }
- }
- i++;
- }
-
- if(type==ERROR){
- throw new JSchException("invalid privatekey: "+identity);
- }
-
- int start=i;
- while(i<len){
- if(buf[i]==0x0a){
- boolean xd=(buf[i-1]==0x0d);
- System.arraycopy(buf, i+1,
- buf,
- i-(xd ? 1 : 0),
- len-i-1-(xd ? 1 : 0)
- );
- if(xd)len--;
- len--;
- continue;
- }
- if(buf[i]=='-'){ break; }
- i++;
- }
- encoded_data=Util.fromBase64(buf, start, i-start);
-
- if(encoded_data.length>4 && // FSecure
- encoded_data[0]==(byte)0x3f &&
- encoded_data[1]==(byte)0x6f &&
- encoded_data[2]==(byte)0xf9 &&
- encoded_data[3]==(byte)0xeb){
-
- Buffer _buf=new Buffer(encoded_data);
- _buf.getInt(); // 0x3f6ff9be
- _buf.getInt();
- byte[]_type=_buf.getString();
- //System.err.println("type: "+new String(_type));
- byte[] _cipher=_buf.getString();
- String cipher=Util.byte2str(_cipher);
- //System.err.println("cipher: "+cipher);
- if(cipher.equals("3des-cbc")){
- _buf.getInt();
- byte[] foo=new byte[encoded_data.length-_buf.getOffSet()];
- _buf.getByte(foo);
- encoded_data=foo;
- encrypted=true;
- throw new JSchException("unknown privatekey format: "+identity);
- }
- else if(cipher.equals("none")){
- _buf.getInt();
- //_buf.getInt();
- encrypted=false;
-
- byte[] foo=new byte[encoded_data.length-_buf.getOffSet()];
- _buf.getByte(foo);
- encoded_data=foo;
- }
-
- }
-
- if(pubkey==null){
- return;
- }
-
- buf=pubkey;
- len=buf.length;
-
- if(buf.length>4 && // FSecure's public key
- buf[0]=='-' && buf[1]=='-' && buf[2]=='-' && buf[3]=='-'){
- i=0;
- do{i++;}while(len>i && buf[i]!=0x0a);
- if(len<=i) return;
- while(i<len){
- if(buf[i]==0x0a){
- boolean inheader=false;
- for(int j=i+1; j<len; j++){
- if(buf[j]==0x0a) break;
- if(buf[j]==':'){inheader=true; break;}
- }
- if(!inheader){
- i++;
- break;
- }
- }
- i++;
- }
- if(len<=i) return;
-
- start=i;
- while(i<len){
- if(buf[i]==0x0a){
- System.arraycopy(buf, i+1, buf, i, len-i-1);
- len--;
- continue;
- }
- if(buf[i]=='-'){ break; }
- i++;
- }
- publickeyblob=Util.fromBase64(buf, start, i-start);
-
- if(type==UNKNOWN && publickeyblob.length>8){
- if(publickeyblob[8]=='d'){
- type=DSS;
- }
- else if(publickeyblob[8]=='r'){
- type=RSA;
- }
- }
- }
- else{
- if(buf[0]!='s'|| buf[1]!='s'|| buf[2]!='h'|| buf[3]!='-') return;
- i=0;
- while(i<len){ if(buf[i]==' ')break; i++;} i++;
- if(i>=len) return;
- start=i;
- while(i<len){ if(buf[i]==' ' || buf[i]=='\n')break; i++;}
- publickeyblob=Util.fromBase64(buf, start, i-start);
- if(publickeyblob.length<4+7){ // It must start with "ssh-XXX".
- if(JSch.getLogger().isEnabled(Logger.WARN)){
- JSch.getLogger().log(Logger.WARN,
- "failed to parse the public key");
- }
- publickeyblob=null;
- }
- }
- }
- catch(Exception e){
- //System.err.println("IdentityFile: "+e);
- if(e instanceof JSchException) throw (JSchException)e;
- if(e instanceof Throwable)
- throw new JSchException(e.toString(), (Throwable)e);
- throw new JSchException(e.toString());
- }
+ KeyPair kpair = KeyPair.load(jsch, prvkey, pubkey);
+ return new IdentityFile(jsch, name, kpair);
}
- public String getAlgName(){
- if(type==RSA) return "ssh-rsa";
- return "ssh-dss";
+ private IdentityFile(JSch jsch, String name, KeyPair kpair) throws JSchException{
+ this.jsch = jsch;
+ this.identity = name;
+ this.kpair = kpair;
}
- public boolean setPassphrase(byte[] _passphrase) throws JSchException{
- /*
- hash is MD5
- h(0) <- hash(passphrase, iv);
- h(n) <- hash(h(n-1), passphrase, iv);
- key <- (h(0),...,h(n))[0,..,key.length];
- */
- try{
- if(encrypted){
- if(_passphrase==null) return false;
- byte[] passphrase=_passphrase;
- int hsize=hash.getBlockSize();
- byte[] hn=new byte[key.length/hsize*hsize+
- (key.length%hsize==0?0:hsize)];
- byte[] tmp=null;
- if(keytype==OPENSSH){
- for(int index=0; index+hsize<=hn.length;){
- if(tmp!=null){ hash.update(tmp, 0, tmp.length); }
- hash.update(passphrase, 0, passphrase.length);
- hash.update(iv, 0, iv.length > 8 ? 8: iv.length);
- tmp=hash.digest();
- System.arraycopy(tmp, 0, hn, index, tmp.length);
- index+=tmp.length;
- }
- System.arraycopy(hn, 0, key, 0, key.length);
- }
- else if(keytype==FSECURE){
- for(int index=0; index+hsize<=hn.length;){
- if(tmp!=null){ hash.update(tmp, 0, tmp.length); }
- hash.update(passphrase, 0, passphrase.length);
- tmp=hash.digest();
- System.arraycopy(tmp, 0, hn, index, tmp.length);
- index+=tmp.length;
- }
- System.arraycopy(hn, 0, key, 0, key.length);
- }
- Util.bzero(passphrase);
- }
- if(decrypt()){
- encrypted=false;
- return true;
- }
- P_array=Q_array=G_array=pub_array=prv_array=null;
- return false;
- }
- catch(Exception e){
- if(e instanceof JSchException) throw (JSchException)e;
- if(e instanceof Throwable)
- throw new JSchException(e.toString(), (Throwable)e);
- throw new JSchException(e.toString());
- }
+ /**
+ * Decrypts this identity with the specified pass-phrase.
+ * @param passphrase the pass-phrase for this identity.
+ * @return <tt>true</tt> if the decryption is succeeded
+ * or this identity is not cyphered.
+ */
+ public boolean setPassphrase(byte[] passphrase) throws JSchException{
+ return kpair.decrypt(passphrase);
}
+ /**
+ * Returns the public-key blob.
+ * @return the public-key blob
+ */
public byte[] getPublicKeyBlob(){
- if(publickeyblob!=null) return publickeyblob;
- if(type==RSA) return getPublicKeyBlob_rsa();
- return getPublicKeyBlob_dss();
- }
-
- byte[] getPublicKeyBlob_rsa(){
- if(e_array==null) return null;
- Buffer buf=new Buffer("ssh-rsa".length()+4+
- e_array.length+4+
- n_array.length+4);
- buf.putString(Util.str2byte("ssh-rsa"));
- buf.putString(e_array);
- buf.putString(n_array);
- return buf.buffer;
- }
-
- byte[] getPublicKeyBlob_dss(){
- if(P_array==null) return null;
- Buffer buf=new Buffer("ssh-dss".length()+4+
- P_array.length+4+
- Q_array.length+4+
- G_array.length+4+
- pub_array.length+4);
- buf.putString(Util.str2byte("ssh-dss"));
- buf.putString(P_array);
- buf.putString(Q_array);
- buf.putString(G_array);
- buf.putString(pub_array);
- return buf.buffer;
+ return kpair.getPublicKeyBlob();
}
+ /**
+ * Signs on data with this identity, and returns the result.
+ * @param data data to be signed
+ * @return the signature
+ */
public byte[] getSignature(byte[] data){
- if(type==RSA) return getSignature_rsa(data);
- return getSignature_dss(data);
- }
-
- byte[] getSignature_rsa(byte[] data){
- try{
- Class c=Class.forName((String)jsch.getConfig("signature.rsa"));
- SignatureRSA rsa=(SignatureRSA)(c.newInstance());
-
- rsa.init();
- rsa.setPrvKey(d_array, n_array);
-
- rsa.update(data);
- byte[] sig = rsa.sign();
- Buffer buf=new Buffer("ssh-rsa".length()+4+
- sig.length+4);
- buf.putString(Util.str2byte("ssh-rsa"));
- buf.putString(sig);
- return buf.buffer;
- }
- catch(Exception e){
- }
- return null;
- }
-
- byte[] getSignature_dss(byte[] data){
-/*
- byte[] foo;
- int i;
- System.err.print("P ");
- foo=P_array;
- for(i=0; i<foo.length; i++){
- System.err.print(Integer.toHexString(foo[i]&0xff)+":");
- }
- System.err.println("");
- System.err.print("Q ");
- foo=Q_array;
- for(i=0; i<foo.length; i++){
- System.err.print(Integer.toHexString(foo[i]&0xff)+":");
- }
- System.err.println("");
- System.err.print("G ");
- foo=G_array;
- for(i=0; i<foo.length; i++){
- System.err.print(Integer.toHexString(foo[i]&0xff)+":");
- }
- System.err.println("");
-*/
-
- try{
- Class c=Class.forName((String)jsch.getConfig("signature.dss"));
- SignatureDSA dsa=(SignatureDSA)(c.newInstance());
- dsa.init();
- dsa.setPrvKey(prv_array, P_array, Q_array, G_array);
-
- dsa.update(data);
- byte[] sig = dsa.sign();
- Buffer buf=new Buffer("ssh-dss".length()+4+
- sig.length+4);
- buf.putString(Util.str2byte("ssh-dss"));
- buf.putString(sig);
- return buf.buffer;
- }
- catch(Exception e){
- //System.err.println("e "+e);
- }
- return null;
+ return kpair.getSignature(data);
}
+ /**
+ * @deprecated This method should not be invoked.
+ * @see #setPassphrase(byte[] passphrase)
+ */
public boolean decrypt(){
- if(type==RSA) return decrypt_rsa();
- return decrypt_dss();
- }
-
- boolean decrypt_rsa(){
- byte[] p_array;
- byte[] q_array;
- byte[] dmp1_array;
- byte[] dmq1_array;
- byte[] iqmp_array;
-
- try{
- byte[] plain;
- if(encrypted){
- if(keytype==OPENSSH){
- cipher.init(Cipher.DECRYPT_MODE, key, iv);
- plain=new byte[encoded_data.length];
- cipher.update(encoded_data, 0, encoded_data.length, plain, 0);
- }
- else if(keytype==FSECURE){
- for(int i=0; i<iv.length; i++)iv[i]=0;
- cipher.init(Cipher.DECRYPT_MODE, key, iv);
- plain=new byte[encoded_data.length];
- cipher.update(encoded_data, 0, encoded_data.length, plain, 0);
- }
- else{
- return false;
- }
- }
- else{
- if(n_array!=null) return true;
- plain=encoded_data;
- }
-
- if(keytype==FSECURE){ // FSecure
- Buffer buf=new Buffer(plain);
- int foo=buf.getInt();
- if(plain.length!=foo+4){
- return false;
- }
- e_array=buf.getMPIntBits();
- d_array=buf.getMPIntBits();
- n_array=buf.getMPIntBits();
- byte[] u_array=buf.getMPIntBits();
- p_array=buf.getMPIntBits();
- q_array=buf.getMPIntBits();
- return true;
- }
-
- int index=0;
- int length=0;
-
- if(plain[index]!=0x30)return false;
- index++; // SEQUENCE
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
-
- if(plain[index]!=0x02)return false;
- index++; // INTEGER
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- index+=length;
-
-//System.err.println("int: len="+length);
-//System.err.print(Integer.toHexString(plain[index-1]&0xff)+":");
-//System.err.println("");
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- n_array=new byte[length];
- System.arraycopy(plain, index, n_array, 0, length);
- index+=length;
-/*
-System.err.println("int: N len="+length);
-for(int i=0; i<n_array.length; i++){
-System.err.print(Integer.toHexString(n_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- e_array=new byte[length];
- System.arraycopy(plain, index, e_array, 0, length);
- index+=length;
-/*
-System.err.println("int: E len="+length);
-for(int i=0; i<e_array.length; i++){
-System.err.print(Integer.toHexString(e_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- d_array=new byte[length];
- System.arraycopy(plain, index, d_array, 0, length);
- index+=length;
-/*
-System.err.println("int: D len="+length);
-for(int i=0; i<d_array.length; i++){
-System.err.print(Integer.toHexString(d_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- p_array=new byte[length];
- System.arraycopy(plain, index, p_array, 0, length);
- index+=length;
-/*
-System.err.println("int: P len="+length);
-for(int i=0; i<p_array.length; i++){
-System.err.print(Integer.toHexString(p_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- q_array=new byte[length];
- System.arraycopy(plain, index, q_array, 0, length);
- index+=length;
-/*
-System.err.println("int: q len="+length);
-for(int i=0; i<q_array.length; i++){
-System.err.print(Integer.toHexString(q_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- dmp1_array=new byte[length];
- System.arraycopy(plain, index, dmp1_array, 0, length);
- index+=length;
-/*
-System.err.println("int: dmp1 len="+length);
-for(int i=0; i<dmp1_array.length; i++){
-System.err.print(Integer.toHexString(dmp1_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- dmq1_array=new byte[length];
- System.arraycopy(plain, index, dmq1_array, 0, length);
- index+=length;
-/*
-System.err.println("int: dmq1 len="+length);
-for(int i=0; i<dmq1_array.length; i++){
-System.err.print(Integer.toHexString(dmq1_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- iqmp_array=new byte[length];
- System.arraycopy(plain, index, iqmp_array, 0, length);
- index+=length;
-/*
-System.err.println("int: iqmp len="+length);
-for(int i=0; i<iqmp_array.length; i++){
-System.err.print(Integer.toHexString(iqmp_array[i]&0xff)+":");
-}
-System.err.println("");
-*/
- }
- catch(Exception e){
- //System.err.println(e);
- return false;
- }
- return true;
- }
-
- boolean decrypt_dss(){
- try{
- byte[] plain;
- if(encrypted){
- if(keytype==OPENSSH){
- cipher.init(Cipher.DECRYPT_MODE, key, iv);
- plain=new byte[encoded_data.length];
- cipher.update(encoded_data, 0, encoded_data.length, plain, 0);
-/*
-for(int i=0; i<plain.length; i++){
-System.err.print(Integer.toHexString(plain[i]&0xff)+":");
-}
-System.err.println("");
-*/
- }
- else if(keytype==FSECURE){
- for(int i=0; i<iv.length; i++)iv[i]=0;
- cipher.init(Cipher.DECRYPT_MODE, key, iv);
- plain=new byte[encoded_data.length];
- cipher.update(encoded_data, 0, encoded_data.length, plain, 0);
- }
- else{
- return false;
- }
- }
- else{
- if(P_array!=null) return true;
- plain=encoded_data;
- }
-
- if(keytype==FSECURE){ // FSecure
- Buffer buf=new Buffer(plain);
- int foo=buf.getInt();
- if(plain.length!=foo+4){
- return false;
- }
- P_array=buf.getMPIntBits();
- G_array=buf.getMPIntBits();
- Q_array=buf.getMPIntBits();
- pub_array=buf.getMPIntBits();
- prv_array=buf.getMPIntBits();
- return true;
- }
-
- int index=0;
- int length=0;
- if(plain[index]!=0x30)return false;
- index++; // SEQUENCE
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- if(plain[index]!=0x02)return false;
- index++; // INTEGER
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- index+=length;
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- P_array=new byte[length];
- System.arraycopy(plain, index, P_array, 0, length);
- index+=length;
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- Q_array=new byte[length];
- System.arraycopy(plain, index, Q_array, 0, length);
- index+=length;
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- G_array=new byte[length];
- System.arraycopy(plain, index, G_array, 0, length);
- index+=length;
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- pub_array=new byte[length];
- System.arraycopy(plain, index, pub_array, 0, length);
- index+=length;
-
- index++;
- length=plain[index++]&0xff;
- if((length&0x80)!=0){
- int foo=length&0x7f; length=0;
- while(foo-->0){ length=(length<<8)+(plain[index++]&0xff); }
- }
- prv_array=new byte[length];
- System.arraycopy(plain, index, prv_array, 0, length);
- index+=length;
- }
- catch(Exception e){
- //System.err.println(e);
- //e.printStackTrace();
- return false;
- }
- return true;
+ throw new RuntimeException("not implemented");
}
- public boolean isEncrypted(){
- return encrypted;
+ /**
+ * Returns the name of the key algorithm.
+ * @return "ssh-rsa" or "ssh-dss"
+ */
+ public String getAlgName(){
+ return new String(kpair.getKeyTypeName());
}
+ /**
+ * Returns the name of this identity.
+ * It will be useful to identify this object in the {@link IdentityRepository}.
+ */
public String getName(){
return identity;
}
- private byte a2b(byte c){
- if('0'<=c&&c<='9') return (byte)(c-'0');
- if('a'<=c&&c<='z') return (byte)(c-'a'+10);
- return (byte)(c-'A'+10);
- }
-
- public boolean equals(Object o){
- if(!(o instanceof IdentityFile)) return super.equals(o);
- IdentityFile foo=(IdentityFile)o;
- return getName().equals(foo.getName());
+ /**
+ * Returns <tt>true</tt> if this identity is cyphered.
+ * @return <tt>true</tt> if this identity is cyphered.
+ */
+ public boolean isEncrypted(){
+ return kpair.isEncrypted();
}
+ /**
+ * Disposes internally allocated data, like byte array for the private key.
+ */
public void clear(){
- Util.bzero(encoded_data);
- Util.bzero(prv_array);
- Util.bzero(d_array);
- Util.bzero(key);
- Util.bzero(iv);
+ kpair.dispose();
+ kpair = null;
}
- public void finalize (){
- clear();
+ /**
+ * Returns an instance of {@link KeyPair} used in this {@link Identity}.
+ * @return an instance of {@link KeyPair} used in this {@link Identity}.
+ */
+ public KeyPair getKeyPair(){
+ return kpair;
}
}