openssl 2.0.9 → 2.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of openssl might be problematic. Click here for more details.

Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +28 -69
  3. data/README.md +1 -1
  4. data/ext/openssl/deprecation.rb +0 -3
  5. data/ext/openssl/extconf.rb +8 -52
  6. data/ext/openssl/openssl_missing.c +0 -67
  7. data/ext/openssl/openssl_missing.h +3 -50
  8. data/ext/openssl/ossl.c +81 -74
  9. data/ext/openssl/ossl.h +14 -27
  10. data/ext/openssl/ossl_asn1.c +287 -374
  11. data/ext/openssl/ossl_asn1.h +0 -4
  12. data/ext/openssl/ossl_bio.c +5 -20
  13. data/ext/openssl/ossl_bio.h +0 -2
  14. data/ext/openssl/ossl_bn.c +70 -28
  15. data/ext/openssl/ossl_cipher.c +18 -42
  16. data/ext/openssl/ossl_cipher.h +1 -1
  17. data/ext/openssl/ossl_digest.c +8 -12
  18. data/ext/openssl/ossl_digest.h +1 -1
  19. data/ext/openssl/ossl_engine.c +47 -47
  20. data/ext/openssl/ossl_hmac.c +19 -22
  21. data/ext/openssl/ossl_kdf.c +221 -0
  22. data/ext/openssl/ossl_kdf.h +6 -0
  23. data/ext/openssl/ossl_ns_spki.c +17 -21
  24. data/ext/openssl/ossl_ocsp.c +85 -80
  25. data/ext/openssl/ossl_pkcs12.c +15 -21
  26. data/ext/openssl/ossl_pkcs7.c +8 -21
  27. data/ext/openssl/ossl_pkey.c +24 -48
  28. data/ext/openssl/ossl_pkey.h +1 -6
  29. data/ext/openssl/ossl_pkey_dh.c +11 -11
  30. data/ext/openssl/ossl_pkey_dsa.c +16 -22
  31. data/ext/openssl/ossl_pkey_ec.c +43 -56
  32. data/ext/openssl/ossl_pkey_rsa.c +19 -19
  33. data/ext/openssl/ossl_rand.c +12 -12
  34. data/ext/openssl/ossl_ssl.c +291 -243
  35. data/ext/openssl/ossl_ssl.h +0 -5
  36. data/ext/openssl/ossl_ssl_session.c +7 -9
  37. data/ext/openssl/ossl_version.h +1 -1
  38. data/ext/openssl/ossl_x509.c +0 -15
  39. data/ext/openssl/ossl_x509.h +0 -7
  40. data/ext/openssl/ossl_x509attr.c +3 -7
  41. data/ext/openssl/ossl_x509cert.c +17 -54
  42. data/ext/openssl/ossl_x509crl.c +15 -25
  43. data/ext/openssl/ossl_x509ext.c +9 -14
  44. data/ext/openssl/ossl_x509name.c +76 -41
  45. data/ext/openssl/ossl_x509req.c +10 -47
  46. data/ext/openssl/ossl_x509revoked.c +8 -8
  47. data/ext/openssl/ossl_x509store.c +15 -45
  48. data/ext/openssl/ruby_missing.h +2 -13
  49. data/lib/openssl.rb +1 -0
  50. data/lib/openssl/bn.rb +2 -1
  51. data/lib/openssl/buffering.rb +24 -23
  52. data/lib/openssl/config.rb +12 -11
  53. data/lib/openssl/digest.rb +3 -6
  54. data/lib/openssl/pkcs5.rb +22 -0
  55. data/lib/openssl/pkey.rb +0 -41
  56. data/lib/openssl/ssl.rb +118 -16
  57. data/lib/openssl/x509.rb +7 -1
  58. metadata +8 -7
  59. data/ext/openssl/ossl_pkcs5.c +0 -180
  60. data/ext/openssl/ossl_pkcs5.h +0 -6
@@ -23,10 +23,6 @@
23
23
  ossl_raise(rb_eRuntimeError, "EXT wasn't initialized!"); \
24
24
  } \
25
25
  } while (0)
26
- #define SafeGetX509Ext(obj, ext) do { \
27
- OSSL_Check_Kind((obj), cX509Ext); \
28
- GetX509Ext((obj), (ext)); \
29
- } while (0)
30
26
  #define MakeX509ExtFactory(klass, obj, ctx) do { \
