openssl 2.1.4 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +9 -7
  3. data/History.md +68 -37
  4. data/README.md +2 -2
  5. data/ext/openssl/extconf.rb +43 -41
  6. data/ext/openssl/openssl_missing.h +36 -1
  7. data/ext/openssl/ossl.c +49 -23
  8. data/ext/openssl/ossl.h +7 -4
  9. data/ext/openssl/ossl_asn1.c +25 -0
  10. data/ext/openssl/ossl_bn.c +16 -23
  11. data/ext/openssl/ossl_cipher.c +33 -24
  12. data/ext/openssl/ossl_digest.c +18 -57
  13. data/ext/openssl/ossl_engine.c +2 -12
  14. data/ext/openssl/ossl_hmac.c +5 -11
  15. data/ext/openssl/ossl_kdf.c +3 -19
  16. data/ext/openssl/ossl_ns_spki.c +1 -1
  17. data/ext/openssl/ossl_ocsp.c +6 -11
  18. data/ext/openssl/ossl_ocsp.h +3 -3
  19. data/ext/openssl/ossl_pkcs7.c +3 -19
  20. data/ext/openssl/ossl_pkcs7.h +16 -0
  21. data/ext/openssl/ossl_pkey.c +180 -14
  22. data/ext/openssl/ossl_pkey_dsa.c +2 -2
  23. data/ext/openssl/ossl_pkey_ec.c +37 -8
  24. data/ext/openssl/ossl_pkey_rsa.c +17 -9
  25. data/ext/openssl/ossl_rand.c +2 -32
  26. data/ext/openssl/ossl_ssl.c +78 -72
  27. data/ext/openssl/ossl_ts.c +1514 -0
  28. data/ext/openssl/ossl_ts.h +16 -0
  29. data/ext/openssl/ossl_x509cert.c +2 -2
  30. data/ext/openssl/ossl_x509ext.c +14 -0
  31. data/ext/openssl/ossl_x509name.c +7 -3
  32. data/ext/openssl/ossl_x509store.c +20 -39
  33. data/lib/openssl/bn.rb +1 -1
  34. data/lib/openssl/buffering.rb +28 -5
  35. data/lib/openssl/cipher.rb +1 -1
  36. data/lib/openssl/config.rb +17 -8
  37. data/lib/openssl/digest.rb +10 -12
  38. data/lib/openssl/hmac.rb +13 -0
  39. data/lib/openssl/marshal.rb +30 -0
  40. data/lib/openssl/pkcs5.rb +1 -1
  41. data/lib/openssl/pkey.rb +18 -1
  42. data/lib/openssl/ssl.rb +40 -2
  43. data/lib/openssl/version.rb +5 -0
  44. data/lib/openssl/x509.rb +155 -1
  45. data/lib/openssl.rb +25 -9
  46. metadata +13 -24
  47. data/ext/openssl/deprecation.rb +0 -27
  48. data/ext/openssl/ossl_version.h +0 -15
@@ -173,7 +173,6 @@ ossl_bn_alloc(VALUE klass)
173
173
 
