aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Rokos <m.rokos@sh.cvut.cz>2001-11-19 12:44:57 +0000
committerMichal Rokos <m.rokos@sh.cvut.cz>2001-11-19 12:44:57 +0000
commitcceffafefe8d78e8b7b8d0c4563ec0d48f44eed3 (patch)
treefd1286c83be09812fd97b3ac0b58f15ce374fa00
parentdd5dc9508d397e96ee4aa849f411567e78b49e32 (diff)
downloadruby-openssl-history-cceffafefe8d78e8b7b8d0c4563ec0d48f44eed3.tar.gz
added X509::Certificate .to_der
-rw-r--r--ChangeLog5
-rw-r--r--openssl_missing.h2
-rw-r--r--ossl.c9
-rw-r--r--ossl_x509.c24
-rw-r--r--ossl_x509revoked.c11
-rwxr-xr-xtest/ossl_x509.rb3
6 files changed, 48 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 53cd014..9a27cb4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,11 @@ $Id$
Copyright (C) 2001 Michal Rokos <m.rokos@sh.cvut.cz>
All rights reserved.
+$Log$
+Revision 1.6 2001/11/19 12:44:57 majkl
+added X509::Certificate .to_der
+
+
2001/11/18 (ossl-0.0.9)
* all project is moved to savannah.gnu.org
* applied patch to make yielding optional (GOTOU Yuuzou - thanks!)
diff --git a/openssl_missing.h b/openssl_missing.h
index 4c8f24d..ec1ef8d 100644
--- a/openssl_missing.h
+++ b/openssl_missing.h
@@ -31,6 +31,8 @@
#define DSAPublicKey_dup(dsa) (DSA *)ASN1_dup((int (*)())i2d_DSAPublicKey, \
(char *(*)())d2i_DSAPublicKey,(char *)dsa)
#endif
+#define X509_REVOKED_dup(rev) (X509_REVOKED *)ASN1_dup((int (*)())i2d_X509_REVOKED, \
+ (char *(*)())d2i_X509_REVOKED, (char *)rev)
/* to pkcs7.h */
#define PKCS7_SIGNER_INFO_dup(si) (PKCS7_SIGNER_INFO *)ASN1_dup((int (*)())i2d_PKCS7_SIGNER_INFO, \
diff --git a/ossl.c b/ossl.c
index 59a5bef..176d3dd 100644
--- a/ossl.c
+++ b/ossl.c
@@ -24,11 +24,14 @@ void ossl_check_type(VALUE obj, VALUE klass)
#ifdef OSSL_DEBUG
inline char *ossl_error() {
char *ret = NULL, *err = NULL;
- int err_len = NULL;
+ int ret_len = 0;
err = ERR_error_string(ERR_get_error(), NULL);
- ret = malloc(strlen(err)+strlen(__FILE__)+(sizeof(__LINE__)*3)+5);
- sprintf(ret, "%s [%s:%d]", err, __FILE__, __LINE__);
+ ret_len = strlen(err)+strlen(__FILE__)+(sizeof(__LINE__)*3)+5;
+ ret = malloc(ret_len+1);
+ if (snprintf(ret, ret_len, "%s [%s:%d]", err, __FILE__, __LINE__) > ret_len) {
+ rb_bug("BUFFER OVERFLOW IN ossl_error());
+ }
return ret;
}
diff --git a/ossl_x509.c b/ossl_x509.c
index 739455e..cd8074d 100644
--- a/ossl_x509.c
+++ b/ossl_x509.c
@@ -135,6 +135,29 @@ static VALUE ossl_x509_initialize(int argc, VALUE *argv, VALUE self)
return self;
}
+static VALUE ossl_x509_to_der(VALUE self)
+{
+ ossl_x509 *x509p = NULL;
+ BIO *out = NULL;
+ BUF_MEM *buf = NULL;
+ VALUE str;
+
+ GetX509(self, x509p);
+
+ if (!(out = BIO_new(BIO_s_mem()))) {
+ rb_raise(eX509CertificateError, "%s", ossl_error());
+ }
+ if (!i2d_X509_bio(out, x509p->x509)) {
+ BIO_free(out);
+ rb_raise(eX509CertificateError, "%s", ossl_error());
+ }
+ BIO_get_mem_ptr(out, &buf);
+ str = rb_str_new(buf->data, buf->length);
+ BIO_free(out);
+
+ return str;
+}
+
static VALUE ossl_x509_to_pem(VALUE self)
{
ossl_x509 *x509p = NULL;
@@ -590,6 +613,7 @@ void Init_ossl_x509(VALUE mX509)
cX509Certificate = rb_define_class_under(mX509, "Certificate", rb_cObject);
rb_define_singleton_method(cX509Certificate, "new", ossl_x509_s_new, -1);
rb_define_method(cX509Certificate, "initialize", ossl_x509_initialize, -1);
+ rb_define_method(cX509Certificate, "to_der", ossl_x509_to_der, 0);
rb_define_method(cX509Certificate, "to_pem", ossl_x509_to_pem, 0);
rb_define_method(cX509Certificate, "to_str", ossl_x509_to_str, 0);
rb_define_method(cX509Certificate, "version", ossl_x509_get_version, 0);
diff --git a/ossl_x509revoked.c b/ossl_x509revoked.c
index 8e559fb..1c5746b 100644
--- a/ossl_x509revoked.c
+++ b/ossl_x509revoked.c
@@ -45,11 +45,16 @@ static void ossl_x509revoked_free(ossl_x509revoked *revp)
VALUE ossl_x509revoked_new2(X509_REVOKED *rev)
{
ossl_x509revoked *revp = NULL;
+ X509_REVOKED *new = NULL;
VALUE obj;
+ if (!(new = X509_REVOKED_dup(rev))) {
+ rb_raise(eX509RevokedError, "%s", ossl_error());
+ }
+
MakeX509Revoked(obj, revp);
- revp->revoked = ((X509_REVOKED *)ASN1_dup((int (*)())i2d_X509_REVOKED, (char *(*)())d2i_X509_REVOKED, (char *)rev));
-
+ revp->revoked = new;
+
return obj;
}
@@ -59,7 +64,7 @@ X509_REVOKED *ossl_x509revoked_get_X509_REVOKED(VALUE self)
GetX509Revoked(self, revp);
- return ((X509_REVOKED *)ASN1_dup((int (*)())i2d_X509_REVOKED, (char *(*)())d2i_X509_REVOKED, (char *)revp->revoked));
+ return X509_REVOKED_dup(revp->revoked);
}
/*
diff --git a/test/ossl_x509.rb b/test/ossl_x509.rb
index c8b5b07..4a7abe3 100755
--- a/test/ossl_x509.rb
+++ b/test/ossl_x509.rb
@@ -58,5 +58,8 @@ p ext4 = maker.create_extension(["authorityKeyIdentifier", "keyid:always,issuer:
#puts ext1.to_str
p new.add_extension(ext4)
p new.sign(key, Digest::MD5.new)
+puts "===PEM==="
puts new.to_str
+puts "===DER==="
+p new.to_der