31
27
  (obj) = TypedData_Wrap_Struct((klass), &ossl_x509extfactory_type, 0); \
32
28
  if (!((ctx) = OPENSSL_malloc(sizeof(X509V3_CTX)))) \
@@ -90,7 +86,7 @@ GetX509ExtPtr(VALUE obj)
90
86
  {
91
87
  X509_EXTENSION *ext;
92
88
 
93
- SafeGetX509Ext(obj, ext);
89
+ GetX509Ext(obj, ext);
94
90
 
95
91
  return ext;
96
92
  }
@@ -263,15 +259,15 @@ ossl_x509ext_alloc(VALUE klass)
263
259
 
264
260
  /*
265
261
  * call-seq:
266
- * OpenSSL::X509::Extension.new asn1
267
- * OpenSSL::X509::Extension.new name, value
268
- * OpenSSL::X509::Extension.new name, value, critical
262
+ * OpenSSL::X509::Extension.new(der)
263
+ * OpenSSL::X509::Extension.new(oid, value)
264
+ * OpenSSL::X509::Extension.new(oid, value, critical)
269
265
  *
270
266
  * Creates an X509 extension.
271
267
  *
272
- * The extension may be created from +asn1+ data or from an extension +name+
273
- * and +value+. The +name+ may be either an OID or an extension name. If
274
- * +critical+ is true the extension is marked critical.
268
+ * The extension may be created from _der_ data or from an extension _oid_
269
+ * and _value_. The _oid_ may be either an OID or an extension name. If
270
+ * _critical_ is +true+ the extension is marked critical.
275
271
  */
276
272
  static VALUE
277
273
  ossl_x509ext_initialize(int argc, VALUE *argv, VALUE self)
@@ -305,7 +301,7 @@ ossl_x509ext_initialize_copy(VALUE self, VALUE other)
305
301
 
306
302
  rb_check_frozen(self);
307
303
  GetX509Ext(self, ext);
308
- SafeGetX509Ext(other, ext_other);
304
+ GetX509Ext(other, ext_other);
309
305
 
310
306
  ext_new = X509_EXTENSION_dup(ext_other);
311
307
  if (!ext_new)
@@ -441,7 +437,6 @@ ossl_x509ext_to_der(VALUE obj)
441
437
  void
442
438
  Init_ossl_x509ext(void)
443
439
  {
444
- #undef rb_intern
445
440
  #if 0
446
441
  mOSSL = rb_define_module("OpenSSL");
447
442
  eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
@@ -470,7 +465,7 @@ Init_ossl_x509ext(void)
470
465
  cX509Ext = rb_define_class_under(mX509, "Extension", rb_cObject);
471
466
  rb_define_alloc_func(cX509Ext, ossl_x509ext_alloc);
472
467
  rb_define_method(cX509Ext, "initialize", ossl_x509ext_initialize, -1);
473
- rb_define_copy_func(cX509Ext, ossl_x509ext_initialize_copy);
468
+ rb_define_method(cX509Ext, "initialize_copy", ossl_x509ext_initialize_copy, 1);
474
469
  rb_define_method(cX509Ext, "oid=", ossl_x509ext_set_oid, 1);
475
470
  rb_define_method(cX509Ext, "value=", ossl_x509ext_set_value, 1);
476
471
  rb_define_method(cX509Ext, "critical=", ossl_x509ext_set_critical, 1);
@@ -23,10 +23,6 @@
23
23
  ossl_raise(rb_eRuntimeError, "Name wasn't initialized."); \
24
24
  } \
25
25
  } while (0)
26
- #define SafeGetX509Name(obj, name) do { \
27
- OSSL_Check_Kind((obj), cX509Name); \
28
- GetX509Name((obj), (name)); \
29
- } while (0)
30
26
 
31
27
  #define OBJECT_TYPE_TEMPLATE \
32
28
  rb_const_get(cX509Name, rb_intern("OBJECT_TYPE_TEMPLATE"))
@@ -81,7 +77,7 @@ GetX509NamePtr(VALUE obj)
81
77
  {
82
78
  X509_NAME *name;
83
79
 
84
- SafeGetX509Name(obj, name);
80
+ GetX509Name(obj, name);
85
81
 
86
82
  return name;
87
83
  }
@@ -135,15 +131,15 @@ ossl_x509name_init_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
135
131
  *
136
132
  * Creates a new Name.
