#include "quakedef.h"
#include "hmac.h"
-void hmac(
+qboolean hmac(
hashfunc_t hfunc, int hlen, int hblock,
unsigned char *out,
- unsigned char *in, int n,
- unsigned char *key, int k
+ const unsigned char *in, int n,
+ const unsigned char *key, int k
)
{
- unsigned char hashbuf[32];
- unsigned char k_xor_ipad[128];
- unsigned char k_xor_opad[128];
- unsigned char catbuf[256];
+ static unsigned char hashbuf[32];
+ static unsigned char k_xor_ipad[128];
+ static unsigned char k_xor_opad[128];
+ static unsigned char catbuf[65600]; // 65535 bytes max quake packet size + 64 for the hash
int i;
if(sizeof(hashbuf) < (size_t) hlen)
- Host_Error("Invalid hash function used for HMAC - too long hash length");
+ return false;
if(sizeof(k_xor_ipad) < (size_t) hblock)
- Host_Error("Invalid hash function used for HMAC - too long hash block length");
+ return false;
if(sizeof(k_xor_ipad) < (size_t) hlen)
- Host_Error("Invalid hash function used for HMAC - too long hash length");
+ return false;
if(sizeof(catbuf) < (size_t) hblock + (size_t) hlen)
- Host_Error("Invalid hash function used for HMAC - too long hash block length");
+ return false;
if(sizeof(catbuf) < (size_t) hblock + (size_t) n)
- Host_Error("Invalid hash function used for HMAC - too long message length");
+ return false;
if(k > hblock)
{
memcpy(catbuf, k_xor_opad, hblock);
memcpy(catbuf + hblock, hashbuf, hlen);
hfunc(out, catbuf, hblock + hlen);
+ return true;
}