zig_example 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/ext/mkmf.rb +2734 -0
  3. data/ext/openssl/openssl_missing.c +40 -0
  4. data/ext/openssl/openssl_missing.h +238 -0
  5. data/ext/openssl/ossl.c +1295 -0
  6. data/ext/openssl/ossl.h +201 -0
  7. data/ext/openssl/ossl_asn1.c +1891 -0
  8. data/ext/openssl/ossl_asn1.h +62 -0
  9. data/ext/openssl/ossl_bio.c +42 -0
  10. data/ext/openssl/ossl_bio.h +16 -0
  11. data/ext/openssl/ossl_bn.c +1344 -0
  12. data/ext/openssl/ossl_bn.h +26 -0
  13. data/ext/openssl/ossl_cipher.c +1074 -0
  14. data/ext/openssl/ossl_cipher.h +20 -0
  15. data/ext/openssl/ossl_config.c +460 -0
  16. data/ext/openssl/ossl_config.h +16 -0
  17. data/ext/openssl/ossl_digest.c +425 -0
  18. data/ext/openssl/ossl_digest.h +20 -0
  19. data/ext/openssl/ossl_engine.c +568 -0
  20. data/ext/openssl/ossl_engine.h +19 -0
  21. data/ext/openssl/ossl_hmac.c +310 -0
  22. data/ext/openssl/ossl_hmac.h +18 -0
  23. data/ext/openssl/ossl_kdf.c +311 -0
  24. data/ext/openssl/ossl_kdf.h +6 -0
  25. data/ext/openssl/ossl_ns_spki.c +405 -0
  26. data/ext/openssl/ossl_ns_spki.h +19 -0
  27. data/ext/openssl/ossl_ocsp.c +1965 -0
  28. data/ext/openssl/ossl_ocsp.h +23 -0
  29. data/ext/openssl/ossl_pkcs12.c +275 -0
  30. data/ext/openssl/ossl_pkcs12.h +13 -0
  31. data/ext/openssl/ossl_pkcs7.c +1081 -0
  32. data/ext/openssl/ossl_pkcs7.h +36 -0
  33. data/ext/openssl/ossl_pkey.c +1624 -0
  34. data/ext/openssl/ossl_pkey.h +204 -0
  35. data/ext/openssl/ossl_pkey_dh.c +440 -0
  36. data/ext/openssl/ossl_pkey_dsa.c +359 -0
  37. data/ext/openssl/ossl_pkey_ec.c +1655 -0
  38. data/ext/openssl/ossl_pkey_rsa.c +579 -0
  39. data/ext/openssl/ossl_rand.c +200 -0
  40. data/ext/openssl/ossl_rand.h +18 -0
  41. data/ext/openssl/ossl_ssl.c +3142 -0
  42. data/ext/openssl/ossl_ssl.h +36 -0
  43. data/ext/openssl/ossl_ssl_session.c +331 -0
  44. data/ext/openssl/ossl_ts.c +1539 -0
  45. data/ext/openssl/ossl_ts.h +16 -0
  46. data/ext/openssl/ossl_x509.c +256 -0
  47. data/ext/openssl/ossl_x509.h +115 -0
  48. data/ext/openssl/ossl_x509attr.c +324 -0
  49. data/ext/openssl/ossl_x509cert.c +1002 -0
  50. data/ext/openssl/ossl_x509crl.c +545 -0
  51. data/ext/openssl/ossl_x509ext.c +490 -0
  52. data/ext/openssl/ossl_x509name.c +597 -0
  53. data/ext/openssl/ossl_x509req.c +444 -0
  54. data/ext/openssl/ossl_x509revoked.c +300 -0
  55. data/ext/openssl/ossl_x509store.c +986 -0
  56. data/ext/zigrb_100doors/build.zig +0 -12
  57. data/ext/zigrb_100doors/extconf.rb +2 -19
  58. data/ext/zigrb_ackermann/build.zig +0 -12
  59. data/ext/zigrb_ackermann/extconf.rb +2 -19
  60. data/ext/zigrb_lucas_lehmer/build.zig +0 -12
  61. data/ext/zigrb_lucas_lehmer/extconf.rb +2 -19
  62. data/lib/zig_example/version.rb +1 -1
  63. metadata +56 -2