137
133
  *
138
- * A name may be created from a DER encoded string +der+, an Array
139
- * representing a +distinguished_name+ or a +distinguished_name+ along with a
140
- * +template+.
134
+ * A name may be created from a DER encoded string _der_, an Array
135
+ * representing a _distinguished_name_ or a _distinguished_name_ along with a
136
+ * _template_.
141
137
  *
142
138
  * name = OpenSSL::X509::Name.new [['CN', 'nobody'], ['DC', 'example']]
143
139
  *
144
140
  * name = OpenSSL::X509::Name.new name.to_der
145
141
  *
146
- * See add_entry for a description of the +distinguished_name+ Array's
142
+ * See add_entry for a description of the _distinguished_name_ Array's
147
143
  * contents
148
144
  */
149
145
  static VALUE
@@ -188,7 +184,7 @@ ossl_x509name_initialize_copy(VALUE self, VALUE other)
188
184
 
189
185
  rb_check_frozen(self);
190
186
  GetX509Name(self, name);
191
- SafeGetX509Name(other, name_other);
187
+ GetX509Name(other, name_other);
192
188
 
193
189
  name_new = X509_NAME_dup(name_other);
194
190
  if (!name_new)
@@ -202,9 +198,9 @@ ossl_x509name_initialize_copy(VALUE self, VALUE other)
202
198
 
203
199
  /*
204
200
  * call-seq:
205
- * name.add_entry(oid, value [, type]) => self
201
+ * name.add_entry(oid, value [, type], loc: -1, set: 0) => self
206
202
  *
207
- * Adds a new entry with the given +oid+ and +value+ to this name. The +oid+
203
+ * Adds a new entry with the given _oid_ and _value_ to this name. The _oid_
208
204
  * is an object identifier defined in ASN.1. Some common OIDs are:
209
205
  *
210
206
  * C:: Country Name
@@ -213,24 +209,39 @@ ossl_x509name_initialize_copy(VALUE self, VALUE other)
213
209
  * O:: Organization Name
214
210
  * OU:: Organizational Unit Name
215
211
  * ST:: State or Province Name
212
+ *
213
+ * The optional keyword parameters _loc_ and _set_ specify where to insert the
214
+ * new attribute. Refer to the manpage of X509_NAME_add_entry(3) for details.
215
+ * _loc_ defaults to -1 and _set_ defaults to 0. This appends a single-valued
216
+ * RDN to the end.
216
217
  */
217
218
  static
218
219
  VALUE ossl_x509name_add_entry(int argc, VALUE *argv, VALUE self)
219
220
  {
220
221
  X509_NAME *name;
221
- VALUE oid, value, type;
222
+ VALUE oid, value, type, opts, kwargs[2];
223
+ static ID kwargs_ids[2];
222
224
  const char *oid_name;
225
+ int loc = -1, set = 0;
223
226
 
224
- rb_scan_args(argc, argv, "21", &oid, &value, &type);
227
+ if (!kwargs_ids[0]) {
228
+ kwargs_ids[0] = rb_intern_const("loc");
229
+ kwargs_ids[1] = rb_intern_const("set");
230
+ }
231
+ rb_scan_args(argc, argv, "21:", &oid, &value, &type, &opts);
232
+ rb_get_kwargs(opts, kwargs_ids, 0, 2, kwargs);
225
233
  oid_name = StringValueCStr(oid);
226
234
  StringValue(value);
227
235
  if(NIL_P(type)) type = rb_aref(OBJECT_TYPE_TEMPLATE, oid);
236
+ if (kwargs[0] != Qundef)
237
+ loc = NUM2INT(kwargs[0]);
238
+ if (kwargs[1] != Qundef)
239
+ set = NUM2INT(kwargs[1]);
228
240
  GetX509Name(self, name);
229
241
  if (!X509_NAME_add_entry_by_txt(name, oid_name, NUM2INT(type),
230
- (const unsigned char *)RSTRING_PTR(value), RSTRING_LENINT(value), -1, 0)) {
231
- ossl_raise(eX509NameError, NULL);
232
- }
233
-
242
+ (unsigned char *)RSTRING_PTR(value),
243
+ RSTRING_LENINT(value), loc, set))
244
+ ossl_raise(eX509NameError, "X509_NAME_add_entry_by_txt");
234
245
  return self;
235
246
  }
236
247
 
