#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hmac.h"
#include "sha.h"
HMAC *hmacopen(int alg, unsigned char *key, unsigned int keylen)
{
unsigned int i;
HMAC *h;
SHA_newz(0, h, 1, HMAC);
if (h == NULL)
return(NULL);
if ((h->isha = shaopen(alg)) == NULL) {
SHA_free(h);
return(NULL);
}
if ((h->osha = shaopen(alg)) == NULL) {
shaclose(h->isha);
SHA_free(h);
return(NULL);
}
if (keylen <= h->osha->blocksize / 8)
memcpy(h->key, key, keylen);
else {
if ((h->ksha = shaopen(alg)) == NULL) {
shaclose(h->isha);
shaclose(h->osha);
SHA_free(h);
return(NULL);
}
shawrite(key, keylen * 8, h->ksha);
shafinish(h->ksha);
memcpy(h->key, shadigest(h->ksha), h->ksha->digestlen);
shaclose(h->ksha);
}
for (i = 0; i < h->osha->blocksize / 8; i++)
h->key[i] ^= 0x5c;
shawrite(h->key, h->osha->blocksize, h->osha);
for (i = 0; i < h->isha->blocksize / 8; i++)
h->key[i] ^= (0x5c ^ 0x36);
shawrite(h->key, h->isha->blocksize, h->isha);
memset(h->key, 0, sizeof(h->key));
return(h);
}
unsigned long hmacwrite(unsigned char *bitstr, unsigned long bitcnt, HMAC *h)
{
return(shawrite(bitstr, bitcnt, h->isha));
}
void hmacfinish(HMAC *h)
{
shafinish(h->isha);
shawrite(shadigest(h->isha), h->isha->digestlen * 8, h->osha);
shaclose(h->isha);
shafinish(h->osha);
}
unsigned char *hmacdigest(HMAC *h)
{
return(shadigest(h->osha));
}
char *hmachex(HMAC *h)
{
return(shahex(h->osha));
}
char *hmacbase64(HMAC *h)
{
return(shabase64(h->osha));
}
int hmacclose(HMAC *h)
{
shaclose(h->osha);
if (h != NULL) {
memset(h, 0, sizeof(HMAC));
SHA_free(h);
}
return(0);
}