Add MD5_Hmac
This commit is contained in:
parent
e856f0a920
commit
42ef80e0b4
2 changed files with 48 additions and 0 deletions
47
md5.c
47
md5.c
|
|
@ -270,3 +270,50 @@ void MD5_Final(unsigned char *result, MD5_CTX *ctx)
|
||||||
|
|
||||||
memset(ctx, 0, sizeof(*ctx));
|
memset(ctx, 0, sizeof(*ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MD5_Hmac(unsigned char *result, const void *data, unsigned long size, const void *key, unsigned long key_size)
|
||||||
|
{
|
||||||
|
MD5_CTX ctx;
|
||||||
|
unsigned char block[MD5_BLOCK_SZ];
|
||||||
|
|
||||||
|
unsigned char short_key[MD5_DIGEST_SZ];
|
||||||
|
unsigned char temp[MD5_DIGEST_SZ];
|
||||||
|
|
||||||
|
const unsigned char *used_key;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (key_size > MD5_BLOCK_SZ)
|
||||||
|
{
|
||||||
|
MD5_Init(&ctx);
|
||||||
|
MD5_Update(&ctx, key, key_size);
|
||||||
|
MD5_Final(short_key, &ctx);
|
||||||
|
used_key = short_key;
|
||||||
|
key_size = MD5_DIGEST_SZ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
used_key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
MD5_Init(&ctx);
|
||||||
|
|
||||||
|
memset(block, 0x36, MD5_BLOCK_SZ);
|
||||||
|
for (i = 0; i < key_size; i++)
|
||||||
|
block[i] ^= used_key[i];
|
||||||
|
MD5_Update(&ctx, block, MD5_BLOCK_SZ);
|
||||||
|
|
||||||
|
MD5_Update(&ctx, data, size);
|
||||||
|
|
||||||
|
MD5_Final(temp, &ctx);
|
||||||
|
|
||||||
|
MD5_Init(&ctx);
|
||||||
|
|
||||||
|
memset(block, 0x5c, MD5_BLOCK_SZ);
|
||||||
|
for (i = 0; i < key_size; i++)
|
||||||
|
block[i] ^= used_key[i];
|
||||||
|
MD5_Update(&ctx, block, MD5_BLOCK_SZ);
|
||||||
|
|
||||||
|
MD5_Update(&ctx, temp, sizeof(temp));
|
||||||
|
|
||||||
|
MD5_Final(result, &ctx);
|
||||||
|
}
|
||||||
|
|
|
||||||
1
md5.h
1
md5.h
|
|
@ -25,5 +25,6 @@ typedef struct {
|
||||||
extern void MD5_Init(MD5_CTX *ctx);
|
extern void MD5_Init(MD5_CTX *ctx);
|
||||||
extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
|
extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
|
||||||
extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
|
extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
|
||||||
|
extern void MD5_Hmac(unsigned char *result, const void *data, unsigned long size, const void *key, unsigned long key_size);
|
||||||
|
|
||||||
#endif /* __MD5_H__ */
|
#endif /* __MD5_H__ */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue