예제 #1
0
파일: lcrypto.c 프로젝트: Odie/moai-beta
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;
}
예제 #2
0
파일: lcrypto.c 프로젝트: Odie/moai-beta
static int hmac_clone(lua_State *L)
{
 HMAC_CTX *c = hmac_pget(L, 1);
 HMAC_CTX *d = hmac_pnew(L);
 *d = *c;
 return 1;
}
예제 #3
0
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;
}
예제 #4
0
파일: lcrypto.c 프로젝트: Odie/moai-beta
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;
}
예제 #5
0
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;
}
예제 #6
0
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;
}
예제 #7
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;
}
예제 #8
0
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;
}
예제 #9
0
static int hmac_gc(lua_State *L)
{
  HANDLER_HMAC *c = hmac_pget(L, 1);
  HMAC_CLEANUP(c);
  return 1;
}
예제 #10
0
파일: lcrypto.c 프로젝트: Odie/moai-beta
static int hmac_gc(lua_State *L)
{
  HMAC_CTX *c = hmac_pget(L, 1);
  HMAC_CTX_cleanup(c);
  return 1;
}
예제 #11
0
파일: lcrypto.c 프로젝트: Odie/moai-beta
static int hmac_reset(lua_State *L)
{
  HMAC_CTX *c = hmac_pget(L, 1);
  HMAC_Init_ex(c, NULL, 0, NULL, NULL);
  return 0;
}