openssl 2.1.3 → 3.0.2

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +35 -45
  3. data/History.md +266 -1
  4. data/README.md +2 -2
  5. data/ext/openssl/extconf.rb +46 -38
  6. data/ext/openssl/openssl_missing.c +0 -66
  7. data/ext/openssl/openssl_missing.h +59 -43
  8. data/ext/openssl/ossl.c +110 -64
  9. data/ext/openssl/ossl.h +27 -10
  10. data/ext/openssl/ossl_asn1.c +41 -4
  11. data/ext/openssl/ossl_bn.c +251 -134
  12. data/ext/openssl/ossl_bn.h +2 -1
  13. data/ext/openssl/ossl_cipher.c +38 -29
  14. data/ext/openssl/ossl_config.c +412 -41
  15. data/ext/openssl/ossl_config.h +4 -7
  16. data/ext/openssl/ossl_digest.c +25 -60
  17. data/ext/openssl/ossl_engine.c +18 -27
  18. data/ext/openssl/ossl_hmac.c +60 -145
  19. data/ext/openssl/ossl_kdf.c +11 -19
  20. data/ext/openssl/ossl_ns_spki.c +1 -1
  21. data/ext/openssl/ossl_ocsp.c +9 -62
  22. data/ext/openssl/ossl_ocsp.h +3 -3
  23. data/ext/openssl/ossl_pkcs12.c +21 -3
  24. data/ext/openssl/ossl_pkcs7.c +45 -78
  25. data/ext/openssl/ossl_pkcs7.h +16 -0
  26. data/ext/openssl/ossl_pkey.c +1295 -178
  27. data/ext/openssl/ossl_pkey.h +35 -72
  28. data/ext/openssl/ossl_pkey_dh.c +124 -334
  29. data/ext/openssl/ossl_pkey_dsa.c +93 -398
  30. data/ext/openssl/ossl_pkey_ec.c +186 -329
  31. data/ext/openssl/ossl_pkey_rsa.c +105 -484
  32. data/ext/openssl/ossl_rand.c +2 -32
  33. data/ext/openssl/ossl_ssl.c +347 -394
  34. data/ext/openssl/ossl_ssl_session.c +24 -29
  35. data/ext/openssl/ossl_ts.c +1539 -0
  36. data/ext/openssl/ossl_ts.h +16 -0
  37. data/ext/openssl/ossl_x509.c +0 -6
  38. data/ext/openssl/ossl_x509cert.c +169 -13
  39. data/ext/openssl/ossl_x509crl.c +13 -10
  40. data/ext/openssl/ossl_x509ext.c +15 -2
  41. data/ext/openssl/ossl_x509name.c +15 -4
  42. data/ext/openssl/ossl_x509req.c +13 -10
  43. data/ext/openssl/ossl_x509revoked.c +3 -3
  44. data/ext/openssl/ossl_x509store.c +154 -70
  45. data/lib/openssl/bn.rb +1 -1
  46. data/lib/openssl/buffering.rb +37 -5
  47. data/lib/openssl/cipher.rb +1 -1
  48. data/lib/openssl/digest.rb +10 -12
  49. data/lib/openssl/hmac.rb +78 -0
  50. data/lib/openssl/marshal.rb +30 -0
  51. data/lib/openssl/pkcs5.rb +1 -1
  52. data/lib/openssl/pkey.rb +443 -1
  53. data/lib/openssl/ssl.rb +47 -9
  54. data/lib/openssl/version.rb +5 -0
  55. data/lib/openssl/x509.rb +177 -1
  56. data/lib/openssl.rb +24 -9
  57. metadata +10 -79
  58. data/ext/openssl/deprecation.rb +0 -27
  59. data/ext/openssl/ossl_version.h +0 -15
  60. data/ext/openssl/ruby_missing.h +0 -24
  61. data/lib/openssl/config.rb +0 -492
@@ -9,81 +9,452 @@
9
9
  */
10
10
  #include "ossl.h"
11
11
 
