From cceffafefe8d78e8b7b8d0c4563ec0d48f44eed3 Mon Sep 17 00:00:00 2001 From: Michal Rokos Date: Mon, 19 Nov 2001 12:44:57 +0000 Subject: added X509::Certificate .to_der --- ChangeLog | 5 +++++ openssl_missing.h | 2 ++ ossl.c | 9 ++++++--- ossl_x509.c | 24 ++++++++++++++++++++++++ ossl_x509revoked.c | 11 ++++++++--- test/ossl_x509.rb | 3 +++ 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 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 -- cgit v1.2.3