openssl 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +180 -29
  3. data/History.md +114 -1
  4. data/README.md +11 -7
  5. data/ext/openssl/extconf.rb +7 -9
  6. data/ext/openssl/openssl_missing.c +1 -1
  7. data/ext/openssl/openssl_missing.h +1 -1
  8. data/ext/openssl/ossl.c +7 -9
  9. data/ext/openssl/ossl.h +12 -8
  10. data/ext/openssl/ossl_asn1.c +65 -261
  11. data/ext/openssl/ossl_asn1.h +1 -19
  12. data/ext/openssl/ossl_bio.c +1 -1
  13. data/ext/openssl/ossl_bio.h +1 -1
  14. data/ext/openssl/ossl_bn.c +12 -12
  15. data/ext/openssl/ossl_bn.h +1 -2
  16. data/ext/openssl/ossl_cipher.c +24 -9
  17. data/ext/openssl/ossl_cipher.h +1 -4
  18. data/ext/openssl/ossl_config.c +10 -9
  19. data/ext/openssl/ossl_config.h +1 -1
  20. data/ext/openssl/ossl_digest.c +39 -20
  21. data/ext/openssl/ossl_digest.h +1 -4
  22. data/ext/openssl/ossl_engine.c +3 -3
  23. data/ext/openssl/ossl_engine.h +1 -4
  24. data/ext/openssl/ossl_hmac.c +3 -3
  25. data/ext/openssl/ossl_hmac.h +1 -4
  26. data/ext/openssl/ossl_kdf.c +5 -5
  27. data/ext/openssl/ossl_ns_spki.c +8 -8
  28. data/ext/openssl/ossl_ns_spki.h +1 -5
  29. data/ext/openssl/ossl_ocsp.c +8 -8
  30. data/ext/openssl/ossl_ocsp.h +1 -8
  31. data/ext/openssl/ossl_pkcs12.c +54 -3
  32. data/ext/openssl/ossl_pkcs12.h +1 -4
  33. data/ext/openssl/ossl_pkcs7.c +79 -22
  34. data/ext/openssl/ossl_pkcs7.h +2 -22
  35. data/ext/openssl/ossl_pkey.c +1 -1
  36. data/ext/openssl/ossl_pkey.h +3 -14
  37. data/ext/openssl/ossl_pkey_dh.c +2 -2
  38. data/ext/openssl/ossl_pkey_dsa.c +2 -2
  39. data/ext/openssl/ossl_pkey_ec.c +6 -6
  40. data/ext/openssl/ossl_pkey_rsa.c +2 -2
  41. data/ext/openssl/ossl_provider.c +1 -1
  42. data/ext/openssl/ossl_rand.c +3 -3
  43. data/ext/openssl/ossl_rand.h +1 -4
  44. data/ext/openssl/ossl_ssl.c +71 -52
  45. data/ext/openssl/ossl_ssl.h +1 -1
  46. data/ext/openssl/ossl_ts.c +73 -15
  47. data/ext/openssl/ossl_ts.h +1 -1
  48. data/ext/openssl/ossl_x509.c +1 -1
  49. data/ext/openssl/ossl_x509.h +1 -20
  50. data/ext/openssl/ossl_x509attr.c +25 -26
  51. data/ext/openssl/ossl_x509cert.c +42 -3
  52. data/ext/openssl/ossl_x509crl.c +8 -4
  53. data/ext/openssl/ossl_x509ext.c +3 -3
  54. data/ext/openssl/ossl_x509name.c +3 -3
  55. data/ext/openssl/ossl_x509req.c +8 -4
  56. data/ext/openssl/ossl_x509revoked.c +2 -2
  57. data/ext/openssl/ossl_x509store.c +16 -11
  58. data/lib/openssl/asn1.rb +188 -0
  59. data/lib/openssl/bn.rb +1 -1
  60. data/lib/openssl/buffering.rb +24 -9
  61. data/lib/openssl/cipher.rb +1 -1
  62. data/lib/openssl/digest.rb +1 -1
  63. data/lib/openssl/marshal.rb +1 -1
  64. data/lib/openssl/ssl.rb +67 -4
  65. data/lib/openssl/version.rb +1 -1
  66. data/lib/openssl/x509.rb +6 -6
  67. data/lib/openssl.rb +2 -1
  68. metadata +6 -4
  69. /data/{LICENSE.txt → COPYING} +0 -0
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licenced under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -161,8 +161,11 @@ get_asn1obj(ASN1_OBJECT *obj)
161
161
  ret = rb_str_new2(OBJ_nid2sn(nid));
