mech-cram-md5.c revision 50782de8a9d5ebe11ee61496b4e695a1d3875230
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* CRAM-MD5 SASL authentication, see RFC-2195
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw Joshua Goodall <joshua@roughtrade.net> */
68b2bbf26c7040fea4281dcb58b81e7627e46f34Gordon Ross /* requested: */
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown /* received: */
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown unsigned long maxbuf;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic const char *get_cram_challenge(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic bool verify_credentials(struct cram_auth_request *request,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States unsigned char digest[MD5_RESULTLEN];
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States struct hmac_md5_context ctx;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw const char *response_hex;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb auth_request_log_error(&request->auth_request, "cram-md5",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb "invalid credentials length");
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb hmac_md5_update(&ctx, request->challenge, strlen(request->challenge));
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (memcmp(response_hex, request->response, sizeof(digest)*2) != 0) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb auth_request_log_info(&request->auth_request, "cram-md5",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "password mismatch");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic bool parse_cram_response(struct cram_auth_request *request,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw const char **error_r)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* <username> SPACE <response>. Username may contain spaces, so assume
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw the rightmost space is the response separator. */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (space == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw request->username = p_strndup(request->pool, data, space);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void credentials_callback(enum passdb_result result,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States struct auth_request *auth_request)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwmech_cram_md5_auth_continue(struct auth_request *auth_request,
ccc71be50bb49efb4e31004c77fb3e065e9c0596Gordon Ross const char *error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (parse_cram_response(request, data, data_size, &error)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (auth_request_set_username(auth_request, request->username,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw auth_request_log_info(auth_request, "cram-md5", "%s", error);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjbmech_cram_md5_auth_initial(struct auth_request *auth_request,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb request->challenge = p_strdup(request->pool, get_cram_challenge());
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb auth_request_handler_reply_continue(auth_request, request->challenge,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw pool = pool_alloconly_create("cram_md5_auth_request", 2048);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "CRAM-MD5",