diff --git a/meson.build b/meson.build index 84b41dface..f71182c6d0 100644 --- a/meson.build +++ b/meson.build @@ -138,6 +138,7 @@ sources = files( 'misc/charset_conv.c', 'misc/codepoint_width.c', 'misc/dispatch.c', + 'misc/hash.c', 'misc/io_utils.c', 'misc/json.c', 'misc/language.c', diff --git a/misc/hash.c b/misc/hash.c new file mode 100644 index 0000000000..338219e9d5 --- /dev/null +++ b/misc/hash.c @@ -0,0 +1,41 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#include + +#include + +#include "common/common.h" +#include "misc/hash.h" + +bstr mp_hash_to_bstr(void *talloc_ctx, const uint8_t *data, size_t len, const char *algorithm) +{ + struct AVHashContext *ctx = NULL; + mp_require(av_hash_alloc(&ctx, algorithm) == 0); + int size = av_hash_get_size(ctx); + uint8_t hash[AV_HASH_MAX_SIZE] = {0}; + + av_hash_init(ctx); + av_hash_update(ctx, data, len); + av_hash_final(ctx, hash); + av_hash_freep(&ctx); + + bstr ret = {0}; + for (int n = 0; n < size; n++) + bstr_xappend_asprintf(talloc_ctx, &ret, "%02X", hash[n]); + return ret; +} diff --git a/misc/hash.h b/misc/hash.h new file mode 100644 index 0000000000..e0b6756637 --- /dev/null +++ b/misc/hash.h @@ -0,0 +1,26 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#pragma once + +#include "misc/bstr.h" + +/* + * Return the hashed data as a hex string with upper case letters. + * The list of available algorithms is available at libavutil/hash.c. + */ +bstr mp_hash_to_bstr(void *talloc_ctx, const uint8_t *data, size_t len, const char *algorithm);