@@ -239,12 +250,14 @@ ossl_x509name_to_s_old(VALUE self)
239
250
  {
240
251
  X509_NAME *name;
241
252
  char *buf;
253
+ VALUE str;
242
254
 
243
255
  GetX509Name(self, name);
244
256
  buf = X509_NAME_oneline(name, NULL, 0);
245
- if (!buf)
246
- ossl_raise(eX509NameError, "X509_NAME_oneline");
247
- return ossl_buf2str(buf, rb_long2int(strlen(buf)));
257
+ str = rb_str_new2(buf);
258
+ OPENSSL_free(buf);
259
+
260
+ return str;
248
261
  }
249
262
 
250
263
  static VALUE
@@ -252,14 +265,12 @@ x509name_print(VALUE self, unsigned long iflag)
252
265
  {
253
266
  X509_NAME *name;
254
267
  BIO *out;
255
- int ret;
256
268
 
257
269
  GetX509Name(self, name);
258
270
  out = BIO_new(BIO_s_mem());
259
271
  if (!out)
260
272
  ossl_raise(eX509NameError, NULL);
261
- ret = X509_NAME_print_ex(out, name, 0, iflag);
262
- if (ret < 0 || iflag == XN_FLAG_COMPAT && ret == 0) {
273
+ if (!X509_NAME_print_ex(out, name, 0, iflag)) {
263
274
  BIO_free(out);
264
275
  ossl_raise(eX509NameError, "X509_NAME_print_ex");
265
276
  }
@@ -268,15 +279,19 @@ x509name_print(VALUE self, unsigned long iflag)
268
279
 
269
280
  /*
270
281
  * call-seq:
271
- * name.to_s => string
272
- * name.to_s(flags) => string
282
+ * name.to_s -> string
283
+ * name.to_s(format) -> string
273
284
  *
274
- * Returns this name as a Distinguished Name string. +flags+ may be one of:
285
+ * Returns a String representation of the Distinguished Name. _format_ is
286
+ * one of:
275
287
  *
276
288
  * * OpenSSL::X509::Name::COMPAT
277
289
  * * OpenSSL::X509::Name::RFC2253
278
290
  * * OpenSSL::X509::Name::ONELINE
279
291
  * * OpenSSL::X509::Name::MULTILINE
292
+ *
293
+ * If _format_ is omitted, the largely broken and traditional OpenSSL format
294
+ * is used.
280
295
  */
281
296
  static VALUE
282
297
  ossl_x509name_to_s(int argc, VALUE *argv, VALUE self)
@@ -289,6 +304,29 @@ ossl_x509name_to_s(int argc, VALUE *argv, VALUE self)
289
304
  return x509name_print(self, NUM2ULONG(argv[0]));
290
305
  }
291
306
 
307
+ /*
308
+ * call-seq;
309
+ * name.to_utf8 -> string
310
+ *
311
+ * Returns an UTF-8 representation of the distinguished name, as specified
312
+ * in {RFC 2253}[https://www.ietf.org/rfc/rfc2253.txt].
313
+ */
314
+ static VALUE
315
+ ossl_x509name_to_utf8(VALUE self)
316
+ {
317
+ VALUE str = x509name_print(self, XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB);
318
+ rb_enc_associate_index(str, rb_utf8_encindex());
319
+ return str;
320
+ }
321
+
322
+ /* :nodoc: */
323
+ static VALUE
324
+ ossl_x509name_inspect(VALUE self)
325
+ {
326
+ return rb_enc_sprintf(rb_utf8_encoding(), "#<%"PRIsVALUE" %"PRIsVALUE">",
327
+ rb_obj_class(self), ossl_x509name_to_utf8(self));
328
+ }
329
+
292
330
  /*
293
331
  * call-seq:
294
332
  * name.to_a => [[name, data, type], ...]
@@ -342,18 +380,18 @@ ossl_x509name_cmp0(VALUE self, VALUE other)
342
380
  X509_NAME *name1, *name2;
343
381
 
344
382
  GetX509Name(self, name1);
345
- SafeGetX509Name(other, name2);
383
+ GetX509Name(other, name2);
346
384
 
347
385
  return X509_NAME_cmp(name1, name2);
348
386
  }
349
387
 
350
388
  /*
351
389
  * call-seq:
352
- * name.cmp other => integer
353
- * name.<=> other => integer
390
+ * name.cmp(other) -> -1 | 0 | 1
391
+ * name <=> other -> -1 | 0 | 1
354
392
  *
355
- * Compares this Name with +other+ and returns 0 if they are the same and -1 or
356
- * +1 if they are greater or less than each other respectively.
393
+ * Compares this Name with _other_ and returns +0+ if they are the same and +-1+
394
+ * or ++1+ if they are greater or less than each other respectively.
357
395
  */
358
396
  static VALUE
359
397
  ossl_x509name_cmp(VALUE self, VALUE other)
@@ -362,16 +400,16 @@ ossl_x509name_cmp(VALUE self, VALUE other)
362
400
 
363
401
  result = ossl_x509name_cmp0(self, other);
364
402
  if (result < 0) return INT2FIX(-1);
365
- if (result > 0) return INT2FIX(1);
403
+ if (result > 1) return INT2FIX(1);
366
404
 
367
405
  return INT2FIX(0);
368
406
  }
