Mercurial > dovecot > original-hg > dovecot-1.2
view src/auth/password-scheme-cram-md5.c @ 1879:6d37e8554dbb HEAD
cram-md5 updates.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 11 Nov 2003 11:59:27 +0200 |
parents | ed5e808d934f |
children | 959136e08a70 |
line wrap: on
line source
/* Copyright (C) 2003 Timo Sirainen / Joshua Goodall */ #include "lib.h" #include "md5.h" #include "hex-binary.h" #include "password-scheme.h" const char *password_generate_cram_md5(const char *plaintext) { unsigned char digest[16], ipad[64], opad[64], context_digest[32], *cdp; struct md5_context ctxo, ctxi; size_t len; int i; memset(ipad, 0, sizeof(ipad)); memset(opad, 0, sizeof(opad)); /* Hash excessively long passwords */ len = strlen(plaintext); if (len > 64) { md5_get_digest(plaintext, len, digest); memcpy(ipad, digest, 16); memcpy(opad, digest, 16); } else { memcpy(ipad, plaintext, len); memcpy(opad, plaintext, len); } /* ipad/opad operation */ for (i = 0; i < 64; i++) { ipad[i] ^= 0x36; opad[i] ^= 0x5c; } md5_init(&ctxi); md5_init(&ctxo); md5_update(&ctxi, ipad, 64); md5_update(&ctxo, opad, 64); /* Make HMAC-MD5 hex digest */ #define CDPUT(p, c) STMT_START { \ *(p)++ = (c) & 0xff; \ *(p)++ = (c) >> 8 & 0xff; \ *(p)++ = (c) >> 16 & 0xff; \ *(p)++ = (c) >> 24 & 0xff; \ } STMT_END cdp = context_digest; CDPUT(cdp, ctxo.a); CDPUT(cdp, ctxo.b); CDPUT(cdp, ctxo.c); CDPUT(cdp, ctxo.d); CDPUT(cdp, ctxi.a); CDPUT(cdp, ctxi.b); CDPUT(cdp, ctxi.c); CDPUT(cdp, ctxi.d); return binary_to_hex(context_digest, sizeof(context_digest)); }