6#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
7# include <openssl/kdf.h>
10static VALUE mKDF, eKDF;
40 VALUE pass, salt, opts, kwargs[4],
str;
41 static ID kwargs_ids[4];
46 kwargs_ids[0] = rb_intern_const(
"salt");
47 kwargs_ids[1] = rb_intern_const(
"iterations");
48 kwargs_ids[2] = rb_intern_const(
"length");
49 kwargs_ids[3] = rb_intern_const(
"hash");
61 if (!PKCS5_PBKDF2_HMAC(
RSTRING_PTR(pass), RSTRING_LENINT(pass),
63 RSTRING_LENINT(salt), iters, md,
len,
70#if defined(HAVE_EVP_PBE_SCRYPT)
106 VALUE pass, salt, opts, kwargs[5],
str;
107 static ID kwargs_ids[5];
111 if (!kwargs_ids[0]) {
112 kwargs_ids[0] = rb_intern_const(
"salt");
113 kwargs_ids[1] = rb_intern_const(
"N");
114 kwargs_ids[2] = rb_intern_const(
"r");
115 kwargs_ids[3] = rb_intern_const(
"p");
116 kwargs_ids[4] = rb_intern_const(
"length");
123 N = NUM2UINT64T(kwargs[1]);
124 r = NUM2UINT64T(kwargs[2]);
125 p = NUM2UINT64T(kwargs[3]);
144#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
170 VALUE ikm, salt, info, opts, kwargs[4],
str;
171 static ID kwargs_ids[4];
172 int saltlen, ikmlen, infolen;
177 if (!kwargs_ids[0]) {
178 kwargs_ids[0] = rb_intern_const(
"salt");
179 kwargs_ids[1] = rb_intern_const(
"info");
180 kwargs_ids[2] = rb_intern_const(
"length");
181 kwargs_ids[3] = rb_intern_const(
"hash");
187 ikmlen = RSTRING_LENINT(ikm);
189 saltlen = RSTRING_LENINT(salt);
191 infolen = RSTRING_LENINT(info);
198 pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF,
NULL);
201 if (EVP_PKEY_derive_init(pctx) <= 0) {
202 EVP_PKEY_CTX_free(pctx);
205 if (EVP_PKEY_CTX_set_hkdf_md(pctx, md) <= 0) {
206 EVP_PKEY_CTX_free(pctx);
209 if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, (
unsigned char *)
RSTRING_PTR(salt),
211 EVP_PKEY_CTX_free(pctx);
212 ossl_raise(eKDF,
"EVP_PKEY_CTX_set_hkdf_salt");
214 if (EVP_PKEY_CTX_set1_hkdf_key(pctx, (
unsigned char *)
RSTRING_PTR(ikm),
216 EVP_PKEY_CTX_free(pctx);
217 ossl_raise(eKDF,
"EVP_PKEY_CTX_set_hkdf_key");
219 if (EVP_PKEY_CTX_add1_hkdf_info(pctx, (
unsigned char *)
RSTRING_PTR(info),
221 EVP_PKEY_CTX_free(pctx);
222 ossl_raise(eKDF,
"EVP_PKEY_CTX_set_hkdf_info");
225 EVP_PKEY_CTX_free(pctx);
229 EVP_PKEY_CTX_free(pctx);
297#if defined(HAVE_EVP_PBE_SCRYPT)
300#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
#define rb_define_module_function(klass, mid, func, arity)
Defines klass#mid and makes it a module function.
char str[HTML_ESCAPE_MAX_LEN+1]
#define RSTRING_LEN(string)
#define RSTRING_PTR(string)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
VALUE rb_define_module(const char *name)
VALUE rb_define_module_under(VALUE outer, const char *name)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
void rb_raise(VALUE exc, const char *fmt,...)
#define rb_str_new(str, len)
void rb_str_set_len(VALUE, long)
void ossl_raise(VALUE exc, const char *fmt,...)
const EVP_MD * ossl_evp_get_digestbyname(VALUE obj)
unsigned long long uint64_t