@@ -0,0 +1,1081 @@
1
+ /*
2
+ * 'OpenSSL for Ruby' project
3
+ * Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
4
+ * All rights reserved.
5
+ */
6
+ /*
7
+ * This program is licensed under the same licence as Ruby.
8
+ * (See the file 'LICENCE'.)
9
+ */
10
+ #include "ossl.h"
11
+
12
+ #define NewPKCS7si(klass) \
13
+ TypedData_Wrap_Struct((klass), &ossl_pkcs7_signer_info_type, 0)
14
+ #define SetPKCS7si(obj, p7si) do { \
15
+ if (!(p7si)) { \
16
+ ossl_raise(rb_eRuntimeError, "PKCS7si wasn't initialized."); \
17
+ } \
18
+ RTYPEDDATA_DATA(obj) = (p7si); \
19
+ } while (0)
20
+ #define GetPKCS7si(obj, p7si) do { \
21
+ TypedData_Get_Struct((obj), PKCS7_SIGNER_INFO, &ossl_pkcs7_signer_info_type, (p7si)); \
22
+ if (!(p7si)) { \
23
+ ossl_raise(rb_eRuntimeError, "PKCS7si wasn't initialized."); \
24
+ } \
25
+ } while (0)
26
+
27
+ #define NewPKCS7ri(klass) \
28
+ TypedData_Wrap_Struct((klass), &ossl_pkcs7_recip_info_type, 0)
29
+ #define SetPKCS7ri(obj, p7ri) do { \
30
+ if (!(p7ri)) { \
31
+ ossl_raise(rb_eRuntimeError, "PKCS7ri wasn't initialized."); \
32
+ } \
33
+ RTYPEDDATA_DATA(obj) = (p7ri); \
34
+ } while (0)
35
+ #define GetPKCS7ri(obj, p7ri) do { \
36
+ TypedData_Get_Struct((obj), PKCS7_RECIP_INFO, &ossl_pkcs7_recip_info_type, (p7ri)); \
37
+ if (!(p7ri)) { \
38
+ ossl_raise(rb_eRuntimeError, "PKCS7ri wasn't initialized."); \
39
+ } \
40
+ } while (0)
41
+
42
+ #define numberof(ary) (int)(sizeof(ary)/sizeof((ary)[0]))
43
+
44
+ #define ossl_pkcs7_set_data(o,v) rb_iv_set((o), "@data", (v))
45
+ #define ossl_pkcs7_get_data(o) rb_iv_get((o), "@data")
46
+ #define ossl_pkcs7_set_err_string(o,v) rb_iv_set((o), "@error_string", (v))
47
+ #define ossl_pkcs7_get_err_string(o) rb_iv_get((o), "@error_string")
48
+
49
+ /*
50
+ * Classes
51
+ */
52
+ VALUE cPKCS7;
53
+ VALUE cPKCS7Signer;
54
+ VALUE cPKCS7Recipient;
55
+ VALUE ePKCS7Error;
56
+
57
+ static void
58
+ ossl_pkcs7_free(void *ptr)
59
+ {
60
+ PKCS7_free(ptr);
61
+ }
62
+
63
+ const rb_data_type_t ossl_pkcs7_type = {
64
+ "OpenSSL/PKCS7",
65
+ {
66
+ 0, ossl_pkcs7_free,
67
+ },
68
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
69
+ };
70
+
71
+ static void
72
+ ossl_pkcs7_signer_info_free(void *ptr)
73
+ {
74
+ PKCS7_SIGNER_INFO_free(ptr);
75
+ }
76
+
77
+ static const rb_data_type_t ossl_pkcs7_signer_info_type = {
78
+ "OpenSSL/PKCS7/SIGNER_INFO",
79
+ {
80
+ 0, ossl_pkcs7_signer_info_free,
81
+ },
82
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
83
+ };
84
+
85
+ static void
86
+ ossl_pkcs7_recip_info_free(void *ptr)
87
+ {
88
+ PKCS7_RECIP_INFO_free(ptr);
89
+ }
90
+
91
+ static const rb_data_type_t ossl_pkcs7_recip_info_type = {
92
+ "OpenSSL/PKCS7/RECIP_INFO",
93
+ {
94
+ 0, ossl_pkcs7_recip_info_free,
95
+ },
96
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
97
+ };
98
+
99
+ /*
100
+ * Public
101
+ * (MADE PRIVATE UNTIL SOMEBODY WILL NEED THEM)
102
+ */
103
+ static PKCS7_SIGNER_INFO *
104
+ ossl_PKCS7_SIGNER_INFO_dup(PKCS7_SIGNER_INFO *si)
105
+ {
106
+ PKCS7_SIGNER_INFO *si_new = ASN1_dup((i2d_of_void *)i2d_PKCS7_SIGNER_INFO,
107
+ (d2i_of_void *)d2i_PKCS7_SIGNER_INFO,
108
+ si);
109
+ if (si_new && si->pkey) {
110
+ EVP_PKEY_up_ref(si->pkey);
111
+ si_new->pkey = si->pkey;
112
+ }
113
+ return si_new;
114
+ }
115
+
116
+ static PKCS7_RECIP_INFO *
117
+ ossl_PKCS7_RECIP_INFO_dup(PKCS7_RECIP_INFO *si)
118
+ {
119
+ return ASN1_dup((i2d_of_void *)i2d_PKCS7_RECIP_INFO,
120
+ (d2i_of_void *)d2i_PKCS7_RECIP_INFO,
121
+ si);
122
+ }
123
+
124
+ static VALUE
125
+ ossl_pkcs7si_new(PKCS7_SIGNER_INFO *p7si)
126
+ {
127
+ PKCS7_SIGNER_INFO *pkcs7;
128
+ VALUE obj;
129
+
130
+ obj = NewPKCS7si(cPKCS7Signer);
131
+ pkcs7 = p7si ? ossl_PKCS7_SIGNER_INFO_dup(p7si) : PKCS7_SIGNER_INFO_new();
132
+ if (!pkcs7) ossl_raise(ePKCS7Error, NULL);
133
+ SetPKCS7si(obj, pkcs7);
134
+
135
+ return obj;
136
+ }
137
+
138
+ static VALUE
139
+ ossl_pkcs7ri_new(PKCS7_RECIP_INFO *p7ri)
140
+ {
141
+ PKCS7_RECIP_INFO *pkcs7;
142
+ VALUE obj;
143
+
144
+ obj = NewPKCS7ri(cPKCS7Recipient);
145
+ pkcs7 = p7ri ? ossl_PKCS7_RECIP_INFO_dup(p7ri) : PKCS7_RECIP_INFO_new();
146
+ if (!pkcs7) ossl_raise(ePKCS7Error, NULL);
147
+ SetPKCS7ri(obj, pkcs7);
148
+
149
+ return obj;
150
+ }
151
+
152
+ /*
153
+ * call-seq:
154
+ * PKCS7.read_smime(string) => pkcs7
155
+ */
156
+ static VALUE
157
+ ossl_pkcs7_s_read_smime(VALUE klass, VALUE arg)
158
+ {
159
+ BIO *in, *out;
160
+ PKCS7 *pkcs7;
161
+ VALUE ret, data;
162
+
163
+ ret = NewPKCS7(cPKCS7);
164
+ in = ossl_obj2bio(&arg);
165
+ out = NULL;
166
+ pkcs7 = SMIME_read_PKCS7(in, &out);
167
+ BIO_free(in);
168
+ if(!pkcs7) ossl_raise(ePKCS7Error, NULL);
169
+ data = out ? ossl_membio2str(out) : Qnil;
170
+ SetPKCS7(ret, pkcs7);
171
+ ossl_pkcs7_set_data(ret, data);
172
+ ossl_pkcs7_set_err_string(ret, Qnil);
173
+
174
+ return ret;
175
+ }
176
+
177
+ /*
178
+ * call-seq:
179
+ * PKCS7.write_smime(pkcs7 [, data [, flags]]) => string
180
+ */
181
+ static VALUE
182
+ ossl_pkcs7_s_write_smime(int argc, VALUE *argv, VALUE klass)
183
+ {
184
+ VALUE pkcs7, data, flags;
185
+ BIO *out, *in;
186
+ PKCS7 *p7;
187
+ VALUE str;
188
+ int flg;
189
+
190
+ rb_scan_args(argc, argv, "12", &pkcs7, &data, &flags);
191
+ flg = NIL_P(flags) ? 0 : NUM2INT(flags);
192
+ if(NIL_P(data)) data = ossl_pkcs7_get_data(pkcs7);
193
+ GetPKCS7(pkcs7, p7);
194
+ if(!NIL_P(data) && PKCS7_is_detached(p7))
195
+ flg |= PKCS7_DETACHED;
196
+ in = NIL_P(data) ? NULL : ossl_obj2bio(&data);
197
+ if(!(out = BIO_new(BIO_s_mem()))){
198
+ BIO_free(in);
199
+ ossl_raise(ePKCS7Error, NULL);
200
+ }
201
+ if(!SMIME_write_PKCS7(out, p7, in, flg)){
202
+ BIO_free(out);
203
+ BIO_free(in);
204
+ ossl_raise(ePKCS7Error, NULL);
205
+ }
206
+ BIO_free(in);
207
+ str = ossl_membio2str(out);
208
+
209
+ return str;
210
+ }
211
+
212
+ /*
213
+ * call-seq:
214
+ * PKCS7.sign(cert, key, data, [, certs [, flags]]) => pkcs7
215
+ */
216
+ static VALUE
217
+ ossl_pkcs7_s_sign(int argc, VALUE *argv, VALUE klass)
218
+ {
219
+ VALUE cert, key, data, certs, flags;
220
+ X509 *x509;
221
+ EVP_PKEY *pkey;
222
+ BIO *in;
223
+ STACK_OF(X509) *x509s;
224
+ int flg, status = 0;
225
+ PKCS7 *pkcs7;
226
+ VALUE ret;
227
+
228
+ rb_scan_args(argc, argv, "32", &cert, &key, &data, &certs, &flags);
229
+ x509 = GetX509CertPtr(cert); /* NO NEED TO DUP */
230
+ pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
231
+ flg = NIL_P(flags) ? 0 : NUM2INT(flags);
232
+ ret = NewPKCS7(cPKCS7);
233
+ in = ossl_obj2bio(&data);
234
+ if(NIL_P(certs)) x509s = NULL;
235
+ else{
236
+ x509s = ossl_protect_x509_ary2sk(certs, &status);
237
+ if(status){
238
+ BIO_free(in);
239
+ rb_jump_tag(status);
240
+ }
241
+ }
242
+ if(!(pkcs7 = PKCS7_sign(x509, pkey, x509s, in, flg))){
243
+ BIO_free(in);
244
+ sk_X509_pop_free(x509s, X509_free);
245
+ ossl_raise(ePKCS7Error, NULL);
246
+ }
247
+ SetPKCS7(ret, pkcs7);
248
+ ossl_pkcs7_set_data(ret, data);
249
+ ossl_pkcs7_set_err_string(ret, Qnil);
250
+ BIO_free(in);
251
+ sk_X509_pop_free(x509s, X509_free);
252
+
253
+ return ret;
254
+ }
255
+
256
+ /*
257
+ * call-seq:
258
+ * PKCS7.encrypt(certs, data, [, cipher [, flags]]) => pkcs7
259
+ */
260
+ static VALUE
261
+ ossl_pkcs7_s_encrypt(int argc, VALUE *argv, VALUE klass)
262
+ {
263
+ VALUE certs, data, cipher, flags;
264
+ STACK_OF(X509) *x509s;
265
+ BIO *in;
266
+ const EVP_CIPHER *ciph;
267
+ int flg, status = 0;
268
+ VALUE ret;
269
+ PKCS7 *p7;
270
+
271
+ rb_scan_args(argc, argv, "22", &certs, &data, &cipher, &flags);
272
+ if(NIL_P(cipher)){
273
+ #if !defined(OPENSSL_NO_RC2)
274
+ ciph = EVP_rc2_40_cbc();
275
+ #elif !defined(OPENSSL_NO_DES)
276
+ ciph = EVP_des_ede3_cbc();
277
+ #elif !defined(OPENSSL_NO_RC2)
278
+ ciph = EVP_rc2_40_cbc();
279
+ #elif !defined(OPENSSL_NO_AES)
280
+ ciph = EVP_EVP_aes_128_cbc();
281
+ #else
282
+ ossl_raise(ePKCS7Error, "Must specify cipher");
283
+ #endif
284
+
285
+ }
286
+ else ciph = ossl_evp_get_cipherbyname(cipher);
287
+ flg = NIL_P(flags) ? 0 : NUM2INT(flags);
288
+ ret = NewPKCS7(cPKCS7);
289
+ in = ossl_obj2bio(&data);
290
+ x509s = ossl_protect_x509_ary2sk(certs, &status);
291
+ if(status){
292
+ BIO_free(in);
293
+ rb_jump_tag(status);
294
+ }
295
+ if(!(p7 = PKCS7_encrypt(x509s, in, (EVP_CIPHER*)ciph, flg))){
296
+ BIO_free(in);
297
+ sk_X509_pop_free(x509s, X509_free);
298
+ ossl_raise(ePKCS7Error, NULL);
299
+ }
300
+ BIO_free(in);
301
+ SetPKCS7(ret, p7);
302
+ ossl_pkcs7_set_data(ret, data);
303
+ sk_X509_pop_free(x509s, X509_free);
304
+
305
+ return ret;
306
+ }
307
+
308
+ static VALUE
309
+ ossl_pkcs7_alloc(VALUE klass)
310
+ {
311
+ PKCS7 *pkcs7;
312
+ VALUE obj;
313
+
314
+ obj = NewPKCS7(klass);
315
+ if (!(pkcs7 = PKCS7_new())) {
316
+ ossl_raise(ePKCS7Error, NULL);
317
+ }
318
+ SetPKCS7(obj, pkcs7);
319
+
320
+ return obj;
321
+ }
322
+
323
+ /*
324
+ * call-seq:
325
+ * PKCS7.new => pkcs7
326
+ * PKCS7.new(string) => pkcs7
327
+ *
328
+ * Many methods in this class aren't documented.
329
+ */
330
+ static VALUE
331
+ ossl_pkcs7_initialize(int argc, VALUE *argv, VALUE self)
332
+ {
333
+ PKCS7 *p7, *p7_orig = RTYPEDDATA_DATA(self);
334
+ BIO *in;
335
+ VALUE arg;
336
+
337
+ if(rb_scan_args(argc, argv, "01", &arg) == 0)
338
+ return self;
339
+ arg = ossl_to_der_if_possible(arg);
340
+ in = ossl_obj2bio(&arg);
341
+ p7 = d2i_PKCS7_bio(in, NULL);
342
+ if (!p7) {
343
+ OSSL_BIO_reset(in);
344
+ p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL);
345
+ }
346
+ BIO_free(in);
347
+ if (!p7)
348
+ ossl_raise(rb_eArgError, "Could not parse the PKCS7");
349
+
350
+ RTYPEDDATA_DATA(self) = p7;
351
+ PKCS7_free(p7_orig);
352
+ ossl_pkcs7_set_data(self, Qnil);
353
+ ossl_pkcs7_set_err_string(self, Qnil);
354
+
355
+ return self;
356
+ }
357
+
358
+ static VALUE
359
+ ossl_pkcs7_copy(VALUE self, VALUE other)
360
+ {
361
+ PKCS7 *a, *b, *pkcs7;
362
+
363
+ rb_check_frozen(self);
364
+ if (self == other) return self;
365
+
366
+ GetPKCS7(self, a);
367
+ GetPKCS7(other, b);
368
+
369
+ pkcs7 = PKCS7_dup(b);
370
+ if (!pkcs7) {
371
+ ossl_raise(ePKCS7Error, NULL);
372
+ }
373
+ DATA_PTR(self) = pkcs7;
374
+ PKCS7_free(a);
375
+
376
+ return self;
377
+ }
378
+
379
+ static int
380
+ ossl_pkcs7_sym2typeid(VALUE sym)
381
+ {
382
+ int i, ret = Qnil;
383
+ const char *s;
384
+ size_t l;
385
+
386
+ static const struct {
387
+ char name[20];
388
+ int nid;
389
+ } p7_type_tab[] = {
390
+ { "signed", NID_pkcs7_signed },
391
+ { "data", NID_pkcs7_data },
392
+ { "signedAndEnveloped", NID_pkcs7_signedAndEnveloped },
393
+ { "enveloped", NID_pkcs7_enveloped },
394
+ { "encrypted", NID_pkcs7_encrypted },
395
+ { "digest", NID_pkcs7_digest },
396
+ };
397
+
398
+ if (SYMBOL_P(sym)) sym = rb_sym2str(sym);
399
+ else StringValue(sym);
400
+ RSTRING_GETMEM(sym, s, l);
401
+
402
+ for(i = 0; ; i++){
403
+ if(i == numberof(p7_type_tab))
404
+ ossl_raise(ePKCS7Error, "unknown type \"%"PRIsVALUE"\"", sym);
405
+ if(strlen(p7_type_tab[i].name) != l) continue;
406
+ if(strcmp(p7_type_tab[i].name, s) == 0){
407
+ ret = p7_type_tab[i].nid;
408
+ break;
409
+ }
410
+ }
411
+
412
+ return ret;
413
+ }
414
+
415
+ /*
416
+ * call-seq:
417
+ * pkcs7.type = type => type
418
+ */
419
+ static VALUE
420
+ ossl_pkcs7_set_type(VALUE self, VALUE type)
421
+ {
422
+ PKCS7 *p7;
423
+
424
+ GetPKCS7(self, p7);
425
+ if(!PKCS7_set_type(p7, ossl_pkcs7_sym2typeid(type)))
426
+ ossl_raise(ePKCS7Error, NULL);
427
+
428
+ return type;
429
+ }
430
+
431
+ /*
432
+ * call-seq:
433
+ * pkcs7.type => string or nil
434
+ */
435
+ static VALUE
436
+ ossl_pkcs7_get_type(VALUE self)
437
+ {
438
+ PKCS7 *p7;
439
+
440
+ GetPKCS7(self, p7);
441
+ if(PKCS7_type_is_signed(p7))
442
+ return ID2SYM(rb_intern("signed"));
443
+ if(PKCS7_type_is_encrypted(p7))
444
+ return ID2SYM(rb_intern("encrypted"));
445
+ if(PKCS7_type_is_enveloped(p7))
446
+ return ID2SYM(rb_intern("enveloped"));
447
+ if(PKCS7_type_is_signedAndEnveloped(p7))
448
+ return ID2SYM(rb_intern("signedAndEnveloped"));
449
+ if(PKCS7_type_is_data(p7))
450
+ return ID2SYM(rb_intern("data"));
451
+ return Qnil;
452
+ }
453
+
454
+ static VALUE
455
+ ossl_pkcs7_set_detached(VALUE self, VALUE flag)
456
+ {
457
+ PKCS7 *p7;
458
+
459
+ GetPKCS7(self, p7);
460
+ if(flag != Qtrue && flag != Qfalse)
461
+ ossl_raise(ePKCS7Error, "must specify a boolean");
462
+ if(!PKCS7_set_detached(p7, flag == Qtrue ? 1 : 0))
463
+ ossl_raise(ePKCS7Error, NULL);
464
+
465
+ return flag;
466
+ }
467
+
468
+ static VALUE
469
+ ossl_pkcs7_get_detached(VALUE self)
470
+ {
471
+ PKCS7 *p7;
472
+ GetPKCS7(self, p7);
473
+ return PKCS7_get_detached(p7) ? Qtrue : Qfalse;
474
+ }
475
+
476
+ static VALUE
477
+ ossl_pkcs7_detached_p(VALUE self)
478
+ {
479
+ PKCS7 *p7;
480
+ GetPKCS7(self, p7);
481
+ return PKCS7_is_detached(p7) ? Qtrue : Qfalse;
482
+ }
483
+
484
+ static VALUE
485
+ ossl_pkcs7_set_cipher(VALUE self, VALUE cipher)
486
+ {
487
+ PKCS7 *pkcs7;
488
+
489
+ GetPKCS7(self, pkcs7);
490
+ if (!PKCS7_set_cipher(pkcs7, ossl_evp_get_cipherbyname(cipher))) {
491
+ ossl_raise(ePKCS7Error, NULL);
492
+ }
493
+
494
+ return cipher;
495
+ }
496
+
497
+ static VALUE
498
+ ossl_pkcs7_add_signer(VALUE self, VALUE signer)
499
+ {
500
+ PKCS7 *pkcs7;
501
+ PKCS7_SIGNER_INFO *si, *si_new;
502
+
503
+ GetPKCS7(self, pkcs7);
504
+ GetPKCS7si(signer, si);
505
+
506
+ si_new = ossl_PKCS7_SIGNER_INFO_dup(si);
507
+ if (!si_new)
508
+ ossl_raise(ePKCS7Error, "PKCS7_SIGNER_INFO_dup");
509
+
510
+ if (PKCS7_add_signer(pkcs7, si_new) != 1) {
511
+ PKCS7_SIGNER_INFO_free(si_new);
512
+ ossl_raise(ePKCS7Error, "PKCS7_add_signer");
513
+ }
514
+
515
+ return self;
516
+ }
517
+
518
+ static VALUE
519
+ ossl_pkcs7_get_signer(VALUE self)
520
+ {
521
+ PKCS7 *pkcs7;
522
+ STACK_OF(PKCS7_SIGNER_INFO) *sk;
523
+ PKCS7_SIGNER_INFO *si;
524
+ int num, i;
525
+ VALUE ary;
526
+
527
+ GetPKCS7(self, pkcs7);
528
+ if (!(sk = PKCS7_get_signer_info(pkcs7))) {
529
+ OSSL_Debug("OpenSSL::PKCS7#get_signer_info == NULL!");
530
+ return rb_ary_new();
531
+ }
532
+ if ((num = sk_PKCS7_SIGNER_INFO_num(sk)) < 0) {
533
+ ossl_raise(ePKCS7Error, "Negative number of signers!");
534
+ }
535
+ ary = rb_ary_new2(num);
536
+ for (i=0; i<num; i++) {
537
+ si = sk_PKCS7_SIGNER_INFO_value(sk, i);
538
+ rb_ary_push(ary, ossl_pkcs7si_new(si));
539
+ }
540
+
541
+ return ary;
542
+ }
543
+
544
+ static VALUE
545
+ ossl_pkcs7_add_recipient(VALUE self, VALUE recip)
546
+ {
547
+ PKCS7 *pkcs7;
548
+ PKCS7_RECIP_INFO *ri, *ri_new;
549
+
550
+ GetPKCS7(self, pkcs7);
551
+ GetPKCS7ri(recip, ri);
552
+
553
+ ri_new = ossl_PKCS7_RECIP_INFO_dup(ri);
554
+ if (!ri_new)
555
+ ossl_raise(ePKCS7Error, "PKCS7_RECIP_INFO_dup");
556
+
557
+ if (PKCS7_add_recipient_info(pkcs7, ri_new) != 1) {
558
+ PKCS7_RECIP_INFO_free(ri_new);
559
+ ossl_raise(ePKCS7Error, "PKCS7_add_recipient_info");
560
+ }
561
+
562
+ return self;
563
+ }
564
+
565
+ static VALUE
566
+ ossl_pkcs7_get_recipient(VALUE self)
567
+ {
568
+ PKCS7 *pkcs7;
569
+ STACK_OF(PKCS7_RECIP_INFO) *sk;
570
+ PKCS7_RECIP_INFO *si;
571
+ int num, i;
572
+ VALUE ary;
573
+
574
+ GetPKCS7(self, pkcs7);
575
+ if (PKCS7_type_is_enveloped(pkcs7))
576
+ sk = pkcs7->d.enveloped->recipientinfo;
577
+ else if (PKCS7_type_is_signedAndEnveloped(pkcs7))
578
+ sk = pkcs7->d.signed_and_enveloped->recipientinfo;
579
+ else sk = NULL;
580
+ if (!sk) return rb_ary_new();
581
+ if ((num = sk_PKCS7_RECIP_INFO_num(sk)) < 0) {
582
+ ossl_raise(ePKCS7Error, "Negative number of recipient!");
583
+ }
584
+ ary = rb_ary_new2(num);
585
+ for (i=0; i<num; i++) {
586
+ si = sk_PKCS7_RECIP_INFO_value(sk, i);
587
+ rb_ary_push(ary, ossl_pkcs7ri_new(si));
588
+ }
589
+
590
+ return ary;
591
+ }
592
+
593
+ static VALUE
594
+ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
595
+ {
596
+ PKCS7 *pkcs7;
597
+ X509 *x509;
598
+
599
+ GetPKCS7(self, pkcs7);
600
+ x509 = GetX509CertPtr(cert); /* NO NEED TO DUP */
601
+ if (!PKCS7_add_certificate(pkcs7, x509)){
602
+ ossl_raise(ePKCS7Error, NULL);
603
+ }
604
+
605
+ return self;
606
+ }
607
+
608
+ static STACK_OF(X509) *
609
+ pkcs7_get_certs(VALUE self)
610
+ {
611
+ PKCS7 *pkcs7;
612
+ STACK_OF(X509) *certs;
613
+ int i;
614
+
615
+ GetPKCS7(self, pkcs7);
616
+ i = OBJ_obj2nid(pkcs7->type);
617
+ switch(i){
618
+ case NID_pkcs7_signed:
619
+ certs = pkcs7->d.sign->cert;
620
+ break;
621
+ case NID_pkcs7_signedAndEnveloped:
622
+ certs = pkcs7->d.signed_and_enveloped->cert;
623
+ break;
624
+ default:
625
+ certs = NULL;
626
+ }
627
+
628
+ return certs;
629
+ }
630
+
631
+ static STACK_OF(X509_CRL) *
632
+ pkcs7_get_crls(VALUE self)
633
+ {
634
+ PKCS7 *pkcs7;
635
+ STACK_OF(X509_CRL) *crls;
636
+ int i;
637
+
638
+ GetPKCS7(self, pkcs7);
639
+ i = OBJ_obj2nid(pkcs7->type);
640
+ switch(i){
641
+ case NID_pkcs7_signed:
642
+ crls = pkcs7->d.sign->crl;
643
+ break;
644
+ case NID_pkcs7_signedAndEnveloped:
645
+ crls = pkcs7->d.signed_and_enveloped->crl;
646
+ break;
647
+ default:
648
+ crls = NULL;
649
+ }
650
+
651
+ return crls;
652
+ }
653
+
654
+ static VALUE
655
+ ossl_pkcs7_set_certs_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, arg))
656
+ {
657
+ return ossl_pkcs7_add_certificate(arg, i);
658
+ }
659
+
660
+ static VALUE
661
+ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
662
+ {
663
+ STACK_OF(X509) *certs;
664
+ X509 *cert;
665
+
666
+ certs = pkcs7_get_certs(self);
667
+ while((cert = sk_X509_pop(certs))) X509_free(cert);
668
+ rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
669
+
670
+ return ary;
671
+ }
672
+
673
+ static VALUE
674
+ ossl_pkcs7_get_certificates(VALUE self)
675
+ {
676
+ return ossl_x509_sk2ary(pkcs7_get_certs(self));
677
+ }
678
+
679
+ static VALUE
680
+ ossl_pkcs7_add_crl(VALUE self, VALUE crl)
681
+ {
682
+ PKCS7 *pkcs7;
683
+ X509_CRL *x509crl;
684
+
685
+ GetPKCS7(self, pkcs7); /* NO DUP needed! */
686
+ x509crl = GetX509CRLPtr(crl);
687
+ if (!PKCS7_add_crl(pkcs7, x509crl)) {
688
+ ossl_raise(ePKCS7Error, NULL);
689
+ }
690
+
691
+ return self;
692
+ }
693
+
694
+ static VALUE
695
+ ossl_pkcs7_set_crls_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, arg))
696
+ {
697
+ return ossl_pkcs7_add_crl(arg, i);
698
+ }
699
+
700
+ static VALUE
701
+ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
702
+ {
703
+ STACK_OF(X509_CRL) *crls;
704
+ X509_CRL *crl;
705
+
706
+ crls = pkcs7_get_crls(self);
707
+ while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
708
+ rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
709
+
710
+ return ary;
711
+ }
712
+
713
+ static VALUE
714
+ ossl_pkcs7_get_crls(VALUE self)
715
+ {
716
+ return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
717
+ }
718
+
719
+ static VALUE
720
+ ossl_pkcs7_verify(int argc, VALUE *argv, VALUE self)
721
+ {
722
+ VALUE certs, store, indata, flags;
723
+ STACK_OF(X509) *x509s;
724
+ X509_STORE *x509st;
725
+ int flg, ok, status = 0;
726
+ BIO *in, *out;
727
+ PKCS7 *p7;
728
+ VALUE data;
729
+ const char *msg;
730
+
731
+ GetPKCS7(self, p7);
732
+ rb_scan_args(argc, argv, "22", &certs, &store, &indata, &flags);
733
+ x509st = GetX509StorePtr(store);
734
+ flg = NIL_P(flags) ? 0 : NUM2INT(flags);
735
+ if(NIL_P(indata)) indata = ossl_pkcs7_get_data(self);
736
+ in = NIL_P(indata) ? NULL : ossl_obj2bio(&indata);
737
+ if(NIL_P(certs)) x509s = NULL;
738
+ else{
739
+ x509s = ossl_protect_x509_ary2sk(certs, &status);
740
+ if(status){
741
+ BIO_free(in);
742
+ rb_jump_tag(status);
743
+ }
744
+ }
745
+ if(!(out = BIO_new(BIO_s_mem()))){
746
+ BIO_free(in);
747
+ sk_X509_pop_free(x509s, X509_free);
748
+ ossl_raise(ePKCS7Error, NULL);
749
+ }
750
+ ok = PKCS7_verify(p7, x509s, x509st, in, out, flg);
751
+ BIO_free(in);
752
+ sk_X509_pop_free(x509s, X509_free);
753
+ if (ok < 0) ossl_raise(ePKCS7Error, "PKCS7_verify");
754
+ msg = ERR_reason_error_string(ERR_peek_error());
755
+ ossl_pkcs7_set_err_string(self, msg ? rb_str_new2(msg) : Qnil);
756
+ ossl_clear_error();
757
+ data = ossl_membio2str(out);
758
+ ossl_pkcs7_set_data(self, data);
759
+
760
+ return (ok == 1) ? Qtrue : Qfalse;
761
+ }
762
+
763
+ static VALUE
764
+ ossl_pkcs7_decrypt(int argc, VALUE *argv, VALUE self)
765
+ {
766
+ VALUE pkey, cert, flags;
767
+ EVP_PKEY *key;
768
+ X509 *x509;
769
+ int flg;
770
+ PKCS7 *p7;
771
+ BIO *out;
772
+ VALUE str;
773
+
774
+ rb_scan_args(argc, argv, "12", &pkey, &cert, &flags);
775
+ key = GetPrivPKeyPtr(pkey); /* NO NEED TO DUP */
776
+ x509 = NIL_P(cert) ? NULL : GetX509CertPtr(cert); /* NO NEED TO DUP */
777
+ flg = NIL_P(flags) ? 0 : NUM2INT(flags);
778
+ GetPKCS7(self, p7);
779
+ if(!(out = BIO_new(BIO_s_mem())))
780
+ ossl_raise(ePKCS7Error, NULL);
781
+ if(!PKCS7_decrypt(p7, key, x509, out, flg)){
782
+ BIO_free(out);
783
+ ossl_raise(ePKCS7Error, NULL);
784
+ }
785
+ str = ossl_membio2str(out); /* out will be free */
786
+
787
+ return str;
788
+ }
789
+
790
+ static VALUE
791
+ ossl_pkcs7_add_data(VALUE self, VALUE data)
792
+ {
793
+ PKCS7 *pkcs7;
794
+ BIO *out, *in;
795
+ char buf[4096];
796
+ int len;
797
+
798
+ GetPKCS7(self, pkcs7);
799
+ if(PKCS7_type_is_signed(pkcs7)){
800
+ if(!PKCS7_content_new(pkcs7, NID_pkcs7_data))
801
+ ossl_raise(ePKCS7Error, NULL);
802
+ }
803
+ in = ossl_obj2bio(&data);
804
+ if(!(out = PKCS7_dataInit(pkcs7, NULL))) goto err;
805
+ for(;;){
806
+ if((len = BIO_read(in, buf, sizeof(buf))) <= 0)
807
+ break;
808
+ if(BIO_write(out, buf, len) != len)
809
+ goto err;
810
+ }
811
+ if(!PKCS7_dataFinal(pkcs7, out)) goto err;
812
+ ossl_pkcs7_set_data(self, Qnil);
813
+
814
+ err:
815
+ BIO_free_all(out);
816
+ BIO_free(in);
817
+ if(ERR_peek_error()){
818
+ ossl_raise(ePKCS7Error, NULL);
819
+ }
820
+
821
+ return data;
822
+ }
823
+
824
+ static VALUE
825
+ ossl_pkcs7_to_der(VALUE self)
826
+ {
827
+ PKCS7 *pkcs7;
828
+ VALUE str;
829
+ long len;
830
+ unsigned char *p;
831
+
832
+ GetPKCS7(self, pkcs7);
833
+ if((len = i2d_PKCS7(pkcs7, NULL)) <= 0)
834
+ ossl_raise(ePKCS7Error, NULL);
835
+ str = rb_str_new(0, len);
836
+ p = (unsigned char *)RSTRING_PTR(str);
837
+ if(i2d_PKCS7(pkcs7, &p) <= 0)
838
+ ossl_raise(ePKCS7Error, NULL);
839
+ ossl_str_adjust(str, p);
840
+
841
+ return str;
842
+ }
843
+
844
+ static VALUE
845
+ ossl_pkcs7_to_pem(VALUE self)
846
+ {
847
+ PKCS7 *pkcs7;
848
+ BIO *out;
849
+ VALUE str;
850
+
851
+ GetPKCS7(self, pkcs7);
852
+ if (!(out = BIO_new(BIO_s_mem()))) {
853
+ ossl_raise(ePKCS7Error, NULL);
854
+ }
855
+ if (!PEM_write_bio_PKCS7(out, pkcs7)) {
856
+ BIO_free(out);
857
+ ossl_raise(ePKCS7Error, NULL);
858
+ }
859
+ str = ossl_membio2str(out);
860
+
861
+ return str;
862
+ }
863
+
864
+ /*
865
+ * SIGNER INFO
866
+ */
867
+ static VALUE
868
+ ossl_pkcs7si_alloc(VALUE klass)
869
+ {
870
+ PKCS7_SIGNER_INFO *p7si;
871
+ VALUE obj;
872
+
873
+ obj = NewPKCS7si(klass);
874
+ if (!(p7si = PKCS7_SIGNER_INFO_new())) {
875
+ ossl_raise(ePKCS7Error, NULL);
876
+ }
877
+ SetPKCS7si(obj, p7si);
878
+
879
+ return obj;
880
+ }
881
+
882
+ static VALUE
883
+ ossl_pkcs7si_initialize(VALUE self, VALUE cert, VALUE key, VALUE digest)
884
+ {
885
+ PKCS7_SIGNER_INFO *p7si;
886
+ EVP_PKEY *pkey;
887
+ X509 *x509;
888
+ const EVP_MD *md;
889
+
890
+ pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
891
+ x509 = GetX509CertPtr(cert); /* NO NEED TO DUP */
892
+ md = ossl_evp_get_digestbyname(digest);
893
+ GetPKCS7si(self, p7si);
894
+ if (!(PKCS7_SIGNER_INFO_set(p7si, x509, pkey, (EVP_MD*)md))) {
895
+ ossl_raise(ePKCS7Error, NULL);
896
+ }
897
+
898
+ return self;
899
+ }
900
+
901
+ static VALUE
902
+ ossl_pkcs7si_get_issuer(VALUE self)
903
+ {
904
+ PKCS7_SIGNER_INFO *p7si;
905
+
906
+ GetPKCS7si(self, p7si);
907
+
908
+ return ossl_x509name_new(p7si->issuer_and_serial->issuer);
909
+ }
910
+
911
+ static VALUE
912
+ ossl_pkcs7si_get_serial(VALUE self)
913
+ {
914
+ PKCS7_SIGNER_INFO *p7si;
915
+
916
+ GetPKCS7si(self, p7si);
917
+
918
+ return asn1integer_to_num(p7si->issuer_and_serial->serial);
919
+ }
920
+
921
+ static VALUE
922
+ ossl_pkcs7si_get_signed_time(VALUE self)
923
+ {
924
+ PKCS7_SIGNER_INFO *p7si;
925
+ ASN1_TYPE *asn1obj;
926
+
927
+ GetPKCS7si(self, p7si);
928
+
929
+ if (!(asn1obj = PKCS7_get_signed_attribute(p7si, NID_pkcs9_signingTime))) {
930
+ ossl_raise(ePKCS7Error, NULL);
931
+ }
932
+ if (asn1obj->type == V_ASN1_UTCTIME) {
933
+ return asn1time_to_time(asn1obj->value.utctime);
934
+ }
935
+ /*
936
+ * OR
937
+ * ossl_raise(ePKCS7Error, "...");
938
+ * ?
939
+ */
940
+
941
+ return Qnil;
942
+ }
943
+
944
+ /*
945
+ * RECIPIENT INFO
946
+ */
947
+ static VALUE
948
+ ossl_pkcs7ri_alloc(VALUE klass)
949
+ {
950
+ PKCS7_RECIP_INFO *p7ri;
951
+ VALUE obj;
952
+
953
+ obj = NewPKCS7ri(klass);
954
+ if (!(p7ri = PKCS7_RECIP_INFO_new())) {
955
+ ossl_raise(ePKCS7Error, NULL);
956
+ }
957
+ SetPKCS7ri(obj, p7ri);
958
+
959
+ return obj;
960
+ }
961
+
962
+ static VALUE
963
+ ossl_pkcs7ri_initialize(VALUE self, VALUE cert)
964
+ {
965
+ PKCS7_RECIP_INFO *p7ri;
966
+ X509 *x509;
967
+
968
+ x509 = GetX509CertPtr(cert); /* NO NEED TO DUP */
969
+ GetPKCS7ri(self, p7ri);
970
+ if (!PKCS7_RECIP_INFO_set(p7ri, x509)) {
971
+ ossl_raise(ePKCS7Error, NULL);
972
+ }
973
+
974
+ return self;
975
+ }
976
+
977
+ static VALUE
978
+ ossl_pkcs7ri_get_issuer(VALUE self)
979
+ {
980
+ PKCS7_RECIP_INFO *p7ri;
981
+
982
+ GetPKCS7ri(self, p7ri);
983
+
984
+ return ossl_x509name_new(p7ri->issuer_and_serial->issuer);
985
+ }
986
+
987
+ static VALUE
988
+ ossl_pkcs7ri_get_serial(VALUE self)
989
+ {
990
+ PKCS7_RECIP_INFO *p7ri;
991
+
992
+ GetPKCS7ri(self, p7ri);
993
+
994
+ return asn1integer_to_num(p7ri->issuer_and_serial->serial);
995
+ }
996
+
997
+ static VALUE
998
+ ossl_pkcs7ri_get_enc_key(VALUE self)
999
+ {
1000
+ PKCS7_RECIP_INFO *p7ri;
1001
+
1002
+ GetPKCS7ri(self, p7ri);
1003
+
1004
+ return asn1str_to_str(p7ri->enc_key);
1005
+ }
1006
+
1007
+ /*
1008
+ * INIT
1009
+ */
1010
+ void
1011
+ Init_ossl_pkcs7(void)
1012
+ {
1013
+ #undef rb_intern
1014
+ #if 0
1015
+ mOSSL = rb_define_module("OpenSSL");
1016
+ eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
1017
+ #endif
1018
+
1019
+ cPKCS7 = rb_define_class_under(mOSSL, "PKCS7", rb_cObject);
1020
+ ePKCS7Error = rb_define_class_under(cPKCS7, "PKCS7Error", eOSSLError);
1021
+ rb_define_singleton_method(cPKCS7, "read_smime", ossl_pkcs7_s_read_smime, 1);
1022
+ rb_define_singleton_method(cPKCS7, "write_smime", ossl_pkcs7_s_write_smime, -1);
1023
+ rb_define_singleton_method(cPKCS7, "sign", ossl_pkcs7_s_sign, -1);
1024
+ rb_define_singleton_method(cPKCS7, "encrypt", ossl_pkcs7_s_encrypt, -1);
1025
+ rb_attr(cPKCS7, rb_intern("data"), 1, 0, Qfalse);
1026
+ rb_attr(cPKCS7, rb_intern("error_string"), 1, 1, Qfalse);
1027
+ rb_define_alloc_func(cPKCS7, ossl_pkcs7_alloc);
1028
+ rb_define_method(cPKCS7, "initialize_copy", ossl_pkcs7_copy, 1);
1029
+ rb_define_method(cPKCS7, "initialize", ossl_pkcs7_initialize, -1);
1030
+ rb_define_method(cPKCS7, "type=", ossl_pkcs7_set_type, 1);
1031
+ rb_define_method(cPKCS7, "type", ossl_pkcs7_get_type, 0);
1032
+ rb_define_method(cPKCS7, "detached=", ossl_pkcs7_set_detached, 1);
1033
+ rb_define_method(cPKCS7, "detached", ossl_pkcs7_get_detached, 0);
1034
+ rb_define_method(cPKCS7, "detached?", ossl_pkcs7_detached_p, 0);
1035
+ rb_define_method(cPKCS7, "cipher=", ossl_pkcs7_set_cipher, 1);
1036
+ rb_define_method(cPKCS7, "add_signer", ossl_pkcs7_add_signer, 1);
1037
+ rb_define_method(cPKCS7, "signers", ossl_pkcs7_get_signer, 0);
1038
+ rb_define_method(cPKCS7, "add_recipient", ossl_pkcs7_add_recipient, 1);
1039
+ rb_define_method(cPKCS7, "recipients", ossl_pkcs7_get_recipient, 0);
1040
+ rb_define_method(cPKCS7, "add_certificate", ossl_pkcs7_add_certificate, 1);
1041
+ rb_define_method(cPKCS7, "certificates=", ossl_pkcs7_set_certificates, 1);
1042
+ rb_define_method(cPKCS7, "certificates", ossl_pkcs7_get_certificates, 0);
1043
+ rb_define_method(cPKCS7, "add_crl", ossl_pkcs7_add_crl, 1);
1044
+ rb_define_method(cPKCS7, "crls=", ossl_pkcs7_set_crls, 1);
1045
+ rb_define_method(cPKCS7, "crls", ossl_pkcs7_get_crls, 0);
1046
+ rb_define_method(cPKCS7, "add_data", ossl_pkcs7_add_data, 1);
1047
+ rb_define_alias(cPKCS7, "data=", "add_data");
1048
+ rb_define_method(cPKCS7, "verify", ossl_pkcs7_verify, -1);
1049
+ rb_define_method(cPKCS7, "decrypt", ossl_pkcs7_decrypt, -1);
1050
+ rb_define_method(cPKCS7, "to_pem", ossl_pkcs7_to_pem, 0);
1051
+ rb_define_alias(cPKCS7, "to_s", "to_pem");
1052
+ rb_define_method(cPKCS7, "to_der", ossl_pkcs7_to_der, 0);
1053
+
1054
+ cPKCS7Signer = rb_define_class_under(cPKCS7, "SignerInfo", rb_cObject);
1055
+ rb_define_const(cPKCS7, "Signer", cPKCS7Signer);
1056
+ rb_define_alloc_func(cPKCS7Signer, ossl_pkcs7si_alloc);
1057
+ rb_define_method(cPKCS7Signer, "initialize", ossl_pkcs7si_initialize,3);
1058
+ rb_define_method(cPKCS7Signer, "issuer", ossl_pkcs7si_get_issuer, 0);
1059
+ rb_define_method(cPKCS7Signer, "serial", ossl_pkcs7si_get_serial,0);
1060
+ rb_define_method(cPKCS7Signer,"signed_time",ossl_pkcs7si_get_signed_time,0);
1061
+
1062
+ cPKCS7Recipient = rb_define_class_under(cPKCS7,"RecipientInfo",rb_cObject);
1063
+ rb_define_alloc_func(cPKCS7Recipient, ossl_pkcs7ri_alloc);
1064
+ rb_define_method(cPKCS7Recipient, "initialize", ossl_pkcs7ri_initialize,1);
1065
+ rb_define_method(cPKCS7Recipient, "issuer", ossl_pkcs7ri_get_issuer,0);
1066
+ rb_define_method(cPKCS7Recipient, "serial", ossl_pkcs7ri_get_serial,0);
1067
+ rb_define_method(cPKCS7Recipient, "enc_key", ossl_pkcs7ri_get_enc_key,0);
1068
+
1069
+ #define DefPKCS7Const(x) rb_define_const(cPKCS7, #x, INT2NUM(PKCS7_##x))
1070
+
1071
+ DefPKCS7Const(TEXT);
1072
+ DefPKCS7Const(NOCERTS);
1073
+ DefPKCS7Const(NOSIGS);
1074
+ DefPKCS7Const(NOCHAIN);
1075
+ DefPKCS7Const(NOINTERN);
1076
+ DefPKCS7Const(NOVERIFY);
1077
+ DefPKCS7Const(DETACHED);
1078
+ DefPKCS7Const(BINARY);
1079
+ DefPKCS7Const(NOATTR);
1080
+ DefPKCS7Const(NOSMIMECAP);
1081
+ }