blob: d1cba07cc2cef8d8467a47ef9dbc12ae7fcbb643 [file] [log] [blame]
/** @file hmac_md5.c
*
* @brief This file defines algorithm for hmac md5
*
* Copyright (C) 2014, Marvell International Ltd.
*
* This software file (the "File") is distributed by Marvell International
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
* (the "License"). You may use, redistribute and/or modify this File in
* accordance with the terms and conditions of the License, a copy of which
* is available by writing to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
* this warranty disclaimer.
*/
/******************************************************
Change log:
03/07/2014: Initial version
******************************************************/
#include "wltypes.h"
#include "md5.h"
#include "hostsa_ext_def.h"
#include "authenticator.h"
void
Mrvl_hmac_md5(void *priv, UINT8 *text_data, int text_len, UINT8 *key,
int key_len, void *digest)
{
phostsa_private psapriv = (phostsa_private)priv;
hostsa_util_fns *util_fns = &psapriv->util_fns;
// BufferDesc_t * pDesc = NULL;
UINT8 buf[400] = { 0 };
Mrvl_MD5_CTX *context;
unsigned char *k_pad; /* padding - key XORd with i/opad */
int i;
#if 0
/* Wait forever ensures a buffer */
pDesc = (BufferDesc_t *) bml_AllocBuffer(ramHook_encrPoolConfig,
400, BML_WAIT_FOREVER);
#endif
/* WLAN buffers are aligned, so k_pad start at a UINT32 boundary */
// k_pad = (unsigned char *)BML_DATA_PTR(pDesc);
k_pad = (unsigned char *)buf;
context = (Mrvl_MD5_CTX *)(k_pad + 64);
/* if key is longer than 64 bytes reset it to key=MD5(key) */
if (key_len > 64) {
Mrvl_MD5_CTX tctx;
wpa_MD5Init(&tctx);
wpa_MD5Update((void *)priv, &tctx, key, key_len);
wpa_MD5Final((void *)priv, context->buffer, &tctx);
key = context->buffer;
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 */
memset(util_fns, k_pad, 0, 64);
memcpy(util_fns, k_pad, key, key_len);
/* XOR key with ipad and opad values */
for (i = 0; i < 16; i++) {
((UINT32 *)k_pad)[i] ^= 0x36363636;
}
/* perform inner MD5 */
wpa_MD5Init(context); /* init context for 1st pass */
wpa_MD5Update((void *)priv, context, k_pad, 64); /* start with
inner pad */
wpa_MD5Update((void *)priv, context, text_data, text_len); /* then
text
of
datagram
*/
wpa_MD5Final((void *)priv, digest, context); /* finish up 1st pass */
/* start out by storing key in pads */
memset(util_fns, k_pad, 0, 64);
memcpy(util_fns, k_pad, key, key_len);
for (i = 0; i < 16; i++) {
((UINT32 *)k_pad)[i] ^= 0x5c5c5c5c;
}
/* perform outer MD5 */
wpa_MD5Init(context); /* init context for 2nd pass */
wpa_MD5Update((void *)priv, context, k_pad, 64);
/* start with outer pad */
wpa_MD5Update((void *)priv, context, digest, 16);
/* then results of 1st hash */
wpa_MD5Final((void *)priv, digest, context); /* finish up 2nd pass */
// bml_FreeBuffer((UINT32)pDesc);
}