162
162
  else{
163
163
  if (!(out = BIO_new(BIO_s_mem())))
164
- ossl_raise(eX509AttrError, NULL);
165
- i2a_ASN1_OBJECT(out, obj);
164
+ ossl_raise(eTimestampError, "BIO_new(BIO_s_mem())");
165
+ if (i2a_ASN1_OBJECT(out, obj) <= 0) {
166
+ BIO_free(out);
167
+ ossl_raise(eTimestampError, "i2a_ASN1_OBJECT");
168
+ }
166
169
  ret = ossl_membio2str(out);
167
170
  }
168
171
 
@@ -503,6 +506,25 @@ ossl_ts_req_to_der(VALUE self)
503
506
  return asn1_to_der((void *)req, (int (*)(void *, unsigned char **))i2d_TS_REQ);
504
507
  }
505
508
 
509
+ static VALUE
510
+ ossl_ts_req_to_text(VALUE self)
511
+ {
512
+ TS_REQ *req;
513
+ BIO *out;
514
+
515
+ GetTSRequest(self, req);
516
+
517
+ out = BIO_new(BIO_s_mem());
518
+ if (!out) ossl_raise(eTimestampError, NULL);
519
+
520
+ if (!TS_REQ_print_bio(out, req)) {
521
+ BIO_free(out);
522
+ ossl_raise(eTimestampError, NULL);
523
+ }
524
+
525
+ return ossl_membio2str(out);
526
+ }
527
+
506
528
  static VALUE
507
529
  ossl_ts_resp_alloc(VALUE klass)
