From d376e45136376852d025b2fa2f71aeebf4c4b03b Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Mon, 14 Oct 2024 20:41:12 +0200 Subject: [PATCH] Add rpmkeys --export Just writes the keys out to stdout in an ASCII armored format. Resolves: #3366 --- docs/man/rpmkeys.8.md | 6 ++ tests/rpmdb.at | 147 ++++++++++++++++++++++++++++++++++++++++++ tools/rpmkeys.cc | 18 +++++- 3 files changed, 170 insertions(+), 1 deletion(-) diff --git a/docs/man/rpmkeys.8.md b/docs/man/rpmkeys.8.md index cb00fa1c15..f46ffbaf27 100644 --- a/docs/man/rpmkeys.8.md +++ b/docs/man/rpmkeys.8.md @@ -21,6 +21,8 @@ The general forms of rpm digital signature commands are **rpmkeys** **\--list** \[*KEYFINGERPRINT \...*\] +**rpmkeys** **\--export** \[*KEYFINGERPRINT \...*\] + **rpmkeys** **\--import** *PUBKEY \...* **rpmkeys** **\--delete** *KEYHASH \...* @@ -53,6 +55,10 @@ querying. Here\'s information about the Red Hat GPG/DSA key: Finally, public keys can be erased after importing just like packages. Here\'s how to remove the Red Hat GPG/DSA key: +**rpmkeys** **\--export** + +Write the keys in an armor wrapped text format to standard out. + **rpmkeys** **\--delete db42a60e** Or alternatively: diff --git a/tests/rpmdb.at b/tests/rpmdb.at index 2ae8d98312..d93569a0b2 100644 --- a/tests/rpmdb.at +++ b/tests/rpmdb.at @@ -168,6 +168,117 @@ b6542f92f30650c36b6f41bcb3a771bfeb04e625 Alice public key ], []) +RPMTEST_CHECK([ +runroot rpmkeys --export +], +[0], +[-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g +HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY +91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8 +eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas +7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ +1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl +c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK +CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf +Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB +BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr +XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX +fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq ++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN +BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY +zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz +iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6 +Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c +KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m +L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAGJAR8EGAEIAAkFAljmORgCGwwA +CgkQQ0RZHhlkxfzwDQf/Y5on5o+s/xD3tDyRYa6SErfT44lEArdCD7Yi+cygJFox +3jyM8ovtJAkwRegwyxcaLN7zeG1p1Sk9ZAYWQEJT6qSU4Ppu+CVGHgxgnTcfUiu6 +EZZQE6srvua53IMY1lT50M7vx0T5VicHFRWBFV2C/Mc32p7cEE6nn45nEZgUXQNl +ySEyvoRlsAJq6gFsfqucVz2vMJDTMVczUtq1CjvUqFbif8JVL36EoZCf1SeRw6d6 +s1Kp3AA33Rjd+Uw87HJ4EIB75zMFQX2H0ggAVdYTQcqGXHP5MZK1jJrHfxJyMi3d +UNW2iqnN3BA7guhOv6OMiROF1+I7Q5nWT63mQC7IgQ== +=Z6nu +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZh0iqBYJKwYBBAHaRw8BAQdAykdH/PFqlgMlJjKORrUVBCEtMj6dPAHev1Qr +DwxCr5u0KXJwbS5vcmcgZWQyNTUxOSB0ZXN0a2V5IDxlZDI1NTE5QHJwbS5vcmc+ +iJAEExYIADgWIQQVK7Mv2cqYJ5foNc+wZFrsdXv2ngUCZh0iqAIbAwULCQgHAgYV +CgkICwIEFgIDAQIeAQIXgAAKCRCwZFrsdXv2nkd7AP42YzwyWeKd/775qIJ1qPai +dy/F5VaN3Y5W5rw0KwvPLgD9F3Pna3krtD/9MtkfsI9pitS8g598YlknklAHPi5p +FwY= +=sZKd +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +BlgjNTm30U4AGjWmvl24U6a1o8/m +=Qf3c +-----END PGP PUBLIC KEY BLOCK----- +], +[]) + RPMTEST_CHECK([ runroot rpmkeys --list 771b18d3d7baa28734333c424344591e1964c5fc ], @@ -184,6 +295,42 @@ runroot rpmkeys --list 4344591e1964c5fc ], []) +RPMTEST_CHECK([ +runroot rpmkeys --export 4344591e1964c5fc +], +[0], +[-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g +HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY +91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8 +eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas +7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ +1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl +c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK +CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf +Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB +BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr +XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX +fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq ++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN +BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY +zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz +iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6 +Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c +KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m +L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAGJAR8EGAEIAAkFAljmORgCGwwA +CgkQQ0RZHhlkxfzwDQf/Y5on5o+s/xD3tDyRYa6SErfT44lEArdCD7Yi+cygJFox +3jyM8ovtJAkwRegwyxcaLN7zeG1p1Sk9ZAYWQEJT6qSU4Ppu+CVGHgxgnTcfUiu6 +EZZQE6srvua53IMY1lT50M7vx0T5VicHFRWBFV2C/Mc32p7cEE6nn45nEZgUXQNl +ySEyvoRlsAJq6gFsfqucVz2vMJDTMVczUtq1CjvUqFbif8JVL36EoZCf1SeRw6d6 +s1Kp3AA33Rjd+Uw87HJ4EIB75zMFQX2H0ggAVdYTQcqGXHP5MZK1jJrHfxJyMi3d +UNW2iqnN3BA7guhOv6OMiROF1+I7Q5nWT63mQC7IgQ== +=Z6nu +-----END PGP PUBLIC KEY BLOCK----- +], +[]) + RPMTEST_CHECK([ runroot rpmkeys --list XXX diff --git a/tools/rpmkeys.cc b/tools/rpmkeys.cc index b4dc2bbeaa..1cee353d8d 100644 --- a/tools/rpmkeys.cc +++ b/tools/rpmkeys.cc @@ -14,6 +14,7 @@ enum modes { MODE_IMPORTKEY = (1 << 1), MODE_DELKEY = (1 << 2), MODE_LISTKEY = (1 << 3), + MODE_EXPORTKEY = (1 << 4), }; static int mode = 0; @@ -24,6 +25,8 @@ static struct poptOption keyOptsTable[] = { N_("verify package signature(s)"), NULL }, { "import", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_IMPORTKEY, N_("import an armored public key"), NULL }, + { "export", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTKEY, + N_("export an public key"), NULL }, { "test", '\0', POPT_ARG_NONE, &test, 0, N_("don't import, but tell if it would work or not"), NULL }, { "delete", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_DELKEY, @@ -123,6 +126,14 @@ static int deleteKey(rpmPubkey key, void * data) return 0; } +static int exportKey(rpmPubkey key, void * data) +{ + char * armored = rpmPubkeyArmorWrap(key); + rpmlog(RPMLOG_NOTICE, "%s", armored); + free(armored); + return 0; +} + int main(int argc, char *argv[]) { int ec = EXIT_FAILURE; @@ -139,7 +150,7 @@ int main(int argc, char *argv[]) args = (ARGV_const_t) poptGetArgs(optCon); - if (mode != MODE_LISTKEY && args == NULL) + if (args == NULL && mode != MODE_LISTKEY && mode != MODE_EXPORTKEY) argerror(_("no arguments given")); ts = rpmtsCreate(); @@ -154,6 +165,11 @@ int main(int argc, char *argv[]) rpmtsSetFlags(ts, (rpmtsFlags(ts)|RPMTRANS_FLAG_TEST)); ec = rpmcliImportPubkeys(ts, args); break; + case MODE_EXPORTKEY: + { + ec = matchingKeys(ts, args, exportKey); + break; + } case MODE_DELKEY: { rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);