Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add a simple digest API.
Vsevolod Stakhov committed 11 years ago
commit 56528f24c81981675c580829e9d4369fe23b8bfe
parent 5bf264f
2 files changed +75 -1
modified libpkg/pkg_checksum.c
@@ -40,13 +40,19 @@ struct pkg_checksum_entry {

typedef void (*pkg_checksum_hash_func)(struct pkg_checksum_entry *entries,
				unsigned char **out, size_t *outlen);
+
typedef void (*pkg_checksum_hash_bulk_func)(const unsigned char *in, size_t inlen,
+
				unsigned char **out, size_t *outlen);
typedef void (*pkg_checksum_encode_func)(unsigned char *in, size_t inlen,
				char *out, size_t outlen);

static void pkg_checksum_hash_sha256(struct pkg_checksum_entry *entries,
				unsigned char **out, size_t *outlen);
+
static void pkg_checksum_hash_sha256_bulk(const unsigned char *in, size_t inlen,
+
				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_hash_blake2_bulk(const unsigned char *in, size_t inlen,
+
				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,
@@ -56,36 +62,42 @@ static const struct _pkg_cksum_type {
	const char *name;
	size_t hlen;
	pkg_checksum_hash_func hfunc;
+
	pkg_checksum_hash_bulk_func hbulkfunc;
	pkg_checksum_encode_func encfunc;
} checksum_types[] = {
	[PKG_HASH_TYPE_SHA256_BASE32] = {
		"sha256_base32",
		PKG_CHECKSUM_SHA256_LEN,
		pkg_checksum_hash_sha256,
+
		pkg_checksum_hash_sha256_bulk,
		pkg_checksum_encode_base32
	},
	[PKG_HASH_TYPE_SHA256_HEX] = {
		"sha256_hex",
		PKG_CHECKSUM_SHA256_LEN,
		pkg_checksum_hash_sha256,
+
		pkg_checksum_hash_sha256_bulk,
		pkg_checksum_encode_hex
	},
	[PKG_HASH_TYPE_BLAKE2_BASE32] = {
		"blake2_base32",
		PKG_CHECKSUM_BLAKE2_LEN,
		pkg_checksum_hash_blake2,
+
		pkg_checksum_hash_blake2_bulk,
		pkg_checksum_encode_hex
	},
	[PKG_HASH_TYPE_SHA256_RAW] = {
		"sha256_raw",
		SHA256_DIGEST_LENGTH,
		pkg_checksum_hash_sha256,
+
		pkg_checksum_hash_sha256_bulk,
		NULL
	},
	[PKG_HASH_TYPE_BLAKE2_RAW] = {
		"blake2_raw",
		BLAKE2B_OUTBYTES,
		pkg_checksum_hash_blake2,
+
		pkg_checksum_hash_blake2_bulk,
		NULL
	},
	[PKG_HASH_TYPE_UNKNOWN] = {
@@ -270,7 +282,6 @@ pkg_checksum_get_type(const char *cksum, size_t clen)
	return (PKG_HASH_TYPE_UNKNOWN);
}

-

static void
pkg_checksum_hash_sha256(struct pkg_checksum_entry *entries,
		unsigned char **out, size_t *outlen)
@@ -296,6 +307,19 @@ pkg_checksum_hash_sha256(struct pkg_checksum_entry *entries,
}

static void
+
pkg_checksum_hash_sha256_bulk(const unsigned char *in, size_t inlen,
+
				unsigned char **out, size_t *outlen)
+
{
+
	SHA256_CTX sign_ctx;
+

+
	*out = malloc(SHA256_DIGEST_LENGTH);
+
	SHA256_Init(&sign_ctx);
+
	SHA256_Update(&sign_ctx, in, inlen);
+
	SHA256_Final(*out, &sign_ctx);
+
	*outlen = SHA256_DIGEST_LENGTH;
+
}
+

+
static void
pkg_checksum_hash_blake2(struct pkg_checksum_entry *entries,
		unsigned char **out, size_t *outlen)
{
@@ -319,6 +343,15 @@ pkg_checksum_hash_blake2(struct pkg_checksum_entry *entries,
	}
}

+
static void
+
pkg_checksum_hash_blake2_bulk(const unsigned char *in, size_t inlen,
+
				unsigned char **out, size_t *outlen)
+
{
+
	*out = malloc(BLAKE2B_OUTBYTES);
+
	blake2b(*out, in, NULL, BLAKE2B_OUTBYTES, inlen, 0);
+
	*outlen = BLAKE2B_OUTBYTES;
+
}
+

/*
 * We use here z-base32 encoding described here:
 * http://philzimmermann.com/docs/human-oriented-base-32-encoding.txt
@@ -460,3 +493,37 @@ pkg_checksum_calculate(struct pkg *pkg, struct pkgdb *db)

	return (rc);
}
+

+

+
unsigned char *
+
pkg_checksum_data(const unsigned char *in, size_t inlen,
+
	pkg_checksum_type_t type)
+
{
+
	const struct _pkg_cksum_type *cksum;
+
	unsigned char *out, *res = NULL;
+
	size_t outlen;
+

+
	if (type >= PKG_HASH_TYPE_UNKNOWN || in == NULL)
+
		return (NULL);
+

+
	/* Zero terminated string */
+
	if (inlen == 0) {
+
		inlen = strlen(in);
+
	}
+

+
	cksum = &checksum_types[type];
+

+
	cksum->hbulkfunc(in, inlen, &out, &outlen);
+
	if (out != NULL) {
+
		if (cksum->encfunc != NULL) {
+
			res = malloc(cksum->hlen);
+
			cksum->encfunc(out, outlen, res, cksum->hlen);
+
			free(out);
+
		}
+
		else {
+
			res = out;
+
		}
+
	}
+

+
	return (res);
+
}
modified libpkg/private/pkg.h
@@ -618,6 +618,13 @@ pkg_object* pkg_emit_object(struct pkg *pkg, short flags);
int pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,
	pkg_checksum_type_t type);

+
/*
+
 * Calculates checksum for any data.
+
 * Caller must free resulting hash after usage
+
 */
+
unsigned char * pkg_checksum_data(const unsigned char *in, size_t inlen,
+
	pkg_checksum_type_t type);
+

bool pkg_checksum_is_valid(const char *cksum, size_t clen);
pkg_checksum_type_t pkg_checksum_get_type(const char *cksum, size_t clen);
pkg_checksum_type_t pkg_checksum_type_from_string(const char *name);