aboutsummaryrefslogtreecommitdiffstats
path: root/ossl_digest.c
diff options
context:
space:
mode:
Diffstat (limited to 'ossl_digest.c')
-rw-r--r--ossl_digest.c88
1 files changed, 35 insertions, 53 deletions
diff --git a/ossl_digest.c b/ossl_digest.c
index c77f432..8a62b3f 100644
--- a/ossl_digest.c
+++ b/ossl_digest.c
@@ -10,10 +10,8 @@
*/
#include "ossl.h"
-#define MakeDigest(klass, obj, digestp) {\
- obj = Data_Make_Struct(klass, ossl_digest, 0, ossl_digest_free, digestp);\
-}
-#define GetDigest(obj, digestp) Data_Get_Struct(obj, ossl_digest, digestp)
+#define WrapDigest(klass, obj, ctx) obj = Data_Wrap_Struct(klass, 0, CRYPTO_free, ctx)
+#define GetDigest(obj, ctx) Data_Get_Struct(obj, EVP_MD_CTX, ctx)
/*
* Classes
@@ -23,60 +21,49 @@ VALUE eDigestError;
VALUE cMD2, cMD4, cMD5, cMDC2, cRIPEMD160, cSHA, cSHA1, cDSS, cDSS1;
/*
- * Struct
- */
-typedef struct ossl_digest_st {
- EVP_MD_CTX *md;
-} ossl_digest;
-
-static void
-ossl_digest_free(ossl_digest *digestp)
-{
- if (digestp) {
- if (digestp->md) OPENSSL_free(digestp->md);
- digestp->md = NULL;
- free(digestp);
- }
-}
-
-/*
- * PUBLIC
+ * Public
*/
int
ossl_digest_get_NID(VALUE obj)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL;
OSSL_Check_Type(obj, cDigest);
- GetDigest(obj, digestp);
- return EVP_MD_CTX_type(digestp->md); /*== digestp->md->digest->type*/
+ GetDigest(obj, ctx);
+
+ return EVP_MD_CTX_type(ctx); /*== ctx->digest->type*/
}
const EVP_MD *
ossl_digest_get_EVP_MD(VALUE obj)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL;
OSSL_Check_Type(obj, cDigest);
- GetDigest(obj, digestp);
- return EVP_MD_CTX_md(digestp->md); /*== digestp->md->digest*/
+ GetDigest(obj, ctx);
+
+ return EVP_MD_CTX_md(ctx); /*== ctx->digest*/
}
/*
- * PRIVATE
+ * Private
*/
static VALUE
ossl_digest_s_new(int argc, VALUE *argv, VALUE klass)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL;
VALUE obj;
if (klass == cDigest)
rb_raise(rb_eNotImpError, "cannot do Digest::ANY.new - it is an abstract class");
- MakeDigest(klass, obj, digestp);
+ if (!(ctx = OPENSSL_malloc(sizeof(EVP_MD_CTX)))) {
+ OSSL_Raise(eDigestError, "Cannot allocate memory for a digest's CTX");
+ }
+ WrapDigest(klass, obj, ctx);
+
rb_obj_call_init(obj, argc, argv);
return obj;
@@ -85,13 +72,13 @@ ossl_digest_s_new(int argc, VALUE *argv, VALUE klass)
static VALUE
ossl_digest_update(VALUE self, VALUE data)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL;
- GetDigest(self, digestp);
+ GetDigest(self, ctx);
data = rb_String(data);
- EVP_DigestUpdate(digestp->md, RSTRING(data)->ptr, RSTRING(data)->len);
+ EVP_DigestUpdate(ctx, RSTRING(data)->ptr, RSTRING(data)->len);
return self;
}
@@ -99,15 +86,14 @@ ossl_digest_update(VALUE self, VALUE data)
static VALUE
ossl_digest_digest(VALUE self)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL, final;
char *digest_txt = NULL;
int digest_len = 0;
- EVP_MD_CTX final;
VALUE digest;
- GetDigest(self, digestp);
+ GetDigest(self, ctx);
- if (!EVP_MD_CTX_copy(&final, digestp->md)) {
+ if (!EVP_MD_CTX_copy(&final, ctx)) {
OSSL_Raise(eDigestError, "");
}
if (!(digest_txt = OPENSSL_malloc(EVP_MD_CTX_size(&final)))) {
@@ -127,16 +113,15 @@ ossl_digest_digest(VALUE self)
static VALUE
ossl_digest_hexdigest(VALUE self)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL, final;
static const char hex[]="0123456789abcdef";
char *digest_txt = NULL, *hexdigest_txt = NULL;
int i,digest_len = 0;
- EVP_MD_CTX final;
VALUE hexdigest;
- GetDigest(self, digestp);
+ GetDigest(self, ctx);
- if (!EVP_MD_CTX_copy(&final, digestp->md)) {
+ if (!EVP_MD_CTX_copy(&final, ctx)) {
OSSL_Raise(eDigestError, "");
}
if (!(digest_txt = OPENSSL_malloc(EVP_MD_CTX_size(&final)))) {
@@ -166,15 +151,14 @@ ossl_digest_hexdigest(VALUE self)
static VALUE
ossl_digest_hexdigest(VALUE self)
{
- ossl_digest *digestp = NULL;
+ EVP_MD_CTX *ctx = NULL, final;
unsigned char *digest_txt = NULL, *hexdigest_txt = NULL;
int i,digest_len = 0;
- EVP_MD_CTX final;
VALUE hexdigest;
- GetDigest(self, digestp);
+ GetDigest(self, ctx);
- if (!EVP_MD_CTX_copy(&final, digestp->md)) {
+ if (!EVP_MD_CTX_copy(&final, ctx)) {
OSSL_Raise(eDigestError, "");
}
@@ -199,18 +183,16 @@ ossl_digest_hexdigest(VALUE self)
static VALUE \
ossl_##dgst##_initialize(int argc, VALUE *argv, VALUE self) \
{ \
- ossl_digest *digestp = NULL; \
+ EVP_MD_CTX *ctx = NULL; \
VALUE data; \
\
- GetDigest(self, digestp); \
- if (!(digestp->md = OPENSSL_malloc(sizeof(EVP_MD_CTX)))) { \
- OSSL_Raise(eDigestError, "Cannot allocate memory for a digest's CTX"); \
- } \
- EVP_DigestInit(digestp->md, EVP_##dgst()); \
+ GetDigest(self, ctx); \
+ \
+ EVP_DigestInit(ctx, EVP_##dgst()); \
\
if (rb_scan_args(argc, argv, "01", &data) == 1) { \
data = rb_String(data); \
- EVP_DigestUpdate(digestp->md, RSTRING(data)->ptr, RSTRING(data)->len); \
+ EVP_DigestUpdate(ctx, RSTRING(data)->ptr, RSTRING(data)->len); \
} \
return self; \
}