174
174
  /*
175
175
  * call-seq:
176
- * OpenSSL::BN.new => aBN
177
176
  * OpenSSL::BN.new(bn) => aBN
178
177
  * OpenSSL::BN.new(integer) => aBN
179
178
  * OpenSSL::BN.new(string) => aBN
@@ -193,6 +192,10 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
193
192
  base = NUM2INT(bs);
194
193
  }
195
194
 
195
+ if (NIL_P(str)) {
196
+ ossl_raise(rb_eArgError, "invalid argument");
197
+ }
198
+
196
199
  if (RB_INTEGER_TYPE_P(str)) {
197
200
  GetBN(self, bn);
198
201
  integer_to_bnptr(str, bn);
@@ -400,7 +403,7 @@ ossl_bn_is_negative(VALUE self)
400
403
  if (!(result = BN_new())) { \
401
404
  ossl_raise(eBNError, NULL); \
402
405
  } \
403
- if (BN_##func(result, bn, ossl_bn_ctx) <= 0) { \
406
+ if (!BN_##func(result, bn, ossl_bn_ctx)) { \
404
407
  BN_free(result); \
405
408
  ossl_raise(eBNError, NULL); \
406
409
  } \
@@ -426,7 +429,7 @@ BIGNUM_1c(sqr)
426
429
  if (!(result = BN_new())) { \
427
430
  ossl_raise(eBNError, NULL); \
428
431
  } \
429
- if (BN_##func(result, bn1, bn2) <= 0) { \
432
+ if (!BN_##func(result, bn1, bn2)) { \
430
433
  BN_free(result); \
431
434
  ossl_raise(eBNError, NULL); \
432
435
  } \
@@ -459,7 +462,7 @@ BIGNUM_2(sub)
459
462
  if (!(result = BN_new())) { \
460
463
  ossl_raise(eBNError, NULL); \
461
464
  } \
462
- if (BN_##func(result, bn1, bn2, ossl_bn_ctx) <= 0) { \
465
+ if (!BN_##func(result, bn1, bn2, ossl_bn_ctx)) { \
463
466
  BN_free(result); \
464
467
  ossl_raise(eBNError, NULL); \
465
468
  } \
@@ -503,21 +506,11 @@ BIGNUM_2c(gcd)
503
506
  BIGNUM_2c(mod_sqr)
504
507
 
505
508
  /*
509
+ * Document-method: OpenSSL::BN#mod_inverse
506
510
  * call-seq:
507
- * bn.mod_inverse(bn2) => aBN
511
+ * bn.mod_inverse(bn2) => aBN
508
512
  */
509
- static VALUE
510
- ossl_bn_mod_inverse(VALUE self, VALUE other)
511
- {
512
- BIGNUM *bn1, *bn2 = GetBNPtr(other), *result;
513
- VALUE obj;
514
- GetBN(self, bn1);
515
- obj = NewBN(rb_obj_class(self));
516
- if (!(result = BN_mod_inverse(NULL, bn1, bn2, ossl_bn_ctx)))
517
- ossl_raise(eBNError, "BN_mod_inverse");
518
- SetBN(obj, result);
519
- return obj;
520
- }
513
+ BIGNUM_2c(mod_inverse)
521
514
 
522
515
  /*
523
516
  * call-seq:
@@ -566,7 +559,7 @@ ossl_bn_div(VALUE self, VALUE other)
566
559
  if (!(result = BN_new())) { \
567
560
  ossl_raise(eBNError, NULL); \
568
561
  } \
569
- if (BN_##func(result, bn1, bn2, bn3, ossl_bn_ctx) <= 0) { \
562
+ if (!BN_##func(result, bn1, bn2, bn3, ossl_bn_ctx)) { \
570
563
  BN_free(result); \
571
564
  ossl_raise(eBNError, NULL); \
572
565
  } \
@@ -608,7 +601,7 @@ BIGNUM_3c(mod_exp)
608
601
  { \
609
602
  BIGNUM *bn; \
610
603
  GetBN(self, bn); \
611
- if (BN_##func(bn, NUM2INT(bit)) <= 0) { \
604
+ if (!BN_##func(bn, NUM2INT(bit))) { \
612
605
  ossl_raise(eBNError, NULL); \
613
606
  } \
614
607
  return self; \
@@ -668,7 +661,7 @@ ossl_bn_is_bit_set(VALUE self, VALUE bit)
668
661
  if (!(result = BN_new())) { \
669
662
  ossl_raise(eBNError, NULL); \
670
663
  } \
671
- if (BN_##func(result, bn, b) <= 0) { \
664
+ if (!BN_##func(result, bn, b)) { \
672
665
  BN_free(result); \
673
666
  ossl_raise(eBNError, NULL); \
674
667
  } \
@@ -698,7 +691,7 @@ BIGNUM_SHIFT(rshift)
698
691
  int b; \
699
692
  b = NUM2INT(bits); \
700
693
  GetBN(self, bn); \
701
- if (BN_##func(bn, bn, b) <= 0) \
694
+ if (!BN_##func(bn, bn, b)) \
702
695
  ossl_raise(eBNError, NULL); \
703
696
  return self; \
704
697
  }
@@ -737,7 +730,7 @@ BIGNUM_SELF_SHIFT(rshift)
737
730
  if (!(result = BN_new())) { \
738
731
  ossl_raise(eBNError, NULL); \
739
732
  } \
740
- if (BN_##func(result, b, top, bottom) <= 0) { \
733
+ if (!BN_##func(result, b, top, bottom)) { \
741
734
  BN_free(result); \
742
735
  ossl_raise(eBNError, NULL); \
743
736
  } \
@@ -766,7 +759,7 @@ BIGNUM_RAND(pseudo_rand)
766
759
  if (!(result = BN_new())) { \
767
760
  ossl_raise(eBNError, NULL); \
768
761
  } \
769
- if (BN_##func##_range(result, bn) <= 0) { \
762
+ if (!BN_##func##_range(result, bn)) { \
770
763
  BN_free(result); \
771
764
  ossl_raise(eBNError, NULL); \
772
765
  } \
@@ -104,7 +104,7 @@ ossl_cipher_alloc(VALUE klass)
104
104
  * call-seq:
105
105
  * Cipher.new(string) -> cipher
106
106
  *
107
- * The string must be a valid cipher name like "AES-128-CBC" or "3DES".
107
+ * The string must contain a valid cipher name like "AES-256-CBC".
108
108
  *
109
109
  * A list of cipher names is available by calling OpenSSL::Cipher.ciphers.
110
110
  */