508
530
  {
@@ -672,21 +694,12 @@ static VALUE
672
694
  ossl_ts_resp_get_token(VALUE self)
673
695
  {
674
696
  TS_RESP *resp;
675
- PKCS7 *p7, *copy;
676
- VALUE obj;
697
+ PKCS7 *p7;
677
698
 
678
699
  GetTSResponse(self, resp);
679
700
  if (!(p7 = TS_RESP_get_token(resp)))
680
701
  return Qnil;
681
-
682
- obj = NewPKCS7(cPKCS7);
683
-
684
- if (!(copy = PKCS7_dup(p7)))
685
- ossl_raise(eTimestampError, NULL);
686
-
687
- SetPKCS7(obj, copy);
688
-
689
- return obj;
702
+ return ossl_pkcs7_new(p7);
690
703
  }
691
704
 
692
705
  /*
@@ -757,6 +770,25 @@ ossl_ts_resp_to_der(VALUE self)
757
770
  return asn1_to_der((void *)resp, (int (*)(void *, unsigned char **))i2d_TS_RESP);
758
771
  }
759
772
 
773
+ static VALUE
774
+ ossl_ts_resp_to_text(VALUE self)
775
+ {
776
+ TS_RESP *resp;
777
+ BIO *out;
778
+
779
+ GetTSResponse(self, resp);
780
+
781
+ out = BIO_new(BIO_s_mem());
782
+ if (!out) ossl_raise(eTimestampError, NULL);
783
+
784
+ if (!TS_RESP_print_bio(out, resp)) {
785
+ BIO_free(out);
786
+ ossl_raise(eTimestampError, NULL);
787
+ }
788
+
789
+ return ossl_membio2str(out);
790
+ }
791
+
760
792
  /*
761
793
  * Verifies a timestamp token by checking the signature, validating the
762
794
  * certificate chain implied by tsa_certificate and by checking conformance to
@@ -1073,6 +1105,25 @@ ossl_ts_token_info_to_der(VALUE self)
1073
1105
  return asn1_to_der((void *)info, (int (*)(void *, unsigned char **))i2d_TS_TST_INFO);
1074
1106
  }
1075
1107
 
1108
+ static VALUE
1109
+ ossl_ts_token_info_to_text(VALUE self)
1110
+ {
1111
+ TS_TST_INFO *info;
1112
+ BIO *out;
1113
+
1114
+ GetTSTokenInfo(self, info);
1115
+
1116
+ out = BIO_new(BIO_s_mem());
1117
+ if (!out) ossl_raise(eTimestampError, NULL);
1118
+
1119
+ if (!TS_TST_INFO_print_bio(out, info)) {
1120
+ BIO_free(out);
1121
+ ossl_raise(eTimestampError, NULL);
1122
+ }
1123
+
1124
+ return ossl_membio2str(out);
1125
+ }
1126
+
1076
1127
  static ASN1_INTEGER *
1077
1128
  ossl_tsfac_serial_cb(struct TS_resp_ctx *ctx, void *data)
1078
1129
  {
@@ -1356,6 +1407,7 @@ Init_ossl_ts(void)
1356
1407
  rb_define_method(cTimestampResponse, "token_info", ossl_ts_resp_get_token_info, 0);
1357
1408
  rb_define_method(cTimestampResponse, "tsa_certificate", ossl_ts_resp_get_tsa_certificate, 0);
1358
1409
  rb_define_method(cTimestampResponse, "to_der", ossl_ts_resp_to_der, 0);
1410
+ rb_define_method(cTimestampResponse, "to_text", ossl_ts_resp_to_text, 0);
1359
1411
  rb_define_method(cTimestampResponse, "verify", ossl_ts_resp_verify, -1);
1360
1412
 
1361
1413
  /* Document-class: OpenSSL::Timestamp::TokenInfo
@@ -1374,6 +1426,7 @@ Init_ossl_ts(void)
1374
1426
  rb_define_method(cTimestampTokenInfo, "ordering", ossl_ts_token_info_get_ordering, 0);
1375
1427
  rb_define_method(cTimestampTokenInfo, "nonce", ossl_ts_token_info_get_nonce, 0);
1376
1428
  rb_define_method(cTimestampTokenInfo, "to_der", ossl_ts_token_info_to_der, 0);
1429
+ rb_define_method(cTimestampTokenInfo, "to_text", ossl_ts_token_info_to_text, 0);
1377
1430
 
1378
1431
  /* Document-class: OpenSSL::Timestamp::Request
1379
1432
  * Allows to create timestamp requests or parse existing ones. A Request is
@@ -1399,6 +1452,7 @@ Init_ossl_ts(void)
1399
1452
  rb_define_method(cTimestampRequest, "cert_requested=", ossl_ts_req_set_cert_requested, 1);
1400
1453
  rb_define_method(cTimestampRequest, "cert_requested?", ossl_ts_req_get_cert_requested, 0);
1401
1454
  rb_define_method(cTimestampRequest, "to_der", ossl_ts_req_to_der, 0);
1455
+ rb_define_method(cTimestampRequest, "to_text", ossl_ts_req_to_text, 0);
1402
1456
 
1403
1457
  /*
1404
1458
  * Indicates a successful response. Equal to +0+.
@@ -1535,5 +1589,9 @@ Init_ossl_ts(void)
1535
1589
  rb_attr(cTimestampFactory, rb_intern_const("additional_certs"), 1, 1, 0);
1536
1590
  rb_define_method(cTimestampFactory, "create_timestamp", ossl_tsfac_create_ts, 3);
1537
1591
  }
1538
-
1592
+ #else /* OPENSSL_NO_TS */
1593
+ void
1594
+ Init_ossl_ts(void)
1595
+ {
1596
+ }
1539
1597
  #endif
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licenced under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
 
11
11
  #if !defined(_OSSL_TS_H_)
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #if !defined(_OSSL_X509_H_)
11
11
  #define _OSSL_X509_H_
@@ -28,7 +28,6 @@ void Init_ossl_x509(void);
28
28
  * X509Attr
29
29
  */
30
30
  extern VALUE cX509Attr;
31
- extern VALUE eX509AttrError;
32
31
 
33
32
  VALUE ossl_x509attr_new(X509_ATTRIBUTE *);
34
33
  X509_ATTRIBUTE *GetX509AttrPtr(VALUE);
@@ -38,7 +37,6 @@ void Init_ossl_x509attr(void);
38
37
  * X509Cert
39
38
  */
40
39
  extern VALUE cX509Cert;
41
- extern VALUE eX509CertError;
42
40
 
43
41
  VALUE ossl_x509_new(X509 *);
44
42
  X509 *GetX509CertPtr(VALUE);
@@ -48,9 +46,6 @@ void Init_ossl_x509cert(void);
48
46
  /*
49
47
  * X509CRL
50
48
  */
51
- extern VALUE cX509CRL;
52
- extern VALUE eX509CRLError;
53
-
54
49
  VALUE ossl_x509crl_new(X509_CRL *);
55
50
  X509_CRL *GetX509CRLPtr(VALUE);
56
51
  void Init_ossl_x509crl(void);
@@ -59,8 +54,6 @@ void Init_ossl_x509crl(void);
59
54
  * X509Extension
60
55
  */
61
56
  extern VALUE cX509Ext;
62
- extern VALUE cX509ExtFactory;
63
- extern VALUE eX509ExtError;
64
57
 
65
58
  VALUE ossl_x509ext_new(X509_EXTENSION *);
66
59
  X509_EXTENSION *GetX509ExtPtr(VALUE);
@@ -69,9 +62,6 @@ void Init_ossl_x509ext(void);
69
62
  /*
70
63
  * X509Name
71
64
  */
72
- extern VALUE cX509Name;
73
- extern VALUE eX509NameError;
74
-
75
65
  VALUE ossl_x509name_new(X509_NAME *);
76
66
  X509_NAME *GetX509NamePtr(VALUE);
77
67
  void Init_ossl_x509name(void);
@@ -79,9 +69,6 @@ void Init_ossl_x509name(void);
79
69
  /*
80
70
  * X509Request
81
71
  */
82
- extern VALUE cX509Req;
83
- extern VALUE eX509ReqError;
84
-
85
72
  X509_REQ *GetX509ReqPtr(VALUE);
86
73
  void Init_ossl_x509req(void);
87
74
 
@@ -89,7 +76,6 @@ void Init_ossl_x509req(void);
89
76
  * X509Revoked
90
77
  */
91
78
  extern VALUE cX509Rev;
92
- extern VALUE eX509RevError;
93
79
 
94
80
  VALUE ossl_x509revoked_new(X509_REVOKED *);
95
81
  X509_REVOKED *DupX509RevokedPtr(VALUE);
@@ -98,12 +84,7 @@ void Init_ossl_x509revoked(void);
98
84
  /*
99
85
  * X509Store and X509StoreContext
100
86
  */
101
- extern VALUE cX509Store;
102
- extern VALUE cX509StoreContext;
103
- extern VALUE eX509StoreError;
104
-
105
87
  X509_STORE *GetX509StorePtr(VALUE);
106
-
107
88
  void Init_ossl_x509store(void);
108
89
 
109
90
  /*
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -28,7 +28,7 @@
28
28
  * Classes
29
29
  */
30
30
  VALUE cX509Attr;
31
- VALUE eX509AttrError;
31
+ static VALUE eX509AttrError;
32
32
 
33
33
  static void
34
34
  ossl_x509attr_free(void *ptr)
@@ -201,37 +201,36 @@ static VALUE
201
201
  ossl_x509attr_set_value(VALUE self, VALUE value)
202
202
  {
203
203
  X509_ATTRIBUTE *attr;
204
- VALUE asn1_value;
205
- int i, asn1_tag;
204
+ GetX509Attr(self, attr);
206
205
 
207
206
  OSSL_Check_Kind(value, cASN1Data);
208
- asn1_tag = NUM2INT(rb_attr_get(value, rb_intern("@tag")));
209
- asn1_value = rb_attr_get(value, rb_intern("@value"));
210
- if (asn1_tag != V_ASN1_SET)
211
- ossl_raise(eASN1Error, "argument must be ASN1::Set");
212
- if (!RB_TYPE_P(asn1_value, T_ARRAY))
213
- ossl_raise(eASN1Error, "ASN1::Set has non-array value");
207
+ VALUE der = ossl_to_der(value);
208
+ const unsigned char *p = (const unsigned char *)RSTRING_PTR(der);
209
+ STACK_OF(ASN1_TYPE) *sk = d2i_ASN1_SET_ANY(NULL, &p, RSTRING_LEN(der));
210
+ if (!sk)
211
+ ossl_raise(eX509AttrError, "attribute value must be ASN1::Set");
214
212
 
215
- GetX509Attr(self, attr);
216
213
  if (X509_ATTRIBUTE_count(attr)) { /* populated, reset first */
217
- ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr);
218
- X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, 0, NULL, -1);
219
- if (!new_attr)
220
- ossl_raise(eX509AttrError, NULL);
221
- SetX509Attr(self, new_attr);
222
- X509_ATTRIBUTE_free(attr);
223
- attr = new_attr;
214
+ ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr);
215
+ X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, 0, NULL, -1);
216
+ if (!new_attr) {
217
+ sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
218
+ ossl_raise(eX509AttrError, "X509_ATTRIBUTE_create_by_OBJ");
219
+ }
220
+ SetX509Attr(self, new_attr);
221
+ X509_ATTRIBUTE_free(attr);
222
+ attr = new_attr;
224
223
  }
