diff --git a/libavutil/hmac.c b/libavutil/hmac.c index f87728e181..318174ec31 100644 --- a/libavutil/hmac.c +++ b/libavutil/hmac.c @@ -26,7 +26,7 @@ #include "sha.h" #include "mem.h" -#define MAX_HASHLEN 20 +#define MAX_HASHLEN 32 #define MAX_BLOCKLEN 64 struct AVHMAC { @@ -39,11 +39,16 @@ struct AVHMAC { int keylen; }; -static av_cold void sha1_init(void *ctx) -{ - av_sha_init(ctx, 160); +#define DEFINE_SHA(bits) \ +static av_cold void sha ## bits ##_init(void *ctx) \ +{ \ + av_sha_init(ctx, bits); \ } +DEFINE_SHA(160) +DEFINE_SHA(224) +DEFINE_SHA(256) + AVHMAC *av_hmac_alloc(enum AVHMACType type) { AVHMAC *c = av_mallocz(sizeof(*c)); @@ -61,7 +66,23 @@ AVHMAC *av_hmac_alloc(enum AVHMACType type) case AV_HMAC_SHA1: c->blocklen = 64; c->hashlen = 20; - c->init = sha1_init; + c->init = sha160_init; + c->update = av_sha_update; + c->final = av_sha_final; + c->hash = av_sha_alloc(); + break; + case AV_HMAC_SHA224: + c->blocklen = 64; + c->hashlen = 28; + c->init = sha224_init; + c->update = av_sha_update; + c->final = av_sha_final; + c->hash = av_sha_alloc(); + break; + case AV_HMAC_SHA256: + c->blocklen = 64; + c->hashlen = 32; + c->init = sha256_init; c->update = av_sha_update; c->final = av_sha_final; c->hash = av_sha_alloc(); diff --git a/libavutil/hmac.h b/libavutil/hmac.h index 28c2062b1b..1ed56269cb 100644 --- a/libavutil/hmac.h +++ b/libavutil/hmac.h @@ -32,6 +32,8 @@ enum AVHMACType { AV_HMAC_MD5, AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, }; typedef struct AVHMAC AVHMAC;