From b804eb4323a01f55727ac48475a9e3c257532ab5 Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Mon, 21 Apr 2014 11:01:10 +0200 Subject: lavu/hash: add hash_final helpers. The helpers use local memory to compute the final hash, making AV_HASH_MAX_SIZE safe to use. --- doc/APIchanges | 3 +++ libavutil/hash.c | 35 +++++++++++++++++++++++++++++++++++ libavutil/hash.h | 22 ++++++++++++++++++++++ libavutil/version.h | 2 +- 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 8fe5ff2e7c..8d001cd6c4 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2012-10-22 API changes, most recent first: +2014-04-29 - xxxxxxx - lavu 52.80.0 - hash.h + Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64(). + 2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs. diff --git a/libavutil/hash.c b/libavutil/hash.c index a8cf80b577..773f29e23b 100644 --- a/libavutil/hash.c +++ b/libavutil/hash.c @@ -29,6 +29,7 @@ #include "sha512.h" #include "avstring.h" +#include "base64.h" #include "error.h" #include "intreadwrite.h" #include "mem.h" @@ -196,6 +197,40 @@ void av_hash_final(AVHashContext *ctx, uint8_t *dst) } } +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size) +{ + uint8_t buf[AV_HASH_MAX_SIZE]; + unsigned rsize = av_hash_get_size(ctx); + + av_hash_final(ctx, buf); + memcpy(dst, buf, FFMIN(size, rsize)); + if (size > rsize) + memset(dst + rsize, 0, size - rsize); +} + +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size) +{ + uint8_t buf[AV_HASH_MAX_SIZE]; + unsigned rsize = av_hash_get_size(ctx), i; + + av_hash_final(ctx, buf); + for (i = 0; i < FFMIN(rsize, size / 2); i++) + snprintf(dst + i * 2, size - i * 2, "%02x", buf[i]); +} + +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size) +{ + uint8_t buf[AV_HASH_MAX_SIZE], b64[AV_BASE64_SIZE(AV_HASH_MAX_SIZE)]; + unsigned rsize = av_hash_get_size(ctx), osize; + + av_hash_final(ctx, buf); + av_base64_encode(b64, sizeof(b64), buf, rsize); + osize = AV_BASE64_SIZE(rsize); + memcpy(dst, b64, FFMIN(osize, size)); + if (size < osize) + dst[size - 1] = 0; +} + void av_hash_freep(AVHashContext **ctx) { if (*ctx) diff --git a/libavutil/hash.h b/libavutil/hash.h index 9bf715e1ac..d4bcbf8cc8 100644 --- a/libavutil/hash.h +++ b/libavutil/hash.h @@ -82,6 +82,28 @@ void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); */ void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); +/** + * Finalize a hash context and compute the actual hash value. + * If size is smaller than the hash size, the hash is truncated; + * if size is larger, the buffer is padded with 0. + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and compute the actual hash value as a hex string. + * The string is always 0-terminated. + * If size is smaller than 2 * hash_size + 1, the hex string is truncated. + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and compute the actual hash value as a base64 string. + * The string is always 0-terminated. + * If size is smaller than AV_BASE64_SIZE(hash_size), the base64 string is + * truncated. + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + /** * Free hash context. */ diff --git a/libavutil/version.h b/libavutil/version.h index edafa30a3f..a17cb506de 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -56,7 +56,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 52 -#define LIBAVUTIL_VERSION_MINOR 79 +#define LIBAVUTIL_VERSION_MINOR 80 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ -- cgit v1.2.3