* Jonathan McDowell <noodles@earth.li>
*
* Copyright 2002 Project Purple
- *
- * $Id: keyid.c,v 1.8 2003/11/01 19:25:15 noodles Exp $
*/
#include <sys/types.h>
+#include "assert.h"
#include "keyid.h"
#include "keystructs.h"
#include "log.h"
#include "md5.h"
-#include "sha.h"
+#include "sha1.h"
/**
unsigned char *fingerprint,
size_t *len)
{
- SHA1_CONTEXT sha_ctx;
- MD5_CONTEXT md5_ctx;
+ SHA1_CTX sha_ctx;
+ struct md5_ctx md5_context;
unsigned char c;
- unsigned char *buff = NULL;
size_t modlen, explen;
assert(fingerprint != NULL);
switch (packet->data[0]) {
case 2:
case 3:
- md5_init(&md5_ctx);
+ md5_init_ctx(&md5_context);
/*
* MD5 the modulus and exponent.
*/
modlen = ((packet->data[8] << 8) +
packet->data[9] + 7) >> 3;
- md5_write(&md5_ctx, &packet->data[10], modlen);
+ md5_process_bytes(&packet->data[10], modlen, &md5_context);
explen = ((packet->data[10+modlen] << 8) +
packet->data[11+modlen] + 7) >> 3;
- md5_write(&md5_ctx, &packet->data[12 + modlen], explen);
-
- md5_final(&md5_ctx);
- buff = md5_read(&md5_ctx);
+ md5_process_bytes(&packet->data[12 + modlen], explen,
+ &md5_context);
+ md5_finish_ctx(&md5_context, fingerprint);
*len = 16;
- memcpy(fingerprint, buff, *len);
break;
case 4:
- sha1_init(&sha_ctx);
+ SHA1Init(&sha_ctx);
/*
* TODO: Can this be 0x99? Are all public key packets old
* format with 2 bytes of length data?
*/
c = 0x99;
- sha1_write(&sha_ctx, &c, sizeof(c));
+ SHA1Update(&sha_ctx, &c, sizeof(c));
c = packet->length >> 8;
- sha1_write(&sha_ctx, &c, sizeof(c));
+ SHA1Update(&sha_ctx, &c, sizeof(c));
c = packet->length & 0xFF;
- sha1_write(&sha_ctx, &c, sizeof(c));
- sha1_write(&sha_ctx, packet->data,
+ SHA1Update(&sha_ctx, &c, sizeof(c));
+ SHA1Update(&sha_ctx, packet->data,
packet->length);
- sha1_final(&sha_ctx);
- buff = sha1_read(&sha_ctx);
-
+ SHA1Final(fingerprint, &sha_ctx);
*len = 20;
- memcpy(fingerprint, buff, *len);
+
break;
default:
logthing(LOGTHING_ERROR, "Unknown key type: %d",
keyid += packet->data[offset++];
}
/*
- * I thought we needed to ensure it's an RSA key, but pks
- * doesn't seem to care and I've seen some type 3 keys.
- * So just log a warning.
+ * Check for an RSA key; if not then log but accept anyway.
+ * 1 == RSA
+ * 2 == RSA Encrypt-Only
+ * 3 == RSA Sign-Only
*/
- if (packet->data[7] != 1) {
+ if (packet->data[7] < 1 || packet->data[7] > 3) {
logthing(LOGTHING_NOTICE,
"Type 2 or 3 key, but not RSA: %llx (type %d)",
keyid,