]> the.earth.li Git - onak.git/blobdiff - decodekey.c
0.3.2 release.
[onak.git] / decodekey.c
index 46c75833d3317a41d6bca8084dc1e525e1037a12..efffad7d7863a7e310647113801fb21ba545c22f 100644 (file)
@@ -4,11 +4,8 @@
  * Jonathan McDowell <noodles@earth.li>
  *
  * Copyright 2002 Project Purple
- *
- * $Id: decodekey.c,v 1.3 2003/06/08 10:45:44 noodles Exp $
  */
 
-#include <assert.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -37,7 +34,7 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid)
        int length = 0;
        int packetlen = 0;
 
-       assert(data != NULL);
+       log_assert(data != NULL);
 
        length = (data[0] << 8) + data[1] + 2;
 
@@ -84,6 +81,12 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid)
                        *keyid <<= 8;
                        *keyid += data[offset+packetlen - 1];
                        break;
+               case 20:
+                       /*
+                        * Annotation data.
+                        */
+                       break;
+
                case 23:
                        /*
                         * Key server preferences. Including no-modify.
@@ -212,6 +215,10 @@ char **keyuids(struct openpgp_publickey *key, char **primary)
        char buf[1024];
        char **uids = NULL;
        int count = 0;
+        
+        if (primary != NULL) {
+               *primary = NULL;
+       }
 
        if (key != NULL && key->uids != NULL) {
                uids = malloc((spsize(key->uids) + 1) * sizeof (char *));
@@ -228,13 +235,41 @@ char **keyuids(struct openpgp_publickey *key, char **primary)
                        curuid = curuid -> next;
                }
                uids[count] = NULL;
-       }
-       /*
-        * TODO: Parse subpackets for real primary ID (v4 keys)
-        */
-       if (primary != NULL) {
-               *primary = uids[0];
+
+               /*
+                * TODO: Parse subpackets for real primary ID (v4 keys)
+                */
+               if (primary != NULL) {
+                       *primary = uids[0];
+               }
        }
 
        return uids;
 }
+
+/**
+ *     keysubkeys - Takes a key and returns an array of its subkey keyids.
+ *     @key: The key to get the subkeys of.
+ *
+ *     keysubkeys takes a public key structure and returns an array of the
+ *     subkey keyids for that key.
+ */
+uint64_t *keysubkeys(struct openpgp_publickey *key)
+{
+       struct openpgp_signedpacket_list *cursubkey = NULL;
+       uint64_t                         *subkeys = NULL;
+       int                               count = 0;
+        
+       if (key != NULL && key->subkeys != NULL) {
+               subkeys = malloc((spsize(key->subkeys) + 1) *
+                               sizeof (uint64_t));
+               cursubkey = key->subkeys;
+               while (cursubkey != NULL) {
+                       subkeys[count++] = get_packetid(cursubkey->packet);
+                       cursubkey = cursubkey -> next;
+               }
+               subkeys[count] = 0;
+       }
+
+       return subkeys;
+}