From 0211c730256c9bbaf10a569c88f7df0ef882311e Mon Sep 17 00:00:00 2001
From: Jonathan McDowell <noodles@earth.li>
Date: Sat, 30 Apr 2011 17:49:57 -0700
Subject: [PATCH] Define OpenPGP constants and use them rather than magic
 numbers

  Take the set of OpenPGP constants from RFC4880 that we're using
  and produce some #defines, to try and make the code a bit clearer.
---
 decodekey.c     | 19 ++++++++++---------
 keydb.c         |  3 ++-
 keydb_dynamic.c |  3 ++-
 keyindex.c      | 25 ++++++++++++++-----------
 openpgp.h       | 45 +++++++++++++++++++++++++++++++++++++++++++++
 parsekey.c      | 22 +++++++++++++---------
 splitkeys.c     |  4 +++-
 7 files changed, 89 insertions(+), 32 deletions(-)
 create mode 100644 openpgp.h

diff --git a/decodekey.c b/decodekey.c
index 606b091..7dd7992 100644
--- a/decodekey.c
+++ b/decodekey.c
@@ -16,6 +16,7 @@
 #include "keystructs.h"
 #include "ll.h"
 #include "log.h"
+#include "openpgp.h"
 
 /*
  *	parse_subpackets - Parse the subpackets of a Type 4 signature.
@@ -54,7 +55,7 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid, time_t *creation)
 			packetlen = data[offset++];
 		}
 		switch (data[offset] & 0x7F) {
-		case 2:
+		case OPENPGP_SIGSUB_CREATION:
 			/*
 			 * Signature creation time.
 			 */
@@ -68,17 +69,17 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid, time_t *creation)
 				*creation = data[offset + packetlen - 1];
 			}
 			break;
-		case 3:
+		case OPENPGP_SIGSUB_EXPIRY:
 			/*
 			 * Signature expiration time. Might want to output this?
 			 */
 			break;
-		case 6:
+		case OPENPGP_SIGSUB_REGEX:
 			/*
 			 * Regular expression for UIDs this sig is over.
 			 */
 			break;
-		case 16:
+		case OPENPGP_SIGSUB_ISSUER:
 			if (keyid != NULL) {
 				*keyid = data[offset+packetlen - 8];
 				*keyid <<= 8;
@@ -97,23 +98,23 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid, time_t *creation)
 				*keyid += data[offset+packetlen - 1];
 			}
 			break;
-		case 20:
+		case OPENPGP_SIGSUB_NOTATION:
 			/*
 			 * Annotation data.
 			 */
 			break;
 
-		case 23:
+		case OPENPGP_SIGSUB_KEYSERVER:
 			/*
 			 * Key server preferences. Including no-modify.
 			 */
 			break;
-		case 25:
+		case OPENPGP_SIGSUB_PRIMARYUID:
 			/*
 			 * Primary UID.
 			 */
 			break;
-		case 26:
+		case OPENPGP_SIGSUB_POLICYURI:
 			/*
 			 * Policy URI.
 			 */
