98 MAKE_HMAC_FUNCTION(Lhmac_sha256, EVP_sha256, SHA256_DIGEST_LENGTH, SHA256_CTX) |
98 MAKE_HMAC_FUNCTION(Lhmac_sha256, EVP_sha256, SHA256_DIGEST_LENGTH, SHA256_CTX) |
99 MAKE_HMAC_FUNCTION(Lhmac_sha512, EVP_sha512, SHA512_DIGEST_LENGTH, SHA512_CTX) |
99 MAKE_HMAC_FUNCTION(Lhmac_sha512, EVP_sha512, SHA512_DIGEST_LENGTH, SHA512_CTX) |
100 MAKE_HMAC_FUNCTION(Lhmac_md5, EVP_md5, MD5_DIGEST_LENGTH, MD5_CTX) |
100 MAKE_HMAC_FUNCTION(Lhmac_md5, EVP_md5, MD5_DIGEST_LENGTH, MD5_CTX) |
101 |
101 |
102 static int Lpbkdf2_sha1(lua_State *L) { |
102 static int Lpbkdf2_sha1(lua_State *L) { |
103 unsigned char out[SHA_DIGEST_LENGTH]; |
|
104 |
|
105 size_t pass_len, salt_len; |
103 size_t pass_len, salt_len; |
106 const char *pass = luaL_checklstring(L, 1, &pass_len); |
104 const char *pass = luaL_checklstring(L, 1, &pass_len); |
107 const unsigned char *salt = (unsigned char *)luaL_checklstring(L, 2, &salt_len); |
105 const unsigned char *salt = (unsigned char *)luaL_checklstring(L, 2, &salt_len); |
108 const int iter = luaL_checkinteger(L, 3); |
106 const int iter = luaL_checkinteger(L, 3); |
|
107 const size_t len = luaL_optinteger(L, 4, SHA_DIGEST_LENGTH); |
109 |
108 |
110 if(PKCS5_PBKDF2_HMAC(pass, pass_len, salt, salt_len, iter, EVP_sha1(), SHA_DIGEST_LENGTH, out) == 0) { |
109 luaL_Buffer b; |
|
110 unsigned char *out = (unsigned char *)luaL_buffinitsize(L, &b, len); |
|
111 |
|
112 if(PKCS5_PBKDF2_HMAC(pass, pass_len, salt, salt_len, iter, EVP_sha1(), len, out) == 0) { |
111 return luaL_error(L, "PKCS5_PBKDF2_HMAC() failed"); |
113 return luaL_error(L, "PKCS5_PBKDF2_HMAC() failed"); |
112 } |
114 } |
113 |
115 |
114 lua_pushlstring(L, (char *)out, SHA_DIGEST_LENGTH); |
116 luaL_pushresultsize(&b, len); |
115 |
|
116 return 1; |
117 return 1; |
117 } |
118 } |
118 |
119 |
119 |
120 |
120 static int Lpbkdf2_sha256(lua_State *L) { |
121 static int Lpbkdf2_sha256(lua_State *L) { |
121 unsigned char out[SHA256_DIGEST_LENGTH]; |
|
122 |
|
123 size_t pass_len, salt_len; |
122 size_t pass_len, salt_len; |
124 const char *pass = luaL_checklstring(L, 1, &pass_len); |
123 const char *pass = luaL_checklstring(L, 1, &pass_len); |
125 const unsigned char *salt = (unsigned char *)luaL_checklstring(L, 2, &salt_len); |
124 const unsigned char *salt = (unsigned char *)luaL_checklstring(L, 2, &salt_len); |
126 const int iter = luaL_checkinteger(L, 3); |
125 const int iter = luaL_checkinteger(L, 3); |
|
126 const int len = luaL_optinteger(L, 4, SHA256_DIGEST_LENGTH); |
127 |
127 |
128 if(PKCS5_PBKDF2_HMAC(pass, pass_len, salt, salt_len, iter, EVP_sha256(), SHA256_DIGEST_LENGTH, out) == 0) { |
128 luaL_Buffer b; |
|
129 unsigned char *out = (unsigned char *)luaL_buffinitsize(L, &b, len); |
|
130 |
|
131 if(PKCS5_PBKDF2_HMAC(pass, pass_len, salt, salt_len, iter, EVP_sha256(), len, out) == 0) { |
129 return luaL_error(L, "PKCS5_PBKDF2_HMAC() failed"); |
132 return luaL_error(L, "PKCS5_PBKDF2_HMAC() failed"); |
130 } |
133 } |
131 |
134 |
132 lua_pushlstring(L, (char *)out, SHA_DIGEST_LENGTH); |
135 luaL_pushresultsize(&b, len); |
133 return 1; |
136 return 1; |
134 } |
137 } |
135 |
138 |
136 static const luaL_Reg Reg[] = { |
139 static const luaL_Reg Reg[] = { |
137 { "sha1", Lsha1 }, |
140 { "sha1", Lsha1 }, |