~xdavidwu/saf-sftp

038cb8f42f00d50aa4936492d8cee41b3d837aa8 — xdavidwu 1 year, 8 months ago b9dca21
MainActivity: connection test: show key fingerprints
1 files changed, 27 insertions(+), 7 deletions(-)

M src/main/java/org/safsftp/MainActivity.java
M src/main/java/org/safsftp/MainActivity.java => src/main/java/org/safsftp/MainActivity.java +27 -7
@@ 13,11 13,13 @@ import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;

import com.trilead.ssh2.crypto.Base64;
import com.trilead.ssh2.Connection;
import com.trilead.ssh2.ServerHostKeyVerifier;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.concurrent.CompletableFuture;

public class MainActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {


@@ 26,25 28,43 @@ public class MainActivity extends PreferenceActivity implements OnSharedPreferen
		public boolean verifyServerHostKey(String hostname, int port,
				String serverHostKeyAlgorithm,
				byte[] serverHostKey) {
			Log.e("SFTP", "verify");
			CompletableFuture<Boolean> acceptFuture =
				new CompletableFuture<>();
			final String key64 = new String(Base64.encode(serverHostKey));
			byte[] md5, sha256;
			try {
				md5 = MessageDigest.getInstance("MD5").digest(serverHostKey);
			} catch (NoSuchAlgorithmException e) {
				throw new IllegalStateException("MD5 not available");
			}
			try {
				sha256 = MessageDigest.getInstance("SHA-256").digest(serverHostKey);
			} catch (NoSuchAlgorithmException e) {
				throw new IllegalStateException("SHA-256 not available");
			}
			final String key64 = Base64.getEncoder().encodeToString(serverHostKey);
			final String md5Str = String.format(
				"%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:" +
				"%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", md5[0], md5[1],
				md5[2], md5[3], md5[4], md5[5], md5[6], md5[7], md5[8], md5[9],
				md5[10], md5[11], md5[12], md5[13], md5[14], md5[15]);
			final String sha256Str = Base64.getEncoder().withoutPadding().encodeToString(sha256);

			MainActivity.this.runOnUiThread(() -> {
				new AlertDialog.Builder(MainActivity.this)
					.setTitle("Host key verification")
					.setMessage("Accept SSH server key of " +
						serverHostKeyAlgorithm + " " +
						key64 + "?")
					.setMessage(String.format(
						"Accept SSH server key of type %s: %s?\nMD5:%s\n" +
						"SHA-256:%s",
						serverHostKeyAlgorithm, key64, md5Str, sha256Str))
					.setCancelable(false)
					.setPositiveButton("Accept", (dialog, which) -> {
						acceptFuture.complete(true);
						Log.e("SFTP", "y");
					}).setNegativeButton("Deny", (dialog, which) -> {
						acceptFuture.complete(false);
					})
					.show();
			});

			try {
				return acceptFuture.get();
			} catch (Exception e) {