12
+ static VALUE cConfig, eConfigError;
13
+
14
+ static void
15
+ nconf_free(void *conf)
16
+ {
17
+ NCONF_free(conf);
18
+ }
19
+
20
+ static const rb_data_type_t ossl_config_type = {
21
+ "OpenSSL/CONF",
22
+ {
23
+ 0, nconf_free,
24
+ },
25
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
26
+ };
27
+
28
+ CONF *
29
+ GetConfig(VALUE obj)
30
+ {
31
+ CONF *conf;
32
+
33
+ TypedData_Get_Struct(obj, CONF, &ossl_config_type, conf);
34
+ if (!conf)
35
+ rb_raise(rb_eRuntimeError, "CONF is not initialized");
36
+ return conf;
37
+ }
38
+
39
+ static VALUE
40
+ config_s_alloc(VALUE klass)
41
+ {
42
+ VALUE obj;
43
+ CONF *conf;
44
+
45
+ obj = TypedData_Wrap_Struct(klass, &ossl_config_type, 0);
46
+ conf = NCONF_new(NULL);
47
+ if (!conf)
48
+ ossl_raise(eConfigError, "NCONF_new");
49
+ RTYPEDDATA_DATA(obj) = conf;
50
+ return obj;
51
+ }
52
+
53
+ static void
54
+ config_load_bio(CONF *conf, BIO *bio)
55
+ {
56
+ long eline = -1;
57
+
58
+ if (!NCONF_load_bio(conf, bio, &eline)) {
59
+ BIO_free(bio);
60
+ if (eline <= 0)
61
+ ossl_raise(eConfigError, "wrong config format");
62
+ else
63
+ ossl_raise(eConfigError, "error in line %ld", eline);
64
+ }
65
+ BIO_free(bio);
66
+
67
+ /*
68
+ * Clear the error queue even if it is parsed successfully.
69
+ * Particularly, when the .include directive refers to a non-existent file,
70
+ * it is only reported in the error queue.
71
+ */
72
+ ossl_clear_error();
73
+ }
12
74
 
13
75
  /*
14
- * Classes
15
- */
16
- VALUE cConfig;
17
- /* Document-class: OpenSSL::ConfigError
76
+ * call-seq:
77
+ * Config.parse(string) -> OpenSSL::Config
18
78
  *
19
- * General error for openssl library configuration files. Including formatting,
20
- * parsing errors, etc.
79
+ * Parses a given _string_ as a blob that contains configuration for OpenSSL.
21
80
  */
22
- VALUE eConfigError;
81
+ static VALUE
82
+ config_s_parse(VALUE klass, VALUE str)
83
+ {
84
+ VALUE obj = config_s_alloc(klass);
85
+ CONF *conf = GetConfig(obj);
86
+ BIO *bio;
87
+
88
+ bio = ossl_obj2bio(&str);
89
+ config_load_bio(conf, bio); /* Consumes BIO */
90
+ return obj;
91
+ }
92
+
93
+ static VALUE config_get_sections(VALUE self);
94
+ static VALUE config_get_section(VALUE self, VALUE section);
23
95
 
24
96
  /*
25
- * Public
97
+ * call-seq:
98
+ * Config.parse_config(io) -> hash
99
+ *
100
+ * Parses the configuration data read from _io_ and returns the whole content
101
+ * as a Hash.
26
102
  */
103
+ static VALUE
104
+ config_s_parse_config(VALUE klass, VALUE io)
105
+ {
106
+ VALUE obj, sections, ret;
107
+ long i;
108
+
109
+ obj = config_s_parse(klass, io);
110
+ sections = config_get_sections(obj);
111
+ ret = rb_hash_new();
112
+ for (i = 0; i < RARRAY_LEN(sections); i++) {
113
+ VALUE section = rb_ary_entry(sections, i);
114
+ rb_hash_aset(ret, section, config_get_section(obj, section));
115
+ }
116
+ return ret;
117
+ }
27
118
 
