]> the.earth.li Git - onak.git/blobdiff - parsekey.c
Define OpenPGP constants and use them rather than magic numbers
[onak.git] / parsekey.c
index 687fd9bd8612c6f9a3cd2c41af96e9269368a620..349d5c862903e6fecad1f3b00c804d6d0620e835 100644 (file)
@@ -16,6 +16,7 @@
 #include "ll.h"
 #include "log.h"
 #include "mem.h"
+#include "openpgp.h"
 #include "parsekey.h"
 
 /**
@@ -45,11 +46,10 @@ 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 (it should be a revocation), to the current UID
-                        * or the current subkey.
+                        * key, to the current UID or the current subkey.
                         */
                        log_assert(curkey != NULL);
                        if (curkey->subkeys != NULL) {
@@ -62,11 +62,30 @@ int parse_keys(struct openpgp_packet_list *packets,
                                        packet_dup(packets->packet));
                        } else {
                                ADD_PACKET_TO_LIST_END(curkey,
-                                       revocation,
+                                       sig,
                                        packet_dup(packets->packet));
+                               /*
+                                * This is a signature on the public key; check
+                                * if it's a revocation.
+                                */
+                               if (packets->packet->data[0] == 3 &&
+                                       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] ==
+                                               OPENPGP_SIGTYPE_KEY_REV) {
+                                       /*
+                                        * Type 4 key, 0x20 == revocation
+                                        */
+                                       curkey->revoked = true;
+                               }
                        }
                        break;
-               case 6:
+               case OPENPGP_PACKET_PUBLICKEY:
                        /*
                         * It's a public key packet, so start a new key in our
                         * list.
@@ -82,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).
                         */
@@ -93,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.
                         */
@@ -102,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:
@@ -132,7 +151,7 @@ int parse_keys(struct openpgp_packet_list *packets,
  */
 int debug_packet(struct openpgp_packet *packet)
 {
-       printf("\tNew format: %d, Tag: %u, Length: %d\n",
+       printf("\tNew format: %d, Tag: %u, Length: %zd\n",
                        packet->newformat,
                        packet->tag,
                        packet->length);
@@ -152,7 +171,7 @@ int debug_packet(struct openpgp_packet *packet)
  *     ready for parsing as a public key or whatever.
  */
 int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
-                               unsigned char *c),
+                               void *c),
                                void *ctx,
                                struct openpgp_packet_list **packets,
                                int maxnum)
@@ -268,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 =
@@ -306,7 +326,7 @@ int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
  *     packet stream from a linked list of packets.
  */
 int write_openpgp_stream(int (*putchar_func)(void *ctx, size_t count,
-                                               unsigned char *c),
+                                               void *c),
                                void *ctx,
                                struct openpgp_packet_list *packets)
 {
@@ -416,9 +436,9 @@ int flatten_publickey(struct openpgp_publickey *key,
                }
 
                /*
-                * Now do any revocation signatures on the main key.
+                * Now do any signatures on the main key.
                 */
-               for (tmplist = key->revocations; tmplist != NULL;
+               for (tmplist = key->sigs; tmplist != NULL;
                                tmplist = tmplist->next) {
                        ADD_PACKET_TO_LIST((*list_end),
                                        packet_dup(tmplist->packet));