15static char hextab[] =
"0123456789abcdef";
18 char *authzid,stralloc *nonce,stralloc *digesturi,
19 char *cnonce,
const char *nc,
const char *qop)
22 unsigned char digest[20], ea1[33], ea2[33];
25 if (
user->len < 2)
return 0;
26 if (
pass->len < 2)
return 0;
27 if (realm->len < 2)
return 0;
28 if (nonce->len < 2)
return 0;
29 if (digesturi->len < 2)
return 0;
30 if (!cnonce || !nc || !qop)
return 0;
35 MD5Update(&md5,(
unsigned char *)realm->s,realm->len);
43 MD5Update(&md5,(
unsigned char *)nonce->s,nonce->len);
45 MD5Update(&md5,(
unsigned char *)cnonce,32);
46 if (authzid && *authzid) {
48 MD5Update(&md5,(
unsigned char *)authzid,str_len(authzid));
51 for (
j = 0;
j < 16;
j++) {
52 ea1[
j] = hextab[digest[
j] / 16];
53 ea1[
j + 1] = hextab[digest[
j] % 16];
58 MD5Update(&md5,(
unsigned char *)
"AUTHENTICATE:",13);
59 MD5Update(&md5,(
unsigned char *)digesturi->s,digesturi->len);
61 MD5Update(&md5,(
unsigned char *)
":00000000000000000000000000000000",32);
64 for (
j = 0;
j < 16;
j++) {
65 ea2[
j] = hextab[digest[
j] / 16];
66 ea2[
j + 1] = hextab[digest[
j] % 16];
75 MD5Update(&md5,(
unsigned char *)nonce->s,nonce->len);
77 MD5Update(&md5,(
unsigned char *)nc,str_len(nc));
79 MD5Update(&md5,(
unsigned char *)cnonce, 32);
81 MD5Update(&md5,(
unsigned char *)qop, str_len(qop));
86 for (
j = 0;
j < 16;
j++) {
87 digestmd5[
j] = hextab[digest[
j] / 16];
88 digestmd5[
j + 1] = hextab[digest[
j] % 16];
int digest_md5(unsigned char *digestmd5, stralloc *user, stralloc *realm, stralloc *pass, char *authzid, stralloc *nonce, stralloc *digesturi, char *cnonce, const char *nc, const char *qop)
void MD5Final(unsigned char[16], MD5_CTX *)
void MD5Update(MD5_CTX *, unsigned char *, unsigned int)