diff options
author | gotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-11 21:20:20 +0000 |
---|---|---|
committer | gotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-11 21:20:20 +0000 |
commit | ed2a386f587e5ee045dee23ec52fc7dcf7f91314 (patch) | |
tree | e6ba403740b12968b0edf1615be540b89050ac95 /ext | |
parent | 2fc95b6399d7120f38fa9a00b76bd4e3a30c5267 (diff) | |
download | ruby-ed2a386f587e5ee045dee23ec52fc7dcf7f91314.tar.gz |
* ext/openssl/ossl.c (ossl_x509_sk2ary, ossl_x509crl_sk2ary): add
functions to convert STACK into Array.
* ext/openssl/ossl.h: add prototypes.
* ext/openssl/ossl_pkcs7.c (ossl_pkcs7_set_certificates,
ossl_pkcs7_get_certificates, ossl_pkcs7_get_crls,
ossl_pkcs7_set_crls): add functions for PKCS7#certificates=
PKCS7#certificates, PKCS7#crls= and PKCS7#crls.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/openssl/ossl.c | 10 | ||||
-rw-r--r-- | ext/openssl/ossl.h | 2 | ||||
-rw-r--r-- | ext/openssl/ossl_pkcs7.c | 80 |
3 files changed, 86 insertions, 6 deletions
diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c index 581da783eb..6646bafc2e 100644 --- a/ext/openssl/ossl.c +++ b/ext/openssl/ossl.c @@ -90,8 +90,7 @@ ossl_x509_ary2sk(VALUE ary) return sk; } -#if 0 -#define OSSL_SK2ARY(name, type) \ +#define OSSL_IMPL_SK2ARY(name, type) \ VALUE \ ossl_##name##_sk2ary(STACK *sk) \ { \ @@ -101,7 +100,7 @@ ossl_##name##_sk2ary(STACK *sk) \ \ if (!sk) { \ OSSL_Debug("empty sk!"); \ - return rb_ary_new(); \ + return Qnil; \ } \ num = sk_num(sk); \ if (num < 0) { \ @@ -116,9 +115,8 @@ ossl_##name##_sk2ary(STACK *sk) \ } \ return ary; \ } -OSSL_SK2ARY(x509, X509) -OSSL_SK2ARY(x509crl, X509_CRL) -#endif +OSSL_IMPL_SK2ARY(x509, X509) +OSSL_IMPL_SK2ARY(x509crl, X509_CRL) static VALUE ossl_str_new(int size) diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h index bb9bd2a497..b0e26bee91 100644 --- a/ext/openssl/ossl.h +++ b/ext/openssl/ossl.h @@ -108,6 +108,8 @@ int string2hex(char *, int, char **, int *); STACK_OF(X509) *ossl_x509_ary2sk0(VALUE); STACK_OF(X509) *ossl_x509_ary2sk(VALUE); STACK_OF(X509) *ossl_protect_x509_ary2sk(VALUE,int*); +VALUE ossl_x509_sk2ary(STACK_OF(X509) *certs); +VALUE ossl_x509crl_sk2ary(STACK_OF(X509_CRL) *crl); VALUE ossl_buf2str(char *buf, int len); #define ossl_str_adjust(str, p) \ do{\ diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c index 66c40b9b39..aaa12ac7d7 100644 --- a/ext/openssl/ossl_pkcs7.c +++ b/ext/openssl/ossl_pkcs7.c @@ -479,6 +479,57 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert) return self; } +static STACK * +pkcs7_get_certs_or_crls(VALUE self, int want_certs) +{ + PKCS7 *pkcs7; + STACK_OF(X509) *certs; + STACK_OF(X509_CRL) *crls; + int i; + + GetPKCS7(self, pkcs7); + i = OBJ_obj2nid(pkcs7->type); + switch(i){ + case NID_pkcs7_signed: + certs = pkcs7->d.sign->cert; + crls = pkcs7->d.sign->crl; + break; + case NID_pkcs7_signedAndEnveloped: + certs = pkcs7->d.signed_and_enveloped->cert; + crls = pkcs7->d.signed_and_enveloped->crl; + break; + default: + certs = crls = NULL; + } + + return want_certs ? certs : crls; +} + +static VALUE +ossl_pkcs7_set_certs_i(VALUE i, VALUE arg) +{ + return ossl_pkcs7_add_certificate(arg, i); +} + +static VALUE +ossl_pkcs7_set_certificates(VALUE self, VALUE ary) +{ + STACK_OF(X509) *certs; + X509 *cert; + + certs = pkcs7_get_certs_or_crls(self, 1); + while((cert = sk_X509_pop(certs))) X509_free(cert); + rb_iterate(rb_each, ary, ossl_pkcs7_set_certs_i, self); + + return ary; +} + +static VALUE +ossl_pkcs7_get_certificates(VALUE self) +{ + return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1)); +} + static VALUE ossl_pkcs7_add_crl(VALUE self, VALUE crl) { @@ -495,6 +546,31 @@ ossl_pkcs7_add_crl(VALUE self, VALUE crl) } static VALUE +ossl_pkcs7_set_crls_i(VALUE i, VALUE arg) +{ + return ossl_pkcs7_add_crl(arg, i); +} + +static VALUE +ossl_pkcs7_set_crls(VALUE self, VALUE ary) +{ + STACK_OF(X509_CRL) *crls; + X509_CRL *crl; + + crls = pkcs7_get_certs_or_crls(self, 0); + while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl); + rb_iterate(rb_each, ary, ossl_pkcs7_set_crls_i, self); + + return ary; +} + +static VALUE +ossl_pkcs7_get_crls(VALUE self) +{ + return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0)); +} + +static VALUE ossl_pkcs7_verify(int argc, VALUE *argv, VALUE self) { VALUE certs, store, indata, flags; @@ -747,7 +823,11 @@ Init_ossl_pkcs7() rb_define_method(cPKCS7, "signers", ossl_pkcs7_get_signer, 0); rb_define_method(cPKCS7, "add_recipient", ossl_pkcs7_add_recipient, 1); rb_define_method(cPKCS7, "add_certificate", ossl_pkcs7_add_certificate, 1); + rb_define_method(cPKCS7, "certificates=", ossl_pkcs7_set_certificates, 1); + rb_define_method(cPKCS7, "certificates", ossl_pkcs7_get_certificates, 0); rb_define_method(cPKCS7, "add_crl", ossl_pkcs7_add_crl, 1); + rb_define_method(cPKCS7, "crls=", ossl_pkcs7_set_crls, 1); + rb_define_method(cPKCS7, "crls", ossl_pkcs7_get_crls, 0); rb_define_method(cPKCS7, "add_data", ossl_pkcs7_add_data, 1); rb_define_alias(cPKCS7, "data=", "add_data"); rb_define_method(cPKCS7, "verify", ossl_pkcs7_verify, -1); |