[EMAIL PROTECTED] (Niels M�ller) writes:
> Some changes and preparations for real host authentication. lsh will
> now display the fingerprints of a received host key, but doesn't store
> or compare any keys yet. Next thing to do is an ACL file.
>
> ftp://ftp.lysator.liu.se/pub/security/lsh/lsh-0.1.16.tar.gz
> http://www.lysator.liu.se/~nisse/archive/lsh-0.1.16.tar.gz
>
> /Niels
>
>
Hej, jag stoppade nyligen in fingerprinting i OSSH och jag tror att
det �r p� v�g att bli integrerat i OpenSSH. Nu undrar jag litet om man
kan vara kompatibel p� fingerprint niv�. Hur g�r du n�r du tillverkar
fingerprints?
Jag sl�nger med kod som visar hur jag gjorde (men jag kan �ndra
det). Det �r i allt v�sentligt modulen (ut�kad till 8 bitars gr�ns)
f�ljd av den publika exponenenten (ocks� ut�kad till 8 bitar) som jag
avslutningsvis g�r fingerprint av.
#include "includes.h"
RCSID("$Id: fingerprint.c,v 1.2 1999/11/07 14:48:13 bg Exp $");
#include "xmalloc.h"
#include "ssh.h"
static
char *
mpz_to_bin(char *buffer, MP_INT *value)
{
int bits = mpz_sizeinbase(value, 2);
int hex_size = mpz_sizeinbase(value, 16);
char *buf = xmalloc(hex_size + 2);
int i, oi, byte;
/* Get the value of the number in hex. Too bad that gmp does not allow
us to get it in binary. */
mpz_get_str(buf, 16, value);
/* i is "input index", oi is "output index". Both point to the same array,
and start from the beginning. "input index" moves twice as fast. */
i = 0;
oi = 0;
/* Check for an odd number of hex digits. Process the odd digit
separately. */
if (hex_size & 1)
{
sscanf(buf, "%1x", &byte);
buf[oi++] = byte;
i = 1;
}
/* Convert the hex number into binary representation. */
for (; i < hex_size; i += 2)
{
sscanf(buf + i, "%2x", &byte);
buf[oi++] = byte;
}
assert(oi == ((bits + 7) / 8));
/* Store the binary data. */
memcpy(buffer, buf, oi);
buffer = buffer + oi; /* Next free byte */
/* Clear the temporary data. */
memset(buf, 0, hex_size);
xfree(buf);
return buffer;
}
/* Generate key fingerprint in ascii format. */
char *
fingerprint(RSAPublicKey *key)
{
static char retval[80];
struct MD5Context c;
unsigned char d[16];
int len = ((mpz_sizeinbase(&key->n, 2) + 7)/8
+ (mpz_sizeinbase(&key->e, 2) + 7)/8);
char *buf = xmalloc(len);
char *t = buf;
t = mpz_to_bin(t, &key->n);
mpz_to_bin(t, &key->e);
MD5Init(&c);
MD5Update(&c, buf, len);
MD5Final(d, &c);
sprintf(retval,
"%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],
d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
memset(buf, 0, len);
xfree(buf);
return retval;
}