13 #define WrapCipher(obj, klass, ctx) \
14 (obj) = Data_Wrap_Struct((klass), 0, ossl_cipher_free, (ctx))
15 #define MakeCipher(obj, klass, ctx) \
16 (obj) = Data_Make_Struct((klass), EVP_CIPHER_CTX, 0, ossl_cipher_free, (ctx))
17 #define AllocCipher(obj, ctx) \
18 memset(DATA_PTR(obj) = (ctx) = ALLOC(EVP_CIPHER_CTX), 0, sizeof(EVP_CIPHER_CTX))
19 #define GetCipherInit(obj, ctx) do { \
20 Data_Get_Struct((obj), EVP_CIPHER_CTX, (ctx)); \
22 #define GetCipher(obj, ctx) do { \
23 GetCipherInit((obj), (ctx)); \
25 ossl_raise(rb_eRuntimeError, "Cipher not inititalized!"); \
28 #define SafeGetCipher(obj, ctx) do { \
29 OSSL_Check_Kind((obj), cCipher); \
30 GetCipher((obj), (ctx)); \
51 return EVP_CIPHER_CTX_cipher(ctx);
62 EVP_CIPHER_CTX_init(ctx);
76 EVP_CIPHER_CTX_cleanup(ctx);
103 const EVP_CIPHER *cipher;
105 unsigned char key[EVP_MAX_KEY_LENGTH];
113 EVP_CIPHER_CTX_init(ctx);
114 if (!(cipher = EVP_get_cipherbyname(name))) {
123 memset(key, 0, EVP_MAX_KEY_LENGTH);
133 EVP_CIPHER_CTX *ctx1, *ctx2;
136 if (
self == other)
return self;
149 #ifdef HAVE_OBJ_NAME_DO_ALL_SORTED
151 add_cipher_name_to_ary(
const OBJ_NAME *
name,
VALUE ary)
158 #ifdef HAVE_OBJ_NAME_DO_ALL_SORTED
171 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
172 (
void(*)(
const OBJ_NAME*,
void*))add_cipher_name_to_ary,
178 #define ossl_s_ciphers rb_f_notimplement
206 unsigned char key[EVP_MAX_KEY_LENGTH], *p_key =
NULL;
207 unsigned char iv[EVP_MAX_IV_LENGTH], *p_iv =
NULL;
217 rb_warn(
"arguments for %s#encrypt and %s#decrypt were deprecated; "
218 "use %s#pkcs5_keyivgen to derive key and IV",
219 cname, cname, cname);
222 if (
NIL_P(init_v)) memcpy(iv,
"OpenSSL for Ruby rulez!",
sizeof(iv));
226 memset(iv, 0, EVP_MAX_IV_LENGTH);
231 EVP_BytesToKey(EVP_CIPHER_CTX_cipher(ctx), EVP_md5(), iv,
306 const EVP_MD *digest;
307 VALUE vpass, vsalt, viter, vdigest;
308 unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH], *salt =
NULL;
311 rb_scan_args(argc, argv,
"13", &vpass, &vsalt, &viter, &vdigest);
322 EVP_BytesToKey(EVP_CIPHER_CTX_cipher(ctx), digest, salt,
361 out_len = in_len+EVP_CIPHER_CTX_block_size(ctx);
370 if (!EVP_CipherUpdate(ctx, (
unsigned char *)
RSTRING_PTR(str), &out_len, in, in_len))
395 str =
rb_str_new(0, EVP_CIPHER_CTX_block_size(ctx));
440 if (
RSTRING_LEN(key) < EVP_CIPHER_CTX_key_length(ctx))
472 if (
RSTRING_LEN(iv) < EVP_CIPHER_CTX_iv_length(ctx))
501 if (EVP_CIPHER_CTX_set_key_length(ctx, len) != 1)
507 #if defined(HAVE_EVP_CIPHER_CTX_SET_PADDING)
525 if (EVP_CIPHER_CTX_set_padding(ctx, pad) != 1)
530 #define ossl_cipher_set_padding rb_f_notimplement
533 #define CIPHER_0ARG_INT(func) \
535 ossl_cipher_##func(VALUE self) \
537 EVP_CIPHER_CTX *ctx; \
538 GetCipher(self, ctx); \
539 return INT2NUM(EVP_CIPHER_##func(EVP_CIPHER_CTX_cipher(ctx))); \