-#include "quakedef.h"
+#include "darkplaces.h"
#include "hmac.h"
-void hmac(
+qbool 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];
+ unsigned char *catbuf;
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");
- if(sizeof(catbuf) < (size_t) hblock + (size_t) hlen)
- Host_Error("Invalid hash function used for HMAC - too long hash block length");
- if(sizeof(catbuf) < (size_t) hblock + (size_t) n)
- Host_Error("Invalid hash function used for HMAC - too long message length");
+ return false;
+
+ catbuf = (unsigned char *)Mem_Alloc(tempmempool, (size_t) hblock + max((size_t) hlen, (size_t) n));
if(k > hblock)
{
memcpy(catbuf, k_xor_opad, hblock);
memcpy(catbuf + hblock, hashbuf, hlen);
hfunc(out, catbuf, hblock + hlen);
+
+ Mem_Free(catbuf);
+
+ return true;
}