17
17
Hex[HASHHEXLEN] = '\0';
20
/* calculate H(A1) as per spec */
23
IN char * pszUserName,
25
IN char * pszPassword,
28
OUT HASHHEX SessionKey
35
MD5_Update(&Md5Ctx, (unsigned char *)pszUserName, strlen(pszUserName));
36
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
37
MD5_Update(&Md5Ctx, (unsigned char *)pszRealm, strlen(pszRealm));
38
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
39
MD5_Update(&Md5Ctx, (unsigned char *)pszPassword, strlen(pszPassword));
40
MD5_Final(HA1, &Md5Ctx);
41
if (strcasecmp(pszAlg, "md5-sess") == 0) {
43
MD5_Update(&Md5Ctx, (unsigned char *)HA1, HASHLEN);
44
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
45
MD5_Update(&Md5Ctx, (unsigned char *)pszNonce, strlen(pszNonce));
46
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
47
MD5_Update(&Md5Ctx, (unsigned char *)pszCNonce, strlen(pszCNonce));
48
MD5_Final(HA1, &Md5Ctx);
50
CvtHex(HA1, SessionKey);
53
/* calculate request-digest/response-digest as per HTTP Digest spec */
54
void DigestCalcResponse(
55
IN HASHHEX HA1, /* H(A1) */
56
IN char * pszNonce, /* nonce from server */
57
IN char * pszNonceCount, /* 8 hex digits */
58
IN char * pszCNonce, /* client nonce */
59
IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
60
IN char * pszMethod, /* method from the request */
61
IN char * pszDigestUri, /* requested URL */
62
IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
63
OUT HASHHEX Response /* request-digest or response-digest */
73
MD5_Update(&Md5Ctx, (unsigned char *)pszMethod, strlen(pszMethod));
74
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
75
MD5_Update(&Md5Ctx, (unsigned char *)pszDigestUri, strlen(pszDigestUri));
76
if (strcasecmp(pszQop, "auth-int") == 0) {
77
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
78
MD5_Update(&Md5Ctx, (unsigned char *)HEntity, HASHHEXLEN);
80
MD5_Final(HA2, &Md5Ctx);
83
/* calculate response */
85
MD5_Update(&Md5Ctx, (unsigned char *)HA1, HASHHEXLEN);
86
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
87
MD5_Update(&Md5Ctx, (unsigned char *)pszNonce, strlen(pszNonce));
88
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
90
MD5_Update(&Md5Ctx, (unsigned char *)pszNonceCount, strlen(pszNonceCount));
91
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
92
MD5_Update(&Md5Ctx, (unsigned char *)pszCNonce, strlen(pszCNonce));
93
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
94
MD5_Update(&Md5Ctx, (unsigned char *)pszQop, strlen(pszQop));
95
MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
97
MD5_Update(&Md5Ctx, (unsigned char *)HA2Hex, HASHHEXLEN);
98
MD5_Final(RespHash, &Md5Ctx);
99
CvtHex(RespHash, Response);