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);