28
119
  /*
29
- * DupConfigPtr is a public C-level function for getting OpenSSL CONF struct
30
- * from an OpenSSL::Config(eConfig) instance. We decided to implement
31
- * OpenSSL::Config in Ruby level but we need to pass native CONF struct for
32
- * some OpenSSL features such as X509V3_EXT_*.
120
+ * call-seq:
121
+ * Config.new(filename) -> OpenSSL::Config
122
+ *
123
+ * Creates an instance of OpenSSL::Config from the content of the file
124
+ * specified by _filename_.
125
+ *
126
+ * This can be used in contexts like OpenSSL::X509::ExtensionFactory.config=
127
+ *
128
+ * This can raise IO exceptions based on the access, or availability of the
129
+ * file. A ConfigError exception may be raised depending on the validity of
130
+ * the data being configured.
33
131
  */
34
- CONF *
35
- DupConfigPtr(VALUE obj)
132
+ static VALUE
133
+ config_initialize(int argc, VALUE *argv, VALUE self)
36
134
  {
37
- CONF *conf;
135
+ CONF *conf = GetConfig(self);
136
+ VALUE filename;
137
+
138
+ /* 0-arguments call has no use-case, but is kept for compatibility */
139
+ rb_scan_args(argc, argv, "01", &filename);
140
+ rb_check_frozen(self);
141
+ if (!NIL_P(filename)) {
142
+ BIO *bio = BIO_new_file(StringValueCStr(filename), "rb");
143
+ if (!bio)
144
+ ossl_raise(eConfigError, "BIO_new_file");
145
+ config_load_bio(conf, bio); /* Consumes BIO */
146
+ }
147
+ return self;
148
+ }
149
+
150
+ static VALUE
151
+ config_initialize_copy(VALUE self, VALUE other)
152
+ {
153
+ CONF *conf = GetConfig(self);
38
154
  VALUE str;
39
155
  BIO *bio;
40
- long eline = -1;
41
156
 
42
- OSSL_Check_Kind(obj, cConfig);
43
- str = rb_funcall(obj, rb_intern("to_s"), 0);
157
+ str = rb_funcall(other, rb_intern("to_s"), 0);
158
+ rb_check_frozen(self);
44
159
  bio = ossl_obj2bio(&str);
45
- conf = NCONF_new(NULL);
46
- if(!conf){
47
- BIO_free(bio);
48
- ossl_raise(eConfigError, NULL);
160
+ config_load_bio(conf, bio); /* Consumes BIO */
161
+ return self;
162
+ }
163
+
164
+ /*
165
+ * call-seq:
166
+ * config.get_value(section, key) -> string
167
+ *
168
+ * Gets the value of _key_ from the given _section_.
169
+ *
170
+ * Given the following configurating file being loaded:
171
+ *
172
+ * config = OpenSSL::Config.load('foo.cnf')
173
+ * #=> #<OpenSSL::Config sections=["default"]>
174
+ * puts config.to_s
175
+ * #=> [ default ]
176
+ * # foo=bar
177
+ *
178
+ * You can get a specific value from the config if you know the _section_
179
+ * and _key_ like so:
180
+ *
181
+ * config.get_value('default','foo')
182
+ * #=> "bar"
183
+ */
184
+ static VALUE
185
+ config_get_value(VALUE self, VALUE section, VALUE key)
186
+ {
187
+ CONF *conf = GetConfig(self);
188
+ const char *str, *sectionp;
189
+
190
+ StringValueCStr(section);
191
+ StringValueCStr(key);
192
+ /* For compatibility; NULL means "default". */
193
+ sectionp = RSTRING_LEN(section) ? RSTRING_PTR(section) : NULL;
194
+ str = NCONF_get_string(conf, sectionp, RSTRING_PTR(key));
195
+ if (!str) {
196
+ ossl_clear_error();
197
+ return Qnil;
198
+ }
199
+ return rb_str_new_cstr(str);
200
+ }
201
+
202
+ /*
203
+ * call-seq:
204
+ * config[section] -> hash
205
+ *
206
+ * Gets all key-value pairs in a specific _section_ from the current
207
+ * configuration.
208
+ *
209
+ * Given the following configurating file being loaded:
210
+ *
211
+ * config = OpenSSL::Config.load('foo.cnf')
212
+ * #=> #<OpenSSL::Config sections=["default"]>
213
+ * puts config.to_s
214
+ * #=> [ default ]
215
+ * # foo=bar
216
+ *
217
+ * You can get a hash of the specific section like so:
218
+ *
219
+ * config['default']
220
+ * #=> {"foo"=>"bar"}
221
+ *
222
+ */
223
+ static VALUE
224
+ config_get_section(VALUE self, VALUE section)
225
+ {
226
+ CONF *conf = GetConfig(self);
227
+ STACK_OF(CONF_VALUE) *sk;
228
+ int i, entries;
229
+ VALUE hash;
230
+
231
+ hash = rb_hash_new();
232
+ StringValueCStr(section);
233
+ if (!(sk = NCONF_get_section(conf, RSTRING_PTR(section)))) {
234
+ ossl_clear_error();
235
+ return hash;
49
236
  }
50
- if(!NCONF_load_bio(conf, bio, &eline)){
51
- BIO_free(bio);
52
- NCONF_free(conf);
53
- if (eline <= 0)
54
- ossl_raise(eConfigError, "wrong config format");
55
- else
56
- ossl_raise(eConfigError, "error in line %d", eline);
237
+ entries = sk_CONF_VALUE_num(sk);
238
+ for (i = 0; i < entries; i++) {
239
+ CONF_VALUE *entry = sk_CONF_VALUE_value(sk, i);
240
+ rb_hash_aset(hash, rb_str_new_cstr(entry->name),
241
+ rb_str_new_cstr(entry->value));
57
242
  }
58
- BIO_free(bio);
243
+ return hash;
244
+ }
59
245
 
60
- return conf;
246
+ static void
247
+ get_conf_section_doall_arg(CONF_VALUE *cv, VALUE *aryp)
248
+ {
249
+ if (cv->name)
250
+ return;
251
+ rb_ary_push(*aryp, rb_str_new_cstr(cv->section));
61
252
  }
62
253
 
63
- /* Document-const: DEFAULT_CONFIG_FILE
254
+ /* IMPLEMENT_LHASH_DOALL_ARG_CONST() requires >= OpenSSL 1.1.0 */
255
+ static IMPLEMENT_LHASH_DOALL_ARG_FN(get_conf_section, CONF_VALUE, VALUE)
256
+
257
+ /*
258
+ * call-seq:
259
+ * config.sections -> array of string
64
260
  *
65
- * The default system configuration file for openssl
261
+ * Get the names of all sections in the current configuration.
66
262
  */
263
+ static VALUE
264
+ config_get_sections(VALUE self)
265
+ {
266
+ CONF *conf = GetConfig(self);
267
+ VALUE ary;
268
+
269
+ ary = rb_ary_new();
270
+ lh_doall_arg((_LHASH *)conf->data, LHASH_DOALL_ARG_FN(get_conf_section),
271
+ &ary);
272
+ return ary;
273
+ }
274
+
275
+ static void
276
+ dump_conf_value_doall_arg(CONF_VALUE *cv, VALUE *strp)
277
+ {
278
+ VALUE str = *strp;
279
+ STACK_OF(CONF_VALUE) *sk;
280
+ int i, num;
281
+
282
+ if (cv->name)
283
+ return;
284
+ sk = (STACK_OF(CONF_VALUE) *)cv->value;
285
+ num = sk_CONF_VALUE_num(sk);
286
+ rb_str_cat_cstr(str, "[ ");
287
+ rb_str_cat_cstr(str, cv->section);
288
+ rb_str_cat_cstr(str, " ]\n");
289
+ for (i = 0; i < num; i++){
290
+ CONF_VALUE *v = sk_CONF_VALUE_value(sk, i);
291
+ rb_str_cat_cstr(str, v->name ? v->name : "None");
292
+ rb_str_cat_cstr(str, "=");
293
+ rb_str_cat_cstr(str, v->value ? v->value : "None");
294
+ rb_str_cat_cstr(str, "\n");
295
+ }
296
+ rb_str_cat_cstr(str, "\n");
297
+ }
298
+
299
+ static IMPLEMENT_LHASH_DOALL_ARG_FN(dump_conf_value, CONF_VALUE, VALUE)
67
300
 
68
301
  /*
69
- * INIT
302
+ * call-seq:
303
+ * config.to_s -> string
304
+ *
305
+ *
306
+ * Gets the parsable form of the current configuration.
307
+ *
308
+ * Given the following configuration being created:
309
+ *
310
+ * config = OpenSSL::Config.new
311
+ * #=> #<OpenSSL::Config sections=[]>
312
+ * config['default'] = {"foo"=>"bar","baz"=>"buz"}
313
+ * #=> {"foo"=>"bar", "baz"=>"buz"}
314
+ * puts config.to_s
315
+ * #=> [ default ]
316
+ * # foo=bar
317
+ * # baz=buz
318
+ *
319
+ * You can parse get the serialized configuration using #to_s and then parse
320
+ * it later:
321
+ *
322
+ * serialized_config = config.to_s
323
+ * # much later...
324
+ * new_config = OpenSSL::Config.parse(serialized_config)
325
+ * #=> #<OpenSSL::Config sections=["default"]>
326
+ * puts new_config
327
+ * #=> [ default ]
328
+ * foo=bar
329
+ * baz=buz
70
330
  */
331
+ static VALUE
332
+ config_to_s(VALUE self)
333
+ {
334
+ CONF *conf = GetConfig(self);
335
+ VALUE str;
336
+
337
+ str = rb_str_new(NULL, 0);
338
+ lh_doall_arg((_LHASH *)conf->data, LHASH_DOALL_ARG_FN(dump_conf_value),
339
+ &str);
340
+ return str;
341
+ }
342
+
343
+ static void
344
+ each_conf_value_doall_arg(CONF_VALUE *cv, void *unused)
345
+ {
346
+ STACK_OF(CONF_VALUE) *sk;
347
+ VALUE section;
348
+ int i, num;
349
+
350
+ if (cv->name)
351
+ return;
352
+ sk = (STACK_OF(CONF_VALUE) *)cv->value;
353
+ num = sk_CONF_VALUE_num(sk);
354
+ section = rb_str_new_cstr(cv->section);
355
+ for (i = 0; i < num; i++){
356
+ CONF_VALUE *v = sk_CONF_VALUE_value(sk, i);
357
+ VALUE name = v->name ? rb_str_new_cstr(v->name) : Qnil;
358
+ VALUE value = v->value ? rb_str_new_cstr(v->value) : Qnil;
359
+ rb_yield(rb_ary_new3(3, section, name, value));
360
+ }
361
+ }
362
+
363
+ static IMPLEMENT_LHASH_DOALL_ARG_FN(each_conf_value, CONF_VALUE, void)
364
+
365
+ /*
366
+ * call-seq:
367
+ * config.each { |section, key, value| }
368
+ *
369
+ * Retrieves the section and its pairs for the current configuration.
370
+ *
371
+ * config.each do |section, key, value|
372
+ * # ...
373
+ * end
374
+ */
375
+ static VALUE
376
+ config_each(VALUE self)
377
+ {
378
+ CONF *conf = GetConfig(self);
379
+
380
+ RETURN_ENUMERATOR(self, 0, 0);
381
+
382
+ lh_doall_arg((_LHASH *)conf->data, LHASH_DOALL_ARG_FN(each_conf_value),
383
+ NULL);
384
+ return self;
385
+ }
386
+
387
+ /*
388
+ * call-seq:
389
+ * config.inspect -> string
390
+ *
391
+ * String representation of this configuration object, including the class
392
+ * name and its sections.
393
+ */
394
+ static VALUE
395
+ config_inspect(VALUE self)
396
+ {
397
+ VALUE str, ary = config_get_sections(self);
398
+ const char *cname = rb_class2name(rb_obj_class(self));
399
+
400
+ str = rb_str_new_cstr("#<");
401
+ rb_str_cat_cstr(str, cname);
402
+ rb_str_cat_cstr(str, " sections=");
403
+ rb_str_append(str, rb_inspect(ary));
404
+ rb_str_cat_cstr(str, ">");
405
+
406
+ return str;
407
+ }
408
+
71
409
  void
72
410
  Init_ossl_config(void)
73
411
  {
74
- char *default_config_file;
412
+ char *path;
413
+ VALUE path_str;
75
414
 
76
415
  #if 0
77
416
  mOSSL = rb_define_module("OpenSSL");
78
417
  eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
79
418
  #endif
80
419
 
81
- eConfigError = rb_define_class_under(mOSSL, "ConfigError", eOSSLError);
420
+ /* Document-class: OpenSSL::Config
421
+ *
422
+ * Configuration for the openssl library.
423
+ *
424
+ * Many system's installation of openssl library will depend on your system
425
+ * configuration. See the value of OpenSSL::Config::DEFAULT_CONFIG_FILE for
426
+ * the location of the file for your host.
427
+ *
428
+ * See also http://www.openssl.org/docs/apps/config.html
429
+ */
82
430
  cConfig = rb_define_class_under(mOSSL, "Config", rb_cObject);
83
431
 
84
- default_config_file = CONF_get1_default_config_file();
85
- rb_define_const(cConfig, "DEFAULT_CONFIG_FILE",
86
- rb_str_new2(default_config_file));
87
- OPENSSL_free(default_config_file);
88
- /* methods are defined by openssl/config.rb */
432
+ /* Document-class: OpenSSL::ConfigError
433
+ *
434
+ * General error for openssl library configuration files. Including formatting,
435
+ * parsing errors, etc.
436
+ */
437
+ eConfigError = rb_define_class_under(mOSSL, "ConfigError", eOSSLError);
438
+
439
+ rb_include_module(cConfig, rb_mEnumerable);
440
+ rb_define_singleton_method(cConfig, "parse", config_s_parse, 1);
441
+ rb_define_singleton_method(cConfig, "parse_config", config_s_parse_config, 1);
442
+ rb_define_alias(CLASS_OF(cConfig), "load", "new");
443
+ rb_define_alloc_func(cConfig, config_s_alloc);
444
+ rb_define_method(cConfig, "initialize", config_initialize, -1);
445
+ rb_define_method(cConfig, "initialize_copy", config_initialize_copy, 1);
446
+ rb_define_method(cConfig, "get_value", config_get_value, 2);
447
+ rb_define_method(cConfig, "[]", config_get_section, 1);
448
+ rb_define_method(cConfig, "sections", config_get_sections, 0);
449
+ rb_define_method(cConfig, "to_s", config_to_s, 0);
450
+ rb_define_method(cConfig, "each", config_each, 0);
451
+ rb_define_method(cConfig, "inspect", config_inspect, 0);
452
+
453
+ /* Document-const: DEFAULT_CONFIG_FILE
454
+ *
455
+ * The default system configuration file for OpenSSL.
456
+ */
457
+ path = CONF_get1_default_config_file();
458
+ path_str = ossl_buf2str(path, rb_long2int(strlen(path)));
459
+ rb_define_const(cConfig, "DEFAULT_CONFIG_FILE", path_str);
89
460
  }
@@ -7,13 +7,10 @@
7
7
  * This program is licensed under the same licence as Ruby.
8
8
  * (See the file 'LICENCE'.)
9
9
  */
10
- #if !defined(_OSSL_CONFIG_H_)
11
- #define _OSSL_CONFIG_H_
10
+ #ifndef OSSL_CONFIG_H
11
+ #define OSSL_CONFIG_H
12
12
 
13
- extern VALUE cConfig;
14
- extern VALUE eConfigError;
15
-
16
- CONF* DupConfigPtr(VALUE obj);
13
+ CONF *GetConfig(VALUE obj);
17
14
  void Init_ossl_config(void);
18
15
 
19
- #endif /* _OSSL_CONFIG_H_ */
16
+ #endif /* OSSL_CONFIG_H */
@@ -63,7 +63,7 @@ ossl_evp_get_digestbyname(VALUE obj)
63
63
 
64
64
  GetDigest(obj, ctx);
65
65
 
66
- md = EVP_MD_CTX_md(ctx);
66
+ md = EVP_MD_CTX_get0_md(ctx);
67
67
  }
68
68
 
69
69
  return md;
@@ -176,7 +176,7 @@ ossl_digest_reset(VALUE self)
176
176
  EVP_MD_CTX *ctx;
177
177
 
178
178
  GetDigest(self, ctx);
179
- if (EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL) != 1) {
179
+ if (EVP_DigestInit_ex(ctx, EVP_MD_CTX_get0_md(ctx), NULL) != 1) {
180
180
  ossl_raise(eDigestError, "Digest initialization failed.");
181
181
  }
182
182
 
@@ -192,7 +192,7 @@ ossl_digest_reset(VALUE self)
192
192
  * be passed individually to the Digest instance.
193
193
  *
194
194
  * === Example
195
- * digest = OpenSSL::Digest::SHA256.new
195
+ * digest = OpenSSL::Digest.new('SHA256')
196
196
  * digest.update('First input')
197
197
  * digest << 'Second input' # equivalent to digest.update('Second input')
198
198
  * result = digest.digest
@@ -248,7 +248,7 @@ ossl_digest_finish(int argc, VALUE *argv, VALUE self)
248
248
  * Returns the sn of this Digest algorithm.
249
249
  *
250
250
  * === Example
251
- * digest = OpenSSL::Digest::SHA512.new
251
+ * digest = OpenSSL::Digest.new('SHA512')
252
252
  * puts digest.name # => SHA512
253
253
  *
254
254
  */
@@ -259,7 +259,7 @@ ossl_digest_name(VALUE self)
259
259
 
260
260
  GetDigest(self, ctx);
261
261
 
262
- return rb_str_new2(EVP_MD_name(EVP_MD_CTX_md(ctx)));
262
+ return rb_str_new_cstr(EVP_MD_name(EVP_MD_CTX_get0_md(ctx)));
263
263
  }
264
264
 
265
265
  /*
@@ -270,7 +270,7 @@ ossl_digest_name(VALUE self)
270
270
  * final message digest result.
271
271
  *
272
272
  * === Example
273
- * digest = OpenSSL::Digest::SHA1.new
273
+ * digest = OpenSSL::Digest.new('SHA1')
274
274
  * puts digest.digest_length # => 20
275
275
  *
276
276
  */
@@ -294,7 +294,7 @@ ossl_digest_size(VALUE self)
294
294
  * consecutively.
295
295
  *
296
296
  * === Example
297
- * digest = OpenSSL::Digest::SHA1.new
297
+ * digest = OpenSSL::Digest.new('SHA1')
298
298
  * puts digest.block_length # => 64
299
299
  */
300
300
  static VALUE
@@ -346,54 +346,19 @@ Init_ossl_digest(void)
346
346
  * the integrity of a signed document, it suffices to re-compute the hash
347
347
  * and verify that it is equal to that in the signature.
348
348
  *
349
- * Among the supported message digest algorithms are:
350
- * * SHA, SHA1, SHA224, SHA256, SHA384 and SHA512
351
- * * MD2, MD4, MDC2 and MD5
352
- * * RIPEMD160
353
- * * DSS, DSS1 (Pseudo algorithms to be used for DSA signatures. DSS is
354
- * equal to SHA and DSS1 is equal to SHA1)
349
+ * You can get a list of all digest algorithms supported on your system by
350
+ * running this command in your terminal:
355
351
  *
356
- * For each of these algorithms, there is a sub-class of Digest that
357
- * can be instantiated as simply as e.g.
352
+ * openssl list -digest-algorithms
358
353
  *
359
- * digest = OpenSSL::Digest::SHA1.new
354
+ * Among the OpenSSL 1.1.1 supported message digest algorithms are:
355
+ * * SHA224, SHA256, SHA384, SHA512, SHA512-224 and SHA512-256
356
+ * * SHA3-224, SHA3-256, SHA3-384 and SHA3-512
357
+ * * BLAKE2s256 and BLAKE2b512
360
358
  *
361
- * === Mapping between Digest class and sn/ln
359
+ * Each of these algorithms can be instantiated using the name:
362
360
  *
363
- * The sn (short names) and ln (long names) are defined in
364
- * <openssl/object.h> and <openssl/obj_mac.h>. They are textual
365
- * representations of ASN.1 OBJECT IDENTIFIERs. Each supported digest
366
- * algorithm has an OBJECT IDENTIFIER associated to it and those again
367
- * have short/long names assigned to them.
368
- * E.g. the OBJECT IDENTIFIER for SHA-1 is 1.3.14.3.2.26 and its
369
- * sn is "SHA1" and its ln is "sha1".
370
- * ==== MD2
371
- * * sn: MD2
372
- * * ln: md2
373
- * ==== MD4
374
- * * sn: MD4
375
- * * ln: md4
376
- * ==== MD5
377
- * * sn: MD5
378
- * * ln: md5
379
- * ==== SHA
380
- * * sn: SHA
381
- * * ln: SHA
382
- * ==== SHA-1
383
- * * sn: SHA1
384
- * * ln: sha1
385
- * ==== SHA-224
386
- * * sn: SHA224
387
- * * ln: sha224
388
- * ==== SHA-256
389
- * * sn: SHA256
390
- * * ln: sha256
391
- * ==== SHA-384
392
- * * sn: SHA384
393
- * * ln: sha384
394
- * ==== SHA-512
395
- * * sn: SHA512
396
- * * ln: sha512
361
+ * digest = OpenSSL::Digest.new('SHA256')
397
362
  *