369
407
 
370
408
  /*
371
409
  * call-seq:
372
- * name.eql? other => boolean
410
+ * name.eql?(other) -> true | false
373
411
  *
374
- * Returns true if +name+ and +other+ refer to the same hash key.
412
+ * Returns true if _name_ and _other_ refer to the same hash key.
375
413
  */
376
414
  static VALUE
377
415
  ossl_x509name_eql(VALUE self, VALUE other)
@@ -402,7 +440,6 @@ ossl_x509name_hash(VALUE self)
402
440
  return ULONG2NUM(hash);
403
441
  }
404
442
 
405
- #ifdef HAVE_X509_NAME_HASH_OLD
406
443
  /*
407
444
  * call-seq:
408
445
  * name.hash_old => integer
@@ -421,7 +458,6 @@ ossl_x509name_hash_old(VALUE self)
421
458
 
422
459
  return ULONG2NUM(hash);
423
460
  }
424
- #endif
425
461
 
426
462
  /*
427
463
  * call-seq:
@@ -466,7 +502,6 @@ ossl_x509name_to_der(VALUE self)
466
502
  void
467
503
  Init_ossl_x509name(void)
468
504
  {
469
- #undef rb_intern
470
505
  VALUE utf8str, ptrstr, ia5str, hash;
471
506
 
472
507
  #if 0
@@ -483,17 +518,17 @@ Init_ossl_x509name(void)
483
518
 
484
519
  rb_define_alloc_func(cX509Name, ossl_x509name_alloc);
485
520
  rb_define_method(cX509Name, "initialize", ossl_x509name_initialize, -1);
486
- rb_define_copy_func(cX509Name, ossl_x509name_initialize_copy);
521
+ rb_define_method(cX509Name, "initialize_copy", ossl_x509name_initialize_copy, 1);
487
522
  rb_define_method(cX509Name, "add_entry", ossl_x509name_add_entry, -1);
488
523
  rb_define_method(cX509Name, "to_s", ossl_x509name_to_s, -1);
524
+ rb_define_method(cX509Name, "to_utf8", ossl_x509name_to_utf8, 0);
525
+ rb_define_method(cX509Name, "inspect", ossl_x509name_inspect, 0);
489
526
  rb_define_method(cX509Name, "to_a", ossl_x509name_to_a, 0);
490
527
  rb_define_method(cX509Name, "cmp", ossl_x509name_cmp, 1);
491
528
  rb_define_alias(cX509Name, "<=>", "cmp");
492
529
  rb_define_method(cX509Name, "eql?", ossl_x509name_eql, 1);
493
530
  rb_define_method(cX509Name, "hash", ossl_x509name_hash, 0);
494
- #ifdef HAVE_X509_NAME_HASH_OLD
495
531
  rb_define_method(cX509Name, "hash_old", ossl_x509name_hash_old, 0);
496
- #endif
497
532
  rb_define_method(cX509Name, "to_der", ossl_x509name_to_der, 0);
498
533
 
499
534
  utf8str = INT2NUM(V_ASN1_UTF8STRING);
@@ -23,10 +23,6 @@
23
23
  ossl_raise(rb_eRuntimeError, "Req wasn't initialized!"); \
24
24
  } \
25
25
  } while (0)
26
- #define SafeGetX509Req(obj, req) do { \
27
- OSSL_Check_Kind((obj), cX509Req); \
28
- GetX509Req((obj), (req)); \
29
- } while (0)
30
26
 
31
27
  /*
32
28
  * Classes
@@ -51,49 +47,16 @@ static const rb_data_type_t ossl_x509req_type = {
51
47
  /*
52
48
  * Public functions
53
49
  */
