cram_md5.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
*
* Copyright %G% Sun Microsystems, Inc.
* All Rights Reserved
*
*
* Comments:
*
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <strings.h>
#include "sec.h"
/* text is the challenge, key is the password, digest is an allocated
buffer (min 16 chars) which will contain the resulting digest */
void hmac_md5(unsigned char *text, int text_len, unsigned char *key,
int key_len, unsigned char *digest)
{
MD5_CTX context;
unsigned char k_ipad[65];
unsigned char k_opad[65];
unsigned char tk[16];
int i;
if (key_len > 64){
MD5_CTX tctx;
(void) MD5Init(&tctx);
(void) MD5Update(&tctx, key, key_len);
(void) MD5Final(tk, &tctx);
key = tk;
key_len = 16;
}
bzero(k_ipad, sizeof (k_ipad));
bzero(k_opad, sizeof (k_opad));
bcopy(key, k_ipad, key_len);
bcopy(key, k_opad, key_len);
for (i=0; i<64; i++){
k_ipad[i] ^= 0x36;
k_opad[i] ^= 0x5c;
}
/* Perform inner MD5 */
(void) MD5Init(&context);
(void) MD5Update(&context, k_ipad, 64);
(void) MD5Update(&context, text, text_len);
(void) MD5Final(digest, &context);
/* Perform outer MD5 */
(void) MD5Init(&context);
(void) MD5Update(&context, k_opad, 64);
(void) MD5Update(&context, digest, 16);
(void) MD5Final(digest, &context);
return;
}