2 * $Id: ossl_pkcs7.c 11708 2007-02-12 23:01:19Z shyouhei $
3 * 'OpenSSL for Ruby' project
4 * Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
8 * This program is licenced under the same licence as Ruby.
9 * (See the file 'LICENCE'.)
13 #define WrapPKCS7(klass, obj, pkcs7) do { \
15 ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \
17 obj = Data_Wrap_Struct(klass, 0, PKCS7_free, pkcs7); \
19 #define GetPKCS7(obj, pkcs7) do { \
20 Data_Get_Struct(obj, PKCS7, pkcs7); \
22 ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \
25 #define SafeGetPKCS7(obj, pkcs7) do { \
26 OSSL_Check_Kind(obj, cPKCS7); \
27 GetPKCS7(obj, pkcs7); \
30 #define WrapPKCS7si(klass, obj, p7si) do { \
32 ossl_raise(rb_eRuntimeError, "PKCS7si wasn't initialized."); \
34 obj = Data_Wrap_Struct(klass, 0, PKCS7_SIGNER_INFO_free, p7si); \
36 #define GetPKCS7si(obj, p7si) do { \
37 Data_Get_Struct(obj, PKCS7_SIGNER_INFO, p7si); \
39 ossl_raise(rb_eRuntimeError, "PKCS7si wasn't initialized."); \
42 #define SafeGetPKCS7si(obj, p7si) do { \
43 OSSL_Check_Kind(obj, cPKCS7Signer); \
44 GetPKCS7si(obj, p7si); \
47 #define WrapPKCS7ri(klass, obj, p7ri) do { \
49 ossl_raise(rb_eRuntimeError, "PKCS7ri wasn't initialized."); \
51 obj = Data_Wrap_Struct(klass, 0, PKCS7_RECIP_INFO_free, p7ri); \
53 #define GetPKCS7ri(obj, p7ri) do { \
54 Data_Get_Struct(obj, PKCS7_RECIP_INFO, p7ri); \
56 ossl_raise(rb_eRuntimeError, "PKCS7ri wasn't initialized."); \
59 #define SafeGetPKCS7ri(obj, p7ri) do { \
60 OSSL_Check_Kind(obj, cPKCS7Recipient); \
61 GetPKCS7ri(obj, p7ri); \
64 #define numberof(ary) (sizeof(ary)/sizeof(ary[0]))
66 #define ossl_pkcs7_set_data(o,v) rb_iv_set((o), "@data", (v))
67 #define ossl_pkcs7_get_data(o) rb_iv_get((o), "@data")
68 #define ossl_pkcs7_set_err_string(o,v) rb_iv_set((o), "@error_string", (v))
69 #define ossl_pkcs7_get_err_string(o) rb_iv_get((o), "@error_string")
77 VALUE cPKCS7Recipient
;
82 * (MADE PRIVATE UNTIL SOMEBODY WILL NEED THEM)
85 ossl_pkcs7si_new(PKCS7_SIGNER_INFO
*p7si
)
87 PKCS7_SIGNER_INFO
*pkcs7
;
90 pkcs7
= p7si
? PKCS7_SIGNER_INFO_dup(p7si
) : PKCS7_SIGNER_INFO_new();
91 if (!pkcs7
) ossl_raise(ePKCS7Error
, NULL
);
92 WrapPKCS7si(cPKCS7Signer
, obj
, pkcs7
);
97 static PKCS7_SIGNER_INFO
*
98 DupPKCS7SignerPtr(VALUE obj
)
100 PKCS7_SIGNER_INFO
*p7si
, *pkcs7
;
102 SafeGetPKCS7si(obj
, p7si
);
103 if (!(pkcs7
= PKCS7_SIGNER_INFO_dup(p7si
))) {
104 ossl_raise(ePKCS7Error
, NULL
);
111 ossl_pkcs7ri_new(PKCS7_RECIP_INFO
*p7ri
)
113 PKCS7_RECIP_INFO
*pkcs7
;
116 pkcs7
= p7ri
? PKCS7_RECIP_INFO_dup(p7ri
) : PKCS7_RECIP_INFO_new();
117 if (!pkcs7
) ossl_raise(ePKCS7Error
, NULL
);
118 WrapPKCS7ri(cPKCS7Recipient
, obj
, pkcs7
);
123 static PKCS7_RECIP_INFO
*
124 DupPKCS7RecipientPtr(VALUE obj
)
126 PKCS7_RECIP_INFO
*p7ri
, *pkcs7
;
128 SafeGetPKCS7ri(obj
, p7ri
);
129 if (!(pkcs7
= PKCS7_RECIP_INFO_dup(p7ri
))) {
130 ossl_raise(ePKCS7Error
, NULL
);
140 ossl_pkcs7_s_read_smime(VALUE klass
, VALUE arg
)
146 in
= ossl_obj2bio(arg
);
148 pkcs7
= SMIME_read_PKCS7(in
, &out
);
150 if(!pkcs7
) ossl_raise(ePKCS7Error
, NULL
);
151 data
= out
? ossl_membio2str(out
) : Qnil
;
152 WrapPKCS7(cPKCS7
, ret
, pkcs7
);
153 ossl_pkcs7_set_data(ret
, data
);
154 ossl_pkcs7_set_err_string(ret
, Qnil
);
160 ossl_pkcs7_s_write_smime(int argc
, VALUE
*argv
, VALUE klass
)
162 VALUE pkcs7
, data
, flags
;
168 rb_scan_args(argc
, argv
, "12", &pkcs7
, &data
, &flags
);
169 flg
= NIL_P(flags
) ? 0 : NUM2INT(flags
);
170 if(NIL_P(data
)) data
= ossl_pkcs7_get_data(pkcs7
);
171 SafeGetPKCS7(pkcs7
, p7
);
172 if(!NIL_P(data
) && PKCS7_is_detached(p7
))
173 flg
|= PKCS7_DETACHED
;
174 in
= NIL_P(data
) ? NULL
: ossl_obj2bio(data
);
175 if(!(out
= BIO_new(BIO_s_mem()))){
177 ossl_raise(ePKCS7Error
, NULL
);
179 if(!SMIME_write_PKCS7(out
, p7
, in
, flg
)){
182 ossl_raise(ePKCS7Error
, NULL
);
185 str
= ossl_membio2str(out
);
191 ossl_pkcs7_s_sign(int argc
, VALUE
*argv
, VALUE klass
)
193 VALUE cert
, key
, data
, certs
, flags
;
197 STACK_OF(X509
) *x509s
;
202 rb_scan_args(argc
, argv
, "32", &cert
, &key
, &data
, &certs
, &flags
);
203 x509
= GetX509CertPtr(cert
); /* NO NEED TO DUP */
204 pkey
= GetPrivPKeyPtr(key
); /* NO NEED TO DUP */
205 flg
= NIL_P(flags
) ? 0 : NUM2INT(flags
);
206 in
= ossl_obj2bio(data
);
207 if(NIL_P(certs
)) x509s
= NULL
;
209 x509s
= ossl_protect_x509_ary2sk(certs
, &status
);
215 if(!(pkcs7
= PKCS7_sign(x509
, pkey
, x509s
, in
, flg
))){
217 sk_X509_pop_free(x509s
, X509_free
);
218 ossl_raise(ePKCS7Error
, NULL
);
220 WrapPKCS7(cPKCS7
, ret
, pkcs7
);
221 ossl_pkcs7_set_data(ret
, data
);
222 ossl_pkcs7_set_err_string(ret
, Qnil
);
224 sk_X509_pop_free(x509s
, X509_free
);
230 ossl_pkcs7_s_encrypt(int argc
, VALUE
*argv
, VALUE klass
)
232 VALUE certs
, data
, cipher
, flags
;
233 STACK_OF(X509
) *x509s
;
235 const EVP_CIPHER
*ciph
;
240 rb_scan_args(argc
, argv
, "22", &certs
, &data
, &cipher
, &flags
);
242 #if !defined(OPENSSL_NO_RC2)
243 ciph
= EVP_rc2_40_cbc();
244 #elif !defined(OPENSSL_NO_DES)
245 ciph
= EVP_des_ede3_cbc();
246 #elif !defined(OPENSSL_NO_RC2)
247 ciph
= EVP_rc2_40_cbc();
248 #elif !defined(OPENSSL_NO_AES)
249 ciph
= EVP_EVP_aes_128_cbc();
251 ossl_raise(ePKCS7Error
, "Must specify cipher");
255 else ciph
= GetCipherPtr(cipher
); /* NO NEED TO DUP */
256 flg
= NIL_P(flags
) ? 0 : NUM2INT(flags
);
257 in
= ossl_obj2bio(data
);
258 x509s
= ossl_protect_x509_ary2sk(certs
, &status
);
263 if(!(p7
= PKCS7_encrypt(x509s
, in
, (EVP_CIPHER
*)ciph
, flg
))){
265 sk_X509_pop_free(x509s
, X509_free
);
266 ossl_raise(ePKCS7Error
, NULL
);
269 WrapPKCS7(cPKCS7
, ret
, p7
);
270 ossl_pkcs7_set_data(ret
, data
);
271 sk_X509_pop_free(x509s
, X509_free
);
277 ossl_pkcs7_alloc(VALUE klass
)
282 if (!(pkcs7
= PKCS7_new())) {
283 ossl_raise(ePKCS7Error
, NULL
);
285 WrapPKCS7(klass
, obj
, pkcs7
);
291 ossl_pkcs7_initialize(int argc
, VALUE
*argv
, VALUE self
)
297 if(rb_scan_args(argc
, argv
, "01", &arg
) == 0)
299 arg
= ossl_to_der_if_possible(arg
);
300 in
= ossl_obj2bio(arg
);
301 p7
= PEM_read_bio_PKCS7(in
, (PKCS7
**)&DATA_PTR(self
), NULL
, NULL
);
304 p7
= d2i_PKCS7_bio(in
, (PKCS7
**)&DATA_PTR(self
));
307 ossl_pkcs7_set_data(self
, Qnil
);
308 ossl_pkcs7_set_err_string(self
, Qnil
);
314 ossl_pkcs7_copy(VALUE self
, VALUE other
)
316 PKCS7
*a
, *b
, *pkcs7
;
318 rb_check_frozen(self
);
319 if (self
== other
) return self
;
322 SafeGetPKCS7(other
, b
);
324 pkcs7
= PKCS7_dup(b
);
326 ossl_raise(ePKCS7Error
, NULL
);
328 DATA_PTR(self
) = pkcs7
;
335 ossl_pkcs7_sym2typeid(VALUE sym
)
344 { "signed", NID_pkcs7_signed
},
345 { "data", NID_pkcs7_data
},
346 { "signedAndEnveloped", NID_pkcs7_signedAndEnveloped
},
347 { "enveloped", NID_pkcs7_enveloped
},
348 { "encrypted", NID_pkcs7_encrypted
},
349 { "digest", NID_pkcs7_digest
},
353 if(TYPE(sym
) == T_SYMBOL
) s
= rb_id2name(SYM2ID(sym
));
354 else s
= StringValuePtr(sym
);
355 for(i
= 0; i
< numberof(p7_type_tab
); i
++){
356 if(p7_type_tab
[i
].name
== NULL
)
357 ossl_raise(ePKCS7Error
, "unknown type \"%s\"", s
);
358 if(strcmp(p7_type_tab
[i
].name
, s
) == 0){
359 ret
= p7_type_tab
[i
].nid
;
368 ossl_pkcs7_set_type(VALUE self
, VALUE type
)
373 if(!PKCS7_set_type(p7
, ossl_pkcs7_sym2typeid(type
)))
374 ossl_raise(ePKCS7Error
, NULL
);
380 ossl_pkcs7_get_type(VALUE self
)
385 if(PKCS7_type_is_signed(p7
))
386 return ID2SYM(rb_intern("signed"));
387 if(PKCS7_type_is_encrypted(p7
))
388 return ID2SYM(rb_intern("encrypted"));
389 if(PKCS7_type_is_enveloped(p7
))
390 return ID2SYM(rb_intern("enveloped"));
391 if(PKCS7_type_is_signedAndEnveloped(p7
))
392 return ID2SYM(rb_intern("signedAndEnveloped"));
393 if(PKCS7_type_is_data(p7
))
394 return ID2SYM(rb_intern("data"));
399 ossl_pkcs7_set_detached(VALUE self
, VALUE flag
)
404 if(flag
!= Qtrue
&& flag
!= Qfalse
)
405 ossl_raise(ePKCS7Error
, "must specify a boolean");
406 if(!PKCS7_set_detached(p7
, flag
== Qtrue
? 1 : 0))
407 ossl_raise(ePKCS7Error
, NULL
);
413 ossl_pkcs7_get_detached(VALUE self
)
417 return PKCS7_get_detached(p7
) ? Qtrue
: Qfalse
;
421 ossl_pkcs7_detached_p(VALUE self
)
425 return PKCS7_is_detached(p7
) ? Qtrue
: Qfalse
;
429 ossl_pkcs7_set_cipher(VALUE self
, VALUE cipher
)
433 GetPKCS7(self
, pkcs7
);
434 if (!PKCS7_set_cipher(pkcs7
, GetCipherPtr(cipher
))) {
435 ossl_raise(ePKCS7Error
, NULL
);
442 ossl_pkcs7_add_signer(VALUE self
, VALUE signer
)
445 PKCS7_SIGNER_INFO
*p7si
;
447 p7si
= DupPKCS7SignerPtr(signer
); /* NEED TO DUP */
448 GetPKCS7(self
, pkcs7
);
449 if (!PKCS7_add_signer(pkcs7
, p7si
)) {
450 PKCS7_SIGNER_INFO_free(p7si
);
451 ossl_raise(ePKCS7Error
, "Could not add signer.");
453 if (PKCS7_type_is_signed(pkcs7
)){
454 PKCS7_add_signed_attribute(p7si
, NID_pkcs9_contentType
,
455 V_ASN1_OBJECT
, OBJ_nid2obj(NID_pkcs7_data
));
462 ossl_pkcs7_get_signer(VALUE self
)
465 STACK_OF(PKCS7_SIGNER_INFO
) *sk
;
466 PKCS7_SIGNER_INFO
*si
;
470 GetPKCS7(self
, pkcs7
);
471 if (!(sk
= PKCS7_get_signer_info(pkcs7
))) {
472 OSSL_Debug("OpenSSL::PKCS7#get_signer_info == NULL!");
475 if ((num
= sk_PKCS7_SIGNER_INFO_num(sk
)) < 0) {
476 ossl_raise(ePKCS7Error
, "Negative number of signers!");
478 ary
= rb_ary_new2(num
);
479 for (i
=0; i
<num
; i
++) {
480 si
= sk_PKCS7_SIGNER_INFO_value(sk
, i
);
481 rb_ary_push(ary
, ossl_pkcs7si_new(si
));
488 ossl_pkcs7_add_recipient(VALUE self
, VALUE recip
)
491 PKCS7_RECIP_INFO
*ri
;
493 ri
= DupPKCS7RecipientPtr(recip
); /* NEED TO DUP */
494 GetPKCS7(self
, pkcs7
);
495 if (!PKCS7_add_recipient_info(pkcs7
, ri
)) {
496 PKCS7_RECIP_INFO_free(ri
);
497 ossl_raise(ePKCS7Error
, "Could not add recipient.");
504 ossl_pkcs7_get_recipient(VALUE self
)
507 STACK_OF(PKCS7_RECIP_INFO
) *sk
;
508 PKCS7_RECIP_INFO
*si
;
512 GetPKCS7(self
, pkcs7
);
513 if (PKCS7_type_is_enveloped(pkcs7
))
514 sk
= pkcs7
->d
.enveloped
->recipientinfo
;
515 else if (PKCS7_type_is_signedAndEnveloped(pkcs7
))
516 sk
= pkcs7
->d
.signed_and_enveloped
->recipientinfo
;
518 if (!sk
) return rb_ary_new();
519 if ((num
= sk_PKCS7_RECIP_INFO_num(sk
)) < 0) {
520 ossl_raise(ePKCS7Error
, "Negative number of recipient!");
522 ary
= rb_ary_new2(num
);
523 for (i
=0; i
<num
; i
++) {
524 si
= sk_PKCS7_RECIP_INFO_value(sk
, i
);
525 rb_ary_push(ary
, ossl_pkcs7ri_new(si
));
532 ossl_pkcs7_add_certificate(VALUE self
, VALUE cert
)
537 GetPKCS7(self
, pkcs7
);
538 x509
= GetX509CertPtr(cert
); /* NO NEED TO DUP */
539 if (!PKCS7_add_certificate(pkcs7
, x509
)){
540 ossl_raise(ePKCS7Error
, NULL
);
547 pkcs7_get_certs_or_crls(VALUE self
, int want_certs
)
550 STACK_OF(X509
) *certs
;
551 STACK_OF(X509_CRL
) *crls
;
554 GetPKCS7(self
, pkcs7
);
555 i
= OBJ_obj2nid(pkcs7
->type
);
557 case NID_pkcs7_signed
:
558 certs
= pkcs7
->d
.sign
->cert
;
559 crls
= pkcs7
->d
.sign
->crl
;
561 case NID_pkcs7_signedAndEnveloped
:
562 certs
= pkcs7
->d
.signed_and_enveloped
->cert
;
563 crls
= pkcs7
->d
.signed_and_enveloped
->crl
;
569 return want_certs
? certs
: crls
;
573 ossl_pkcs7_set_certs_i(VALUE i
, VALUE arg
)
575 return ossl_pkcs7_add_certificate(arg
, i
);
579 ossl_pkcs7_set_certificates(VALUE self
, VALUE ary
)
581 STACK_OF(X509
) *certs
;
584 certs
= pkcs7_get_certs_or_crls(self
, 1);
585 while((cert
= sk_X509_pop(certs
))) X509_free(cert
);
586 rb_iterate(rb_each
, ary
, ossl_pkcs7_set_certs_i
, self
);
592 ossl_pkcs7_get_certificates(VALUE self
)
594 return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self
, 1));
598 ossl_pkcs7_add_crl(VALUE self
, VALUE crl
)
603 GetPKCS7(self
, pkcs7
); /* NO DUP needed! */
604 x509crl
= GetX509CRLPtr(crl
);
605 if (!PKCS7_add_crl(pkcs7
, x509crl
)) {
606 ossl_raise(ePKCS7Error
, NULL
);
613 ossl_pkcs7_set_crls_i(VALUE i
, VALUE arg
)
615 return ossl_pkcs7_add_crl(arg
, i
);
619 ossl_pkcs7_set_crls(VALUE self
, VALUE ary
)
621 STACK_OF(X509_CRL
) *crls
;
624 crls
= pkcs7_get_certs_or_crls(self
, 0);
625 while((crl
= sk_X509_CRL_pop(crls
))) X509_CRL_free(crl
);
626 rb_iterate(rb_each
, ary
, ossl_pkcs7_set_crls_i
, self
);
632 ossl_pkcs7_get_crls(VALUE self
)
634 return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self
, 0));
638 ossl_pkcs7_verify(int argc
, VALUE
*argv
, VALUE self
)
640 VALUE certs
, store
, indata
, flags
;
641 STACK_OF(X509
) *x509s
;
643 int flg
, ok
, status
= 0;
649 rb_scan_args(argc
, argv
, "22", &certs
, &store
, &indata
, &flags
);
650 flg
= NIL_P(flags
) ? 0 : NUM2INT(flags
);
651 if(NIL_P(indata
)) indata
= ossl_pkcs7_get_data(self
);
652 in
= NIL_P(indata
) ? NULL
: ossl_obj2bio(indata
);
653 if(NIL_P(certs
)) x509s
= NULL
;
655 x509s
= ossl_protect_x509_ary2sk(certs
, &status
);
661 x509st
= GetX509StorePtr(store
);
663 if(!(out
= BIO_new(BIO_s_mem()))){
665 sk_X509_pop_free(x509s
, X509_free
);
666 ossl_raise(ePKCS7Error
, NULL
);
668 ok
= PKCS7_verify(p7
, x509s
, x509st
, in
, out
, flg
);
670 if (ok
< 0) ossl_raise(ePKCS7Error
, NULL
);
671 msg
= ERR_reason_error_string(ERR_get_error());
672 ossl_pkcs7_set_err_string(self
, msg
? rb_str_new2(msg
) : Qnil
);
674 data
= ossl_membio2str(out
);
675 ossl_pkcs7_set_data(self
, data
);
676 sk_X509_pop_free(x509s
, X509_free
);
678 return (ok
== 1) ? Qtrue
: Qfalse
;
682 ossl_pkcs7_decrypt(int argc
, VALUE
*argv
, VALUE self
)
684 VALUE pkey
, cert
, flags
;
692 rb_scan_args(argc
, argv
, "21", &pkey
, &cert
, &flags
);
693 key
= GetPrivPKeyPtr(pkey
); /* NO NEED TO DUP */
694 x509
= GetX509CertPtr(cert
); /* NO NEED TO DUP */
695 flg
= NIL_P(flags
) ? 0 : NUM2INT(flags
);
697 if(!(out
= BIO_new(BIO_s_mem())))
698 ossl_raise(ePKCS7Error
, NULL
);
699 if(!PKCS7_decrypt(p7
, key
, x509
, out
, flg
)){
701 ossl_raise(ePKCS7Error
, NULL
);
703 str
= ossl_membio2str(out
); /* out will be free */
709 ossl_pkcs7_add_data(VALUE self
, VALUE data
)
716 in
= ossl_obj2bio(data
);
717 GetPKCS7(self
, pkcs7
);
718 if(PKCS7_type_is_signed(pkcs7
)){
719 if(!PKCS7_content_new(pkcs7
, NID_pkcs7_data
))
720 ossl_raise(ePKCS7Error
, NULL
);
722 if(!(out
= PKCS7_dataInit(pkcs7
, NULL
))) goto err
;
724 if((len
= BIO_read(in
, buf
, sizeof(buf
))) <= 0)
726 if(BIO_write(out
, buf
, len
) != len
)
729 if(!PKCS7_dataFinal(pkcs7
, out
)) goto err
;
730 ossl_pkcs7_set_data(self
, Qnil
);
735 if(ERR_peek_error()){
736 ossl_raise(ePKCS7Error
, NULL
);
743 ossl_pkcs7_to_der(VALUE self
)
750 GetPKCS7(self
, pkcs7
);
751 if((len
= i2d_PKCS7(pkcs7
, NULL
)) <= 0)
752 ossl_raise(ePKCS7Error
, NULL
);
753 str
= rb_str_new(0, len
);
754 p
= RSTRING(str
)->ptr
;
755 if(i2d_PKCS7(pkcs7
, &p
) <= 0)
756 ossl_raise(ePKCS7Error
, NULL
);
757 ossl_str_adjust(str
, p
);
763 ossl_pkcs7_to_pem(VALUE self
)
769 GetPKCS7(self
, pkcs7
);
770 if (!(out
= BIO_new(BIO_s_mem()))) {
771 ossl_raise(ePKCS7Error
, NULL
);
773 if (!PEM_write_bio_PKCS7(out
, pkcs7
)) {
775 ossl_raise(ePKCS7Error
, NULL
);
777 str
= ossl_membio2str(out
);
786 ossl_pkcs7si_alloc(VALUE klass
)
788 PKCS7_SIGNER_INFO
*p7si
;
791 if (!(p7si
= PKCS7_SIGNER_INFO_new())) {
792 ossl_raise(ePKCS7Error
, NULL
);
794 WrapPKCS7si(klass
, obj
, p7si
);
800 ossl_pkcs7si_initialize(VALUE self
, VALUE cert
, VALUE key
, VALUE digest
)
802 PKCS7_SIGNER_INFO
*p7si
;
807 pkey
= GetPrivPKeyPtr(key
); /* NO NEED TO DUP */
808 x509
= GetX509CertPtr(cert
); /* NO NEED TO DUP */
809 md
= GetDigestPtr(digest
);
810 GetPKCS7si(self
, p7si
);
811 if (!(PKCS7_SIGNER_INFO_set(p7si
, x509
, pkey
, (EVP_MD
*)md
))) {
812 ossl_raise(ePKCS7Error
, NULL
);
819 ossl_pkcs7si_get_issuer(VALUE self
)
821 PKCS7_SIGNER_INFO
*p7si
;
823 GetPKCS7si(self
, p7si
);
825 return ossl_x509name_new(p7si
->issuer_and_serial
->issuer
);
829 ossl_pkcs7si_get_serial(VALUE self
)
831 PKCS7_SIGNER_INFO
*p7si
;
833 GetPKCS7si(self
, p7si
);
835 return asn1integer_to_num(p7si
->issuer_and_serial
->serial
);
839 ossl_pkcs7si_get_signed_time(VALUE self
)
841 PKCS7_SIGNER_INFO
*p7si
;
844 GetPKCS7si(self
, p7si
);
846 if (!(asn1obj
= PKCS7_get_signed_attribute(p7si
, NID_pkcs9_signingTime
))) {
847 ossl_raise(ePKCS7Error
, NULL
);
849 if (asn1obj
->type
== V_ASN1_UTCTIME
) {
850 return asn1time_to_time(asn1obj
->value
.utctime
);
854 * ossl_raise(ePKCS7Error, "...");
865 ossl_pkcs7ri_alloc(VALUE klass
)
867 PKCS7_RECIP_INFO
*p7ri
;
870 if (!(p7ri
= PKCS7_RECIP_INFO_new())) {
871 ossl_raise(ePKCS7Error
, NULL
);
873 WrapPKCS7ri(klass
, obj
, p7ri
);
879 ossl_pkcs7ri_initialize(VALUE self
, VALUE cert
)
881 PKCS7_RECIP_INFO
*p7ri
;
884 x509
= GetX509CertPtr(cert
); /* NO NEED TO DUP */
885 GetPKCS7ri(self
, p7ri
);
886 if (!PKCS7_RECIP_INFO_set(p7ri
, x509
)) {
887 ossl_raise(ePKCS7Error
, NULL
);
894 ossl_pkcs7ri_get_issuer(VALUE self
)
896 PKCS7_RECIP_INFO
*p7ri
;
898 GetPKCS7ri(self
, p7ri
);
900 return ossl_x509name_new(p7ri
->issuer_and_serial
->issuer
);
904 ossl_pkcs7ri_get_serial(VALUE self
)
906 PKCS7_RECIP_INFO
*p7ri
;
908 GetPKCS7ri(self
, p7ri
);
910 return asn1integer_to_num(p7ri
->issuer_and_serial
->serial
);
914 ossl_pkcs7ri_get_enc_key(VALUE self
)
916 PKCS7_RECIP_INFO
*p7ri
;
918 GetPKCS7ri(self
, p7ri
);
920 return asn1str_to_str(p7ri
->enc_key
);
929 mPKCS7
= rb_define_module_under(mOSSL
, "PKCS7");
931 ePKCS7Error
= rb_define_class_under(mPKCS7
, "PKCS7Error", eOSSLError
);
933 cPKCS7
= rb_define_class_under(mPKCS7
, "PKCS7", rb_cObject
);
934 rb_define_singleton_method(mPKCS7
, "read_smime", ossl_pkcs7_s_read_smime
, 1);
935 rb_define_singleton_method(mPKCS7
, "write_smime", ossl_pkcs7_s_write_smime
, -1);
936 rb_define_singleton_method(mPKCS7
, "sign", ossl_pkcs7_s_sign
, -1);
937 rb_define_singleton_method(mPKCS7
, "encrypt", ossl_pkcs7_s_encrypt
, -1);
938 rb_attr(cPKCS7
, rb_intern("data"), 1, 0, Qfalse
);
939 rb_attr(cPKCS7
, rb_intern("error_string"), 1, 1, Qfalse
);
940 rb_define_alloc_func(cPKCS7
, ossl_pkcs7_alloc
);
941 rb_define_copy_func(cPKCS7
, ossl_pkcs7_copy
);
942 rb_define_method(cPKCS7
, "initialize", ossl_pkcs7_initialize
, -1);
943 rb_define_method(cPKCS7
, "type=", ossl_pkcs7_set_type
, 1);
944 rb_define_method(cPKCS7
, "type", ossl_pkcs7_get_type
, 0);
945 rb_define_method(cPKCS7
, "detached=", ossl_pkcs7_set_detached
, 1);
946 rb_define_method(cPKCS7
, "detached", ossl_pkcs7_get_detached
, 0);
947 rb_define_method(cPKCS7
, "detached?", ossl_pkcs7_detached_p
, 0);
948 rb_define_method(cPKCS7
, "cipher=", ossl_pkcs7_set_cipher
, 1);
949 rb_define_method(cPKCS7
, "add_signer", ossl_pkcs7_add_signer
, 1);
950 rb_define_method(cPKCS7
, "signers", ossl_pkcs7_get_signer
, 0);
951 rb_define_method(cPKCS7
, "add_recipient", ossl_pkcs7_add_recipient
, 1);
952 rb_define_method(cPKCS7
, "recipients", ossl_pkcs7_get_recipient
, 0);
953 rb_define_method(cPKCS7
, "add_certificate", ossl_pkcs7_add_certificate
, 1);
954 rb_define_method(cPKCS7
, "certificates=", ossl_pkcs7_set_certificates
, 1);
955 rb_define_method(cPKCS7
, "certificates", ossl_pkcs7_get_certificates
, 0);
956 rb_define_method(cPKCS7
, "add_crl", ossl_pkcs7_add_crl
, 1);
957 rb_define_method(cPKCS7
, "crls=", ossl_pkcs7_set_crls
, 1);
958 rb_define_method(cPKCS7
, "crls", ossl_pkcs7_get_crls
, 0);
959 rb_define_method(cPKCS7
, "add_data", ossl_pkcs7_add_data
, 1);
960 rb_define_alias(cPKCS7
, "data=", "add_data");
961 rb_define_method(cPKCS7
, "verify", ossl_pkcs7_verify
, -1);
962 rb_define_method(cPKCS7
, "decrypt", ossl_pkcs7_decrypt
, -1);
963 rb_define_method(cPKCS7
, "to_pem", ossl_pkcs7_to_pem
, 0);
964 rb_define_alias(cPKCS7
, "to_s", "to_pem");
965 rb_define_method(cPKCS7
, "to_der", ossl_pkcs7_to_der
, 0);
967 cPKCS7Signer
= rb_define_class_under(mPKCS7
, "SignerInfo", rb_cObject
);
968 rb_define_const(mPKCS7
, "Signer", cPKCS7Signer
);
969 rb_define_alloc_func(cPKCS7Signer
, ossl_pkcs7si_alloc
);
970 rb_define_method(cPKCS7Signer
, "initialize", ossl_pkcs7si_initialize
,3);
971 rb_define_method(cPKCS7Signer
, "issuer", ossl_pkcs7si_get_issuer
, 0);
972 rb_define_alias(cPKCS7Signer
, "name", "issuer");
973 rb_define_method(cPKCS7Signer
, "serial", ossl_pkcs7si_get_serial
,0);
974 rb_define_method(cPKCS7Signer
,"signed_time",ossl_pkcs7si_get_signed_time
,0);
976 cPKCS7Recipient
= rb_define_class_under(mPKCS7
,"RecipientInfo",rb_cObject
);
977 rb_define_alloc_func(cPKCS7Recipient
, ossl_pkcs7ri_alloc
);
978 rb_define_method(cPKCS7Recipient
, "initialize", ossl_pkcs7ri_initialize
,1);
979 rb_define_method(cPKCS7Recipient
, "issuer", ossl_pkcs7ri_get_issuer
,0);
980 rb_define_method(cPKCS7Recipient
, "serial", ossl_pkcs7ri_get_serial
,0);
981 rb_define_method(cPKCS7Recipient
, "enc_key", ossl_pkcs7ri_get_enc_key
,0);
983 #define DefPKCS7Const(x) rb_define_const(mPKCS7, #x, INT2NUM(PKCS7_##x))
986 DefPKCS7Const(NOCERTS
);
987 DefPKCS7Const(NOSIGS
);
988 DefPKCS7Const(NOCHAIN
);
989 DefPKCS7Const(NOINTERN
);
990 DefPKCS7Const(NOVERIFY
);
991 DefPKCS7Const(DETACHED
);
992 DefPKCS7Const(BINARY
);
993 DefPKCS7Const(NOATTR
);
994 DefPKCS7Const(NOSMIMECAP
);