]> the.earth.li Git - onak.git/blobdiff - keydb.c
Add support for v5 keys
[onak.git] / keydb.c
diff --git a/keydb.c b/keydb.c
index cfcf75ceaba7757ca0e3fcd1b4dd7b981c9cdcaa..f8d5a0bd8ef60248157542ee55ec356a06a0ae4d 100644 (file)
--- a/keydb.c
+++ b/keydb.c
@@ -88,13 +88,19 @@ struct ll *generic_getkeysigs(struct onak_dbctx *dbctx,
 {
        struct ll *sigs = NULL;
        struct openpgp_signedpacket_list *uids = NULL;
+       struct openpgp_packet_list *cursig;
        struct openpgp_publickey *publickey = NULL;
 
        dbctx->fetch_key_id(dbctx, keyid, &publickey, false);
        
        if (publickey != NULL) {
                for (uids = publickey->uids; uids != NULL; uids = uids->next) {
-                       sigs = keysigs(sigs, uids->sigs);
+                       for (cursig = uids->sigs; cursig != NULL;
+                                       cursig = cursig->next) {
+                               sigs = lladd(sigs,
+                                               createandaddtohash(sig_keyid(
+                                                       cursig->packet)));
+                       }
                }
                if (revoked != NULL) {
                        *revoked = publickey->revoked;
@@ -267,13 +273,23 @@ static int generic_fetch_key_fp(struct onak_dbctx *dbctx,
        /*
         * We assume if the backend is using this function it's not storing
         * anything bigger than the 64 bit key ID and just truncate the
-        * fingerprint to get that value. This doesn't work for v3 keys,
+        * fingerprint to get that value. v4 keys want the lowest 64 bits, v5
+        * keys need the top 64 bits.  This doesn't work for v3 keys,
         * but there's no way to map from v3 fingerprint to v3 key ID so
         * if the backend can't do it we're going to fail anyway.
         */
        keyid = 0;
-       for (i = (fingerprint->length - 8); i < fingerprint->length; i++) {
-               keyid = (keyid << 8) + fingerprint->fp[i];
+       if (fingerprint->length == 20) {
+               /* v4 */
+               for (i = (fingerprint->length - 8); i < fingerprint->length;
+                               i++) {
+                       keyid = (keyid << 8) + fingerprint->fp[i];
+               }
+       } else {
+               /* v5 */
+               for (i = 0; i < 8; i++) {
+                       keyid = (keyid << 8) + fingerprint->fp[i];
+               }
        }
 
        return dbctx->fetch_key_id(dbctx, keyid, publickey, intrans);