Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add blake2 digests to libpkg.
Vsevolod Stakhov committed 11 years ago
commit feb0d4fe47e03eb0a5dca655d1a5b8beab9ee78f
parent ee64ebc
2 files changed +37 -0
modified libpkg/pkg_checksum.c
@@ -27,6 +27,7 @@
#include "pkg.h"
#include "private/pkg.h"
#include "private/event.h"
+
#include "blake2.h"

struct pkg_checksum_entry {
	const char *field;
@@ -44,6 +45,8 @@ typedef void (*pkg_checksum_encode_func)(unsigned char *in, size_t inlen,

static void pkg_checksum_hash_sha256(struct pkg_checksum_entry *entries,
				unsigned char **out, size_t *outlen);
+
static void pkg_checksum_hash_blake2(struct pkg_checksum_entry *entries,
+
				unsigned char **out, size_t *outlen);
static void pkg_checksum_encode_base32(unsigned char *in, size_t inlen,
				char *out, size_t outlen);
static void pkg_checksum_encode_hex(unsigned char *in, size_t inlen,
@@ -67,6 +70,12 @@ static const struct _pkg_cksum_type {
		pkg_checksum_hash_sha256,
		pkg_checksum_encode_hex
	},
+
	[PKG_HASH_TYPE_BLAKE2_BASE32] = {
+
		"blake2_base32",
+
		PKG_CHECKSUM_BLAKE2_LEN,
+
		pkg_checksum_hash_blake2,
+
		pkg_checksum_encode_hex
+
	},
	[PKG_HASH_TYPE_UNKNOWN] = {
		NULL,
		-1,
@@ -266,6 +275,30 @@ pkg_checksum_hash_sha256(struct pkg_checksum_entry *entries,
	}
}

+
static void
+
pkg_checksum_hash_blake2(struct pkg_checksum_entry *entries,
+
		unsigned char **out, size_t *outlen)
+
{
+
	blake2b_state st;
+

+
	blake2b_init (&st, BLAKE2B_OUTBYTES);
+

+
	while(entries) {
+
		blake2b_update (&st, entries->field, strlen(entries->field));
+
		blake2b_update (&st, entries->value, strlen(entries->value));
+
		entries = entries->next;
+
	}
+
	*out = malloc(BLAKE2B_OUTBYTES);
+
	if (*out != NULL) {
+
		blake2b_final (&st, *out, BLAKE2B_OUTBYTES);
+
		*outlen = BLAKE2B_OUTBYTES;
+
	}
+
	else {
+
		pkg_emit_errno("malloc", "pkg_checksum_hash_blake2");
+
		*outlen = 0;
+
	}
+
}
+

/*
 * We use here z-base32 encoding described here:
 * http://philzimmermann.com/docs/human-oriented-base-32-encoding.txt
modified libpkg/private/pkg.h
@@ -40,6 +40,7 @@
#include <archive.h>
#include <sqlite3.h>
#include <openssl/sha.h>
+
#include <blake2.h>
#include <stdbool.h>
#include <uthash.h>
#include <utlist.h>
@@ -271,6 +272,7 @@ struct pkg_repo_meta_key {
typedef enum pkg_checksum_type_e {
	PKG_HASH_TYPE_SHA256_BASE32 = 0,
	PKG_HASH_TYPE_SHA256_HEX,
+
	PKG_HASH_TYPE_BLAKE2_BASE32,
	PKG_HASH_TYPE_UNKNOWN
} pkg_checksum_type_t;

@@ -503,6 +505,7 @@ bool pkg_repo_meta_is_special_file(const char *file, struct pkg_repo_meta *meta)
typedef enum {
	HASH_UNKNOWN,
	HASH_SHA256,
+
	HASH_BLAKE2
} hash_t;

struct fingerprint {
@@ -608,6 +611,7 @@ pkg_object* pkg_emit_object(struct pkg *pkg, short flags);

/* Hash is in format <version>:<typeid>:<hexhash> */
#define PKG_CHECKSUM_SHA256_LEN (SHA256_DIGEST_LENGTH * 2 + sizeof("100") * 2 + 2)
+
#define PKG_CHECKSUM_BLAKE2_LEN (BLAKE2B_OUTBYTES * 8 / 5 + sizeof("100") * 2 + 2)
#define PKG_CHECKSUM_CUR_VERSION 2

int pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,