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",
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,
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)
DEBUG(key->pakfire, "Exporting key %s\n", fingerprint);
gpgme_data_t data = NULL;
- char* buffer = NULL;
int r = 1;
// Initialize the buffer
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);
ERROR:
if (buffer)
gpgme_free(buffer);
- if (data)
- gpgme_data_release(data);
return r;
}