Imported Upstream version 0.6.27
[platform/upstream/libsolv.git] / ext / repo_pubkey.c
index b1a9aa0..eb83839 100644 (file)
@@ -14,8 +14,6 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <limits.h>
-#include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -257,6 +255,12 @@ pgphashalgo2type(int algo)
     return REPOKEY_TYPE_SHA1;
   if (algo == 8)
     return REPOKEY_TYPE_SHA256;
+  if (algo == 9)
+    return REPOKEY_TYPE_SHA384;
+  if (algo == 10)
+    return REPOKEY_TYPE_SHA512;
+  if (algo == 11)
+    return REPOKEY_TYPE_SHA224;
   return 0;
 }
 
@@ -1147,10 +1151,8 @@ solvsig_free(Solvsig *ss)
   solv_free(ss);
 }
 
-#ifdef ENABLE_PGPVRFY
-
 static int
-repo_verify_sigdata_cmp(const void *va, const void *vb, void *dp)
+repo_find_all_pubkeys_cmp(const void *va, const void *vb, void *dp)
 {
   Pool *pool = dp;
   Id a = *(Id *)va;
@@ -1159,33 +1161,57 @@ repo_verify_sigdata_cmp(const void *va, const void *vb, void *dp)
   return strcmp(pool_id2str(pool, pool->solvables[b].evr), pool_id2str(pool, pool->solvables[a].evr));
 }
 
-/* warning: does not check key expiry/revokation, like gpgv or rpm */
-/* returns the Id of the pubkey that verified the signature */
-Id
-repo_verify_sigdata(Repo *repo, unsigned char *sigdata, int sigdatal, const char *keyid)
+void
+repo_find_all_pubkeys(Repo *repo, const char *keyid, Queue *q)
 {
   Id p;
   Solvable *s;
-  Queue q;
-  int i;
 
-  if (!sigdata || !keyid)
-    return 0;
-  queue_init(&q);
+  queue_empty(q);
+  if (!keyid)
+    return;
+  queue_init(q);
   FOR_REPO_SOLVABLES(repo, p, s)
     {
-      const char *evr = pool_id2str(s->repo->pool, s->evr);
-      const char *kidstr;
+      const char *kidstr, *evr = pool_id2str(s->repo->pool, s->evr);
 
       if (!evr || strncmp(evr, keyid + 8, 8) != 0)
        continue;
       kidstr = solvable_lookup_str(s, PUBKEY_KEYID);
-      if (!kidstr || strcmp(kidstr, keyid) != 0)
-        continue;
-      queue_push(&q, p);
+      if (kidstr && !strcmp(kidstr, keyid))
+        queue_push(q, p);
     }
-  if (q.count > 1)
-    solv_sort(q.elements, q.count, sizeof(Id), repo_verify_sigdata_cmp, repo->pool);
+  if (q->count > 1)
+    solv_sort(q->elements, q->count, sizeof(Id), repo_find_all_pubkeys_cmp, repo->pool);
+}
+
+Id
+repo_find_pubkey(Repo *repo, const char *keyid)
+{
+  Queue q;
+  Id p;
+  queue_init(&q);
+  repo_find_all_pubkeys(repo, keyid, &q);
+  p = q.count ? q.elements[0] : 0;
+  queue_free(&q);
+  return p;
+}
+
+#ifdef ENABLE_PGPVRFY
+
+/* warning: does not check key expiry/revokation, same as with gpgv or rpm */
+/* returns the Id of the pubkey that verified the signature */
+Id
+repo_verify_sigdata(Repo *repo, unsigned char *sigdata, int sigdatal, const char *keyid)
+{
+  Id p;
+  Queue q;
+  int i;
+
+  if (!sigdata || !keyid)
+    return 0;
+  queue_init(&q);
+  repo_find_all_pubkeys(repo, keyid, &q);
   for (i = 0; i < q.count; i++)
     {
       int pubdatal;