+static char *dss_fingerprint(void) {
+ struct MD5Context md5c;
+ unsigned char digest[16], lenbuf[4];
+ char buffer[16*3+40];
+ char *ret;
+ int numlen, i;
+
+ MD5Init(&md5c);
+ MD5Update(&md5c, "\0\0\0\7ssh-dss", 11);
+
+#define ADD_BIGNUM(bignum) \
+ numlen = (ssh1_bignum_bitcount(bignum)+8)/8; \
+ PUT_32BIT(lenbuf, numlen); MD5Update(&md5c, lenbuf, 4); \
+ for (i = numlen; i-- ;) { \
+ unsigned char c = bignum_byte(bignum, i); \
+ MD5Update(&md5c, &c, 1); \
+ }
+ ADD_BIGNUM(dss_p);
+ ADD_BIGNUM(dss_q);
+ ADD_BIGNUM(dss_g);
+ ADD_BIGNUM(dss_y);
+#undef ADD_BIGNUM
+
+ MD5Final(digest, &md5c);
+
+ sprintf(buffer, "%d ", ssh1_bignum_bitcount(dss_p));
+ for (i = 0; i < 16; i++)
+ sprintf(buffer+strlen(buffer), "%s%02x", i?":":"", digest[i]);
+ ret = malloc(strlen(buffer)+1);
+ if (ret)
+ strcpy(ret, buffer);
+ return ret;
+}
+