Author: rinrab
Date: Sun Dec 28 15:04:53 2025
New Revision: 1930923
Log:
Factor-out implementation of svn_checksum_ctx_t into a separate file.
* subversion/libsvn_subr/checksum.c:
(svn_checksum_ctx_t, svn_checksum_ctx_create, svn_checksum_ctx_reset,
svn_checksum_update, svn_checksum_final): Removed.
* subversion/libsvn_subr/checksum_context.c: Copied from checksum.c.
(file header): Adjust file header.
(includes): Cleanup includes that we no longer need.
(): Remove everything from the copied file.
(svn_checksum_ctx_t, svn_checksum_ctx_create, svn_checksum_ctx_reset,
svn_checksum_update, svn_checksum_final): Only keeping those symbols.
Added:
subversion/trunk/subversion/libsvn_subr/checksum_context.c
- copied, changed from r1930922,
subversion/trunk/subversion/libsvn_subr/checksum.c
Modified:
subversion/trunk/subversion/libsvn_subr/checksum.c
Modified: subversion/trunk/subversion/libsvn_subr/checksum.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/checksum.c Sun Dec 28 14:01:28
2025 (r1930922)
+++ subversion/trunk/subversion/libsvn_subr/checksum.c Sun Dec 28 15:04:53
2025 (r1930923)
@@ -529,142 +529,6 @@ svn_checksum_empty_checksum(svn_checksum
}
}
-struct svn_checksum_ctx_t
-{
- void *apr_ctx;
- svn_checksum_kind_t kind;
-};
-
-svn_checksum_ctx_t *
-svn_checksum_ctx_create(svn_checksum_kind_t kind,
- apr_pool_t *pool)
-{
- svn_checksum_ctx_t *ctx = apr_palloc(pool, sizeof(*ctx));
-
- ctx->kind = kind;
- switch (kind)
- {
- case svn_checksum_md5:
- ctx->apr_ctx = apr_palloc(pool, sizeof(apr_md5_ctx_t));
- apr_md5_init(ctx->apr_ctx);
- break;
-
- case svn_checksum_sha1:
- ctx->apr_ctx = apr_palloc(pool, sizeof(apr_sha1_ctx_t));
- apr_sha1_init(ctx->apr_ctx);
- break;
-
- case svn_checksum_fnv1a_32:
- ctx->apr_ctx = svn_fnv1a_32__context_create(pool);
- break;
-
- case svn_checksum_fnv1a_32x4:
- ctx->apr_ctx = svn_fnv1a_32x4__context_create(pool);
- break;
-
- default:
- SVN_ERR_MALFUNCTION_NO_RETURN();
- }
-
- return ctx;
-}
-
-svn_error_t *
-svn_checksum_ctx_reset(svn_checksum_ctx_t *ctx)
-{
- switch (ctx->kind)
- {
- case svn_checksum_md5:
- memset(ctx->apr_ctx, 0, sizeof(apr_md5_ctx_t));
- apr_md5_init(ctx->apr_ctx);
- break;
-
- case svn_checksum_sha1:
- memset(ctx->apr_ctx, 0, sizeof(apr_sha1_ctx_t));
- apr_sha1_init(ctx->apr_ctx);
- break;
-
- case svn_checksum_fnv1a_32:
- svn_fnv1a_32__context_reset(ctx->apr_ctx);
- break;
-
- case svn_checksum_fnv1a_32x4:
- svn_fnv1a_32x4__context_reset(ctx->apr_ctx);
- break;
-
- default:
- SVN_ERR_MALFUNCTION();
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_checksum_update(svn_checksum_ctx_t *ctx,
- const void *data,
- apr_size_t len)
-{
- switch (ctx->kind)
- {
- case svn_checksum_md5:
- apr_md5_update(ctx->apr_ctx, data, len);
- break;
-
- case svn_checksum_sha1:
- apr_sha1_update(ctx->apr_ctx, data, (unsigned int)len);
- break;
-
- case svn_checksum_fnv1a_32:
- svn_fnv1a_32__update(ctx->apr_ctx, data, len);
- break;
-
- case svn_checksum_fnv1a_32x4:
- svn_fnv1a_32x4__update(ctx->apr_ctx, data, len);
- break;
-
- default:
- /* We really shouldn't get here, but if we do... */
- return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_checksum_final(svn_checksum_t **checksum,
- const svn_checksum_ctx_t *ctx,
- apr_pool_t *pool)
-{
- *checksum = svn_checksum_create(ctx->kind, pool);
-
- switch (ctx->kind)
- {
- case svn_checksum_md5:
- apr_md5_final((unsigned char *)(*checksum)->digest, ctx->apr_ctx);
- break;
-
- case svn_checksum_sha1:
- apr_sha1_final((unsigned char *)(*checksum)->digest, ctx->apr_ctx);
- break;
-
- case svn_checksum_fnv1a_32:
- *(apr_uint32_t *)(*checksum)->digest
- = htonl(svn_fnv1a_32__finalize(ctx->apr_ctx));
- break;
-
- case svn_checksum_fnv1a_32x4:
- *(apr_uint32_t *)(*checksum)->digest
- = htonl(svn_fnv1a_32x4__finalize(ctx->apr_ctx));
- break;
-
- default:
- /* We really shouldn't get here, but if we do... */
- return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
- }
-
- return SVN_NO_ERROR;
-}
-
apr_size_t
svn_checksum_size(const svn_checksum_t *checksum)
{
Copied and modified: subversion/trunk/subversion/libsvn_subr/checksum_context.c
(from r1930922, subversion/trunk/subversion/libsvn_subr/checksum.c)
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/checksum.c Sun Dec 28 14:01:28
2025 (r1930922, copy source)
+++ subversion/trunk/subversion/libsvn_subr/checksum_context.c Sun Dec 28
15:04:53 2025 (r1930923)
@@ -1,5 +1,5 @@
/*
- * checksum.c: checksum routines
+ * checksum_context.c: the checksum context
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -23,512 +23,19 @@
#define APR_WANT_BYTEFUNC
-#include <ctype.h>
-
#include <apr_md5.h>
#include <apr_sha1.h>
#include "svn_checksum.h"
#include "svn_error.h"
-#include "svn_ctype.h"
-#include "svn_sorts.h"
#include "checksum.h"
#include "fnv1a.h"
-#include "private/svn_subr_private.h"
-
#include "svn_private_config.h"
-/* The MD5 digest for the empty string. */
-static const unsigned char md5_empty_string_digest_array[] = {
- 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
- 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e
-};
-
-/* The SHA1 digest for the empty string. */
-static const unsigned char sha1_empty_string_digest_array[] = {
- 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
- 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
-};
-
-/* The FNV-1a digest for the empty string. */
-static const unsigned char fnv1a_32_empty_string_digest_array[] = {
- 0x81, 0x1c, 0x9d, 0xc5
-};
-
-/* The FNV-1a digest for the empty string. */
-static const unsigned char fnv1a_32x4_empty_string_digest_array[] = {
- 0xcd, 0x6d, 0x9a, 0x85
-};
-
-/* Digests for an empty string, indexed by checksum type */
-static const unsigned char * empty_string_digests[] = {
- md5_empty_string_digest_array,
- sha1_empty_string_digest_array,
- fnv1a_32_empty_string_digest_array,
- fnv1a_32x4_empty_string_digest_array
-};
-
-/* Digest sizes in bytes, indexed by checksum type */
-static const apr_size_t digest_sizes[] = {
- APR_MD5_DIGESTSIZE,
- APR_SHA1_DIGESTSIZE,
- sizeof(apr_uint32_t),
- sizeof(apr_uint32_t)
-};
-
-/* Checksum type prefixes used in serialized checksums. */
-static const char *ckind_str[] = {
- "$md5 $",
- "$sha1$",
- "$fnv1$",
- "$fnvm$",
- /* ### svn_checksum_deserialize() assumes all these have the same strlen() */
-};
-
-/* Returns the digest size of it's argument. */
-#define DIGESTSIZE(k) \
- (((k) < svn_checksum_md5 || (k) > svn_checksum_fnv1a_32x4) ? 0 :
digest_sizes[k])
-
-/* Largest supported digest size */
-#define MAX_DIGESTSIZE (MAX(APR_MD5_DIGESTSIZE,APR_SHA1_DIGESTSIZE))
-
-const unsigned char *
-svn__empty_string_digest(svn_checksum_kind_t kind)
-{
- return empty_string_digests[kind];
-}
-
-const char *
-svn__digest_to_cstring_display(const unsigned char digest[],
- apr_size_t digest_size,
- apr_pool_t *pool)
-{
- static const char *hex = "0123456789abcdef";
- char *str = apr_palloc(pool, (digest_size * 2) + 1);
- apr_size_t i;
-
- for (i = 0; i < digest_size; i++)
- {
- str[i*2] = hex[digest[i] >> 4];
- str[i*2+1] = hex[digest[i] & 0x0f];
- }
- str[i*2] = '\0';
-
- return str;
-}
-
-
-const char *
-svn__digest_to_cstring(const unsigned char digest[],
- apr_size_t digest_size,
- apr_pool_t *pool)
-{
- static const unsigned char zeros_digest[MAX_DIGESTSIZE] = { 0 };
-
- if (memcmp(digest, zeros_digest, digest_size) != 0)
- return svn__digest_to_cstring_display(digest, digest_size, pool);
- else
- return NULL;
-}
-
-
-svn_boolean_t
-svn__digests_match(const unsigned char d1[],
- const unsigned char d2[],
- apr_size_t digest_size)
-{
- static const unsigned char zeros[MAX_DIGESTSIZE] = { 0 };
-
- return ((memcmp(d1, d2, digest_size) == 0)
- || (memcmp(d2, zeros, digest_size) == 0)
- || (memcmp(d1, zeros, digest_size) == 0));
-}
-
-/* Check to see if KIND is something we recognize. If not, return
- * SVN_ERR_BAD_CHECKSUM_KIND */
-static svn_error_t *
-validate_kind(svn_checksum_kind_t kind)
-{
- if (kind >= svn_checksum_md5 && kind <= svn_checksum_fnv1a_32x4)
- return SVN_NO_ERROR;
- else
- return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
-}
-
-/* Create a svn_checksum_t with everything but the contents of the
- digest populated. */
-static svn_checksum_t *
-checksum_create_without_digest(svn_checksum_kind_t kind,
- apr_size_t digest_size,
- apr_pool_t *pool)
-{
- /* Use apr_palloc() instead of apr_pcalloc() so that the digest
- * contents are only set once by the caller. */
- svn_checksum_t *checksum = apr_palloc(pool, sizeof(*checksum) + digest_size);
- checksum->digest = (unsigned char *)checksum + sizeof(*checksum);
- checksum->kind = kind;
- return checksum;
-}
-
-/* Return a checksum object, allocated in POOL. The checksum will be of
- * type KIND and contain the given DIGEST.
- */
-static svn_checksum_t *
-checksum_create(svn_checksum_kind_t kind,
- const unsigned char *digest,
- apr_pool_t *pool)
-{
- apr_size_t digest_size = DIGESTSIZE(kind);
- svn_checksum_t *checksum = checksum_create_without_digest(kind, digest_size,
- pool);
- memcpy((unsigned char *)checksum->digest, digest, digest_size);
- return checksum;
-}
-
-svn_checksum_t *
-svn_checksum_create(svn_checksum_kind_t kind,
- apr_pool_t *pool)
-{
- svn_checksum_t *checksum;
- apr_size_t digest_size;
-
- switch (kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- digest_size = digest_sizes[kind];
- break;
-
- default:
- return NULL;
- }
-
- checksum = checksum_create_without_digest(kind, digest_size, pool);
- memset((unsigned char *) checksum->digest, 0, digest_size);
- return checksum;
-}
-
-svn_checksum_t *
-svn_checksum__from_digest_md5(const unsigned char *digest,
- apr_pool_t *result_pool)
-{
- return checksum_create(svn_checksum_md5, digest, result_pool);
-}
-
-svn_checksum_t *
-svn_checksum__from_digest_sha1(const unsigned char *digest,
- apr_pool_t *result_pool)
-{
- return checksum_create(svn_checksum_sha1, digest, result_pool);
-}
-
-svn_checksum_t *
-svn_checksum__from_digest_fnv1a_32(const unsigned char *digest,
- apr_pool_t *result_pool)
-{
- return checksum_create(svn_checksum_fnv1a_32, digest, result_pool);
-}
-
-svn_checksum_t *
-svn_checksum__from_digest_fnv1a_32x4(const unsigned char *digest,
- apr_pool_t *result_pool)
-{
- return checksum_create(svn_checksum_fnv1a_32x4, digest, result_pool);
-}
-
-svn_error_t *
-svn_checksum_clear(svn_checksum_t *checksum)
-{
- SVN_ERR(validate_kind(checksum->kind));
-
- memset((unsigned char *) checksum->digest, 0, DIGESTSIZE(checksum->kind));
- return SVN_NO_ERROR;
-}
-
-svn_boolean_t
-svn_checksum_match(const svn_checksum_t *checksum1,
- const svn_checksum_t *checksum2)
-{
- if (checksum1 == NULL || checksum2 == NULL)
- return TRUE;
-
- if (checksum1->kind != checksum2->kind)
- return FALSE;
-
- switch (checksum1->kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- return svn__digests_match(checksum1->digest,
- checksum2->digest,
- digest_sizes[checksum1->kind]);
-
- default:
- /* We really shouldn't get here, but if we do... */
- return FALSE;
- }
-}
-
-const char *
-svn_checksum_to_cstring_display(const svn_checksum_t *checksum,
- apr_pool_t *pool)
-{
- switch (checksum->kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- return svn__digest_to_cstring_display(checksum->digest,
- digest_sizes[checksum->kind],
- pool);
-
- default:
- /* We really shouldn't get here, but if we do... */
- return NULL;
- }
-}
-
-const char *
-svn_checksum_to_cstring(const svn_checksum_t *checksum,
- apr_pool_t *pool)
-{
- if (checksum == NULL)
- return NULL;
-
- switch (checksum->kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- return svn__digest_to_cstring(checksum->digest,
- digest_sizes[checksum->kind],
- pool);
-
- default:
- /* We really shouldn't get here, but if we do... */
- return NULL;
- }
-}
-
-
-const char *
-svn_checksum_serialize(const svn_checksum_t *checksum,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR_ASSERT_NO_RETURN(checksum->kind >= svn_checksum_md5
- || checksum->kind <= svn_checksum_fnv1a_32x4);
- return apr_pstrcat(result_pool,
- ckind_str[checksum->kind],
- svn_checksum_to_cstring(checksum, scratch_pool),
- SVN_VA_NULL);
-}
-
-
-svn_error_t *
-svn_checksum_deserialize(const svn_checksum_t **checksum,
- const char *data,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_checksum_kind_t kind;
- svn_checksum_t *parsed_checksum;
-
- /* All prefixes have the same length. */
- apr_size_t prefix_len = strlen(ckind_str[0]);
-
- /* "$md5 $...", "$sha1$..." or ... */
- if (strlen(data) <= prefix_len)
- return svn_error_createf(SVN_ERR_BAD_CHECKSUM_PARSE, NULL,
- _("Invalid prefix in checksum '%s'"),
- data);
-
- for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
- if (strncmp(ckind_str[kind], data, prefix_len) == 0)
- {
- SVN_ERR(svn_checksum_parse_hex(&parsed_checksum, kind,
- data + prefix_len, result_pool));
- *checksum = parsed_checksum;
- return SVN_NO_ERROR;
- }
-
- return svn_error_createf(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
- "Unknown checksum kind in '%s'", data);
-}
-
-
-svn_error_t *
-svn_checksum_parse_hex(svn_checksum_t **checksum,
- svn_checksum_kind_t kind,
- const char *hex,
- apr_pool_t *pool)
-{
- apr_size_t i, len;
- unsigned char is_nonzero = 0;
- unsigned char *digest;
- static const unsigned char xdigitval[256] =
- {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, /* 0-7 */
- 0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, /* 8-9 */
- 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF, /* A-F */
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF, /* a-f */
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- };
-
- if (hex == NULL)
- {
- *checksum = NULL;
- return SVN_NO_ERROR;
- }
-
- SVN_ERR(validate_kind(kind));
-
- *checksum = svn_checksum_create(kind, pool);
- digest = (unsigned char *)(*checksum)->digest;
- len = DIGESTSIZE(kind);
-
- for (i = 0; i < len; i++)
- {
- unsigned char x1 = xdigitval[(unsigned char)hex[i * 2]];
- unsigned char x2 = xdigitval[(unsigned char)hex[i * 2 + 1]];
- if (x1 == 0xFF || x2 == 0xFF)
- return svn_error_create(SVN_ERR_BAD_CHECKSUM_PARSE, NULL, NULL);
-
- digest[i] = (x1 << 4) | x2;
- is_nonzero |= digest[i];
- }
-
- if (!is_nonzero)
- *checksum = NULL;
-
- return SVN_NO_ERROR;
-}
-
-svn_checksum_t *
-svn_checksum_dup(const svn_checksum_t *checksum,
- apr_pool_t *pool)
-{
- /* The duplicate of a NULL checksum is a NULL... */
- if (checksum == NULL)
- return NULL;
-
- /* Without this check on valid checksum kind a NULL svn_checksum_t
- * pointer is returned which could cause a core dump at an
- * indeterminate time in the future because callers are not
- * expecting a NULL pointer. This commit forces an early abort() so
- * it's easier to track down where the issue arose. */
- switch (checksum->kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- return checksum_create(checksum->kind, checksum->digest, pool);
-
- default:
- SVN_ERR_MALFUNCTION_NO_RETURN();
- break;
- }
-}
-
-svn_error_t *
-svn_checksum(svn_checksum_t **checksum,
- svn_checksum_kind_t kind,
- const void *data,
- apr_size_t len,
- apr_pool_t *pool)
-{
- apr_sha1_ctx_t sha1_ctx;
-
- SVN_ERR(validate_kind(kind));
- *checksum = svn_checksum_create(kind, pool);
-
- switch (kind)
- {
- case svn_checksum_md5:
- apr_md5((unsigned char *)(*checksum)->digest, data, len);
- break;
-
- case svn_checksum_sha1:
- apr_sha1_init(&sha1_ctx);
- apr_sha1_update(&sha1_ctx, data, (unsigned int)len);
- apr_sha1_final((unsigned char *)(*checksum)->digest, &sha1_ctx);
- break;
-
- case svn_checksum_fnv1a_32:
- *(apr_uint32_t *)(*checksum)->digest
- = htonl(svn__fnv1a_32(data, len));
- break;
-
- case svn_checksum_fnv1a_32x4:
- *(apr_uint32_t *)(*checksum)->digest
- = htonl(svn__fnv1a_32x4(data, len));
- break;
-
- default:
- /* We really shouldn't get here, but if we do... */
- return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-svn_checksum_t *
-svn_checksum_empty_checksum(svn_checksum_kind_t kind,
- apr_pool_t *pool)
-{
- switch (kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- return checksum_create(kind, empty_string_digests[kind], pool);
-
- default:
- /* We really shouldn't get here, but if we do... */
- SVN_ERR_MALFUNCTION_NO_RETURN();
- }
-}
-
struct svn_checksum_ctx_t
{
void *apr_ctx;
@@ -665,192 +172,3 @@ svn_checksum_final(svn_checksum_t **chec
return SVN_NO_ERROR;
}
-apr_size_t
-svn_checksum_size(const svn_checksum_t *checksum)
-{
- return DIGESTSIZE(checksum->kind);
-}
-
-svn_error_t *
-svn_checksum_mismatch_err(const svn_checksum_t *expected,
- const svn_checksum_t *actual,
- apr_pool_t *scratch_pool,
- const char *fmt,
- ...)
-{
- va_list ap;
- const char *desc;
-
- va_start(ap, fmt);
- desc = apr_pvsprintf(scratch_pool, fmt, ap);
- va_end(ap);
-
- return svn_error_createf(SVN_ERR_CHECKSUM_MISMATCH, NULL,
- _("%s:\n"
- " expected: %s\n"
- " actual: %s\n"),
- desc,
- svn_checksum_to_cstring_display(expected, scratch_pool),
- svn_checksum_to_cstring_display(actual, scratch_pool));
-}
-
-svn_boolean_t
-svn_checksum_is_empty_checksum(svn_checksum_t *checksum)
-{
- /* By definition, the NULL checksum matches all others, including the
- empty one. */
- if (!checksum)
- return TRUE;
-
- switch (checksum->kind)
- {
- case svn_checksum_md5:
- case svn_checksum_sha1:
- case svn_checksum_fnv1a_32:
- case svn_checksum_fnv1a_32x4:
- return svn__digests_match(checksum->digest,
- svn__empty_string_digest(checksum->kind),
- digest_sizes[checksum->kind]);
-
- default:
- /* We really shouldn't get here, but if we do... */
- SVN_ERR_MALFUNCTION_NO_RETURN();
- }
-}
-
-/* Checksum calculating stream wrappers.
- */
-
-/* Baton used by write_handler and close_handler to calculate the checksum
- * and return the result to the stream creator. It accommodates the data
- * needed by svn_checksum__wrap_write_stream_fnv1a_32x4 as well as
- * svn_checksum__wrap_write_stream.
- */
-typedef struct stream_baton_t
-{
- /* Stream we are wrapping. Forward write() and close() operations to it. */
- svn_stream_t *inner_stream;
-
- /* Build the checksum data in here. */
- svn_checksum_ctx_t *context;
-
- /* Write the final checksum here. May be NULL. */
- svn_checksum_t **checksum;
-
- /* Copy the digest of the final checksum. May be NULL. */
- unsigned char *digest;
-
- /* Allocate the resulting checksum here. */
- apr_pool_t *pool;
-} stream_baton_t;
-
-/* Implement svn_write_fn_t.
- * Update checksum and pass data on to inner stream.
- */
-static svn_error_t *
-write_handler(void *baton,
- const char *data,
- apr_size_t *len)
-{
- stream_baton_t *b = baton;
-
- SVN_ERR(svn_checksum_update(b->context, data, *len));
- SVN_ERR(svn_stream_write(b->inner_stream, data, len));
-
- return SVN_NO_ERROR;
-}
-
-/* Implement svn_close_fn_t.
- * Finalize checksum calculation and write results. Close inner stream.
- */
-static svn_error_t *
-close_handler(void *baton)
-{
- stream_baton_t *b = baton;
- svn_checksum_t *local_checksum;
-
- /* Ensure we can always write to *B->CHECKSUM. */
- if (!b->checksum)
- b->checksum = &local_checksum;
-
- /* Get the final checksum. */
- SVN_ERR(svn_checksum_final(b->checksum, b->context, b->pool));
-
- /* Extract digest, if wanted. */
- if (b->digest)
- {
- apr_size_t digest_size = DIGESTSIZE((*b->checksum)->kind);
- memcpy(b->digest, (*b->checksum)->digest, digest_size);
- }
-
- /* Done here. Now, close the underlying stream as well. */
- return svn_error_trace(svn_stream_close(b->inner_stream));
-}
-
-/* Common constructor function for svn_checksum__wrap_write_stream and
- * svn_checksum__wrap_write_stream_fnv1a_32x4, taking the superset of their
- * respecting parameters.
- *
- * In the current usage, either CHECKSUM or DIGEST will be NULL but this
- * function does not enforce any such restriction. Also, the caller must
- * make sure that DIGEST refers to a buffer of sufficient length.
- */
-static svn_stream_t *
-wrap_write_stream(svn_checksum_t **checksum,
- unsigned char *digest,
- svn_stream_t *inner_stream,
- svn_checksum_kind_t kind,
- apr_pool_t *pool)
-{
- svn_stream_t *outer_stream;
-
- stream_baton_t *baton = apr_pcalloc(pool, sizeof(*baton));
- baton->inner_stream = inner_stream;
- baton->context = svn_checksum_ctx_create(kind, pool);
- baton->checksum = checksum;
- baton->digest = digest;
- baton->pool = pool;
-
- outer_stream = svn_stream_create(baton, pool);
- svn_stream_set_write(outer_stream, write_handler);
- svn_stream_set_close(outer_stream, close_handler);
-
- return outer_stream;
-}
-
-svn_stream_t *
-svn_checksum__wrap_write_stream(svn_checksum_t **checksum,
- svn_stream_t *inner_stream,
- svn_checksum_kind_t kind,
- apr_pool_t *pool)
-{
- return wrap_write_stream(checksum, NULL, inner_stream, kind, pool);
-}
-
-/* Implement svn_close_fn_t.
- * For FNV-1a-like checksums, we want the checksum as 32 bit integer instead
- * of a big endian 4 byte sequence. This simply wraps close_handler adding
- * the digest conversion.
- */
-static svn_error_t *
-close_handler_fnv1a_32x4(void *baton)
-{
- stream_baton_t *b = baton;
- SVN_ERR(close_handler(baton));
-
- *(apr_uint32_t *)b->digest = ntohl(*(apr_uint32_t *)b->digest);
- return SVN_NO_ERROR;
-}
-
-svn_stream_t *
-svn_checksum__wrap_write_stream_fnv1a_32x4(apr_uint32_t *digest,
- svn_stream_t *inner_stream,
- apr_pool_t *pool)
-{
- svn_stream_t *result
- = wrap_write_stream(NULL, (unsigned char *)digest, inner_stream,
- svn_checksum_fnv1a_32x4, pool);
- svn_stream_set_close(result, close_handler_fnv1a_32x4);
-
- return result;
-}