}
static PyObject* _File_hexdigest(FileObject* self, enum pakfire_digests type) {
- const char* hexdigest = pakfire_file_get_hexdigest(self->file, type);
+ char* hexdigest = pakfire_file_get_hexdigest(self->file, type);
if (!hexdigest)
Py_RETURN_NONE;
- return PyUnicode_FromString(hexdigest);
+ PyObject* obj = PyUnicode_FromString(hexdigest);
+ free(hexdigest);
+
+ return obj;
}
static PyObject* File_hexdigest(FileObject* self, PyObject* args) {
}
static PyObject* Package_get_hexdigest(PackageObject* self, enum pakfire_digests type) {
- enum pakfire_digests digest = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest = 0;
const char* hexdigest = pakfire_package_get_hexdigest(self->package, &digest);
if (!hexdigest)
} pakfire_digests[] = {
{ PAKFIRE_DIGEST_SHA512, "sha512:" },
{ PAKFIRE_DIGEST_SHA256, "sha256:" },
- { PAKFIRE_DIGEST_NONE, NULL },
+ { 0, NULL },
};
static char* pakfire_db_pack_digest(enum pakfire_digests type, const char* hexdigest) {
}
static const char* pakfire_db_unpack_digest(const char* hexdigest, enum pakfire_digests* type) {
- *type = PAKFIRE_DIGEST_NONE;
+ *type = 0;
// Don't do anything for empty input
if (!hexdigest || !*hexdigest)
PAKFIRE_DIGEST_SHA256,
// Sentinel
- PAKFIRE_DIGEST_NONE,
+ 0,
};
const char* sql = "INSERT INTO file_digests(file, type, digest) VALUES(?, ?, ?)";
goto ERROR;
}
- enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest_type = 0;
const char* hexdigest = pakfire_package_get_hexdigest(pkg, &digest_type);
if (hexdigest) {
// Digest
const char* digest = (const char*)sqlite3_column_text(stmt, 8);
if (digest) {
- enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest_type = 0;
// Unpack digest
const char* hexdigest = pakfire_db_unpack_digest(digest, &digest_type);
// Download the file if it does not exist in the cache
if (access(cache_path, R_OK) != 0) {
r = pakfire_downloader_retrieve(downloader, BASEURL, mirrorlist,
- NULL, filename, cache_path, PAKFIRE_DIGEST_NONE, NULL, 0, 0);
+ NULL, filename, cache_path, 0, NULL, 0, 0);
if (r)
return r;
}
}
// Check if expected digest is set
- switch (md) {
- case PAKFIRE_DIGEST_NONE:
- break;
-
- default:
- if (!expected_digest || !expected_digest_length) {
- ERROR(downloader->pakfire, "Expected message digest or size is not set\n");
- errno = EINVAL;
- return NULL;
- }
- break;
+ if (md) {
+ if (!expected_digest || !expected_digest_length) {
+ ERROR(downloader->pakfire, "Expected message digest or size is not set\n");
+ errno = EINVAL;
+ return NULL;
+ }
}
// Expected digest length cannot be too long
case PAKFIRE_DIGEST_SHA256:
transfer->md = EVP_sha256();
break;
-
- case PAKFIRE_DIGEST_NONE:
- break;
}
// Copy the expected digest
#include <archive_entry.h>
#include <openssl/evp.h>
+#include <openssl/sha.h>
#include <pakfire/constants.h>
#include <pakfire/file.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
-#define MAX_DIGESTS 4
-
-struct pakfire_file_digest {
- enum pakfire_digests type;
- unsigned char digest[EVP_MAX_MD_SIZE];
- size_t length;
-
- // Add a buffer to store the hex representation
- char* hexdigest;
-};
-
struct pakfire_file {
struct pakfire* pakfire;
int nrefs;
char symlink[PATH_MAX];
// Digests
- struct pakfire_file_digest digests[MAX_DIGESTS];
+ struct pakfire_file_digests {
+ // SHA-512
+ unsigned char sha512[SHA512_DIGEST_LENGTH];
+
+ // SHA-256
+ unsigned char sha256[SHA256_DIGEST_LENGTH];
+ } digests;
#warning TODO capabilities, config, data
// capabilities
} pakfire_libarchive_digests[] = {
{ PAKFIRE_DIGEST_SHA512, ARCHIVE_ENTRY_DIGEST_SHA512 },
{ PAKFIRE_DIGEST_SHA256, ARCHIVE_ENTRY_DIGEST_SHA256 },
- { PAKFIRE_DIGEST_NONE, 0 },
+ { 0, 0 },
};
int pakfire_file_copy_archive_entry(struct pakfire_file* file, struct archive_entry* entry) {
type->pakfire; type++) {
const unsigned char* digest = archive_entry_digest(entry, type->libarchive);
if (digest) {
- size_t length = pakfire_digest_length(type->pakfire);
-
- r = pakfire_file_set_digest(file, type->pakfire, digest, length);
+ r = pakfire_file_set_digest(file, type->pakfire, digest);
if (r)
return r;
}
}
static void pakfire_file_free(struct pakfire_file* file) {
- struct pakfire_file_digest* digest = NULL;
-
- // Free any generated hexdigests
- for (unsigned int i = 0; i < MAX_DIGESTS; i++) {
- digest = &file->digests[i];
-
- if (digest->hexdigest) {
- free(digest->hexdigest);
- digest->hexdigest = NULL;
- }
- }
-
pakfire_unref(file->pakfire);
free(file);
}
file->mtime = time;
}
-static struct pakfire_file_digest* pakfire_file_find_digest(
- struct pakfire_file* file, enum pakfire_digests type) {
- struct pakfire_file_digest* digest = NULL;
-
- for (unsigned int i = 0; i < MAX_DIGESTS; i++) {
- digest = &file->digests[i];
-
- if (digest->type == type)
- return digest;
+/*
+ Returns one if the digest is not all zeros.
+*/
+static int pakfire_file_has_digest(const unsigned char* digest, const size_t length) {
+ for (unsigned int i = 0; i < length; i++) {
+ if (digest[i])
+ return 1;
}
- // No match
- return NULL;
+ return 0;
}
PAKFIRE_EXPORT const unsigned char* pakfire_file_get_digest(
- struct pakfire_file* file, enum pakfire_digests type, size_t* length) {
- const struct pakfire_file_digest* digest = pakfire_file_find_digest(file, type);
- if (!digest)
- return NULL;
+ struct pakfire_file* file, const enum pakfire_digests type, size_t* length) {
- // Export length
- if (length)
- *length = digest->length;
+ switch (type) {
+ case PAKFIRE_DIGEST_SHA512:
+ if (!pakfire_file_has_digest(file->digests.sha512, sizeof(file->digests.sha512)))
+ return NULL;
- return digest->digest;
-}
+ if (length)
+ *length = sizeof(file->digests.sha512);
-PAKFIRE_EXPORT const char* pakfire_file_get_hexdigest(
- struct pakfire_file* file, enum pakfire_digests type) {
- struct pakfire_file_digest* digest = pakfire_file_find_digest(file, type);
- if (!digest)
- return NULL;
+ return file->digests.sha512;
+
+ case PAKFIRE_DIGEST_SHA256:
+ if (!pakfire_file_has_digest(file->digests.sha256, sizeof(file->digests.sha256)))
+ return NULL;
- // Generate the hexdigest if non exists
- if (!digest->hexdigest) {
- const size_t length = pakfire_digest_length(digest->type);
- if (!length)
- return NULL;
+ if (length)
+ *length = sizeof(file->digests.sha256);
- digest->hexdigest = __pakfire_hexlify(digest->digest, length);
+ return file->digests.sha256;
}
- return digest->hexdigest;
+ return NULL;
}
PAKFIRE_EXPORT int pakfire_file_set_digest(struct pakfire_file* file,
- enum pakfire_digests type, const unsigned char* digest, size_t length) {
- if (!digest || !length) {
+ const enum pakfire_digests type, const unsigned char* digest) {
+ if (!digest) {
errno = EINVAL;
return 1;
}
- // Find any existing digests of this type
- struct pakfire_file_digest* d = pakfire_file_find_digest(file, type);
-
- // If there is no digest, we will try finding a new one
- if (!d)
- d = pakfire_file_find_digest(file, PAKFIRE_DIGEST_NONE);
-
- // If we could not find a free spot, we probably run out of space
- if (!d) {
- errno = ENOBUFS;
- return 1;
- }
+ switch (type) {
+ case PAKFIRE_DIGEST_SHA512:
+ memcpy(file->digests.sha512, digest, sizeof(file->digests.sha512));
+ break;
- // Check if the digest fits into our pre-allocated buffer space
- if (length > sizeof(d->digest)) {
- errno = ENOBUFS;
- return 1;
+ case PAKFIRE_DIGEST_SHA256:
+ memcpy(file->digests.sha256, digest, sizeof(file->digests.sha256));
+ break;
}
- // Store type & length
- d->type = type;
- d->length = length;
-
- // Store digest
- memcpy(d->digest, digest, d->length);
-
return 0;
}
-PAKFIRE_EXPORT int pakfire_file_set_hexdigest(struct pakfire_file* file,
- enum pakfire_digests type, const char* hexdigest) {
- const size_t digest_length = pakfire_digest_length(type);
- if (!digest_length) {
- errno = EINVAL;
- return 1;
- }
+PAKFIRE_EXPORT char* pakfire_file_get_hexdigest(
+ struct pakfire_file* file, const enum pakfire_digests type) {
+ const unsigned char* digest = NULL;
+ size_t length = 0;
- // Allocate a buffer for the binary representation of the digest
- unsigned char* digest = alloca(digest_length);
+ // Fetch the digest
+ digest = pakfire_file_get_digest(file, type, &length);
if (!digest)
- return 1;
-
- // Convert from hex to binary
- __pakfire_unhexlify(digest, digest_length, hexdigest);
+ return NULL;
- return pakfire_file_set_digest(file, type, digest, digest_length);
+ return __pakfire_hexlify(digest, length);
}
static int pakfire_file_levels(struct pakfire_file* file) {
time_t pakfire_file_get_mtime(struct pakfire_file* file);
void pakfire_file_set_mtime(struct pakfire_file* file, time_t time);
-const unsigned char* pakfire_file_get_digest(
- struct pakfire_file* file, enum pakfire_digests type, size_t* length);
-const char* pakfire_file_get_hexdigest(
- struct pakfire_file* file, enum pakfire_digests type);
+const unsigned char* pakfire_file_get_digest(struct pakfire_file* file,
+ const enum pakfire_digests type, size_t* length);
+char* pakfire_file_get_hexdigest(struct pakfire_file* file,
+ const enum pakfire_digests type);
int pakfire_file_set_digest(struct pakfire_file* file,
- enum pakfire_digests type, const unsigned char* digest, size_t length);
-int pakfire_file_set_hexdigest(struct pakfire_file* file,
- enum pakfire_digests type, const char* hexdigest);
+ const enum pakfire_digests type, const unsigned char* digest);
struct pakfire_file* pakfire_file_parse_from_file(const char* list, unsigned int format);
struct pakfire;
enum pakfire_digests {
- PAKFIRE_DIGEST_NONE = 0,
PAKFIRE_DIGEST_SHA256 = 1,
PAKFIRE_DIGEST_SHA512 = 2,
};
pakfire_file_set_ctime;
pakfire_file_set_digest;
pakfire_file_set_group;
- pakfire_file_set_hexdigest;
pakfire_file_set_mode;
pakfire_file_set_mtime;
pakfire_file_set_path;
return PAKFIRE_DIGEST_SHA256;
}
- return PAKFIRE_DIGEST_NONE;
+ return 0;
}
PAKFIRE_EXPORT const unsigned char* pakfire_package_get_digest(
static int pakfire_package_make_cache_path(struct pakfire_package* pkg) {
const char* filename = pakfire_package_get_filename(pkg);
- enum pakfire_digests digest = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest;
const char* hexdigest = pakfire_package_get_hexdigest(pkg, &digest);
if (hexdigest && strlen(hexdigest) >= 3)
if (build_id)
pakfire_package_dump_add_line(&string, _("Build ID"), build_id);
- enum pakfire_digests digest = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest = 0;
// Digest
const char* hexdigest = pakfire_package_get_hexdigest(pkg, &digest);
case PAKFIRE_DIGEST_SHA256:
pakfire_package_dump_add_line(&string, _("SHA256 Digest"), hexdigest);
break;
-
- case PAKFIRE_DIGEST_NONE:
- break;
}
// Source package
// Try to download the key
int r = pakfire_repo_retrieve(repo, NULL, url, path,
- PAKFIRE_DIGEST_NONE, NULL, 0, PAKFIRE_TRANSFER_NOTEMP|PAKFIRE_TRANSFER_NOPROGRESS);
+ 0, NULL, 0, PAKFIRE_TRANSFER_NOTEMP|PAKFIRE_TRANSFER_NOPROGRESS);
if (r)
goto ERROR;
pakfire_string_format(database_url, "repodata/%s", database);
return pakfire_repo_retrieve(repo, title, database_url, cache_path,
- PAKFIRE_DIGEST_NONE, NULL, 0, 0);
+ 0, NULL, 0, 0);
}
static int pakfire_repo_read_metadata(struct pakfire_repo* repo, const char* path, int refresh) {
return pakfire_repo_retrieve(repo, NULL,
repo->appdata->mirrorlist_url, repo->appdata->mirrorlist,
- PAKFIRE_DIGEST_NONE, NULL, 0, PAKFIRE_TRANSFER_NOPROGRESS);
+ 0, NULL, 0, PAKFIRE_TRANSFER_NOPROGRESS);
}
static int pakfire_repo_refresh_metadata(struct pakfire_repo* repo, const int force) {
}
int r = pakfire_repo_retrieve(repo, NULL,
- "repodata/repomd.json", repo->appdata->metadata, PAKFIRE_DIGEST_NONE,
+ "repodata/repomd.json", repo->appdata->metadata, 0,
NULL, 0, PAKFIRE_TRANSFER_NOPROGRESS);
if (r)
return r;
// Download the file
r = pakfire_downloader_retrieve(downloader, NULL, NULL, NULL,
- url, path, PAKFIRE_DIGEST_NONE, NULL, 0, PAKFIRE_TRANSFER_NOTEMP);
+ url, path, 0, NULL, 0, PAKFIRE_TRANSFER_NOTEMP);
if (r)
goto ERROR;
return 0;
}
- enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest_type = 0;
// Fetch digest from package
const unsigned char* expected_digest = pakfire_package_get_digest(pkg, &digest_type);
goto ERROR;
}
- enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE;
+ enum pakfire_digests digest_type = 0;
// Retrieve package digest
const unsigned char* digest = pakfire_package_get_digest(pkg, &digest_type);
case PAKFIRE_DIGEST_SHA256:
return 32;
-
- case PAKFIRE_DIGEST_NONE:
- return 0;
}
return 0;
// Retrieve a file
ASSERT_SUCCESS(
pakfire_downloader_retrieve(d, NULL, NULL, NULL, DOWNLOAD_URL, DOWNLOAD_PATH,
- PAKFIRE_DIGEST_NONE, NULL, 0, 0)
+ 0, NULL, 0, 0)
);
// Everything passed
// Add a transfer
ASSERT_SUCCESS(
pakfire_downloader_add_transfer(d, NULL, NULL, NULL, DOWNLOAD_URL, DOWNLOAD_PATH,
- PAKFIRE_DIGEST_NONE, NULL, 0, 0)
+ 0, NULL, 0, 0)
);
// Retrieve a file
ASSERT_SUCCESS(
pakfire_downloader_retrieve(d, NULL, NULL, NULL, DOWNLOAD_URL, DOWNLOAD_PATH,
- PAKFIRE_DIGEST_NONE, NULL, 0, 0)
+ 0, NULL, 0, 0)
);
// Retrieve a file which exists
ASSERT_SUCCESS(pakfire_downloader_retrieve(d, NULL, m,
- NULL, "beep-1.3-2.ip3.x86_64.pfm", DOWNLOAD_PATH, PAKFIRE_DIGEST_NONE, NULL, 0, 0));
+ NULL, "beep-1.3-2.ip3.x86_64.pfm", DOWNLOAD_PATH, 0, NULL, 0, 0));
// Everything passed
r = EXIT_SUCCESS;
ASSERT_SUCCESS(
pakfire_downloader_retrieve(d, NULL, NULL, NULL,
"https://mirror1.ipfire.org/releases/pakfire/pakfire-0.9.27.tar.gz",
- DOWNLOAD_PATH, PAKFIRE_DIGEST_NONE, NULL, 0, 0)
+ DOWNLOAD_PATH, 0, NULL, 0, 0)
);
// Everything passed