@@ -237,8 +237,7 @@ ossl_cipher_init(int argc, VALUE *argv, VALUE self, int mode)
237
237
  ossl_raise(eCipherError, NULL);
238
238
  }
239
239
 
240
- if (p_key)
241
- rb_ivar_set(self, id_key_set, Qtrue);
240
+ rb_ivar_set(self, id_key_set, p_key ? Qtrue : Qfalse);
242
241
 
243
242
  return self;
244
243
  }
@@ -814,6 +813,31 @@ ossl_cipher_block_size(VALUE self)
814
813
  return INT2NUM(EVP_CIPHER_CTX_block_size(ctx));
815
814
  }
816
815
 
816
+ /*
817
+ * call-seq:
818
+ * cipher.ccm_data_len = integer -> integer
819
+ *
820
+ * Sets the length of the plaintext / ciphertext message that will be
821
+ * processed in CCM mode. Make sure to call this method after #key= and
822
+ * #iv= have been set, and before #auth_data=.
823
+ *
824
+ * Only call this method after calling Cipher#encrypt or Cipher#decrypt.
825
+ */
826
+ static VALUE
827
+ ossl_cipher_set_ccm_data_len(VALUE self, VALUE data_len)
828
+ {
829
+ int in_len, out_len;
830
+ EVP_CIPHER_CTX *ctx;
831
+
832
+ in_len = NUM2INT(data_len);
833
+
834
+ GetCipher(self, ctx);
835
+ if (EVP_CipherUpdate(ctx, NULL, &out_len, NULL, in_len) != 1)
836
+ ossl_raise(eCipherError, NULL);
837
+
838
+ return data_len;
839
+ }
840
+
817
841
  /*
818
842
  * INIT
819
843
  */
@@ -852,22 +876,6 @@ Init_ossl_cipher(void)
852
876
  *
853
877
  * cipher = OpenSSL::Cipher.new('AES-128-CBC')
854
878
  *
855
- * For each algorithm supported, there is a class defined under the
856
- * Cipher class that goes by the name of the cipher, e.g. to obtain an
857
- * instance of AES, you could also use
858
- *
859
- * # these are equivalent
860
- * cipher = OpenSSL::Cipher::AES.new(128, :CBC)
861
- * cipher = OpenSSL::Cipher::AES.new(128, 'CBC')
862
- * cipher = OpenSSL::Cipher::AES.new('128-CBC')
863
- *
864
- * Finally, due to its wide-spread use, there are also extra classes
865
- * defined for the different key sizes of AES
866
- *
867
- * cipher = OpenSSL::Cipher::AES128.new(:CBC)
868
- * cipher = OpenSSL::Cipher::AES192.new(:CBC)
869
- * cipher = OpenSSL::Cipher::AES256.new(:CBC)
870
- *
871
879
  * === Choosing either encryption or decryption mode