225
224
 
226
- for (i = 0; i < RARRAY_LEN(asn1_value); i++) {
227
- ASN1_TYPE *a1type = ossl_asn1_get_asn1type(RARRAY_AREF(asn1_value, i));
228
- if (!X509_ATTRIBUTE_set1_data(attr, ASN1_TYPE_get(a1type),
229
- a1type->value.ptr, -1)) {
230
- ASN1_TYPE_free(a1type);
231
- ossl_raise(eX509AttrError, NULL);
232
- }
233
- ASN1_TYPE_free(a1type);
225
+ for (int i = 0; i < sk_ASN1_TYPE_num(sk); i++) {
226
+ ASN1_TYPE *a1type = sk_ASN1_TYPE_value(sk, i);
227
+ if (!X509_ATTRIBUTE_set1_data(attr, ASN1_TYPE_get(a1type),
228
+ a1type->value.ptr, -1)) {
229
+ sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
230
+ ossl_raise(eX509AttrError, "X509_ATTRIBUTE_set1_data");
231
+ }
234
232
  }
233
+ sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
235
234
 
236
235
  return value;
237
236
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -28,7 +28,7 @@
28
28
  * Classes
29
29
  */
30
30
  VALUE cX509Cert;
31
- VALUE eX509CertError;
31
+ static VALUE eX509CertError;
32
32
 
33
33
  static void
34
34
  ossl_x509_free(void *ptr)
@@ -539,7 +539,11 @@ ossl_x509_sign(VALUE self, VALUE key, VALUE digest)
539
539
  const EVP_MD *md;
540
540
 
541
541
  pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
542
- md = ossl_evp_get_digestbyname(digest);
542
+ if (NIL_P(digest)) {
543
+ md = NULL; /* needed for some key types, e.g. Ed25519 */
544
+ } else {
545
+ md = ossl_evp_get_digestbyname(digest);
546
+ }
543
547
  GetX509(self, x509);
544
548
  if (!X509_sign(x509, pkey, md)) {
545
549
  ossl_raise(eX509CertError, NULL);
@@ -707,6 +711,38 @@ ossl_x509_eq(VALUE self, VALUE other)
707
711
  return !X509_cmp(a, b) ? Qtrue : Qfalse;
708
712
  }
709
713
 
714
+ #ifdef HAVE_I2D_RE_X509_TBS
715
+ /*
716
+ * call-seq:
717
+ * cert.tbs_bytes => string
718
+ *
719
+ * Returns the DER-encoded bytes of the certificate's to be signed certificate.
720
+ * This is mainly useful for validating embedded certificate transparency signatures.
721
+ */
722
+ static VALUE
723
+ ossl_x509_tbs_bytes(VALUE self)
724
+ {
725
+ X509 *x509;
726
+ int len;
727
+ unsigned char *p0;
728
+ VALUE str;
729
+
730
+ GetX509(self, x509);
731
+ len = i2d_re_X509_tbs(x509, NULL);
732
+ if (len <= 0) {
733
+ ossl_raise(eX509CertError, "i2d_re_X509_tbs");
734
+ }
735
+ str = rb_str_new(NULL, len);
736
+ p0 = (unsigned char *)RSTRING_PTR(str);
737
+ if (i2d_re_X509_tbs(x509, &p0) <= 0) {
738
+ ossl_raise(eX509CertError, "i2d_re_X509_tbs");
739
+ }
740
+ ossl_str_adjust(str, p0);
741
+
742
+ return str;
743
+ }
744
+ #endif
745
+
710
746
  struct load_chained_certificates_arguments {
711
747
  VALUE certificates;
712
748
  X509 *certificate;
@@ -999,4 +1035,7 @@ Init_ossl_x509cert(void)
999
1035
  rb_define_method(cX509Cert, "add_extension", ossl_x509_add_extension, 1);
1000
1036
  rb_define_method(cX509Cert, "inspect", ossl_x509_inspect, 0);
1001
1037
  rb_define_method(cX509Cert, "==", ossl_x509_eq, 1);
1038
+ #ifdef HAVE_I2D_RE_X509_TBS
1039
+ rb_define_method(cX509Cert, "tbs_bytes", ossl_x509_tbs_bytes, 0);
1040
+ #endif
1002
1041
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -27,8 +27,8 @@
27
27
  /*
28
28
  * Classes
29
29
  */
30
- VALUE cX509CRL;
31
- VALUE eX509CRLError;
30
+ static VALUE cX509CRL;
31
+ static VALUE eX509CRLError;
32
32
 
33
33
  static void
34
34
  ossl_x509crl_free(void *ptr)
@@ -350,7 +350,11 @@ ossl_x509crl_sign(VALUE self, VALUE key, VALUE digest)
350
350
 
351
351
  GetX509CRL(self, crl);
352
352
  pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
353
- md = ossl_evp_get_digestbyname(digest);
353
+ if (NIL_P(digest)) {
354
+ md = NULL; /* needed for some key types, e.g. Ed25519 */
355
+ } else {
356
+ md = ossl_evp_get_digestbyname(digest);
357
+ }
354
358
  if (!X509_CRL_sign(crl, pkey, md)) {
355
359
  ossl_raise(eX509CRLError, NULL);
356
360
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -41,8 +41,8 @@
41
41
  * Classes
42
42
  */
43
43
  VALUE cX509Ext;
44
- VALUE cX509ExtFactory;
45
- VALUE eX509ExtError;
44
+ static VALUE cX509ExtFactory;
45
+ static VALUE eX509ExtError;
46
46
 
47
47
  static void
48
48
  ossl_x509ext_free(void *ptr)
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -32,8 +32,8 @@
32
32
  /*
33
33
  * Classes
34
34
  */
35
- VALUE cX509Name;
36
- VALUE eX509NameError;
35
+ static VALUE cX509Name;
36
+ static VALUE eX509NameError;
37
37
 
38
38
  static void
39
39
  ossl_x509name_free(void *ptr)
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -27,8 +27,8 @@
27
27
  /*
28
28
  * Classes
29
29
  */
30
- VALUE cX509Req;
31
- VALUE eX509ReqError;
30
+ static VALUE cX509Req;
31
+ static VALUE eX509ReqError;
32
32
 
33
33
  static void
34
34
  ossl_x509req_free(void *ptr)
@@ -312,7 +312,11 @@ ossl_x509req_sign(VALUE self, VALUE key, VALUE digest)
312
312
 
313
313
  GetX509Req(self, req);
314
314
  pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
315
- md = ossl_evp_get_digestbyname(digest);
315
+ if (NIL_P(digest)) {
316
+ md = NULL; /* needed for some key types, e.g. Ed25519 */
317
+ } else {
318
+ md = ossl_evp_get_digestbyname(digest);
319
+ }
316
320
  if (!X509_REQ_sign(req, pkey, md)) {
317
321
  ossl_raise(eX509ReqError, NULL);
318
322
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -28,7 +28,7 @@
28
28
  * Classes
29
29
  */
30
30
  VALUE cX509Rev;
31
- VALUE eX509RevError;
31
+ static VALUE eX509RevError;
32
32
 
33
33
  static void
34
34
  ossl_x509rev_free(void *ptr)
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /*
7
7
  * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
8
+ * (See the file 'COPYING'.)
9
9
  */
10
10
  #include "ossl.h"
11
11
 
@@ -108,9 +108,9 @@ ossl_verify_cb_call(VALUE proc, int ok, X509_STORE_CTX *ctx)
108
108
  /*
109
109
  * Classes
110
110
  */
111
- VALUE cX509Store;
112
- VALUE cX509StoreContext;
113
- VALUE eX509StoreError;
111
+ static VALUE cX509Store;
112
+ static VALUE cX509StoreContext;
113
+ static VALUE eX509StoreError;
114
114
 
115
115
  static void
116
116
  ossl_x509store_mark(void *ptr)
@@ -223,7 +223,6 @@ ossl_x509store_initialize(int argc, VALUE *argv, VALUE self)
223
223
  rb_iv_set(self, "@error", Qnil);
224
224
  rb_iv_set(self, "@error_string", Qnil);
225
225
  rb_iv_set(self, "@chain", Qnil);
226
- rb_iv_set(self, "@time", Qnil);
227
226
 
228
227
  return self;
229
228
  }
@@ -329,7 +328,16 @@ ossl_x509store_set_trust(VALUE self, VALUE trust)
329
328
  static VALUE
330
329
  ossl_x509store_set_time(VALUE self, VALUE time)
331
330
  {
332
- rb_iv_set(self, "@time", time);
331
+ X509_STORE *store;
332
+ X509_VERIFY_PARAM *param;
333
+
334
+ GetX509Store(self, store);
335
+ #ifdef HAVE_X509_STORE_GET0_PARAM
336
+ param = X509_STORE_get0_param(store);
337
+ #else
338
+ param = store->param;
339
+ #endif
340
+ X509_VERIFY_PARAM_set_time(param, NUM2LONG(rb_Integer(time)));
333
341
  return time;
334
342
  }
335
343
 
@@ -564,7 +572,6 @@ ossl_x509stctx_new(X509_STORE_CTX *ctx)
564
572
  static VALUE ossl_x509stctx_set_flags(VALUE, VALUE);
565
573
  static VALUE ossl_x509stctx_set_purpose(VALUE, VALUE);
566
574
  static VALUE ossl_x509stctx_set_trust(VALUE, VALUE);
567
- static VALUE ossl_x509stctx_set_time(VALUE, VALUE);
568
575
 
569
576
  /*
570
577
  * call-seq:
@@ -575,7 +582,7 @@ static VALUE ossl_x509stctx_set_time(VALUE, VALUE);
575
582
  static VALUE
576
583
  ossl_x509stctx_initialize(int argc, VALUE *argv, VALUE self)
577
584
  {
578
- VALUE store, cert, chain, t;
585
+ VALUE store, cert, chain;
579
586
  X509_STORE_CTX *ctx;
580
587
  X509_STORE *x509st;
581
588
  X509 *x509 = NULL;
@@ -599,8 +606,6 @@ ossl_x509stctx_initialize(int argc, VALUE *argv, VALUE self)
599
606
  sk_X509_pop_free(x509s, X509_free);
600
607
  ossl_raise(eX509StoreError, "X509_STORE_CTX_init");
601
608
  }
602
- if (!NIL_P(t = rb_iv_get(store, "@time")))
603
- ossl_x509stctx_set_time(self, t);
604
609
  rb_iv_set(self, "@verify_callback", rb_iv_get(store, "@verify_callback"));
605
610
  rb_iv_set(self, "@cert", cert);
606
611
 
@@ -631,7 +636,7 @@ ossl_x509stctx_verify(VALUE self)
631
636
  ossl_clear_error();
632
637
  return Qfalse;
633
638
  default:
634
- ossl_raise(eX509CertError, "X509_verify_cert");
639
+ ossl_raise(eX509StoreError, "X509_verify_cert");
635
640
  }
636
641
  }
637
642