54
- VALUE
55
- ossl_x509req_new(X509_REQ *req)
56
- {
57
- X509_REQ *new;
58
- VALUE obj;
59
-
60
- obj = NewX509Req(cX509Req);
61
- if (!req) {
62
- new = X509_REQ_new();
63
- } else {
64
- new = X509_REQ_dup(req);
65
- }
66
- if (!new) {
67
- ossl_raise(eX509ReqError, NULL);
68
- }
69
- SetX509Req(obj, new);
70
-
71
- return obj;
72
- }
73
-
74
50
  X509_REQ *
75
51
  GetX509ReqPtr(VALUE obj)
76
52
  {
77
53
  X509_REQ *req;
78
54
 
79
- SafeGetX509Req(obj, req);
55
+ GetX509Req(obj, req);
80
56
 
81
57
  return req;
82
58
  }
83
59
 
84
- X509_REQ *
85
- DupX509ReqPtr(VALUE obj)
86
- {
87
- X509_REQ *req, *new;
88
-
89
- SafeGetX509Req(obj, req);
90
- if (!(new = X509_REQ_dup(req))) {
91
- ossl_raise(eX509ReqError, NULL);
92
- }
93
-
94
- return new;
95
- }
96
-
97
60
  /*
98
61
  * Private functions
99
62
  */
@@ -145,7 +108,7 @@ ossl_x509req_copy(VALUE self, VALUE other)
145
108
  rb_check_frozen(self);
146
109
  if (self == other) return self;
147
110
  GetX509Req(self, a);
148
- SafeGetX509Req(other, b);
111
+ GetX509Req(other, b);
149
112
  if (!(req = X509_REQ_dup(b))) {
150
113
  ossl_raise(eX509ReqError, NULL);
151
114
  }
@@ -330,10 +293,11 @@ ossl_x509req_set_public_key(VALUE self, VALUE key)
330
293
  EVP_PKEY *pkey;
331
294
 
332
295
  GetX509Req(self, req);
333
- pkey = GetPKeyPtr(key);
334
- ossl_pkey_check_public_key(pkey);
335
- if (!X509_REQ_set_pubkey(req, pkey))
336
- ossl_raise(eX509ReqError, "X509_REQ_set_pubkey");
296
+ pkey = GetPKeyPtr(key); /* NO NEED TO DUP */
297
+ if (!X509_REQ_set_pubkey(req, pkey)) {
298
+ ossl_raise(eX509ReqError, NULL);
299
+ }
300
+
337
301
  return key;
338
302
  }
339
303
 
@@ -346,7 +310,7 @@ ossl_x509req_sign(VALUE self, VALUE key, VALUE digest)
346
310
 
347
311
  GetX509Req(self, req);
348
312
  pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
349
- md = GetDigestPtr(digest);
313
+ md = ossl_evp_get_digestbyname(digest);
350
314
  if (!X509_REQ_sign(req, pkey, md)) {
351
315
  ossl_raise(eX509ReqError, NULL);
352
316
  }
@@ -364,8 +328,7 @@ ossl_x509req_verify(VALUE self, VALUE key)
364
328
  EVP_PKEY *pkey;
365
329
 
366
330
  GetX509Req(self, req);
367
- pkey = GetPKeyPtr(key);
368
- ossl_pkey_check_public_key(pkey);
331
+ pkey = GetPKeyPtr(key); /* NO NEED TO DUP */
369
332
  switch (X509_REQ_verify(req, pkey)) {
370
333
  case 1:
371
334
  return Qtrue;
@@ -457,7 +420,7 @@ Init_ossl_x509req(void)
457
420
 
458
421
  rb_define_alloc_func(cX509Req, ossl_x509req_alloc);
459
422
  rb_define_method(cX509Req, "initialize", ossl_x509req_initialize, -1);
460
- rb_define_copy_func(cX509Req, ossl_x509req_copy);
423
+ rb_define_method(cX509Req, "initialize_copy", ossl_x509req_copy, 1);
461
424
 
462
425
  rb_define_method(cX509Req, "to_pem", ossl_x509req_to_pem, 0);
463
426
  rb_define_method(cX509Req, "to_der", ossl_x509req_to_der, 0);