diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/org/connectbot/PubkeyListActivity.java | 13 | ||||
| -rw-r--r-- | src/org/connectbot/bean/PubkeyBean.java | 73 | ||||
| -rw-r--r-- | src/org/connectbot/service/TerminalManager.java | 4 | ||||
| -rw-r--r-- | src/org/connectbot/transport/SSH.java | 3 | ||||
| -rw-r--r-- | src/org/connectbot/util/PubkeyUtils.java | 17 | 
5 files changed, 70 insertions, 40 deletions
| diff --git a/src/org/connectbot/PubkeyListActivity.java b/src/org/connectbot/PubkeyListActivity.java index 3579980..9bb19f1 100644 --- a/src/org/connectbot/PubkeyListActivity.java +++ b/src/org/connectbot/PubkeyListActivity.java @@ -43,9 +43,9 @@ import android.content.ActivityNotFoundException;  import android.content.ComponentName;  import android.content.Context;  import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener;  import android.content.Intent;  import android.content.ServiceConnection; -import android.content.DialogInterface.OnClickListener;  import android.net.Uri;  import android.os.Bundle;  import android.os.Environment; @@ -58,17 +58,17 @@ import android.view.ContextMenu;  import android.view.LayoutInflater;  import android.view.Menu;  import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener;  import android.view.View;  import android.view.ViewGroup; -import android.view.MenuItem.OnMenuItemClickListener;  import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener;  import android.widget.ArrayAdapter;  import android.widget.EditText;  import android.widget.ImageView;  import android.widget.TableRow;  import android.widget.TextView;  import android.widget.Toast; -import android.widget.AdapterView.OnItemClickListener;  import com.trilead.ssh2.crypto.Base64;  import com.trilead.ssh2.crypto.PEMDecoder; @@ -275,7 +275,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {  			PublicKey pubKey = null;  			try {  				privKey = PubkeyUtils.decodePrivate(pubkey.getPrivateKey(), pubkey.getType(), password); -				pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); +				pubKey = pubkey.getPublicKey();  			} catch (Exception e) {  				String message = getResources().getString(R.string.pubkey_failed_add, pubkey.getNickname());  				Log.e(TAG, message, e); @@ -346,7 +346,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {  		copyPublicToClipboard.setOnMenuItemClickListener(new OnMenuItemClickListener() {  			public boolean onMenuItemClick(MenuItem item) {  				try { -					PublicKey pk = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); +					PublicKey pk = pubkey.getPublicKey();  					String openSSHPubkey = PubkeyUtils.convertToOpenSSHFormat(pk, pubkey.getNickname());  					clipboard.setText(openSSHPubkey); @@ -661,8 +661,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {  				}  			} else {  				try { -					PublicKey pub = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); -					holder.caption.setText(PubkeyUtils.describeKey(pub, pubkey.isEncrypted())); +					holder.caption.setText(pubkey.getDescription());  				} catch (Exception e) {  					Log.e(TAG, "Error decoding public key at " + pubkey.getId(), e);  					holder.caption.setText(R.string.pubkey_unknown_format); diff --git a/src/org/connectbot/bean/PubkeyBean.java b/src/org/connectbot/bean/PubkeyBean.java index 0354f37..790c6cc 100644 --- a/src/org/connectbot/bean/PubkeyBean.java +++ b/src/org/connectbot/bean/PubkeyBean.java @@ -17,7 +17,15 @@  package org.connectbot.bean; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException;  import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.interfaces.DSAPublicKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.EncodedKeySpec; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec;  import org.connectbot.util.PubkeyDatabase;  import org.connectbot.util.PubkeyUtils; @@ -31,12 +39,16 @@ import android.content.ContentValues;  public class PubkeyBean extends AbstractBean {  	public static final String BEAN_NAME = "pubkey"; +	private static final String KEY_TYPE_RSA = "RSA"; + +	private static final String KEY_TYPE_DSA = "DSA"; +  	/* Database fields */  	private long id;  	private String nickname;  	private String type;  	private byte[] privateKey; -	private byte[] publicKey; +	private PublicKey publicKey;  	private boolean encrypted = false;  	private boolean startup = false;  	private boolean confirmUse = false; @@ -89,18 +101,36 @@ public class PubkeyBean extends AbstractBean {  			return privateKey.clone();  	} -	public void setPublicKey(byte[] publicKey) { -		if (publicKey == null) -			this.publicKey = null; -		else -			this.publicKey = publicKey.clone(); +	private PublicKey decodePublicKeyAs(EncodedKeySpec keySpec, String keyType) { +		try { +			final KeyFactory kf = KeyFactory.getInstance(keyType); +			return kf.generatePublic(keySpec); +		} catch (NoSuchAlgorithmException e) { +			return null; +		} catch (InvalidKeySpecException e) { +			return null; +		}  	} -	public byte[] getPublicKey() { -		if (publicKey == null) -			return null; -		else -			return publicKey.clone(); +	public void setPublicKey(byte[] encoded) { +		final X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encoded); +		if (type != null) { +			publicKey = decodePublicKeyAs(pubKeySpec, type); +		} else { +			publicKey = decodePublicKeyAs(pubKeySpec, KEY_TYPE_RSA); +			if (publicKey != null) { +				type = KEY_TYPE_RSA; +			} else { +				publicKey = decodePublicKeyAs(pubKeySpec, KEY_TYPE_DSA); +				if (publicKey != null) { +					type = KEY_TYPE_DSA; +				} +			} +		} +	} + +	public PublicKey getPublicKey() { +		return publicKey;  	}  	public void setEncrypted(boolean encrypted) { @@ -151,6 +181,25 @@ public class PubkeyBean extends AbstractBean {  		return unlockedPrivate;  	} +	public String getDescription() { +		StringBuilder sb = new StringBuilder(); +		if (publicKey instanceof RSAPublicKey) { +			int bits = ((RSAPublicKey) publicKey).getModulus().bitLength(); +			sb.append("RSA "); +			sb.append(bits); +			sb.append("-bit"); +		} else if (publicKey instanceof DSAPublicKey) { +			sb.append("DSA 1024-bit"); +		} else { +			sb.append("Unknown Key Type"); +		} + +		if (encrypted) +			sb.append(" (encrypted)"); + +		return sb.toString(); +	} +  	/* (non-Javadoc)  	 * @see org.connectbot.bean.AbstractBean#getValues()  	 */ @@ -161,7 +210,7 @@ public class PubkeyBean extends AbstractBean {  		values.put(PubkeyDatabase.FIELD_PUBKEY_NICKNAME, nickname);  		values.put(PubkeyDatabase.FIELD_PUBKEY_TYPE, type);  		values.put(PubkeyDatabase.FIELD_PUBKEY_PRIVATE, privateKey); -		values.put(PubkeyDatabase.FIELD_PUBKEY_PUBLIC, publicKey); +		values.put(PubkeyDatabase.FIELD_PUBKEY_PUBLIC, publicKey.getEncoded());  		values.put(PubkeyDatabase.FIELD_PUBKEY_ENCRYPTED, encrypted ? 1 : 0);  		values.put(PubkeyDatabase.FIELD_PUBKEY_STARTUP, startup ? 1 : 0);  		values.put(PubkeyDatabase.FIELD_PUBKEY_CONFIRMUSE, confirmUse ? 1 : 0); diff --git a/src/org/connectbot/service/TerminalManager.java b/src/org/connectbot/service/TerminalManager.java index 3bfcdde..b81c373 100644 --- a/src/org/connectbot/service/TerminalManager.java +++ b/src/org/connectbot/service/TerminalManager.java @@ -26,9 +26,9 @@ import java.util.HashMap;  import java.util.LinkedList;  import java.util.List;  import java.util.Map; +import java.util.Map.Entry;  import java.util.Timer;  import java.util.TimerTask; -import java.util.Map.Entry;  import org.connectbot.R;  import org.connectbot.bean.HostBean; @@ -137,7 +137,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen  		for (PubkeyBean pubkey : pubkeys) {  			try {  				PrivateKey privKey = PubkeyUtils.decodePrivate(pubkey.getPrivateKey(), pubkey.getType()); -				PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); +				PublicKey pubKey = pubkey.getPublicKey();  				Object trileadKey = PubkeyUtils.convertToTrilead(privKey, pubKey);  				addKey(pubkey, trileadKey); diff --git a/src/org/connectbot/transport/SSH.java b/src/org/connectbot/transport/SSH.java index 8a90f72..213cbcd 100644 --- a/src/org/connectbot/transport/SSH.java +++ b/src/org/connectbot/transport/SSH.java @@ -332,8 +332,7 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC  					return false;  				} -				PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), -						pubkey.getType()); +				PublicKey pubKey = pubkey.getPublicKey();  				// convert key to trilead format  				trileadKey = PubkeyUtils.convertToTrilead(privKey, pubKey); diff --git a/src/org/connectbot/util/PubkeyUtils.java b/src/org/connectbot/util/PubkeyUtils.java index e10ee20..029cb0c 100644 --- a/src/org/connectbot/util/PubkeyUtils.java +++ b/src/org/connectbot/util/PubkeyUtils.java @@ -79,23 +79,6 @@ public class PubkeyUtils {  			", bytes=" + encoded.length + "]";  	} -	public static String describeKey(Key key, boolean encrypted) { -		String desc = null; -		if (key instanceof RSAPublicKey) { -			int bits = ((RSAPublicKey)key).getModulus().bitLength(); -			desc = "RSA " + String.valueOf(bits) + "-bit"; -		} else if (key instanceof DSAPublicKey) { -			desc = "DSA 1024-bit"; -		} else { -			desc = "Unknown Key Type"; -		} - -		if (encrypted) -			desc += " (encrypted)"; - -		return desc; -	} -  	public static byte[] sha256(byte[] data) throws NoSuchAlgorithmException {  		return MessageDigest.getInstance("SHA-256").digest(data);  	} | 
