abrt/SOURCES/9100-add_gpg_subkeys_suppor...

89 lines
2.3 KiB
Diff

From 0f61c017f2d0c8a11b12abec774aa94d45ec8116 Mon Sep 17 00:00:00 2001
From: Daniil Leonov <dleonov@cloudlinux.com>
Date: Tue, 9 Feb 2021 15:17:59 +0300
Subject: [PATCH] Add GPG subkeys support.
---
src/daemon/rpm.c | 46 ++++++++++++++++++++++++++++++++++++++--------
1 file changed, 38 insertions(+), 8 deletions(-)
diff --git a/src/daemon/rpm.c b/src/daemon/rpm.c
index af9a7be..c28c047 100644
--- a/src/daemon/rpm.c
+++ b/src/daemon/rpm.c
@@ -24,6 +24,19 @@
#include <rpm/rpmcli.h>
#include <rpm/rpmdb.h>
#include <rpm/rpmpgp.h>
+#include <rpm/rpmkeyring.h>
+
+struct rpmPubkey_s {
+ uint8_t *pkt;
+ size_t pktlen;
+ pgpKeyID_t keyid;
+ pgpDigParams pgpkey;
+ int nrefs;
+ pthread_rwlock_t lock;
+};
+
+typedef struct rpmPubkey_s * rpmPubkey;
+
#endif
/**
@@ -93,8 +106,13 @@ void rpm_destroy()
void rpm_load_gpgkey(const char* filename)
{
#ifdef HAVE_LIBRPM
+ rpmPubkey pubkey = NULL;
+ rpmPubkey *subkeys = NULL;
+ char *fingerprint = NULL;
+ int subkeysCount = 0;
uint8_t *pkt = NULL;
- size_t pklen;
+ size_t pklen = 0;
+
if (pgpReadPkts(filename, &pkt, &pklen) != PGPARMOR_PUBKEY)
{
free(pkt);
@@ -102,17 +120,29 @@ void rpm_load_gpgkey(const char* filename)
return;
}
- uint8_t keyID[8];
-#if 0
- if (pgpPubkeyFingerprint(pkt, pklen, keyID) == 0)
-#else
- if (pgpPubkeyKeyID(pkt, pklen, keyID) == 0)
-#endif
+ pubkey = rpmPubkeyNew(pkt, pklen);
+ if (pubkey != NULL)
{
- char *fingerprint = pgpHexStr(keyID, sizeof(keyID));
+ fingerprint = pgpHexStr(pubkey->keyid, sizeof(pubkey->keyid));
if (fingerprint != NULL)
list_fingerprints = g_list_append(list_fingerprints, fingerprint);
+
+ subkeys = rpmGetSubkeys(pubkey, &subkeysCount);
+ for (int i = 0; i < subkeysCount; i++)
+ {
+ rpmPubkey subkey = subkeys[i];
+ if (subkey != NULL)
+ {
+ fingerprint = pgpHexStr(subkey->keyid, sizeof(subkey->keyid));
+ if (fingerprint != NULL)
+ list_fingerprints = g_list_append(list_fingerprints, fingerprint);
+ }
+ rpmPubkeyFree(subkey);
+ }
+ free(subkeys);
}
+
+ rpmPubkeyFree(pubkey);
free(pkt);
#else
return;
--
2.25.1