32 int key_len,
char **dest,
int *dest_len)
34 if (!strncmp(key,
"realm=", key_len)) {
36 *dest_len =
sizeof(state->
realm);
41 int key_len,
char **dest,
int *dest_len)
45 if (!strncmp(key,
"realm=", key_len)) {
47 *dest_len =
sizeof(state->
realm);
48 }
else if (!strncmp(key,
"nonce=", key_len)) {
49 *dest = digest->
nonce;
50 *dest_len =
sizeof(digest->
nonce);
51 }
else if (!strncmp(key,
"opaque=", key_len)) {
53 *dest_len =
sizeof(digest->
opaque);
54 }
else if (!strncmp(key,
"algorithm=", key_len)) {
57 }
else if (!strncmp(key,
"qop=", key_len)) {
59 *dest_len =
sizeof(digest->
qop);
60 }
else if (!strncmp(key,
"stale=", key_len)) {
61 *dest = digest->
stale;
62 *dest_len =
sizeof(digest->
stale);
67 int key_len,
char **dest,
int *dest_len)
71 if (!strncmp(key,
"nextnonce=", key_len)) {
72 *dest = digest->
nonce;
73 *dest_len =
sizeof(digest->
nonce);
79 char *ptr = strstr(qop,
"auth");
80 char *
end = ptr + strlen(
"auth");
82 if (ptr && (!*end ||
av_isspace(*end) || *end ==
',') &&
83 (ptr == qop ||
av_isspace(ptr[-1]) || ptr[-1] ==
',')) {
126 va_start(vl, md5ctx);
128 const char* str = va_arg(vl,
const char*);
138 const char *password,
const char *uri,
143 uint32_t cnonce_buf[2];
147 char A1hash[33], A2hash[33], response[33];
148 struct AVMD5 *md5ctx;
156 for (i = 0; i < 2; i++)
159 cnonce[2*
sizeof(cnonce_buf)] = 0;
172 }
else if (!strcmp(digest->
algorithm,
"MD5-sess")) {
192 if (!strcmp(digest->
qop,
"auth") || !strcmp(digest->
qop,
"auth-int")) {
202 if (!strcmp(digest->
qop,
"") || !strcmp(digest->
qop,
"auth")) {
203 }
else if (!strcmp(digest->
qop,
"auth-int")) {
211 len = strlen(username) + strlen(state->
realm) + strlen(digest->
nonce) +
212 strlen(uri) + strlen(response) + strlen(digest->
algorithm) +
213 strlen(digest->
opaque) + strlen(digest->
qop) + strlen(cnonce) +
219 snprintf(authstr, len,
"Authorization: Digest ");
222 av_strlcatf(authstr, len,
"username=\"%s\"", username);
226 av_strlcatf(authstr, len,
", response=\"%s\"", response);
234 if (digest->
qop[0]) {
236 av_strlcatf(authstr, len,
", cnonce=\"%s\"", cnonce);
246 const char *path,
const char *method)
248 char *authstr =
NULL;
253 if (!auth || !strchr(auth,
':'))
257 int auth_b64_len,
len;
264 len = auth_b64_len + 30;
272 snprintf(authstr, len,
"Authorization: Basic ");
273 ptr = authstr + strlen(authstr);
275 av_strlcat(ptr,
"\r\n", len - (ptr - authstr));
283 if ((password = strchr(username,
':'))) {
char algorithm[10]
Server specified digest algorithm.
static void handle_basic_params(HTTPAuthState *state, const char *key, int key_len, char **dest, int *dest_len)
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
HTTP Authentication state structure.
int auth_type
The currently chosen auth type.
void av_md5_update(AVMD5 *ctx, const uint8_t *src, int len)
Update hash value.
int av_stristart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str independent of case.
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
static av_cold int end(AVCodecContext *avctx)
char opaque[300]
A server-specified string that should be included in authentication responses, not included in the ac...
HTTP 1.0 Basic auth from RFC 1945 (also in RFC 2617)
static void choose_qop(char *qop, int size)
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
static char * make_digest_auth(HTTPAuthState *state, const char *username, const char *password, const char *uri, const char *method)
int stale
Auth ok, but needs to be resent with a new nonce.
static void handle_digest_params(HTTPAuthState *state, const char *key, int key_len, char **dest, int *dest_len)
char realm[200]
Authentication realm.
void av_md5_init(AVMD5 *ctx)
Initialize MD5 hashing.
HTTP 1.1 Digest auth from RFC 2617.
char qop[30]
Quality of protection, containing the one that we've chosen to use, from the alternatives that the se...
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Finish hashing and output digest value.
char * ff_http_auth_create_response(HTTPAuthState *state, const char *auth, const char *path, const char *method)
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes...
void ff_http_auth_handle_header(HTTPAuthState *state, const char *key, const char *value)
static void handle_digest_update(HTTPAuthState *state, const char *key, int key_len, char **dest, int *dest_len)
char nonce[300]
Server specified nonce.
DigestParams digest_params
The parameters specific to digest authentication.
Public header for MD5 hash function implementation.
int nc
Nonce count, the number of earlier replies where this particular nonce has been used.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
char stale[10]
The server indicated that the auth was ok, but needs to be redone with a new, non-stale nonce...
static void update_md5_strings(struct AVMD5 *md5ctx,...)
char * ff_urldecode(const char *url)
Decodes an URL from its percent-encoded form back into normal representation.