static int hmac_digest(lua_State *L) { HMAC_CTX *c = hmac_pget(L, 1); unsigned char digest[EVP_MAX_MD_SIZE]; size_t written = 0; unsigned int i; char *hex; if (lua_isstring(L, 2)) { const char *s = luaL_checkstring(L, 2); HMAC_Update(c, (unsigned char *)s, lua_strlen(L, 2)); } HMAC_Final(c, digest, &written); if (lua_toboolean(L, 3)) lua_pushlstring(L, (char *)digest, written); else { hex = calloc(sizeof(char), written*2 + 1); for (i = 0; i < written; i++) sprintf(hex + 2*i, "%02x", digest[i]); lua_pushlstring(L, hex, written*2); free(hex); } return 1; }
static int hmac_clone(lua_State *L) { HMAC_CTX *c = hmac_pget(L, 1); HMAC_CTX *d = hmac_pnew(L); *d = *c; return 1; }
static int hmac_tostring(lua_State *L) { HANDLER_HMAC *c = hmac_pget(L, 1); char s[64]; sprintf(s, "%s %p", LUACRYPTO_HMACNAME, (void *)c); lua_pushstring(L, s); return 1; }
static int hmac_update(lua_State *L) { HMAC_CTX *c = hmac_pget(L, 1); const char *s = luaL_checkstring(L, 2); HMAC_Update(c, (unsigned char *)s, lua_strlen(L, 2)); lua_settop(L, 1); return 1; }
static int hmac_update(lua_State *L) { HANDLER_HMAC *c = hmac_pget(L, 1); size_t s_len; const char *s = luaL_checklstring(L, 2, &s_len); HMAC_UPDATE(c, s, s_len); lua_settop(L, 1); return 1; }
static int hmac_reset(lua_State *L) { HANDLER_HMAC *c = hmac_pget(L, 1); #if CRYPTO_OPENSSL HMAC_Init_ex(c, NULL, 0, NULL, NULL); #elif CRYPTO_GCRYPT gcry_md_reset(*c); #endif return 0; }
static int hmac_clone(lua_State *L) { HANDLER_HMAC *c = hmac_pget(L, 1); HANDLER_HMAC *d = hmac_pnew(L); #if CRYPTO_OPENSSL *d = *c; #elif CRYPTO_GCRYPT gcry_md_copy(d, *c); #endif return 1; }
static int hmac_digest(lua_State *L) { HANDLER_HMAC *c = hmac_pget(L, 1); size_t written = 0; #if CRYPTO_OPENSSL unsigned char digest[EVP_MAX_MD_SIZE]; #elif CRYPTO_GCRYPT HANDLER_HMAC d; unsigned char *digest; int algo; #endif if (lua_isstring(L, 2)) { size_t s_len; const char *s = luaL_checklstring(L, 2, &s_len); HMAC_UPDATE(c, s, s_len); } #if CRYPTO_OPENSSL HMAC_Final(c, digest, &written); #elif CRYPTO_GCRYPT algo = gcry_md_get_algo(*c); gcry_md_copy(&d, *c); gcry_md_final(d); digest = gcry_md_read(d, algo); written = gcry_md_get_algo_dlen(algo); #endif if (lua_toboolean(L, 3)) lua_pushlstring(L, (char *)digest, written); else { char *hex = bin2hex(digest, written); lua_pushlstring(L, hex, written*2); free(hex); } #if CRYPTO_GCRYPT gcry_md_close(d); #endif return 1; }
static int hmac_gc(lua_State *L) { HANDLER_HMAC *c = hmac_pget(L, 1); HMAC_CLEANUP(c); return 1; }
static int hmac_gc(lua_State *L) { HMAC_CTX *c = hmac_pget(L, 1); HMAC_CTX_cleanup(c); return 1; }
static int hmac_reset(lua_State *L) { HMAC_CTX *c = hmac_pget(L, 1); HMAC_Init_ex(c, NULL, 0, NULL, NULL); return 0; }