872
880
  *
873
881
  * Encryption and decryption are often very similar operations for
@@ -896,7 +904,7 @@ Init_ossl_cipher(void)
896
904
  * without processing the password further. A simple and secure way to
897
905
  * create a key for a particular Cipher is
898
906
  *
899
- * cipher = OpenSSL::AES256.new(:CFB)
907
+ * cipher = OpenSSL::Cipher.new('AES-256-CFB')
900
908
  * cipher.encrypt
901
909
  * key = cipher.random_key # also sets the generated key on the Cipher
902
910
  *
@@ -964,14 +972,14 @@ Init_ossl_cipher(void)
964
972
  *
965
973
  * data = "Very, very confidential data"
966
974
  *
967
- * cipher = OpenSSL::Cipher::AES.new(128, :CBC)
975
+ * cipher = OpenSSL::Cipher.new('AES-128-CBC')
968
976
  * cipher.encrypt
969
977
  * key = cipher.random_key
970
978
  * iv = cipher.random_iv
971
979
  *
972
980
  * encrypted = cipher.update(data) + cipher.final
973
981
  * ...
974
- * decipher = OpenSSL::Cipher::AES.new(128, :CBC)
982
+ * decipher = OpenSSL::Cipher.new('AES-128-CBC')
975
983
  * decipher.decrypt
976
984
  * decipher.key = key
977
985
  * decipher.iv = iv
@@ -1007,7 +1015,7 @@ Init_ossl_cipher(void)
1007
1015
  * not to reuse the _key_ and _nonce_ pair. Reusing an nonce ruins the
1008
1016
  * security guarantees of GCM mode.
1009
1017
  *
1010
- * cipher = OpenSSL::Cipher::AES.new(128, :GCM).encrypt
1018
+ * cipher = OpenSSL::Cipher.new('AES-128-GCM').encrypt
1011
1019
  * cipher.key = key
1012
1020
  * cipher.iv = nonce
1013
1021
  * cipher.auth_data = auth_data
@@ -1023,7 +1031,7 @@ Init_ossl_cipher(void)
1023
1031
  * ciphertext with a probability of 1/256.
1024
1032
  *
1025
1033
  * raise "tag is truncated!" unless tag.bytesize == 16
1026
- * decipher = OpenSSL::Cipher::AES.new(128, :GCM).decrypt
1034
+ * decipher = OpenSSL::Cipher.new('AES-128-GCM').decrypt
1027
1035
  * decipher.key = key
1028
1036
  * decipher.iv = nonce
1029
1037
  * decipher.auth_tag = tag
@@ -1060,6 +1068,7 @@ Init_ossl_cipher(void)
1060
1068
  rb_define_method(cCipher, "iv_len", ossl_cipher_iv_length, 0);
1061
1069
  rb_define_method(cCipher, "block_size", ossl_cipher_block_size, 0);
1062
1070
  rb_define_method(cCipher, "padding=", ossl_cipher_set_padding, 1);
1071
+ rb_define_method(cCipher, "ccm_data_len=", ossl_cipher_set_ccm_data_len, 1);
1063
1072
 
1064
1073
  id_auth_tag_len = rb_intern_const("auth_tag_len");
1065
1074
  id_key_set = rb_intern_const("key_set");
@@ -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
  */
@@ -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
@@ -313,6 +313,8 @@ ossl_digest_block_length(VALUE self)
313
313
  void
314
314
  Init_ossl_digest(void)
315
315
  {
316
+ rb_require("digest");
317
+
316
318
  #if 0
317
319
  mOSSL = rb_define_module("OpenSSL");
318
320
  eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
@@ -346,54 +348,19 @@ Init_ossl_digest(void)
346
348
  * the integrity of a signed document, it suffices to re-compute the hash
347
349
  * and verify that it is equal to that in the signature.
348
350
  *
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)
351
+ * You can get a list of all digest algorithms supported on your system by
352
+ * running this command in your terminal:
355
353
  *
356
- * For each of these algorithms, there is a sub-class of Digest that
357
- * can be instantiated as simply as e.g.
354
+ * openssl list -digest-algorithms
358
355
  *
