EPEE: Remove hmac-md5
This commit is contained in:
parent
9f814edbd7
commit
63c7f8ba6e
|
@ -1,93 +0,0 @@
|
||||||
/*
|
|
||||||
* libEtPan! -- a mail stuff library
|
|
||||||
*
|
|
||||||
* Copyright (C) 2001, 2005 - DINH Viet Hoa
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the libEtPan! project nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived
|
|
||||||
* from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* hmac-md5.h -- HMAC_MD5 functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* $Id: hmac-md5.h,v 1.1.1.1 2005/03/18 20:17:28 zautrix Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HMAC_MD5_H
|
|
||||||
#define HMAC_MD5_H 1
|
|
||||||
|
|
||||||
namespace md5
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define HMAC_MD5_SIZE 16
|
|
||||||
|
|
||||||
/* intermediate MD5 context */
|
|
||||||
typedef struct HMAC_MD5_CTX_s {
|
|
||||||
MD5_CTX ictx, octx;
|
|
||||||
} HMAC_MD5_CTX;
|
|
||||||
|
|
||||||
/* intermediate HMAC state
|
|
||||||
* values stored in network byte order (Big Endian)
|
|
||||||
*/
|
|
||||||
typedef struct HMAC_MD5_STATE_s {
|
|
||||||
UINT4 istate[4];
|
|
||||||
UINT4 ostate[4];
|
|
||||||
} HMAC_MD5_STATE;
|
|
||||||
|
|
||||||
/* One step hmac computation
|
|
||||||
*
|
|
||||||
* digest may be same as text or key
|
|
||||||
*/
|
|
||||||
void hmac_md5(const unsigned char *text, int text_len,
|
|
||||||
const unsigned char *key, int key_len,
|
|
||||||
unsigned char digest[HMAC_MD5_SIZE]);
|
|
||||||
|
|
||||||
/* create context from key
|
|
||||||
*/
|
|
||||||
void hmac_md5_init(HMAC_MD5_CTX *hmac,
|
|
||||||
const unsigned char *key, int key_len);
|
|
||||||
|
|
||||||
/* precalculate intermediate state from key
|
|
||||||
*/
|
|
||||||
void hmac_md5_precalc(HMAC_MD5_STATE *hmac,
|
|
||||||
const unsigned char *key, int key_len);
|
|
||||||
|
|
||||||
/* initialize context from intermediate state
|
|
||||||
*/
|
|
||||||
void hmac_md5_import(HMAC_MD5_CTX *hmac, HMAC_MD5_STATE *state);
|
|
||||||
|
|
||||||
#define hmac_md5_update(hmac, text, text_len) MD5Update(&(hmac)->ictx, (text), (text_len))
|
|
||||||
|
|
||||||
/* finish hmac from intermediate result. Intermediate result is zeroed.
|
|
||||||
*/
|
|
||||||
void hmac_md5_final(unsigned char digest[HMAC_MD5_SIZE],
|
|
||||||
HMAC_MD5_CTX *hmac);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HMAC_MD5_H */
|
|
|
@ -74,7 +74,6 @@ namespace md5
|
||||||
static void MD5Init(MD5_CTX * context);
|
static void MD5Init(MD5_CTX * context);
|
||||||
static void MD5Update( MD5_CTX *context, const unsigned char *input, unsigned int inputLen );
|
static void MD5Update( MD5_CTX *context, const unsigned char *input, unsigned int inputLen );
|
||||||
static void MD5Final ( unsigned char digest[16], MD5_CTX *context );
|
static void MD5Final ( unsigned char digest[16], MD5_CTX *context );
|
||||||
static inline void hmac_md5(const unsigned char* text, int text_len, const unsigned char* key, int key_len, unsigned char *digest);
|
|
||||||
|
|
||||||
|
|
||||||
inline bool md5( unsigned char *input, int ilen, unsigned char output[16] )
|
inline bool md5( unsigned char *input, int ilen, unsigned char output[16] )
|
||||||
|
|
|
@ -65,7 +65,6 @@ documentation and/or software.
|
||||||
#endif
|
#endif
|
||||||
#include "md5global.h"
|
#include "md5global.h"
|
||||||
#include "md5_l.h"
|
#include "md5_l.h"
|
||||||
#include "hmac-md5.h"
|
|
||||||
|
|
||||||
namespace md5
|
namespace md5
|
||||||
{
|
{
|
||||||
|
@ -89,16 +88,6 @@ namespace md5
|
||||||
#define S43 15
|
#define S43 15
|
||||||
#define S44 21
|
#define S44 21
|
||||||
|
|
||||||
/*
|
|
||||||
static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
|
|
||||||
static void Encode PROTO_LIST
|
|
||||||
((unsigned char *, UINT4 *, unsigned int));
|
|
||||||
static void Decode PROTO_LIST
|
|
||||||
((UINT4 *, unsigned char *, unsigned int));
|
|
||||||
static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
|
|
||||||
static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void MD5_memcpy (POINTER output, POINTER input, unsigned int len)
|
static void MD5_memcpy (POINTER output, POINTER input, unsigned int len)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -107,17 +96,6 @@ namespace md5
|
||||||
output[i] = input[i];
|
output[i] = input[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note: Replace "for loop" with standard memset if possible.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void MD5_memset (POINTER output, int value, unsigned int len)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
((char *)output)[i] = (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void MD5Transform (UINT4 state[4], unsigned char block[64]);
|
static void MD5Transform (UINT4 state[4], unsigned char block[64]);
|
||||||
|
|
||||||
static unsigned char* PADDING()
|
static unsigned char* PADDING()
|
||||||
|
@ -371,190 +349,4 @@ namespace md5
|
||||||
*/
|
*/
|
||||||
memwipe ((POINTER)x, sizeof (x));
|
memwipe ((POINTER)x, sizeof (x));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note: Replace "for loop" with standard memcpy if possible.
|
|
||||||
|
|
||||||
*/
|
|
||||||
inline
|
|
||||||
void hmac_md5_init(HMAC_MD5_CTX *hmac,
|
|
||||||
const unsigned char *key,
|
|
||||||
int key_len)
|
|
||||||
{
|
|
||||||
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 */
|
|
||||||
MD5_memset(k_ipad, '\0', sizeof k_ipad);
|
|
||||||
MD5_memset(k_opad, '\0', sizeof k_opad);
|
|
||||||
MD5_memcpy( k_ipad, (POINTER)key, key_len);
|
|
||||||
MD5_memcpy( k_opad, (POINTER)key, key_len);
|
|
||||||
|
|
||||||
/* XOR key with ipad and opad values */
|
|
||||||
for (i=0; i<64; i++) {
|
|
||||||
k_ipad[i] ^= 0x36;
|
|
||||||
k_opad[i] ^= 0x5c;
|
|
||||||
}
|
|
||||||
|
|
||||||
MD5Init(&hmac->ictx); /* init inner context */
|
|
||||||
MD5Update(&hmac->ictx, k_ipad, 64); /* apply inner pad */
|
|
||||||
|
|
||||||
MD5Init(&hmac->octx); /* init outer context */
|
|
||||||
MD5Update(&hmac->octx, k_opad, 64); /* apply outer pad */
|
|
||||||
|
|
||||||
/* scrub the pads and key context (if used) */
|
|
||||||
memwipe( (POINTER)&k_ipad, sizeof(k_ipad));
|
|
||||||
memwipe( (POINTER)&k_opad, sizeof(k_opad));
|
|
||||||
memwipe( (POINTER)&tk, sizeof(tk));
|
|
||||||
|
|
||||||
/* and we're done. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The precalc and import routines here rely on the fact that we pad
|
|
||||||
* the key out to 64 bytes and use that to initialize the md5
|
|
||||||
* contexts, and that updating an md5 context with 64 bytes of data
|
|
||||||
* leaves nothing left over; all of the interesting state is contained
|
|
||||||
* in the state field, and none of it is left over in the count and
|
|
||||||
* buffer fields. So all we have to do is save the state field; we
|
|
||||||
* can zero the others when we reload it. Which is why the decision
|
|
||||||
* was made to pad the key out to 64 bytes in the first place. */
|
|
||||||
inline
|
|
||||||
void hmac_md5_precalc(HMAC_MD5_STATE *state,
|
|
||||||
const unsigned char *key,
|
|
||||||
int key_len)
|
|
||||||
{
|
|
||||||
HMAC_MD5_CTX hmac;
|
|
||||||
unsigned lupe;
|
|
||||||
|
|
||||||
hmac_md5_init(&hmac, key, key_len);
|
|
||||||
for (lupe = 0; lupe < 4; lupe++) {
|
|
||||||
state->istate[lupe] = htonl(hmac.ictx.state[lupe]);
|
|
||||||
state->ostate[lupe] = htonl(hmac.octx.state[lupe]);
|
|
||||||
}
|
|
||||||
memwipe( (POINTER)&hmac, sizeof(hmac));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline
|
|
||||||
void hmac_md5_import(HMAC_MD5_CTX *hmac,
|
|
||||||
HMAC_MD5_STATE *state)
|
|
||||||
{
|
|
||||||
unsigned lupe;
|
|
||||||
MD5_memset( (POINTER)hmac, 0, sizeof(HMAC_MD5_CTX));
|
|
||||||
for (lupe = 0; lupe < 4; lupe++) {
|
|
||||||
hmac->ictx.state[lupe] = ntohl(state->istate[lupe]);
|
|
||||||
hmac->octx.state[lupe] = ntohl(state->ostate[lupe]);
|
|
||||||
}
|
|
||||||
/* Init the counts to account for our having applied
|
|
||||||
* 64 bytes of key; this works out to 0x200 (64 << 3; see
|
|
||||||
* MD5Update above...) */
|
|
||||||
hmac->ictx.count[0] = hmac->octx.count[0] = 0x200;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
void hmac_md5_final(unsigned char digest[HMAC_MD5_SIZE],
|
|
||||||
HMAC_MD5_CTX *hmac)
|
|
||||||
{
|
|
||||||
MD5Final(digest, &hmac->ictx); /* Finalize inner md5 */
|
|
||||||
MD5Update(&hmac->octx, digest, 16); /* Update outer ctx */
|
|
||||||
MD5Final(digest, &hmac->octx); /* Finalize outer md5 */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void hmac_md5(const unsigned char* text, int text_len, const unsigned char* key, int key_len, unsigned char *digest)
|
|
||||||
{
|
|
||||||
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 */
|
|
||||||
MD5_memset(k_ipad, '\0', sizeof k_ipad);
|
|
||||||
MD5_memset(k_opad, '\0', sizeof k_opad);
|
|
||||||
MD5_memcpy( k_ipad, (POINTER)key, key_len);
|
|
||||||
MD5_memcpy( k_opad, (POINTER)key, 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 */
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue