"mode INTEGER, "
"user TEXT, "
"'group' TEXT, "
- "hash1 TEXT, "
+ "digest TEXT, "
"ctime INTEGER, "
"mtime INTEGER, "
"capabilities TEXT, "
} pakfire_digests[] = {
{ PAKFIRE_DIGEST_SHA512, "sha512:" },
{ PAKFIRE_DIGEST_SHA256, "sha256:" },
+ { PAKFIRE_DIGEST_SHA1, "sha1:" },
{ PAKFIRE_DIGEST_NONE, NULL },
};
static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, struct pakfire_archive* archive) {
sqlite3_stmt* stmt = NULL;
+ char* digest = NULL;
int r = 1;
// Get the filelist from the archive
}
const char* sql = "INSERT INTO files(pkg, path, size, config, datafile, mode, "
- "user, 'group', hash1, ctime, mtime, capabilities) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ "user, 'group', digest, ctime, mtime, capabilities) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
// Prepare the statement
r = sqlite3_prepare_v2(db->handle, sql, -1, &stmt, NULL);
goto END;
}
- // Bind hash1
- const char* chksum = pakfire_file_get_chksum(file);
+ enum pakfire_digests digest_type = PAKFIRE_DIGEST_NONE;
- r = sqlite3_bind_text(stmt, 9, chksum, -1, NULL);
- if (r) {
- ERROR(db->pakfire, "Could not bind hash1: %s\n", sqlite3_errmsg(db->handle));
- pakfire_file_unref(file);
- goto END;
+ // Bind digest
+ const char* hexdigest = pakfire_file_get_hexdigest(file, &digest_type);
+ if (hexdigest) {
+ digest = pakfire_db_pack_digest(digest_type, hexdigest);
+ if (!digest) {
+ ERROR(db->pakfire, "Could not pack digest: %m\n");
+ pakfire_file_unref(file);
+ goto END;
+ }
+
+ r = sqlite3_bind_text(stmt, 9, digest, -1, NULL);
+ if (r) {
+ ERROR(db->pakfire, "Could not bind digest: %s\n", sqlite3_errmsg(db->handle));
+ pakfire_file_unref(file);
+ goto END;
+ }
+ } else {
+ r = sqlite3_bind_null(stmt, 9);
+ if (r) {
+ ERROR(db->pakfire, "Could not bind digest: %s\n", sqlite3_errmsg(db->handle));
+ pakfire_file_unref(file);
+ goto END;
+ }
}
// Bind ctime
// Reset bound values
sqlite3_reset(stmt);
+
+ // Free digest
+ if (digest) {
+ free(digest);
+ digest = NULL;
+ }
}
// All okay
END:
if (stmt)
sqlite3_finalize(stmt);
+ if (digest)
+ free(digest);
pakfire_filelist_unref(filelist);
transfer->md = EVP_sha256();
break;
+ case PAKFIRE_DIGEST_SHA1:
+ transfer->md = EVP_sha1();
+ break;
+
case PAKFIRE_DIGEST_NONE:
break;
}
#include <time.h>
#include <archive_entry.h>
+#include <openssl/evp.h>
#include <pakfire/constants.h>
#include <pakfire/file.h>
time_t ctime;
time_t mtime;
- char* chksum;
+ // Digest
+ enum pakfire_digests digest_type;
+ unsigned char digest[EVP_MAX_MD_SIZE];
+ char* hexdigest;
#warning TODO capabilities, config, data
// capabilities
archive_entry_set_ctime(entry, pakfire_file_get_ctime(file), 0);
archive_entry_set_mtime(entry, pakfire_file_get_mtime(file), 0);
+ // XXX copy digest
+
return entry;
}
pakfire_file_set_ctime(file, archive_entry_ctime(entry));
pakfire_file_set_mtime(file, archive_entry_mtime(entry));
+ // XXX copy digest
+
return 0;
}
static void pakfire_file_free(struct pakfire_file* file) {
- pakfire_unref(file->pakfire);
-
- if (file->chksum)
- free(file->chksum);
+ if (file->hexdigest)
+ free(file->hexdigest);
+ pakfire_unref(file->pakfire);
free(file);
}
file->mtime = time;
}
-PAKFIRE_EXPORT const char* pakfire_file_get_chksum(struct pakfire_file* file) {
- return file->chksum;
+PAKFIRE_EXPORT const unsigned char* pakfire_file_get_digest(
+ struct pakfire_file* file, enum pakfire_digests* type) {
+ *type = file->digest_type;
+
+ if (file->digest_type)
+ return file->digest;
+
+ return NULL;
+}
+
+PAKFIRE_EXPORT const char* pakfire_file_get_hexdigest(
+ struct pakfire_file* file, enum pakfire_digests* type) {
+ *type = file->digest_type;
+
+ if (!file->hexdigest) {
+ const size_t digest_length = pakfire_digest_length(file->digest_type);
+ if (!digest_length)
+ return NULL;
+
+ file->hexdigest = __pakfire_hexlify(file->digest, digest_length);
+ }
+
+ return file->hexdigest;
+}
+
+PAKFIRE_EXPORT int pakfire_file_set_digest(struct pakfire_file* file,
+ enum pakfire_digests type, const unsigned char* digest) {
+ if (!digest) {
+ errno = EINVAL;
+ return 1;
+ }
+
+ // How long would the digest be?
+ const size_t digest_length = pakfire_digest_length(type);
+ if (!digest_length) {
+ errno = EINVAL;
+ return 1;
+ }
+
+ // Store type
+ file->digest_type = type;
+
+ // Store digest
+ memcpy(file->digest, digest, digest_length);
+
+ return 0;
}
-PAKFIRE_EXPORT void pakfire_file_set_chksum(struct pakfire_file* file, const char* chksum) {
- if (file->chksum) {
- free(file->chksum);
- file->chksum = NULL;
+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;
}
- if (chksum)
- file->chksum = strdup(chksum);
+ // Allocate a buffer for the binary representation of the digest
+ unsigned char* digest = alloca(digest_length);
+ if (!digest)
+ return 1;
+
+ // Convert from hex to binary
+ __pakfire_unhexlify(digest, digest_length, hexdigest);
+
+ return pakfire_file_set_digest(file, type, digest);
}
static int pakfire_file_levels(struct pakfire_file* file) {
// checksum
case 6:
- pakfire_file_set_chksum(*file, word);
+ if (strcmp(word, "-") == 0)
+ break;
+
+ pakfire_file_set_hexdigest(*file, PAKFIRE_DIGEST_SHA1, word);
break;
// path
// checksum
case 7:
- pakfire_file_set_chksum(*file, word);
+ if (strcmp(word, "-") == 0)
+ break;
+
+ pakfire_file_set_hexdigest(*file, PAKFIRE_DIGEST_SHA1, word);
break;
}
}
time_t pakfire_file_get_mtime(struct pakfire_file* file);
void pakfire_file_set_mtime(struct pakfire_file* file, time_t time);
-const char* pakfire_file_get_chksum(struct pakfire_file* file);
-void pakfire_file_set_chksum(struct pakfire_file* file, const char* chksum);
+const unsigned char* pakfire_file_get_digest(
+ struct pakfire_file* file, enum pakfire_digests* type);
+const char* pakfire_file_get_hexdigest(
+ struct pakfire_file* file, enum pakfire_digests* type);
+int pakfire_file_set_digest(struct pakfire_file* file,
+ enum pakfire_digests type, const unsigned char* digest);
+int pakfire_file_set_hexdigest(struct pakfire_file* file,
+ enum pakfire_digests type, const char* hexdigest);
struct pakfire_file* pakfire_file_parse_from_file(const char* list, unsigned int format);
enum pakfire_digests {
PAKFIRE_DIGEST_NONE = 0,
- PAKFIRE_DIGEST_SHA256 = 1 << 0,
- PAKFIRE_DIGEST_SHA512 = 1 << 1,
+ PAKFIRE_DIGEST_SHA1 = 1 << 0,
+ PAKFIRE_DIGEST_SHA256 = 1 << 1,
+ PAKFIRE_DIGEST_SHA512 = 1 << 2,
};
#include <pakfire/key.h>
# file
pakfire_file_cmp;
pakfire_file_create;
+ pakfire_file_get_digest;
pakfire_file_get_group;
+ pakfire_file_get_hexdigest;
pakfire_file_get_mode;
pakfire_file_get_path;
pakfire_file_get_time;
pakfire_file_get_user;
+ pakfire_file_set_digest;
pakfire_file_set_group;
+ pakfire_file_set_hexdigest;
pakfire_file_set_mode;
pakfire_file_set_path;
pakfire_file_set_time;
id = REPOKEY_TYPE_SHA512;
break;
+ case PAKFIRE_DIGEST_SHA1:
+ id = REPOKEY_TYPE_SHA1;
+ break;
+
default:
errno = ENOTSUP;
return 1;
pakfire_package_dump_add_line(&string, _("SHA256 Digest"), hexdigest);
break;
+ case PAKFIRE_DIGEST_SHA1:
+ pakfire_package_dump_add_line(&string, _("SHA1 Digest"), hexdigest);
+ break;
+
case PAKFIRE_DIGEST_NONE:
break;
}
case PAKFIRE_DIGEST_SHA256:
return 32;
+ case PAKFIRE_DIGEST_SHA1:
+ return 20;
+
case PAKFIRE_DIGEST_NONE:
return 0;
}