]> git.ipfire.org Git - people/stevee/pakfire.git/commitdiff
archive: Implement creating a signature
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Jul 2021 15:03:17 +0000 (15:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Jul 2021 15:03:17 +0000 (15:03 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/archive.c
src/libpakfire/archive.c
src/libpakfire/include/pakfire/archive.h
src/libpakfire/libpakfire.sym

index 3e3d25e4fa7f21db2102c323d82da7cf6bcf9a87..979b5226c58073b21aea332a97cbe67e508c08f7 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "archive.h"
 #include "errors.h"
+#include "key.h"
 #include "package.h"
 
 PyObject* new_archive(PyTypeObject* type, struct pakfire_archive* archive) {
@@ -126,6 +127,22 @@ static PyObject* Archive_verify(ArchiveObject* self) {
        return NULL;
 }
 
+static PyObject* Archive_sign(ArchiveObject* self, PyObject* args) {
+       KeyObject* key = NULL;
+
+       if (!PyArg_ParseTuple(args, "O!", &KeyType, &key))
+               return NULL;
+
+       // Create signature
+       int r = pakfire_archive_sign(self->archive, key->key);
+       if (r) {
+               PyErr_SetFromErrno(PyExc_OSError);
+               return NULL;
+       }
+
+       Py_RETURN_NONE;
+}
+
 static PyObject* Archive_extract(ArchiveObject* self, PyObject* args) {
        const char* prefix = NULL;
 
@@ -206,6 +223,12 @@ static struct PyMethodDef Archive_methods[] = {
                METH_VARARGS,
                NULL
        },
+       {
+               "sign",
+               (PyCFunction)Archive_sign,
+               METH_VARARGS,
+               NULL
+       },
        {
                "verify",
                (PyCFunction)Archive_verify,
index f58e197cfd9a5c78d25db96d9c417328638e0409..1aaad99ad0563003c0d4806c96d08d290951bd24 100644 (file)
@@ -1175,6 +1175,21 @@ ERROR:
        return status;
 }
 
+static int pakfire_archive_load_checksums_mtree(struct pakfire_archive* archive) {
+       return 0;
+}
+
+static int pakfire_archive_load_checksums_legacy(struct pakfire_archive* archive) {
+       return 0;
+}
+
+static int pakfire_archive_load_checksums(struct pakfire_archive* archive) {
+       if (archive->format >= 6)
+               return pakfire_archive_load_checksums_mtree(archive);
+       else
+               return pakfire_archive_load_checksums_legacy(archive);
+}
+
 /*
        This function is called to examine whether we have a signature and if so verify it
 */
@@ -1398,6 +1413,46 @@ PAKFIRE_EXPORT const char* pakfire_archive_verify_strerror(pakfire_archive_verif
        return _("Unknown error");
 }
 
+static int pakfire_archive_create_signature(struct pakfire_archive* archive,
+               struct pakfire_key* key, char** signature, size_t signature_length) {
+       char* buffer = NULL;
+       size_t length = 0;
+
+       // Read chksums
+       int r = open_archive_and_read(archive, "chksums", &buffer, &length);
+       if (r)
+               goto ERROR;
+
+       // Use the key to sign the buffer
+       r = pakfire_key_sign(key, buffer, length, signature, signature_length);
+       if (r)
+               goto ERROR;
+
+ERROR:
+       if (buffer)
+               free(buffer);
+
+       return r;
+}
+
+PAKFIRE_EXPORT int pakfire_archive_sign(struct pakfire_archive* archive, struct pakfire_key* key) {
+       int r;
+
+       // XXX check if all checksums match
+
+       char* signature = NULL;
+       size_t signature_length = 0;
+
+       // Create the signature
+       r = pakfire_archive_create_signature(archive, key, &signature, &signature_length);
+       if (r)
+               return r;
+
+       // XXX write signature to archive
+
+       return 0;
+}
+
 PAKFIRE_EXPORT size_t pakfire_archive_get_size(struct pakfire_archive* archive) {
        struct stat buf;
 
index ca072c0c47690c8a884b5e6f212da2795e0689e0..17641846cf4ca5af9f5c3e2333c46ffe0f9f6f45 100644 (file)
@@ -61,6 +61,7 @@ struct pakfire_filelist* pakfire_archive_get_filelist(struct pakfire_archive* ar
 int pakfire_archive_verify(struct pakfire_archive* archive,
        pakfire_archive_verify_status_t* status);
 const char* pakfire_archive_verify_strerror(pakfire_archive_verify_status_t status);
+int pakfire_archive_sign(struct pakfire_archive* archive, struct pakfire_key* key);
 
 size_t pakfire_archive_get_size(struct pakfire_archive* archive);
 struct pakfire_package* pakfire_archive_make_package(
index 8b920918a600cc9f204bea5d8cbe2099526b6b1e..e825bb8acf1e4b569088ccbd50fabe85764e49a8 100644 (file)
@@ -65,6 +65,7 @@ global:
        pakfire_archive_open;
        pakfire_archive_read;
        pakfire_archive_ref;
+       pakfire_archive_sign;
        pakfire_archive_unref;
        pakfire_archive_verify;
        pakfire_archive_verify_strerror;