#include <pakfire/scriptlet.h>
#include <pakfire/util.h>
+enum pakfire_archive_verify_flags {
+ PAKFIRE_ARCHIVE_VERIFY_ALL,
+ PAKFIRE_ARCHIVE_VERIFY_BEST,
+};
+
struct pakfire_archive_chksum {
STAILQ_ENTRY(pakfire_archive_chksum) nodes;
};
static int pakfire_archive_verify_add_validator(struct pakfire_archive_validator*** list,
- struct pakfire* pakfire, const EVP_MD* md, const unsigned char* digest) {
+ struct pakfire* pakfire, const EVP_MD* md, const unsigned char* digest,
+ enum pakfire_archive_verify_flags flags) {
+
+ switch (flags) {
+ // Fall through and add the validator
+ case PAKFIRE_ARCHIVE_VERIFY_ALL:
+ break;
+
+ // We only accept one validator, so this function becomes a no-op when list
+ // has any validators already
+ case PAKFIRE_ARCHIVE_VERIFY_BEST:
+ if (*list)
+ return 0;
+ break;
+
+ default:
+ errno = EINVAL;
+ return 1;
+ }
+
+ // Allocate validator
struct pakfire_archive_validator* v = calloc(1, sizeof(*v));
if (!v)
return 1;
// SHA512
if (pakfire_archive_chksum_has_digest(chksum->digest_sha512)) {
r = pakfire_archive_verify_add_validator(&validators, archive->pakfire,
- EVP_sha512(), chksum->digest_sha512);
+ EVP_sha512(), chksum->digest_sha512, flags);
if (r)
return r;
}
// SHA256
if (pakfire_archive_chksum_has_digest(chksum->digest_sha256)) {
r = pakfire_archive_verify_add_validator(&validators, archive->pakfire,
- EVP_sha256(), chksum->digest_sha256);
+ EVP_sha256(), chksum->digest_sha256, flags);
if (r)
return r;
}
return r;
// Verify checksums
- r = pakfire_archive_verify_checksums(archive, 0);
+ r = pakfire_archive_verify_checksums(archive, PAKFIRE_ARCHIVE_VERIFY_BEST);
if (r)
return r;
}
PAKFIRE_EXPORT int pakfire_archive_sign(struct pakfire_archive* archive, struct pakfire_key* key) {
int r;
- // XXX check if all checksums match
+ // Verify checksums
+ r = pakfire_archive_verify_checksums(archive, PAKFIRE_ARCHIVE_VERIFY_ALL);
+ if (r) {
+ ERROR(archive->pakfire, "The archive checksums don't match\n");
+ return r;
+ }
char* signature = NULL;
size_t signature_length = 0;