398
363
  * "Breaking" a message digest algorithm means defying its one-way
399
364
  * function characteristics, i.e. producing a collision or finding a way
@@ -405,16 +370,16 @@ Init_ossl_digest(void)
405
370
  *
406
371
  * === Hashing a file
407
372
  *
408
- * data = File.read('document')
409
- * sha256 = OpenSSL::Digest::SHA256.new
373
+ * data = File.binread('document')
374
+ * sha256 = OpenSSL::Digest.new('SHA256')
410
375
  * digest = sha256.digest(data)
411
376
  *
412
377
  * === Hashing several pieces of data at once
413
378
  *
414
- * data1 = File.read('file1')
415
- * data2 = File.read('file2')
416
- * data3 = File.read('file3')
417
- * sha256 = OpenSSL::Digest::SHA256.new
379
+ * data1 = File.binread('file1')
380
+ * data2 = File.binread('file2')
381
+ * data3 = File.binread('file3')
382
+ * sha256 = OpenSSL::Digest.new('SHA256')
418
383
  * sha256 << data1
419
384
  * sha256 << data2
420
385
  * sha256 << data3
@@ -422,11 +387,11 @@ Init_ossl_digest(void)
422
387
  *
423
388
  * === Reuse a Digest instance
424
389
  *
425
- * data1 = File.read('file1')
426
- * sha256 = OpenSSL::Digest::SHA256.new
390
+ * data1 = File.binread('file1')
391
+ * sha256 = OpenSSL::Digest.new('SHA256')
427
392
  * digest1 = sha256.digest(data1)
428
393
  *
429
- * data2 = File.read('file2')
394
+ * data2 = File.binread('file2')
430
395
  * sha256.reset
431
396
  * digest2 = sha256.digest(data2)
432
397
  *