From: Aki Sakurai <ffmpeg@aki.tw> To: ffmpeg-devel@ffmpeg.org Cc: Aki Sakurai <ffmpeg@aki.tw> Subject: [FFmpeg-devel] [PATCH] avformat/httpauth: support sha-256 and sha-512-256 Date: Sun, 18 Sep 2022 18:18:09 +0800 Message-ID: <20220918101809.94037-1-ffmpeg@aki.tw> (raw) Signed-off-by: Aki Sakurai <ffmpeg@aki.tw> --- libavformat/httpauth.c | 82 ++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/libavformat/httpauth.c b/libavformat/httpauth.c index 0a98ff80a5..6781d32ff1 100644 --- a/libavformat/httpauth.c +++ b/libavformat/httpauth.c @@ -24,7 +24,7 @@ #include "libavutil/avstring.h" #include "internal.h" #include "libavutil/random_seed.h" -#include "libavutil/md5.h" +#include "libavutil/hash.h" #include "urldecode.h" #include "avformat.h" @@ -119,21 +119,21 @@ void ff_http_auth_handle_header(HTTPAuthState *state, const char *key, } -static void update_md5_strings(struct AVMD5 *md5ctx, ...) +static void update_hash_strings(struct AVHashContext *hashctx, ...) { va_list vl; - va_start(vl, md5ctx); + va_start(vl, hashctx); while (1) { const char* str = va_arg(vl, const char*); if (!str) break; - av_md5_update(md5ctx, str, strlen(str)); + av_hash_update(hashctx, str, strlen(str)); } va_end(vl); } -/* Generate a digest reply, according to RFC 2617. */ +/* Generate a digest reply, according to RFC 2617 / 7616. */ static char *make_digest_auth(HTTPAuthState *state, const char *username, const char *password, const char *uri, const char *method) @@ -144,10 +144,12 @@ static char *make_digest_auth(HTTPAuthState *state, const char *username, char cnonce[17]; char nc[9]; int i; - char A1hash[33], A2hash[33], response[33]; - struct AVMD5 *md5ctx; - uint8_t hash[16]; + char A1hash[AV_HASH_MAX_SIZE * 2 + 1], A2hash[AV_HASH_MAX_SIZE * 2 + 1], response[AV_HASH_MAX_SIZE * 2 + 1]; + struct AVHashContext *hashctx = NULL; + uint8_t hash[AV_HASH_MAX_SIZE]; char *authstr; + const char* algorithm = NULL; + int hash_size; digest->nc++; snprintf(nc, sizeof(nc), "%08x", digest->nc); @@ -157,42 +159,54 @@ static char *make_digest_auth(HTTPAuthState *state, const char *username, cnonce_buf[i] = av_get_random_seed(); ff_data_to_hex(cnonce, (const uint8_t*) cnonce_buf, sizeof(cnonce_buf), 1); - md5ctx = av_md5_alloc(); - if (!md5ctx) + if(!strcmp(digest->algorithm, "") || !strcmp(digest->algorithm, "MD5") || !strcmp(digest->algorithm, "MD5-sess")) + algorithm = "MD5"; + if(!strcmp(digest->algorithm, "SHA-256") || !strcmp(digest->algorithm, "SHA-256-sess")) + algorithm = "SHA256"; + else if(!strcmp(digest->algorithm, "SHA-512-256") || !strcmp(digest->algorithm, "SHA-512-256-sess")) + algorithm = "SHA512/256"; + + if (!algorithm) { + /* Unsupported algorithm */ return NULL; + } - av_md5_init(md5ctx); - update_md5_strings(md5ctx, username, ":", state->realm, ":", password, NULL); - av_md5_final(md5ctx, hash); - ff_data_to_hex(A1hash, hash, 16, 1); - - if (!strcmp(digest->algorithm, "") || !strcmp(digest->algorithm, "MD5")) { - } else if (!strcmp(digest->algorithm, "MD5-sess")) { - av_md5_init(md5ctx); - update_md5_strings(md5ctx, A1hash, ":", digest->nonce, ":", cnonce, NULL); - av_md5_final(md5ctx, hash); - ff_data_to_hex(A1hash, hash, 16, 1); - } else { + av_hash_alloc(&hashctx, algorithm); + + if (!hashctx) { /* Unsupported algorithm */ - av_free(md5ctx); return NULL; } - av_md5_init(md5ctx); - update_md5_strings(md5ctx, method, ":", uri, NULL); - av_md5_final(md5ctx, hash); - ff_data_to_hex(A2hash, hash, 16, 1); + hash_size = av_hash_get_size(hashctx); + + av_hash_init (hashctx); + update_hash_strings(hashctx, username, ":", state->realm, ":", password, NULL); + av_hash_final(hashctx, hash); + ff_data_to_hex(A1hash, hash, hash_size, 1); + + if (!strcmp(digest->algorithm, "MD5-sess") || !strcmp(digest->algorithm, "SHA-256-sess") || !strcmp(digest->algorithm, "SHA-512-256-sess")) { + av_hash_init(hashctx); + update_hash_strings(hashctx, A1hash, ":", digest->nonce, ":", cnonce, NULL); + av_hash_final(hashctx, hash); + ff_data_to_hex(A1hash, hash, hash_size, 1); + } + + av_hash_init(hashctx); + update_hash_strings(hashctx, method, ":", uri, NULL); + av_hash_final(hashctx, hash); + ff_data_to_hex(A2hash, hash, hash_size, 1); - av_md5_init(md5ctx); - update_md5_strings(md5ctx, A1hash, ":", digest->nonce, NULL); + av_hash_init(hashctx); + update_hash_strings(hashctx, A1hash, ":", digest->nonce, NULL); if (!strcmp(digest->qop, "auth") || !strcmp(digest->qop, "auth-int")) { - update_md5_strings(md5ctx, ":", nc, ":", cnonce, ":", digest->qop, NULL); + update_hash_strings(hashctx, ":", nc, ":", cnonce, ":", digest->qop, NULL); } - update_md5_strings(md5ctx, ":", A2hash, NULL); - av_md5_final(md5ctx, hash); - ff_data_to_hex(response, hash, 16, 1); + update_hash_strings(hashctx, ":", A2hash, NULL); + av_hash_final(hashctx, hash); + ff_data_to_hex(response, hash, hash_size, 1); - av_free(md5ctx); + av_free(hashctx); if (!strcmp(digest->qop, "") || !strcmp(digest->qop, "auth")) { } else if (!strcmp(digest->qop, "auth-int")) { -- 2.37.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
reply other threads:[~2022-09-18 10:18 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220918101809.94037-1-ffmpeg@aki.tw \ --to=ffmpeg@aki.tw \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git