rsa2_sign() is unused outside this file. Make it static.
[u/mdw/putty] / sshrsa.c
index 74cfac5..e95f8b6 100644 (file)
--- a/sshrsa.c
+++ b/sshrsa.c
 #include <assert.h>
 
 #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;