diff options
author | Nicolas George <george@nsup.org> | 2014-04-21 13:01:10 +0400 |
---|---|---|
committer | Nicolas George <george@nsup.org> | 2014-04-29 15:24:11 +0400 |
commit | b804eb4323a01f55727ac48475a9e3c257532ab5 (patch) | |
tree | a018de97b33ffc73263f1e7a30c9137f3b49d30f /libavutil/hash.c | |
parent | 5b881499a8e40ad0aa3424ec4d9adeb8008c4189 (diff) |
lavu/hash: add hash_final helpers.
The helpers use local memory to compute the final hash,
making AV_HASH_MAX_SIZE safe to use.
Diffstat (limited to 'libavutil/hash.c')
-rw-r--r-- | libavutil/hash.c | 35 |
1 files changed, 35 insertions, 0 deletions
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) |