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:
parent
1e46f02394
commit
163cb5b43d
2 changed files with 43 additions and 7 deletions
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue