aboutsummaryrefslogtreecommitdiffstats
path: root/ossl_pkey_dsa.c
diff options
context:
space:
mode:
authorMichal Rokos <m.rokos@sh.cvut.cz>2001-12-21 20:10:12 +0000
committerMichal Rokos <m.rokos@sh.cvut.cz>2001-12-21 20:10:12 +0000
commit91d3b685dcd805ced1453c551ad315eb3173eab1 (patch)
treec0ed09824800e654855d9224b9b9d398523b3f44 /ossl_pkey_dsa.c
parentb248d91eda8ce439e8d3565438c5ca9bc7c07e9d (diff)
downloadruby-openssl-history-91d3b685dcd805ced1453c551ad315eb3173eab1.tar.gz
* Memory checking
Diffstat (limited to 'ossl_pkey_dsa.c')
-rw-r--r--ossl_pkey_dsa.c56
1 files changed, 41 insertions, 15 deletions
diff --git a/ossl_pkey_dsa.c b/ossl_pkey_dsa.c
index 115932f..370be8a 100644
--- a/ossl_pkey_dsa.c
+++ b/ossl_pkey_dsa.c
@@ -8,6 +8,8 @@
* This program is licenced under the same licence as Ruby.
* (See the file 'LICENCE'.)
*/
+#ifndef NO_DSA
+
#include "ossl.h"
#include "ossl_pkey.h"
@@ -58,9 +60,9 @@ ossl_dsa_new_null()
MakeDSA(obj, dsap);
- if (!(dsap->dsa = DSA_new())) {
+ if (!(dsap->dsa = DSA_new()))
rb_raise(eDSAError, "%s", ossl_error());
- }
+
return obj;
}
@@ -76,9 +78,9 @@ ossl_dsa_new(DSA *dsa)
MakeDSA(obj, dsap);
dsap->dsa = (DSA_PRIVATE(dsa)) ? DSAPrivateKey_dup(dsa) : DSAPublicKey_dup(dsa);
- if (!dsap->dsa) {
+
+ if (!dsap->dsa)
rb_raise(eDSAError, "%s", ossl_error());
- }
return obj;
}
@@ -89,12 +91,13 @@ ossl_dsa_get_DSA(VALUE obj)
ossl_dsa *dsap = NULL;
DSA *dsa = NULL;
+ OSSL_Check_Type(obj, cDSA);
+
GetDSA(obj, dsap);
dsa = (DSA_PRIVATE(dsap->dsa)) ? DSAPrivateKey_dup(dsap->dsa) : DSAPublicKey_dup(dsap->dsa);
- if (!dsa) {
+ if (!dsa)
rb_raise(eDSAError, "%s", ossl_error());
- }
return dsa;
}
@@ -105,6 +108,8 @@ ossl_dsa_get_EVP_PKEY(VALUE obj)
DSA *dsa = NULL;
EVP_PKEY *pkey = NULL;
+ OSSL_Check_Type(obj, cDSA);
+
dsa = ossl_dsa_get_DSA(obj);
if (!(pkey = EVP_PKEY_new())) {
@@ -132,6 +137,7 @@ ossl_dsa_s_new(int argc, VALUE *argv, VALUE klass)
MakeDSA(obj, dsap);
rb_obj_call_init(obj, argc, argv);
+
return obj;
}
@@ -178,10 +184,12 @@ ossl_dsa_initialize(int argc, VALUE *argv, VALUE self)
}
if (rb_block_given_p())
cb = ossl_dsa_generate_cb;
+
if (!(dsa = DSA_generate_parameters(FIX2INT(buffer), seed, seed_len, &counter, &h, cb, NULL))) { /* arg to cb = NULL */
rb_raise(eDSAError, "%s", ossl_error());
}
if (!DSA_generate_key(dsa)) {
+ DSA_free(dsa);
rb_raise(eDSAError, "%s", ossl_error());
}
break;
@@ -269,10 +277,12 @@ ossl_dsa_export(int argc, VALUE *argv, VALUE self)
if (DSA_PRIVATE(dsap->dsa)) {
if (!PEM_write_bio_DSAPrivateKey(out, dsap->dsa, ciph, NULL, 0, NULL, pass)) {
+ BIO_free(out);
rb_raise(eDSAError, "%s", ossl_error());
}
} else {
if (!PEM_write_bio_DSAPublicKey(out, dsap->dsa)) {
+ BIO_free(out);
rb_raise(eDSAError, "%s", ossl_error());
}
}
@@ -296,29 +306,33 @@ ossl_dsa_to_der(VALUE self)
GetDSA(self, dsap);
dsa = (DSA_PRIVATE(dsap->dsa)) ? DSAPrivateKey_dup(dsap->dsa):DSAPublicKey_dup(dsap->dsa);
- if (!dsa) {
+
+ if (!dsa)
rb_raise(eDSAError, "%s", ossl_error());
- }
+
if (!(pkey = EVP_PKEY_new())) {
DSA_free(dsa);
rb_raise(eDSAError, "%s", ossl_error());
}
if (!EVP_PKEY_assign_DSA(pkey, dsap->dsa)) {
- DSA_free(dsa);
+ /*DSA_free(dsa);*/
EVP_PKEY_free(pkey);
rb_raise(eDSAError, "%s", ossl_error());
}
if (!(key = X509_PUBKEY_new())) {
+ /*DSA_free(dsa);*/
EVP_PKEY_free(pkey);
rb_raise(eDSAError, "%s", ossl_error());
}
if (!X509_PUBKEY_set(&key, pkey)) {
- EVP_PKEY_free(pkey);
+ /*DSA_free(dsa);*/
+ /* EVP_PKEY_free(pkey) = this does X509_PUBKEY_free!! */
X509_PUBKEY_free(key);
rb_raise(eDSAError, "%s", ossl_error());
}
str = rb_str_new(key->public_key->data, key->public_key->length);
+ /*DSA_free(dsa);*/
/* EVP_PKEY_free(pkey) = this does X509_PUBKEY_free!! */
X509_PUBKEY_free(key);
@@ -344,6 +358,7 @@ ossl_dsa_to_str(VALUE self)
rb_raise(eDSAError, "%s", ossl_error());
}
if (!DSA_print(out, dsap->dsa, 0)) { //offset = 0
+ BIO_free(out);
rb_raise(eDSAError, "%s", ossl_error());
}
BIO_get_mem_ptr(out, &buf);
@@ -393,6 +408,7 @@ ossl_dsa_sign(VALUE self, VALUE data)
}
if (!DSA_sign(0, RSTRING(data)->ptr, RSTRING(data)->len, sig, &sig_len, dsap->dsa)) { /*type = 0*/
+ OPENSSL_free(sig);
rb_raise(eDSAError, "%s", ossl_error());
}
@@ -413,13 +429,13 @@ ossl_dsa_verify(VALUE self, VALUE digest, VALUE sig)
Check_SafeStr(sig);
ret = DSA_verify(0, RSTRING(digest)->ptr, RSTRING(digest)->len, RSTRING(sig)->ptr, RSTRING(sig)->len, dsap->dsa); /*type = 0*/
+
+ if (ret < 0)
+ rb_raise(eDSAError, "%s", ossl_error());
+
if (ret == 1)
return Qtrue;
- else if (ret == 0)
- return Qfalse;
-
- rb_raise(eDSAError, "%s", ossl_error());
- return Qnil;
+ return Qfalse;
}
/*
@@ -444,3 +460,13 @@ Init_ossl_dsa(VALUE mPKey, VALUE cPKey, VALUE ePKeyError)
rb_define_method(cDSA, "verify_digest", ossl_dsa_verify, 2);
}
+#else /* defined NO_DSA */
+
+void
+Init_ossl_dsa(VALUE mPKey, VALUE cPKey, VALUE ePKeyError)
+{
+ rb_warning("DSA keys will NOT be avaible: OpenSSL is compiled without DSA support.");
+}
+
+#endif /* NO_DSA */
+