Alon Bar-Lev has uploaded a new change for review.

Change subject: pki: ssh fingerprint using various algorithms
......................................................................

pki: ssh fingerprint using various algorithms

Change-Id: I3570f622054b83c66431609e01917f27ef5957a4
Signed-off-by: Alon Bar-Lev <alo...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/EngineSSHClient.java
M 
backend/manager/modules/uutils/src/main/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtils.java
M 
backend/manager/modules/uutils/src/test/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtilsTest.java
3 files changed, 76 insertions(+), 73 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/83/41283/4

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/EngineSSHClient.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/EngineSSHClient.java
index 0e1b20d..ba40325 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/EngineSSHClient.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/EngineSSHClient.java
@@ -87,7 +87,7 @@
      * @return fingerprint.
      */
     public String getHostFingerprint() throws IOException {
-        String fingerprint = 
OpenSSHUtils.getKeyFingerprintString(getHostKey());
+        String fingerprint = OpenSSHUtils.getKeyFingerprint(getHostKey(), 
"MD5");
 
         if (fingerprint == null) {
             throw new IOException("Unable to parse host key");
diff --git 
a/backend/manager/modules/uutils/src/main/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtils.java
 
b/backend/manager/modules/uutils/src/main/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtils.java
index 8b5a532..b44250f 100644
--- 
a/backend/manager/modules/uutils/src/main/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtils.java
+++ 
b/backend/manager/modules/uutils/src/main/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtils.java
@@ -6,13 +6,14 @@
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.security.GeneralSecurityException;
+import java.security.MessageDigest;
 import java.security.PublicKey;
 import java.security.interfaces.RSAPublicKey;
 import java.util.Arrays;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.codec.binary.Hex;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -134,66 +135,37 @@
         return keyString;
     }
 
-    /**
-     * Generate the fingerprint of a public key as used by SSH.
-     *
-     * @param the public key
-     * @return an array of bytes containing the fingerprint of the key
-     */
-    public static final byte[] getKeyFingerprintBytes(final PublicKey key) {
-        if (key == null) {
-            log.error("Public key is null, failed to retrieve fingerprint.");
-            return null;
-        }
+    public static final String getKeyFingerprint(final PublicKey key, String 
digest) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("SHA1");
+            md.update(getKeyBytes(key));
 
-        // Get the serialized version of the key:
-        final byte[] keyBytes = getKeyBytes(key);
-        if (keyBytes == null) {
-            log.error("Can't get key bytes, will return null.");
-            return null;
-        }
-
-        // The fingerprint is a MD5 digest of the key bytes:
-        final byte[] fingerprintBytes = DigestUtils.md5(keyBytes);
-        if (log.isDebugEnabled()) {
-            log.debug("Fingerprint bytes are {}.", 
Hex.encodeHexString(fingerprintBytes));
-        }
-
-        return fingerprintBytes;
-    }
-
-    /**
-     * Generate the fingerprint of a public key as used by SSH.
-     *
-     * @param the public key
-     * @return a string containing the fingerprint of the key
-     */
-    public static final String getKeyFingerprintString(final PublicKey key) {
-        // Get the key bytes:
-        final byte[] fingerprintBytes = getKeyFingerprintBytes(key);
-        if (fingerprintBytes == null) {
-            log.error("Can't get key bytes, will return null.");
-            return null;
-        }
-
-        // Generate the string representation as two hex characters per byte
-        // separated by colons:
-        final StringBuilder buffer = new StringBuilder(fingerprintBytes.length 
* 3 -1);
-        boolean first = true;
-        for (byte b : fingerprintBytes) {
-            if (!first) {
-                buffer.append(':');
+            String fingerprint;
+            if ("MD5".equals(digest)) {
+                StringBuilder s = new StringBuilder();
+                for (byte b : md.digest()) {
+                    if (s.length() > 0) {
+                        s.append(':');
+                    }
+                    s.append(String.format("%02x", b));
+                }
+                fingerprint = s.toString();
+            } else {
+                fingerprint = String.format(
+                    "%s:%s",
+                    digest.toUpperCase().replace("-", ""),
+                    new Base64(0).encodeToString(md.digest())
+                );
             }
-            final String s = String.format("%02x", b);
-            buffer.append(s);
-            first = false;
-        }
-        final String fingerprintString = buffer.toString();
-        if (log.isDebugEnabled()) {
-            log.debug("Fingerprint string is '{}'.", fingerprintString);
-        }
 
-        return fingerprintString;
+            if (log.isDebugEnabled()) {
+                log.debug("Fingerprint: {}", fingerprint);
+            }
+
+            return fingerprint;
+        } catch (GeneralSecurityException e) {
+            throw new RuntimeException(e);
+        }
     }
 
     private static boolean verifyByteArray(DataInputStream dataInputStream, 
byte[] expected) throws IOException {
diff --git 
a/backend/manager/modules/uutils/src/test/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtilsTest.java
 
b/backend/manager/modules/uutils/src/test/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtilsTest.java
index a648678..eb72f2f 100644
--- 
a/backend/manager/modules/uutils/src/test/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtilsTest.java
+++ 
b/backend/manager/modules/uutils/src/test/java/org/ovirt/engine/core/uutils/ssh/OpenSSHUtilsTest.java
@@ -18,16 +18,17 @@
         return factory.generatePublic(spec);
     }
 
-    private static void testFingerprintString(final String keyEncoding, final 
String goodFingerprintString) throws Exception {
+    private static void testFingerprintString(final String keyEncoding, final 
String goodFingerprintString, String algo) throws Exception {
         final PublicKey key = decodeKey(keyEncoding);
-        final String fingerprintString = 
OpenSSHUtils.getKeyFingerprintString(key);
+        final String fingerprintString = OpenSSHUtils.getKeyFingerprint(key, 
algo);
         assertEquals(goodFingerprintString, fingerprintString);
     }
 
     @Test
     public void testFingerprintStrings() throws Exception {
         for (String[] key : KEYS) {
-            testFingerprintString(key[0], key[1]);
+            testFingerprintString(key[0], key[1], "MD5");
+            testFingerprintString(key[0], key[2], "SHA-256");
         }
     }
 
@@ -40,7 +41,7 @@
     @Test
     public void testKeyStrings() throws Exception {
         for (String[] key : KEYS) {
-            testKeyString(key[0], key[2]);
+            testKeyString(key[0], key[3]);
         }
     }
 
@@ -87,8 +88,11 @@
             "2Mx+DapWIHxEhDR2fBAlQgxB9/+XyNzSxWwrrNFox7tlvNmCEqN5HxdBR5fxqw4O" 
+
             "ODNh3JfzLcVNzqDsqwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "16:e1:9e:89:1e:ed:cc:3d:d8:af:d1:83:6e:b0:da:ae",
+
+            // Fingerprint SHA256
+            "SHA256:I4ud9yJLWcxsanCu0bXL6SxjTxj9/wbPi4JqtR1ophw",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQCa3+YrPFsT7orhMQx0VIs+xqj/zcVBN6zLv2lzIZIW/sDQ+sKmZKIT4wWj0GIW8ShD2dW3QNS/18GSq/MXeaih9kUJ2Mx+DapWIHxEhDR2fBAlQgxB9/+XyNzSxWwrrNFox7tlvNmCEqN5HxdBR5fxqw4OODNh3JfzLcVNzqDsqw==\n",
@@ -100,8 +104,11 @@
             "qjbpQUjSwiDrXTLUiU4MJcDAFsFWabbj3cZksVSTuqxR6ljdXMLJd8lrJXz1mLi1" 
+
             "gYKAEfF6MbwzZwcwhwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "a2:55:07:d3:b6:69:7c:ca:8f:33:e7:22:f2:12:48:d9",
+
+            // Fingerprint SHA256
+            "SHA256:5xWt5k1RhhX+EHqhzLxlqEW50QxiBIN2ng78SFbf2Rk",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQCP5HriASnFNB0PqE9M/QLMR2kBbcD7v/4yVsvosyIHw4cpRdfWTsqZAYgMHnwSsvDWTPhx6XCmyx/41pjR4H0bLINhqjbpQUjSwiDrXTLUiU4MJcDAFsFWabbj3cZksVSTuqxR6ljdXMLJd8lrJXz1mLi1gYKAEfF6MbwzZwcwhw==\n",
@@ -113,8 +120,11 @@
             "B5JOzCzO79d3W5glGavSiUqaqOXBLfCFNcNhmJvKVhFAXyJ4JM3v2e8Dg/PtBT73" 
+
             "5+YCSkrnZOSr+if8GwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "0e:82:e9:96:e7:b1:35:2b:c0:14:49:09:1c:8d:80:ee",
+
+            // Fingerprint SHA256
+            "SHA256:KLeBSl0NAL6T1Z8EEqsvpW1c3y9mtVGmogUNxIuL9is",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQC5AkL8nfbs0ANq1MGQL9WYISuQ8NtYMZ7MiH/7af0Mvy5K1nDUysqZt0BFP2Yd9/bScyxdgSp7jux//i2UVINrVFCnB5JOzCzO79d3W5glGavSiUqaqOXBLfCFNcNhmJvKVhFAXyJ4JM3v2e8Dg/PtBT735+YCSkrnZOSr+if8Gw==\n",
@@ -126,8 +136,11 @@
             "Pv1i4Iln5gqJFbaT9/48Zli3AraKbVWBJQeDKQL0EywU0sXz2upN0OMwyehQAZsa" 
+
             "9KWvwt2LV2c8cbMprwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "b0:d1:fc:40:95:39:25:20:c4:3f:7b:b8:6f:18:4d:ae",
+
+            // Fingerprint SHA256
+            "SHA256:hDXnC4yi0dCY8uqtecpi7x3qPk4hwetfZigGpwoMrCo",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQCRYaSHFlFePROfmsj82O6KMCW3wMlF93ifYXA8T1b87AybzORNhR49uCi9jccEpEcRzOmC9lpHYt3iouGCtFfrBWgRPv1i4Iln5gqJFbaT9/48Zli3AraKbVWBJQeDKQL0EywU0sXz2upN0OMwyehQAZsa9KWvwt2LV2c8cbMprw==\n",
@@ -139,8 +152,11 @@
             "DXYWsZY1/UgL9QNl0PrrugWKzQfU1lB7T+TFJQNeYH4xUtORGdnfO+uMTK9h2yC/" 
+
             "uCMvqv3dLKR1SGRzEQIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "56:c1:e3:c5:bc:75:21:00:67:65:c2:06:39:82:bf:9f",
+
+            // Fingerprint SHA256
+            "SHA256:tO9ZbfmciAOQYdr/yk5+EGeEW51jBmMM/bDhc2Y47x8",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQDMJJqXjfcpxpb3VPUXvWl+4R2Kqf5piN3YNwIbBQiZobSnvoY7oMPVFBh0AW1DJa3VD0JOSRqcYn+zbo3/mEln7+/ZDXYWsZY1/UgL9QNl0PrrugWKzQfU1lB7T+TFJQNeYH4xUtORGdnfO+uMTK9h2yC/uCMvqv3dLKR1SGRzEQ==\n",
@@ -152,8 +168,11 @@
             "rNVUmaCRUcsqclJpVURFrLUbdIn4fGMVnxeFrI+cKW34A9JFu4cGbZ2s7eOQNBJT" 
+
             "LKktR9T/nxc8D9H+/wIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "55:d5:de:fc:17:d4:b1:06:22:73:67:f5:e0:08:bf:25",
+
+            // Fingerprint SHA256
+            "SHA256:GtqEmRC7wauTPZcuI14NeyIq/OBRIZfO8A5IoFyCWl8",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQDHlrWc38JjFHNvZ7gs6MOlvrFLF2K+U8CHkqV+7/WFCszZGeJPo9va9uIjdVD7RHYKOiOt2r6xulO/RRjxY4h8coU9rNVUmaCRUcsqclJpVURFrLUbdIn4fGMVnxeFrI+cKW34A9JFu4cGbZ2s7eOQNBJTLKktR9T/nxc8D9H+/w==\n",
@@ -165,8 +184,11 @@
             "VP7QfQ6OSV1c8alckmAA4aFjq84O3dRIM4Vj97FwiENuzcLsBSlPxU4WFhKNrLEL" 
+
             "NNuIVKPltQVnJUA0AwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "23:90:4e:18:11:fc:44:f8:4a:3e:5b:f3:a7:3c:cb:14",
+
+            // Fingerprint SHA256
+            "SHA256:FmRM9fOZfn3yAkik/vE799kR0msftllHsxWh4WK+WDU",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQCYDKTQXJWxY5GNtQyz40osYjuiaqP5B+C0xN8lteW/zrQ9rwyZ+ijm15uY0vH4gggpn5oYkIbu/5mrk7cNan5Ygs5MVP7QfQ6OSV1c8alckmAA4aFjq84O3dRIM4Vj97FwiENuzcLsBSlPxU4WFhKNrLELNNuIVKPltQVnJUA0Aw==\n",
@@ -178,8 +200,11 @@
             "l5VwwKqOrlOVhi3lj6ljpWBI/viBMMJNOeG1K4x8ZO1x6L3h8UtmIU599VqjpaPg" 
+
             "wQNFlOweUqh4h0sRtwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "61:a8:d6:8d:ca:27:86:50:ad:5f:de:1e:a6:17:c0:42",
+
+            // Fingerprint SHA256
+            "SHA256:N0jkalb2Z9nK/tjmYlfECOiTSOVP/OSRHmHmj1BOePk",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQCbfXqtv9/jI022H5t4T9qI3oBBaLFBSLx2J/MP4XQ32L5/arQIyiu25mPNwcnwo7h1teCVr722TS2m8Sg9TXWwnd13l5VwwKqOrlOVhi3lj6ljpWBI/viBMMJNOeG1K4x8ZO1x6L3h8UtmIU599VqjpaPgwQNFlOweUqh4h0sRtw==\n",
@@ -191,8 +216,11 @@
             "0/1UZP95KRlCLfa8Nnqi889NNpUhvHJnfBqzbyBbgDFDMZoi2NVEx9nUpZRr8e6D" 
+
             "1rA4kS4jQURTLODjrwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "37:49:1d:28:20:98:1a:da:e7:29:b3:96:61:2b:f1:40",
+
+            // Fingerprint SHA256
+            "SHA256:OQfj4/W7qD5rfqy81+2gUiX+cPdlVGWupfxZ5Z6GGIM",
 
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQDJmCyxIsgvYvhymxcqZF0eX3bL/IA26Ygr4hZ+Q4NidYXZZ3cYOJvgdj8zoJu/+I3jW2re0Kltj+BqHssWD1WIO2rX0/1UZP95KRlCLfa8Nnqi889NNpUhvHJnfBqzbyBbgDFDMZoi2NVEx9nUpZRr8e6D1rA4kS4jQURTLODjrw==\n",
@@ -204,9 +232,12 @@
             "C3giBDJotkkXO7uR3iAQAGZrARxRrOOhUNqVKIuslw/+YcvgsQl5TdgflvrdH2zQ" 
+
             "yVm2/0qLjdCN8lYahwIDAQAB",
 
-            // Fingerprint:
+            // Fingerprint MD5
             "6d:cd:bc:99:c0:83:ca:b1:8e:58:10:c3:b8:4d:56:ee",
 
+            // Fingerprint SHA256
+            "SHA256:pbpMFSx/C7wm34+zg3ky8ALQytzn1QzDOYE1ohHWGWw",
+
             // SSH:
             "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAAAgQC3Cz4oruqQv9fz+NOZnhvGugWvPpuwh44aGVdYm0iXJZCq76bgw0ajDF6XhVs5xYagWEO31vVKVu7lTMIv7OcoAw3VC3giBDJotkkXO7uR3iAQAGZrARxRrOOhUNqVKIuslw/+YcvgsQl5TdgflvrdH2zQyVm2/0qLjdCN8lYahw==\n",
         },


-- 
To view, visit https://gerrit.ovirt.org/41283
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3570f622054b83c66431609e01917f27ef5957a4
Gerrit-PatchSet: 4
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alon Bar-Lev <alo...@redhat.com>
Gerrit-Reviewer: Francesco Romani <from...@redhat.com>
Gerrit-Reviewer: Jenkins CI
Gerrit-Reviewer: automat...@ovirt.org
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to