@@ -276,7 +277,7 @@ char **keyuids(struct openpgp_publickey *key, char **primary)
 		curuid = key->uids;
 		while (curuid != NULL) {
 			buf[0] = 0;
-			if (curuid->packet->tag == 13) {
+			if (curuid->packet->tag == OPENPGP_PACKET_UID) {
 				snprintf(buf, 1023, "%.*s",
 						(int) curuid->packet->length,
 						curuid->packet->data);
diff --git a/keydb.c b/keydb.c
index 4dc9332..2abfa02 100644
--- a/keydb.c
+++ b/keydb.c
@@ -23,6 +23,7 @@
 #include "keystructs.h"
 #include "mem.h"
 #include "merge.h"
+#include "openpgp.h"
 #include "parsekey.h"
 #include "sendsync.h"
 
@@ -42,7 +43,7 @@ char *generic_keyid2uid(uint64_t keyid)
 			publickey != NULL) {
 		curuid = publickey->uids;
 		while (curuid != NULL && buf[0] == 0) {
-			if (curuid->packet->tag == 13) {
+			if (curuid->packet->tag == OPENPGP_PACKET_UID) {
 				snprintf(buf, 1023, "%.*s",
 						(int) curuid->packet->length,
 						curuid->packet->data);
diff --git a/keydb_dynamic.c b/keydb_dynamic.c
index 5c2d3d5..ae2b805 100644
--- a/keydb_dynamic.c
+++ b/keydb_dynamic.c
@@ -19,6 +19,7 @@
 #include "mem.h"
 #include "merge.h"
 #include "onak-conf.h"
+#include "openpgp.h"
 #include "parsekey.h"
 #include "sendsync.h"
 
@@ -255,7 +256,7 @@ static char *dynamic_keyid2uid(uint64_t keyid)
 	if (dynamic_fetch_key(keyid, &publickey, false) && publickey != NULL) {
 		curuid = publickey->uids;
 		while (curuid != NULL && buf[0] == 0) {
-			if (curuid->packet->tag == 13) {
+			if (curuid->packet->tag == OPENPGP_PACKET_UID) {
 				snprintf(buf, 1023, "%.*s",
 						(int) curuid->packet->length,
 						curuid->packet->data);
diff --git a/keyindex.c b/keyindex.c
index 869befd..6aab5d3 100644
--- a/keyindex.c
+++ b/keyindex.c
@@ -20,6 +20,7 @@
 #include "keystructs.h"
 #include "log.h"
 #include "onak-conf.h"
+#include "openpgp.h"
 
 int list_sigs(struct openpgp_packet_list *sigs, bool html)
 {
@@ -78,13 +79,13 @@ int list_uids(uint64_t keyid, struct openpgp_signedpacket_list *uids,
 	int  imgindx = 0;
 
 	while (uids != NULL) {
-		if (uids->packet->tag == 13) {
+		if (uids->packet->tag == OPENPGP_PACKET_UID) {
 			snprintf(buf, 1023, "%.*s",
 				(int) uids->packet->length,
 				uids->packet->data);
 			printf("                                %s\n",
 				(html) ? txt2html(buf) : buf);
-		} else if (uids->packet->tag == 17) {
+		} else if (uids->packet->tag == OPENPGP_PACKET_UAT) {
 			printf("                                ");
 			if (html) {
 				printf("<img src=\"lookup?op=photo&search="
@@ -115,7 +116,7 @@ int list_subkeys(struct openpgp_signedpacket_list *subkeys, bool verbose,
 	int	 	length = 0;
 
 	while (subkeys != NULL) {
-		if (subkeys->packet->tag == 14) {
+		if (subkeys->packet->tag == OPENPGP_PACKET_PUBLICSUBKEY) {
 
 			created_time = (subkeys->packet->data[1] << 24) +
 					(subkeys->packet->data[2] << 16) +
@@ -143,8 +144,9 @@ int list_subkeys(struct openpgp_signedpacket_list *subkeys, bool verbose,
 		
 			printf("sub  %5d%c/%08X %04d/%02d/%02d\n",
 				length,
-				(type == 1) ? 'R' : ((type == 16) ? 'g' : 
-					((type == 17) ? 'D' : '?')),
+				(type == OPENPGP_PKALGO_RSA) ? 'R' :
+				((type == OPENPGP_PKALGO_ELGAMAL) ? 'g' :
+				((type == OPENPGP_PKALGO_DSA) ? 'D' : '?')),
 				(uint32_t) (get_packetid(subkeys->packet) &
 					    0xFFFFFFFF),
 				created->tm_year + 1900,
@@ -262,16 +264,16 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint,
 		keyid = get_keyid(keys);
 
 		switch (type) {
-		case 1:
+		case OPENPGP_PKALGO_RSA:
 			typech = 'R';
 			break;
-		case 16:
+		case OPENPGP_PKALGO_ELGAMAL:
 			typech = 'g';
 			break;
-		case 17:
+		case OPENPGP_PKALGO_DSA:
 			typech = 'D';
 			break;
-		case 20:
+		case OPENPGP_PKALGO_ELGAMAL_SIGN:
 			typech = 'G';
 			break;
 		default:
@@ -301,7 +303,8 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint,
 		}
 
 		curuid = keys->uids;
-		if (curuid != NULL && curuid->packet->tag == 13) {
+		if (curuid != NULL &&
+				curuid->packet->tag == OPENPGP_PACKET_UID) {
 			snprintf(buf, 1023, "%.*s",
 				(int) curuid->packet->length,
 				curuid->packet->data);
@@ -406,7 +409,7 @@ int mrkey_index(struct openpgp_publickey *keys)
 		for (curuid = keys->uids; curuid != NULL;
 			 curuid = curuid->next) {
 		
-			if (curuid->packet->tag == 13) {
+			if (curuid->packet->tag == OPENPGP_PACKET_UID) {
 				printf("uid:");
 				for (i = 0; i < (int) curuid->packet->length;
 						i++) {
diff --git a/openpgp.h b/openpgp.h
new file mode 100644
index 0000000..7ccf133
--- /dev/null
+++ b/openpgp.h
@@ -0,0 +1,45 @@
+/*
+ * openpgp.h - Defines directly related to OpenPGP RFC 4880
+ *
+ * Copyright 2011 Jonathan McDowell <noodles@earth.li>
+ */
+
+#ifndef __OPENPGP_H__
+#define __OPENPGP_H__
+
+#define OPENPGP_PKALGO_RSA		1
+#define OPENPGP_PKALGO_ELGAMAL		16
+#define OPENPGP_PKALGO_DSA		17
+#define OPENPGP_PKALGO_ELGAMAL_SIGN	20
+
+#define OPENPGP_HASH_MD5		1
+#define OPENPGP_HASH_SHA1		2
+#define OPENPGP_HASH_RIPEMD160		3
+#define OPENPGP_HASH_SHA256		8
+#define OPENPGP_HASH_SHA384		9
+#define OPENPGP_HASH_SHA512		10
+#define OPENPGP_HASH_SHA224		11
+
+#define OPENPGP_PACKET_SIGNATURE	2
+#define OPENPGP_PACKET_PUBLICKEY	6
+#define OPENPGP_PACKET_TRUST		12
+#define OPENPGP_PACKET_UID		13
+#define OPENPGP_PACKET_PUBLICSUBKEY	14
+#define OPENPGP_PACKET_UAT		17
+
+#define OPENPGP_SIGTYPE_BINARY		0x00
+#define OPENPGP_SIGTYPE_TEXT		0x01
+#define OPENPGP_SIGTYPE_KEY_REV		0x20
+#define OPENPGP_SIGTYPE_SUBKEY_REV	0x28
+#define OPENPGP_SIGTYPE_CERT_REV	0x30
+
+#define OPENPGP_SIGSUB_CREATION		2
+#define OPENPGP_SIGSUB_EXPIRY		3
+#define OPENPGP_SIGSUB_REGEX		6
+#define OPENPGP_SIGSUB_ISSUER		16
+#define OPENPGP_SIGSUB_NOTATION		20
+#define OPENPGP_SIGSUB_KEYSERVER	23
+#define OPENPGP_SIGSUB_PRIMARYUID	25
+#define OPENPGP_SIGSUB_POLICYURI	26
+
+#endif /* __OPENPGP_H__ */
diff --git a/parsekey.c b/parsekey.c
index 2d95106..349d5c8 100644
--- a/parsekey.c
+++ b/parsekey.c
@@ -16,6 +16,7 @@
 #include "ll.h"
 #include "log.h"
 #include "mem.h"
+#include "openpgp.h"
 #include "parsekey.h"
 
 /**
@@ -45,7 +46,7 @@ int parse_keys(struct openpgp_packet_list *packets,
 
 	while (packets != NULL) {
 		switch (packets->packet->tag) {
-		case 2:
+		case OPENPGP_PACKET_SIGNATURE:
 			/*
 			 * It's a signature packet. Add it to either the public
 			 * key, to the current UID or the current subkey.
@@ -68,13 +69,15 @@ int parse_keys(struct openpgp_packet_list *packets,
 				 * if it's a revocation.
 				 */
 				if (packets->packet->data[0] == 3 &&
-					packets->packet->data[2] == 0x20) {
+					packets->packet->data[2] ==
+						OPENPGP_SIGTYPE_KEY_REV) {
 					/*
 					 * Type 3 key, 0x20 == revocation
 					 */
 					curkey->revoked = true;
 				} else if (packets->packet->data[0] == 4 &&
-					packets->packet->data[1] == 0x20) {
+					packets->packet->data[1] ==
+						OPENPGP_SIGTYPE_KEY_REV) {
 					/*
 					 * Type 4 key, 0x20 == revocation
 					 */
@@ -82,7 +85,7 @@ int parse_keys(struct openpgp_packet_list *packets,
 				}
 			}
 			break;
-		case 6:
+		case OPENPGP_PACKET_PUBLICKEY:
 			/*
 			 * It's a public key packet, so start a new key in our
 			 * list.
@@ -98,8 +101,8 @@ int parse_keys(struct openpgp_packet_list *packets,
 			curkey->publickey = packet_dup(packets->packet);
 			count++;
 			break;
-		case 13:
-		case 17:
+		case OPENPGP_PACKET_UID:
+		case OPENPGP_PACKET_UAT:
 			/*
 			 * It's a UID packet (or a photo id, which is similar).
 			 */
@@ -109,7 +112,7 @@ int parse_keys(struct openpgp_packet_list *packets,
 				uid,
 				packet_dup(packets->packet));
 			break;
-		case 14:
+		case OPENPGP_PACKET_PUBLICSUBKEY:
 			/*
 			 * It's a subkey packet.
 			 */
@@ -118,7 +121,7 @@ int parse_keys(struct openpgp_packet_list *packets,
 				subkey,
 				packet_dup(packets->packet));
 			break;
-		case 12:
+		case OPENPGP_PACKET_TRUST:
 		case 61:
 			/*
 			 * One of:
@@ -284,7 +287,8 @@ int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
 			}
 
 			if (rc == 0) {
-				if (curpacket->packet->tag == 6) {
+				if (curpacket->packet->tag ==
+						OPENPGP_PACKET_PUBLICKEY) {
 					keys++;
 				}
 				curpacket->packet->data =
diff --git a/splitkeys.c b/splitkeys.c
index 73a94cd..86a8363 100644
--- a/splitkeys.c
+++ b/splitkeys.c
@@ -17,6 +17,7 @@
 #include "log.h"
 #include "mem.h"
 #include "onak-conf.h"
+#include "openpgp.h"
 #include "parsekey.h"
 
 int main(int argc, char *argv[])
@@ -52,7 +53,8 @@ int main(int argc, char *argv[])
 				tmp = list_end;
 				list_end = list_end->next;
 				if (list_end->next == NULL &&
-					list_end->packet->tag == 6) {
+					list_end->packet->tag ==
+						OPENPGP_PACKET_PUBLICKEY) {
 					tmp->next = NULL;
 				}
 			}
-- 
2.39.5