359
- * digest = OpenSSL::Digest::SHA1.new
356
+ * Among the OpenSSL 1.1.1 supported message digest algorithms are:
357
+ * * SHA224, SHA256, SHA384, SHA512, SHA512-224 and SHA512-256
358
+ * * SHA3-224, SHA3-256, SHA3-384 and SHA3-512
359
+ * * BLAKE2s256 and BLAKE2b512
360
360
  *
361
- * === Mapping between Digest class and sn/ln
361
+ * Each of these algorithms can be instantiated using the name:
362
362
  *
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
363
+ * digest = OpenSSL::Digest.new('SHA256')
397
364
  *
398
365
  * "Breaking" a message digest algorithm means defying its one-way
399
366
  * function characteristics, i.e. producing a collision or finding a way
@@ -406,7 +373,7 @@ Init_ossl_digest(void)
406
373
  * === Hashing a file
407
374
  *
408
375
  * data = File.read('document')
409
- * sha256 = OpenSSL::Digest::SHA256.new
376
+ * sha256 = OpenSSL::Digest.new('SHA256')
410
377
  * digest = sha256.digest(data)
411
378
  *
412
379
  * === Hashing several pieces of data at once
@@ -414,7 +381,7 @@ Init_ossl_digest(void)
414
381
  * data1 = File.read('file1')
415
382
  * data2 = File.read('file2')
416
383
  * data3 = File.read('file3')
417
- * sha256 = OpenSSL::Digest::SHA256.new
384
+ * sha256 = OpenSSL::Digest.new('SHA256')
418
385
  * sha256 << data1
419
386
  * sha256 << data2
420
387
  * sha256 << data3
@@ -423,7 +390,7 @@ Init_ossl_digest(void)
423
390
  * === Reuse a Digest instance
424
391
  *
425
392
  * data1 = File.read('file1')
426
- * sha256 = OpenSSL::Digest::SHA256.new
393
+ * sha256 = OpenSSL::Digest.new('SHA256')
427
394
  * digest1 = sha256.digest(data1)
428
395
  *
429
396
  * data2 = File.read('file2')
@@ -431,12 +398,6 @@ Init_ossl_digest(void)
431
398
  * digest2 = sha256.digest(data2)
432
399
  *
433
400
  */
434
-
435
- /*
436
- * Digest::Class is defined by the digest library. rb_require() cannot be
437
- * used here because it bypasses RubyGems.
438
- */
439
- rb_funcall(Qnil, rb_intern_const("require"), 1, rb_str_new_cstr("digest"));
440
401
  cDigest = rb_define_class_under(mOSSL, "Digest", rb_path2class("Digest::Class"));
441
402
  /* Document-class: OpenSSL::Digest::DigestError
442
403
  *
@@ -93,9 +93,6 @@ static const rb_data_type_t ossl_engine_type = {
93
93
  static VALUE
94
94
  ossl_engine_s_load(int argc, VALUE *argv, VALUE klass)
95
95
  {
96
- #if !defined(HAVE_ENGINE_LOAD_BUILTIN_ENGINES)
97
- return Qnil;
98
- #else
99
96
  VALUE name;
100
97
 
101
98
  rb_scan_args(argc, argv, "01", &name);
@@ -104,10 +101,10 @@ ossl_engine_s_load(int argc, VALUE *argv, VALUE klass)
104
101
  return Qtrue;
105
102
  }
106
103
  StringValueCStr(name);
107
- #ifndef OPENSSL_NO_STATIC_ENGINE
108
104
  #if HAVE_ENGINE_LOAD_DYNAMIC
109
105
  OSSL_ENGINE_LOAD_IF_MATCH(dynamic, DYNAMIC);
110
106
  #endif
107
+ #ifndef OPENSSL_NO_STATIC_ENGINE
111
108
  #if HAVE_ENGINE_LOAD_4758CCA
112
109
  OSSL_ENGINE_LOAD_IF_MATCH(4758cca, 4758CCA);
113
110
  #endif
@@ -144,20 +141,13 @@ ossl_engine_s_load(int argc, VALUE *argv, VALUE klass)
144
141
  #if HAVE_ENGINE_LOAD_GOST
145
142
  OSSL_ENGINE_LOAD_IF_MATCH(gost, GOST);
146
143
  #endif
144
+ #endif
147
145
  #if HAVE_ENGINE_LOAD_CRYPTODEV
148
146
  OSSL_ENGINE_LOAD_IF_MATCH(cryptodev, CRYPTODEV);
149
- #endif
150
- #if HAVE_ENGINE_LOAD_AESNI
151
- OSSL_ENGINE_LOAD_IF_MATCH(aesni, AESNI);
152
- #endif
153
- #endif
154
- #ifdef HAVE_ENGINE_LOAD_OPENBSD_DEV_CRYPTO
155
- OSSL_ENGINE_LOAD_IF_MATCH(openbsd_dev_crypto, OPENBSD_DEV_CRYPTO);
156
147
  #endif
157
148
  OSSL_ENGINE_LOAD_IF_MATCH(openssl, OPENSSL);
158
149
  rb_warning("no such builtin loader for `%"PRIsVALUE"'", name);
159
150
  return Qnil;
160
- #endif /* HAVE_ENGINE_LOAD_BUILTIN_ENGINES */
161
151
  }
