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] ==
',')) {
111 sizeof(
state->digest_params.qop));
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) +
234 if (digest->
qop[0]) {
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;
273 ptr = authstr + strlen(authstr);
283 if ((password = strchr(username,
':'))) {
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
void av_md5_init(AVMD5 *ctx)
Initialize MD5 hashing.
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Finish hashing and output digest value.
void av_md5_update(AVMD5 *ctx, const uint8_t *src, int len)
Update hash value.
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,...
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
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.
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
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.
static char * make_digest_auth(HTTPAuthState *state, const char *username, const char *password, const char *uri, const char *method)
char * ff_http_auth_create_response(HTTPAuthState *state, const char *auth, const char *path, const char *method)
static void handle_digest_params(HTTPAuthState *state, const char *key, int key_len, char **dest, int *dest_len)
static void choose_qop(char *qop, int size)
static void handle_digest_update(HTTPAuthState *state, const char *key, int key_len, char **dest, int *dest_len)
static void handle_basic_params(HTTPAuthState *state, const char *key, int key_len, char **dest, int *dest_len)
void ff_http_auth_handle_header(HTTPAuthState *state, const char *key, const char *value)
static void update_md5_strings(struct AVMD5 *md5ctx,...)
@ HTTP_AUTH_DIGEST
HTTP 1.1 Digest auth from RFC 2617.
@ HTTP_AUTH_BASIC
HTTP 1.0 Basic auth from RFC 1945 (also in RFC 2617)
common internal API header
Public header for MD5 hash function implementation.
int nc
Nonce count, the number of earlier replies where this particular nonce has been used.
char stale[10]
The server indicated that the auth was ok, but needs to be redone with a new, non-stale nonce.
char qop[30]
Quality of protection, containing the one that we've chosen to use, from the alternatives that the se...
char nonce[300]
Server specified nonce.
char algorithm[10]
Server specified digest algorithm.
char opaque[300]
A server-specified string that should be included in authentication responses, not included in the ac...
HTTP Authentication state structure.
char * ff_urldecode(const char *url, int decode_plus_sign)
Decodes an URL from its percent-encoded form back into normal representation.