From: Michael Tremer Date: Thu, 6 Oct 2022 13:33:38 +0000 (+0000) Subject: keys: Export public/secret keys easily X-Git-Tag: 0.9.28~273 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=330dae219b9208552a78dd20f6bf6ceee9e6e52e;p=pakfire.git keys: Export public/secret keys easily Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/key.c b/src/_pakfire/key.c index 686dc7ead..4fe6056ea 100644 --- a/src/_pakfire/key.c +++ b/src/_pakfire/key.c @@ -157,6 +157,54 @@ static PyObject* Key_delete(KeyObject* self) { return NULL; } +static PyObject* Key_get_public_key(KeyObject* self) { + char* buffer = NULL; + size_t length = 0; + int r; + + PyObject* object = NULL; + + // Fetch the public key + r = pakfire_key_get_public_key(self->key, &buffer, &length); + if (r) { + PyErr_SetFromErrno(PyExc_OSError); + goto ERROR; + } + + // Create a unicode object + object = PyUnicode_FromStringAndSize(buffer, length); + +ERROR: + if (buffer) + free(buffer); + + return object; +} + +static PyObject* Key_get_secret_key(KeyObject* self) { + char* buffer = NULL; + size_t length = 0; + int r; + + PyObject* object = NULL; + + // Fetch the secret key + r = pakfire_key_get_secret_key(self->key, &buffer, &length); + if (r) { + PyErr_SetFromErrno(PyExc_OSError); + goto ERROR; + } + + // Create a unicode object + object = PyUnicode_FromStringAndSize(buffer, length); + +ERROR: + if (buffer) + free(buffer); + + return object; +} + static struct PyMethodDef Key_methods[] = { { "delete", @@ -195,6 +243,20 @@ static struct PyGetSetDef Key_getsetters[] = { NULL, NULL, }, + { + "public_key", + (getter)Key_get_public_key, + NULL, + NULL, + NULL, + }, + { + "secret_key", + (getter)Key_get_secret_key, + NULL, + NULL, + NULL, + }, { "uid", (getter)Key_get_uid, diff --git a/src/libpakfire/include/pakfire/key.h b/src/libpakfire/include/pakfire/key.h index 89605abf1..4962a22c7 100644 --- a/src/libpakfire/include/pakfire/key.h +++ b/src/libpakfire/include/pakfire/key.h @@ -58,6 +58,9 @@ int pakfire_key_generate(struct pakfire_key** key, struct pakfire* pakfire, int pakfire_key_export(struct pakfire_key* key, FILE* f, pakfire_key_export_mode_t mode); int pakfire_key_import(struct pakfire* pakfire, FILE* f, struct pakfire_key*** keys); +int pakfire_key_get_public_key(struct pakfire_key* key, char** buffer, size_t* length); +int pakfire_key_get_secret_key(struct pakfire_key* key, char** buffer, size_t* length); + char* pakfire_key_dump(struct pakfire_key* key); #ifdef PAKFIRE_PRIVATE diff --git a/src/libpakfire/key.c b/src/libpakfire/key.c index 535d3a354..7f515ac78 100644 --- a/src/libpakfire/key.c +++ b/src/libpakfire/key.c @@ -470,12 +470,9 @@ PAKFIRE_EXPORT int pakfire_key_generate(struct pakfire_key** key, struct pakfire return pakfire_key_write_to_keystore(*key); } -PAKFIRE_EXPORT int pakfire_key_export(struct pakfire_key* key, FILE* f, - pakfire_key_export_mode_t mode) { - if (!f) { - errno = EINVAL; - return 1; - } +static int pakfire_key_data(struct pakfire_key* key, char** buffer, size_t* length, + const pakfire_key_export_mode_t mode) { + char* output = NULL; gpgme_ctx_t gpgctx = pakfire_get_gpgctx(key->pakfire); if (!gpgctx) @@ -496,7 +493,6 @@ PAKFIRE_EXPORT int pakfire_key_export(struct pakfire_key* key, FILE* f, DEBUG(key->pakfire, "Exporting key %s\n", fingerprint); gpgme_data_t data = NULL; - char* buffer = NULL; int r = 1; // Initialize the buffer @@ -514,18 +510,68 @@ PAKFIRE_EXPORT int pakfire_key_export(struct pakfire_key* key, FILE* f, if (gpg_err_code(e) != GPG_ERR_NO_ERROR) goto ERROR; - size_t size; - // Fetch data from buffer - buffer = gpgme_data_release_and_get_mem(data, &size); + output = gpgme_data_release_and_get_mem(data, length); - // Reset data + // Reset data so it won't be freed again data = NULL; + // Allocate buffer + *buffer = malloc(*length); + if (!*buffer) { + r = 1; + goto ERROR; + } + + // Copy the output buffer + memcpy(*buffer, output, *length); + + // Success + r = 0; + +ERROR: + if (output) + gpgme_free(output); + if (data) + gpgme_data_release(data); + + return r; +} + +PAKFIRE_EXPORT int pakfire_key_get_public_key(struct pakfire_key* key, + char** buffer, size_t* length) { + // Fetch the public key + return pakfire_key_data(key, buffer, length, PAKFIRE_KEY_EXPORT_MODE_PUBLIC); +} + +PAKFIRE_EXPORT int pakfire_key_get_secret_key(struct pakfire_key* key, + char** buffer, size_t* length) { + // Fetch the secret key + return pakfire_key_data(key, buffer, length, PAKFIRE_KEY_EXPORT_MODE_SECRET); +} + +PAKFIRE_EXPORT int pakfire_key_export(struct pakfire_key* key, FILE* f, + pakfire_key_export_mode_t mode) { + char* buffer = NULL; + size_t length = 0; + int r; + + // Check input + if (!f) { + errno = EINVAL; + return 1; + } + + r = pakfire_key_data(key, &buffer, &length, mode); + if (r) + return r; + // Write key to file - size_t bytes_written = fwrite(buffer, 1, size, f); - if (bytes_written < size) + size_t bytes_written = fwrite(buffer, 1, length, f); + if (bytes_written < length) { + r = 1; goto ERROR; + } // Flush f r = fflush(f); @@ -538,8 +584,6 @@ PAKFIRE_EXPORT int pakfire_key_export(struct pakfire_key* key, FILE* f, ERROR: if (buffer) gpgme_free(buffer); - if (data) - gpgme_data_release(data); return r; } diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index c7adc4536..ddfa50f01 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -132,6 +132,8 @@ global: pakfire_key_get_name; pakfire_key_get_pubkey_algo; pakfire_key_get_pubkey_length; + pakfire_key_get_public_key; + pakfire_key_get_secret_key; pakfire_key_get_uid; pakfire_key_has_secret; pakfire_key_import;