#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)
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)
* 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;
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;
}
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; \
* 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,
};
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;