162
152
 
163
153
  /*
@@ -84,18 +84,12 @@ ossl_hmac_alloc(VALUE klass)
84
84
  *
85
85
  * === A note about comparisons
86
86
  *
87
- * Two instances won't be equal when they're compared, even if they have the
88
- * same value. Use #to_s or #hexdigest to return the authentication code that
89
- * the instance represents. For example:
87
+ * Two instances can be securely compared with #== in constant time:
90
88
  *
91
89
  * other_instance = OpenSSL::HMAC.new('key', OpenSSL::Digest.new('sha1'))
92
- * #=> f42bb0eeb018ebbd4597ae7213711ec60760843f
93
- * instance
94
- * #=> f42bb0eeb018ebbd4597ae7213711ec60760843f
95
- * instance == other_instance
96
- * #=> false
97
- * instance.to_s == other_instance.to_s
98
- * #=> true
90
+ * #=> f42bb0eeb018ebbd4597ae7213711ec60760843f
91
+ * instance == other_instance
92
+ * #=> true
99
93
  *
100
94
  */
101
95
  static VALUE
@@ -359,7 +353,7 @@ Init_ossl_hmac(void)
359
353
  * data1 = File.read("file1")
360
354
  * data2 = File.read("file2")
361
355
  * key = "key"
362
- * digest = OpenSSL::Digest::SHA256.new
356
+ * digest = OpenSSL::Digest.new('SHA256')
363
357
  * hmac = OpenSSL::HMAC.new(key, digest)
364
358
  * hmac << data1
365
359
  * hmac << data2
@@ -272,7 +272,7 @@ Init_ossl_kdf(void)
272
272
  * # store this with the generated value
273
273
  * salt = OpenSSL::Random.random_bytes(16)
274
274
  * iter = 20_000
275
- * hash = OpenSSL::Digest::SHA256.new
275
+ * hash = OpenSSL::Digest.new('SHA256')
276
276
  * len = hash.digest_length
277
277
  * # the final value to be stored
278
278
  * value = OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
@@ -284,24 +284,8 @@ Init_ossl_kdf(void)
284
284
  * Typically, "==" short-circuits on evaluation, and is therefore
285
285
  * vulnerable to timing attacks. The proper way is to use a method that
286
286
  * always takes the same amount of time when comparing two values, thus
287
- * not leaking any information to potential attackers. To compare two
288
- * values, the following could be used:
289
- *
290
- * def eql_time_cmp(a, b)
291
- * unless a.length == b.length
292
- * return false
293
- * end
294
- * cmp = b.bytes
295
- * result = 0
296
- * a.bytes.each_with_index {|c,i|
297
- * result |= c ^ cmp[i]
298
- * }
299
- * result == 0
300
- * end
301
- *
302
- * Please note that the premature return in case of differing lengths
303
- * typically does not leak valuable information - when using PBKDF2, the
304
- * length of the values to be compared is of fixed size.
287
+ * not leaking any information to potential attackers. To do this, use
288
+ * +OpenSSL.fixed_length_secure_compare+.
305
289
  */
