X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/0e5e7f463ee689f7f29297678a605b85befe58e0..a5dd84675905dfc4274cf45424e6f3a9e385e1a7:/sshdss.c diff --git a/sshdss.c b/sshdss.c index ce56d3c5..fa3ac384 100644 --- a/sshdss.c +++ b/sshdss.c @@ -70,7 +70,7 @@ static Bignum getmp(char **data, int *datalen) return NULL; if (p[0] & 0x80) return NULL; /* negative mp */ - b = bignum_from_bytes(p, length); + b = bignum_from_bytes((unsigned char *)p, length); return b; } @@ -78,7 +78,7 @@ static Bignum get160(char **data, int *datalen) { Bignum b; - b = bignum_from_bytes(*data, 20); + b = bignum_from_bytes((unsigned char *)*data, 20); *data += 20; *datalen -= 20; @@ -91,7 +91,7 @@ static void *dss_newkey(char *data, int len) int slen; struct dss_key *dss; - dss = smalloc(sizeof(struct dss_key)); + dss = snew(struct dss_key); if (!dss) return NULL; getstring(&data, &len, &p, &slen); @@ -141,7 +141,7 @@ static char *dss_fmtkey(void *key) len += 4 * (bignum_bitcount(dss->q) + 15) / 16; len += 4 * (bignum_bitcount(dss->g) + 15) / 16; len += 4 * (bignum_bitcount(dss->y) + 15) / 16; - p = smalloc(len); + p = snewn(len, char); if (!p) return NULL; @@ -188,7 +188,7 @@ static char *dss_fingerprint(void *key) int numlen, i; MD5Init(&md5c); - MD5Update(&md5c, "\0\0\0\7ssh-dss", 11); + MD5Update(&md5c, (unsigned char *)"\0\0\0\7ssh-dss", 11); #define ADD_BIGNUM(bignum) \ numlen = (bignum_bitcount(bignum)+8)/8; \ @@ -209,7 +209,7 @@ static char *dss_fingerprint(void *key) for (i = 0; i < 16; i++) sprintf(buffer + strlen(buffer), "%s%02x", i ? ":" : "", digest[i]); - ret = smalloc(strlen(buffer) + 1); + ret = snewn(strlen(buffer) + 1, char); if (ret) strcpy(ret, buffer); return ret; @@ -268,7 +268,7 @@ static int dss_verifysig(void *key, char *sig, int siglen, /* * Step 2. u1 <- SHA(message) * w mod q. */ - SHA_Simple(data, datalen, hash); + SHA_Simple(data, datalen, (unsigned char *)hash); p = hash; slen = 20; sha = get160(&p, &slen); @@ -322,7 +322,7 @@ static unsigned char *dss_public_blob(void *key, int *len) * 27 + sum of lengths. (five length fields, 20+7=27). */ bloblen = 27 + plen + qlen + glen + ylen; - blob = smalloc(bloblen); + blob = snewn(bloblen, unsigned char); p = blob; PUT_32BIT(p, 7); p += 4; @@ -362,7 +362,7 @@ static unsigned char *dss_private_blob(void *key, int *len) * mpint x, string[20] the SHA of p||q||g. Total 4 + xlen. */ bloblen = 4 + xlen; - blob = smalloc(bloblen); + blob = snewn(bloblen, unsigned char); p = blob; PUT_32BIT(p, xlen); p += 4; @@ -422,7 +422,7 @@ static void *dss_openssh_createkey(unsigned char **blob, int *len) char **b = (char **) blob; struct dss_key *dss; - dss = smalloc(sizeof(struct dss_key)); + dss = snew(struct dss_key); if (!dss) return NULL; @@ -473,7 +473,19 @@ static int dss_openssh_fmtkey(void *key, unsigned char *blob, int len) return bloblen; } -unsigned char *dss_sign(void *key, char *data, int datalen, int *siglen) +static int dss_pubkey_bits(void *blob, int len) +{ + struct dss_key *dss; + int ret; + + dss = dss_newkey((char *) blob, len); + ret = bignum_bitcount(dss->p); + dss_freekey(dss); + + return ret; +} + +static unsigned char *dss_sign(void *key, char *data, int datalen, int *siglen) { /* * The basic DSS signing algorithm is: @@ -606,7 +618,7 @@ unsigned char *dss_sign(void *key, char *data, int datalen, int *siglen) * i.e. 4+7 + 4+40 bytes. */ nbytes = 4 + 7 + 4 + 40; - bytes = smalloc(nbytes); + bytes = snewn(nbytes, unsigned char); PUT_32BIT(bytes, 7); memcpy(bytes + 4, "ssh-dss", 7); PUT_32BIT(bytes + 4 + 7, 40); @@ -630,6 +642,7 @@ const struct ssh_signkey ssh_dss = { dss_createkey, dss_openssh_createkey, dss_openssh_fmtkey, + dss_pubkey_bits, dss_fingerprint, dss_verifysig, dss_sign,