]> git.ipfire.org Git - pakfire.git/commitdiff
keys: Export public/secret keys easily
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Oct 2022 13:33:38 +0000 (13:33 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 11 Oct 2022 11:19:34 +0000 (11:19 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/key.c
src/libpakfire/include/pakfire/key.h
src/libpakfire/key.c
src/libpakfire/libpakfire.sym

index 686dc7eadb3671e5425c4ebf3b75166278b8cc71..4fe6056eaae8847ce78a26e2231bfab31fad88b4 100644 (file)
@@ -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,
index 89605abf14e7f994aa6ad119ecc682dc355d620b..4962a22c7bab3d1fd6f8e5c35bc642fe1b7589fd 100644 (file)
@@ -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
index 535d3a354d5476034a678164fa748771f54987d7..7f515ac780d47f8d9e3387b9baa662498196809f 100644 (file)
@@ -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;
 }
index c7adc45360aa8af940febf69c0f425cdb60248f5..ddfa50f015d69ff013f902af1c26ed30eb8e039b 100644 (file)
@@ -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;