|
|
| version 1.1.1.1, 2012/02/21 17:26:12 | version 1.1.1.2, 2012/10/09 09:22:28 |
|---|---|
| Line 298 static void md5_calc(const uint8_t *b64, md5_ctxt * ct | Line 298 static void md5_calc(const uint8_t *b64, md5_ctxt * ct |
| ctxt->md5_stc += C; | ctxt->md5_stc += C; |
| ctxt->md5_std += D; | ctxt->md5_std += D; |
| } | } |
| /* From RFC 2104 */ | |
| void | |
| hmac_md5(text, text_len, key, key_len, digest) | |
| unsigned char* text; /* pointer to data stream */ | |
| int text_len; /* length of data stream */ | |
| unsigned char* key; /* pointer to authentication key */ | |
| int key_len; /* length of authentication key */ | |
| caddr_t digest; /* caller digest to be filled in */ | |
| { | |
| MD5_CTX context; | |
| unsigned char k_ipad[65]; /* inner padding - | |
| * key XORd with ipad | |
| */ | |
| unsigned char k_opad[65]; /* outer padding - | |
| * key XORd with opad | |
| */ | |
| unsigned char tk[16]; | |
| int i; | |
| /* if key is longer than 64 bytes reset it to key=MD5(key) */ | |
| if (key_len > 64) { | |
| MD5_CTX tctx; | |
| MD5Init(&tctx); | |
| MD5Update(&tctx, key, key_len); | |
| MD5Final(tk, &tctx); | |
| key = tk; | |
| key_len = 16; | |
| } | |
| /* | |
| * the HMAC_MD5 transform looks like: | |
| * | |
| * MD5(K XOR opad, MD5(K XOR ipad, text)) | |
| * | |
| * where K is an n byte key | |
| * ipad is the byte 0x36 repeated 64 times | |
| * opad is the byte 0x5c repeated 64 times | |
| * and text is the data being protected | |
| */ | |
| /* start out by storing key in pads */ | |
| bzero( k_ipad, sizeof k_ipad); | |
| bzero( k_opad, sizeof k_opad); | |
| bcopy( key, k_ipad, key_len); | |
| bcopy( key, k_opad, key_len); | |
| /* XOR key with ipad and opad values */ | |
| for (i=0; i<64; i++) { | |
| k_ipad[i] ^= 0x36; | |
| k_opad[i] ^= 0x5c; | |
| } | |
| /* | |
| * perform inner MD5 | |
| */ | |
| MD5Init(&context); /* init context for 1st | |
| * pass */ | |
| MD5Update(&context, k_ipad, 64); /* start with inner pad */ | |
| MD5Update(&context, text, text_len); /* then text of datagram */ | |
| MD5Final(digest, &context); /* finish up 1st pass */ | |
| /* | |
| * perform outer MD5 | |
| */ | |
| MD5Init(&context); /* init context for 2nd | |
| * pass */ | |
| MD5Update(&context, k_opad, 64); /* start with outer pad */ | |
| MD5Update(&context, digest, 16); /* then results of 1st | |
| * hash */ | |
| MD5Final(digest, &context); /* finish up 2nd pass */ | |
| } |