306
290
  mKDF = rb_define_module_under(mOSSL, "KDF");
307
291
  /*
@@ -350,7 +350,7 @@ ossl_spki_verify(VALUE self, VALUE key)
350
350
  * spki = OpenSSL::Netscape::SPKI.new
351
351
  * spki.challenge = "RandomChallenge"
352
352
  * spki.public_key = key.public_key
353
- * spki.sign(key, OpenSSL::Digest::SHA256.new)
353
+ * spki.sign(key, OpenSSL::Digest.new('SHA256'))
354
354
  * #send a request containing this to a server generating a certificate
355
355
  * === Verifying an SPKI request
356
356
  * request = #...
@@ -1489,13 +1489,15 @@ ossl_ocspcid_initialize_copy(VALUE self, VALUE other)
1489
1489
  * call-seq:
1490
1490
  * OpenSSL::OCSP::CertificateId.new(subject, issuer, digest = nil) -> certificate_id
1491
1491
  * OpenSSL::OCSP::CertificateId.new(der_string) -> certificate_id
1492
+ * OpenSSL::OCSP::CertificateId.new(obj) -> certificate_id
1492
1493
  *
1493
1494
  * Creates a new OpenSSL::OCSP::CertificateId for the given _subject_ and
1494
1495
  * _issuer_ X509 certificates. The _digest_ is a digest algorithm that is used
1495
1496
  * to compute the hash values. This defaults to SHA-1.
1496
1497
  *
1497
1498
  * If only one argument is given, decodes it as DER representation of a
1498
- * certificate ID.
1499
+ * certificate ID or generates certificate ID from the object that responds to
1500
+ * the to_der method.
1499
1501
  */
1500
1502
  static VALUE
1501
1503
  ossl_ocspcid_initialize(int argc, VALUE *argv, VALUE self)
@@ -1717,7 +1719,7 @@ Init_ossl_ocsp(void)
1717
1719
  * subject certificate so the CA knows which certificate we are asking
1718
1720
  * about:
1719
1721
  *
1720
- * digest = OpenSSL::Digest::SHA1.new
1722
+ * digest = OpenSSL::Digest.new('SHA1')
1721
1723
  * certificate_id =
1722
1724
  * OpenSSL::OCSP::CertificateId.new subject, issuer, digest
1723
1725
  *
@@ -1734,18 +1736,11 @@ Init_ossl_ocsp(void)
1734
1736
  * To submit the request to the CA for verification we need to extract the
1735
1737
  * OCSP URI from the subject certificate:
1736
1738
  *
1737
- * authority_info_access = subject.extensions.find do |extension|
1738
- * extension.oid == 'authorityInfoAccess'
1739
- * end
1740
- *
1741
- * descriptions = authority_info_access.value.split "\n"
1742
- * ocsp = descriptions.find do |description|
1743
- * description.start_with? 'OCSP'
1744
- * end
1739
+ * ocsp_uris = subject.ocsp_uris
1745
1740
  *
1746
1741
  * require 'uri'
1747
1742
  *
1748
- * ocsp_uri = URI ocsp[/URI:(.*)/, 1]
1743
+ * ocsp_uri = URI ocsp_uris[0]
1749
1744
  *
1750
1745
  * To submit the request we'll POST the request to the OCSP URI (per RFC
1751
1746
  * 2560). Note that we only handle HTTP requests and don't handle any
@@ -13,9 +13,9 @@
13
13
 
14
14
  #if !defined(OPENSSL_NO_OCSP)
15
15
  extern VALUE mOCSP;
16
- extern VALUE cOPCSReq;
17
- extern VALUE cOPCSRes;
18
- extern VALUE cOPCSBasicRes;
16
+ extern VALUE cOCSPReq;
17
+ extern VALUE cOCSPRes;
18
+ extern VALUE cOCSPBasicRes;
19
19
  #endif
20
20
 
21
21
  void Init_ossl_ocsp(void);
@@ -9,21 +9,6 @@
9
9
  */
10
10
  #include "ossl.h"
