[PATCHv2 1/1] rework printing for visual host key upper border

Christian Hesse mail at eworm.de
Mon Jun 23 18:12:15 EST 2014


Key types are getting longer and the current implementation of visual
host key breaks with ED25519, resulting in (note the missing bracket):

+--[ED25519  256--+

This reworks the calculation of visual host key upper border. Please be
aware that this slightly modifies the output for other key types as
well:

+--[ DSA 1024]----+
+---[DSA 1024]----+

+--[ RSA 2048]----+
+---[RSA 2048]----+

+--[ECDSA  256]---+
+---[ECDSA 256]---+

+--[ED25519  256--+
+--[ED25519 256]--+
---
 key.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/key.c b/key.c
index e8fc5b1..d75d7be 100644
--- a/key.c
+++ b/key.c
@@ -547,13 +547,14 @@ key_fingerprint_randomart(u_char *dgst_raw, u_int dgst_raw_len, const Key *k)
 	 * intersects with itself.  Matter of taste.
 	 */
 	char	*augmentation_string = " .o+=*BOX@%&#/^SE";
-	char	*retval, *p;
+	char	*retval, *p, key_details[FLDSIZE_X + 1];
 	u_char	 field[FLDSIZE_X][FLDSIZE_Y];
 	u_int	 i, b;
 	int	 x, y;
 	size_t	 len = strlen(augmentation_string) - 1;
 
 	retval = xcalloc(1, (FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
+	p = retval;
 
 	/* initialize field */
 	memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
@@ -587,11 +588,15 @@ key_fingerprint_randomart(u_char *dgst_raw, u_int dgst_raw_len, const Key *k)
 	field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len - 1;
 	field[x][y] = len;
 
-	/* fill in retval */
-	snprintf(retval, FLDSIZE_X, "+--[%4s %4u]", key_type(k), key_size(k));
-	p = strchr(retval, '\0');
+	/* assemble key detail string */
+	snprintf(key_details, FLDSIZE_X, "[%s %u]", key_type(k), key_size(k));
 
 	/* output upper border */
+	*p++ = '+';
+	for (i = 0; i < (FLDSIZE_X - strlen(key_details)) / 2; i++)
+		*p++ = '-';
+	for (i = 0; key_details[i] != 0; i++)
+		*p++ = key_details[i];
 	for (i = p - retval - 1; i < FLDSIZE_X; i++)
 		*p++ = '-';
 	*p++ = '+';
-- 
2.0.0



More information about the openssh-unix-dev mailing list