1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

openssl: typed data

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47799 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-10-04 23:33:15 +00:00
parent 1e46f02394
commit 163cb5b43d
2 changed files with 43 additions and 7 deletions

View file

@ -15,11 +15,11 @@
if (!(bn)) { \
ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \
} \
(obj) = Data_Wrap_Struct((klass), 0, BN_clear_free, (bn)); \
(obj) = TypedData_Wrap_Struct((klass), &ossl_bn_type, (bn)); \
} while (0)
#define GetBN(obj, bn) do { \
Data_Get_Struct((obj), BIGNUM, (bn)); \
TypedData_Get_Struct((obj), BIGNUM, &ossl_bn_type, (bn)); \
if (!(bn)) { \
ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \
} \
@ -30,6 +30,25 @@
GetBN((obj), (bn)); \
} while (0)
static void
ossl_bn_free(void *ptr)
{
BN_clear_free(ptr);
}
static size_t
ossl_bn_size(const void *ptr)
{
return sizeof(BIGNUM);
}
static const rb_data_type_t ossl_bn_type = {
"OpenSSL/BN",
{0, ossl_bn_free, ossl_bn_size,},
NULL, NULL,
RUBY_TYPED_FREE_IMMEDIATELY,
};
/*
* Classes
*/

View file

@ -11,13 +11,13 @@
#include "ossl.h"
#define WrapCipher(obj, klass, ctx) \
(obj) = Data_Wrap_Struct((klass), 0, ossl_cipher_free, (ctx))
(obj) = TypedData_Wrap_Struct((klass), &ossl_cipher_type, (ctx))
#define MakeCipher(obj, klass, ctx) \
(obj) = Data_Make_Struct((klass), EVP_CIPHER_CTX, 0, ossl_cipher_free, (ctx))
(obj) = TypedData_Make_Struct((klass), EVP_CIPHER_CTX, &ossl_cipher_type, (ctx))
#define AllocCipher(obj, ctx) \
memset(DATA_PTR(obj) = (ctx) = ALLOC(EVP_CIPHER_CTX), 0, sizeof(EVP_CIPHER_CTX))
(DATA_PTR(obj) = (ctx) = ZALLOC(EVP_CIPHER_CTX))
#define GetCipherInit(obj, ctx) do { \
Data_Get_Struct((obj), EVP_CIPHER_CTX, (ctx)); \
TypedData_Get_Struct((obj), EVP_CIPHER_CTX, &ossl_cipher_type, (ctx)); \
} while (0)
#define GetCipher(obj, ctx) do { \
GetCipherInit((obj), (ctx)); \
@ -37,6 +37,15 @@ VALUE cCipher;
VALUE eCipherError;
static VALUE ossl_cipher_alloc(VALUE klass);
static void ossl_cipher_free(void *ptr);
static size_t ossl_cipher_memsize(const void *ptr);
static const rb_data_type_t ossl_cipher_type = {
"OpenSSL/Cipher",
{0, ossl_cipher_free, ossl_cipher_memsize,},
NULL, NULL,
RUBY_TYPED_FREE_IMMEDIATELY,
};
/*
* PUBLIC
@ -70,14 +79,22 @@ ossl_cipher_new(const EVP_CIPHER *cipher)
* PRIVATE
*/
static void
ossl_cipher_free(EVP_CIPHER_CTX *ctx)
ossl_cipher_free(void *ptr)
{
EVP_CIPHER_CTX *ctx = ptr;
if (ctx) {
EVP_CIPHER_CTX_cleanup(ctx);
ruby_xfree(ctx);
}
}
static size_t
ossl_cipher_memsize(const void *ptr)
{
const EVP_CIPHER_CTX *ctx = ptr;
return ctx ? sizeof(*ctx) : 0;
}
static VALUE
ossl_cipher_alloc(VALUE klass)
{