11
11
 
12
- #define NewPKCS7(klass) \
13
- TypedData_Wrap_Struct((klass), &ossl_pkcs7_type, 0)
14
- #define SetPKCS7(obj, pkcs7) do { \
15
- if (!(pkcs7)) { \
16
- ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \
17
- } \
18
- RTYPEDDATA_DATA(obj) = (pkcs7); \
19
- } while (0)
20
- #define GetPKCS7(obj, pkcs7) do { \
21
- TypedData_Get_Struct((obj), PKCS7, &ossl_pkcs7_type, (pkcs7)); \
22
- if (!(pkcs7)) { \
23
- ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \
24
- } \
25
- } while (0)
26
-
27
12
  #define NewPKCS7si(klass) \
28
13
  TypedData_Wrap_Struct((klass), &ossl_pkcs7_signer_info_type, 0)
29
14
  #define SetPKCS7si(obj, p7si) do { \
@@ -75,7 +60,7 @@ ossl_pkcs7_free(void *ptr)
75
60
  PKCS7_free(ptr);
76
61
  }
77
62
 
78
- static const rb_data_type_t ossl_pkcs7_type = {
63
+ const rb_data_type_t ossl_pkcs7_type = {
79
64
  "OpenSSL/PKCS7",
80
65
  {
81
66
  0, ossl_pkcs7_free,
@@ -803,9 +788,9 @@ ossl_pkcs7_decrypt(int argc, VALUE *argv, VALUE self)
803
788
  BIO *out;
804
789
  VALUE str;
805
790
 
806
- rb_scan_args(argc, argv, "21", &pkey, &cert, &flags);
791
+ rb_scan_args(argc, argv, "12", &pkey, &cert, &flags);
807
792
  key = GetPrivPKeyPtr(pkey); /* NO NEED TO DUP */
808
- x509 = GetX509CertPtr(cert); /* NO NEED TO DUP */
793
+ x509 = NIL_P(cert) ? NULL : GetX509CertPtr(cert); /* NO NEED TO DUP */
809
794
  flg = NIL_P(flags) ? 0 : NUM2INT(flags);
810
795
  GetPKCS7(self, p7);
811
796
  if(!(out = BIO_new(BIO_s_mem())))
@@ -1088,7 +1073,6 @@ Init_ossl_pkcs7(void)
1088
1073
  rb_define_alloc_func(cPKCS7Signer, ossl_pkcs7si_alloc);
1089
1074
  rb_define_method(cPKCS7Signer, "initialize", ossl_pkcs7si_initialize,3);
1090
1075
  rb_define_method(cPKCS7Signer, "issuer", ossl_pkcs7si_get_issuer, 0);
1091
- rb_define_alias(cPKCS7Signer, "name", "issuer");
1092
1076
  rb_define_method(cPKCS7Signer, "serial", ossl_pkcs7si_get_serial,0);
1093
1077
  rb_define_method(cPKCS7Signer,"signed_time",ossl_pkcs7si_get_signed_time,0);
1094
1078
 
@@ -10,6 +10,22 @@
10
10
  #if !defined(_OSSL_PKCS7_H_)
11
11
  #define _OSSL_PKCS7_H_
12
12
 
13
+ #define NewPKCS7(klass) \
14
+ TypedData_Wrap_Struct((klass), &ossl_pkcs7_type, 0)
15
+ #define SetPKCS7(obj, pkcs7) do { \
16
+ if (!(pkcs7)) { \
17
+ ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \
18
+ } \
19
+ RTYPEDDATA_DATA(obj) = (pkcs7); \
20
+ } while (0)
21
+ #define GetPKCS7(obj, pkcs7) do { \
22
+ TypedData_Get_Struct((obj), PKCS7, &ossl_pkcs7_type, (pkcs7)); \
23
+ if (!(pkcs7)) { \
24
+ ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \
25
+ } \
26
+ } while (0)
27
+
28
+ extern const rb_data_type_t ossl_pkcs7_type;
13
29
  extern VALUE cPKCS7;
14
30
  extern VALUE cPKCS7Signer;
15
31
  extern VALUE cPKCS7Recipient;