X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/32874aeac8dacbca26663777b39a79efc5d8dc4b..86916870d36cb70e7ef0ea760e75a6ae8b2d83a5:/sshrsa.c diff --git a/sshrsa.c b/sshrsa.c index 74cfac57..e95f8b63 100644 --- a/sshrsa.c +++ b/sshrsa.c @@ -11,7 +11,19 @@ #include #include "ssh.h" +#include "misc.h" +#define GET_32BIT(cp) \ + (((unsigned long)(unsigned char)(cp)[0] << 24) | \ + ((unsigned long)(unsigned char)(cp)[1] << 16) | \ + ((unsigned long)(unsigned char)(cp)[2] << 8) | \ + ((unsigned long)(unsigned char)(cp)[3])) + +#define PUT_32BIT(cp, value) { \ + (cp)[0] = (unsigned char)((value) >> 24); \ + (cp)[1] = (unsigned char)((value) >> 16); \ + (cp)[2] = (unsigned char)((value) >> 8); \ + (cp)[3] = (unsigned char)(value); } int makekey(unsigned char *data, struct RSAKey *result, unsigned char **keystr, int order) @@ -217,6 +229,37 @@ int rsa_verify(struct RSAKey *key) return 1; } +/* Public key blob as used by Pageant: exponent before modulus. */ +unsigned char *rsa_public_blob(struct RSAKey *key, int *len) +{ + int length, pos; + unsigned char *ret; + + length = (ssh1_bignum_length(key->modulus) + + ssh1_bignum_length(key->exponent) + 4); + ret = smalloc(length); + + PUT_32BIT(ret, bignum_bitcount(key->modulus)); + pos = 4; + pos += ssh1_write_bignum(ret + pos, key->exponent); + pos += ssh1_write_bignum(ret + pos, key->modulus); + + *len = length; + return ret; +} + +/* Given a public blob, determine its length. */ +int rsa_public_blob_len(void *data) +{ + unsigned char *p = (unsigned char *)data; + + p += 4; /* length word */ + p += ssh1_read_bignum(p, NULL); /* exponent */ + p += ssh1_read_bignum(p, NULL); /* modulus */ + + return p - (unsigned char *)data; +} + void freersakey(struct RSAKey *key) { if (key->modulus) @@ -233,18 +276,6 @@ void freersakey(struct RSAKey *key) * Implementation of the ssh-rsa signing key type. */ -#define GET_32BIT(cp) \ - (((unsigned long)(unsigned char)(cp)[0] << 24) | \ - ((unsigned long)(unsigned char)(cp)[1] << 16) | \ - ((unsigned long)(unsigned char)(cp)[2] << 8) | \ - ((unsigned long)(unsigned char)(cp)[3])) - -#define PUT_32BIT(cp, value) { \ - (cp)[0] = (unsigned char)((value) >> 24); \ - (cp)[1] = (unsigned char)((value) >> 16); \ - (cp)[2] = (unsigned char)((value) >> 8); \ - (cp)[3] = (unsigned char)(value); } - static void getstring(char **data, int *datalen, char **p, int *length) { *p = NULL; @@ -268,7 +299,7 @@ static Bignum getmp(char **data, int *datalen) getstring(data, datalen, &p, &length); if (!p) return NULL; - b = bignum_from_bytes(p, length); + b = bignum_from_bytes((unsigned char *)p, length); return b; } @@ -479,7 +510,7 @@ static char *rsa2_fingerprint(void *key) int numlen, i; MD5Init(&md5c); - MD5Update(&md5c, "\0\0\0\7ssh-rsa", 11); + MD5Update(&md5c, (unsigned char *)"\0\0\0\7ssh-rsa", 11); #define ADD_BIGNUM(bignum) \ numlen = (bignum_bitcount(bignum)+8)/8; \ @@ -528,7 +559,7 @@ static char *rsa2_fingerprint(void *key) * iso(1) identified-organization(3) oiw(14) secsig(3) * algorithms(2) 26 } */ -static unsigned char asn1_weird_stuff[] = { +static const unsigned char asn1_weird_stuff[] = { 0x00, 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14, }; @@ -582,7 +613,8 @@ static int rsa2_verifysig(void *key, char *sig, int siglen, return ret; } -unsigned char *rsa2_sign(void *key, char *data, int datalen, int *siglen) +static unsigned char *rsa2_sign(void *key, char *data, int datalen, + int *siglen) { struct RSAKey *rsa = (struct RSAKey *) key; unsigned char *bytes;