openssl 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +180 -29
- data/History.md +76 -0
- data/README.md +11 -7
- data/ext/openssl/extconf.rb +7 -9
- data/ext/openssl/openssl_missing.c +1 -1
- data/ext/openssl/openssl_missing.h +1 -1
- data/ext/openssl/ossl.c +7 -9
- data/ext/openssl/ossl.h +12 -8
- data/ext/openssl/ossl_asn1.c +46 -237
- data/ext/openssl/ossl_asn1.h +1 -19
- data/ext/openssl/ossl_bio.c +1 -1
- data/ext/openssl/ossl_bio.h +1 -1
- data/ext/openssl/ossl_bn.c +12 -12
- data/ext/openssl/ossl_bn.h +1 -2
- data/ext/openssl/ossl_cipher.c +5 -5
- data/ext/openssl/ossl_cipher.h +1 -4
- data/ext/openssl/ossl_config.c +10 -9
- data/ext/openssl/ossl_config.h +1 -1
- data/ext/openssl/ossl_digest.c +39 -21
- data/ext/openssl/ossl_digest.h +1 -4
- data/ext/openssl/ossl_engine.c +3 -3
- data/ext/openssl/ossl_engine.h +1 -4
- data/ext/openssl/ossl_hmac.c +3 -3
- data/ext/openssl/ossl_hmac.h +1 -4
- data/ext/openssl/ossl_kdf.c +5 -5
- data/ext/openssl/ossl_ns_spki.c +8 -8
- data/ext/openssl/ossl_ns_spki.h +1 -5
- data/ext/openssl/ossl_ocsp.c +8 -8
- data/ext/openssl/ossl_ocsp.h +1 -8
- data/ext/openssl/ossl_pkcs12.c +54 -3
- data/ext/openssl/ossl_pkcs12.h +1 -4
- data/ext/openssl/ossl_pkcs7.c +68 -21
- data/ext/openssl/ossl_pkcs7.h +2 -22
- data/ext/openssl/ossl_pkey.c +1 -1
- data/ext/openssl/ossl_pkey.h +3 -14
- data/ext/openssl/ossl_pkey_dh.c +2 -2
- data/ext/openssl/ossl_pkey_dsa.c +2 -2
- data/ext/openssl/ossl_pkey_ec.c +6 -6
- data/ext/openssl/ossl_pkey_rsa.c +2 -2
- data/ext/openssl/ossl_provider.c +1 -1
- data/ext/openssl/ossl_rand.c +3 -3
- data/ext/openssl/ossl_rand.h +1 -4
- data/ext/openssl/ossl_ssl.c +71 -52
- data/ext/openssl/ossl_ssl.h +1 -1
- data/ext/openssl/ossl_ts.c +73 -15
- data/ext/openssl/ossl_ts.h +1 -1
- data/ext/openssl/ossl_x509.c +1 -1
- data/ext/openssl/ossl_x509.h +1 -20
- data/ext/openssl/ossl_x509attr.c +25 -26
- data/ext/openssl/ossl_x509cert.c +42 -3
- data/ext/openssl/ossl_x509crl.c +8 -4
- data/ext/openssl/ossl_x509ext.c +3 -3
- data/ext/openssl/ossl_x509name.c +3 -3
- data/ext/openssl/ossl_x509req.c +8 -4
- data/ext/openssl/ossl_x509revoked.c +2 -2
- data/ext/openssl/ossl_x509store.c +16 -11
- data/lib/openssl/asn1.rb +188 -0
- data/lib/openssl/bn.rb +1 -1
- data/lib/openssl/buffering.rb +13 -3
- data/lib/openssl/cipher.rb +1 -1
- data/lib/openssl/digest.rb +1 -1
- data/lib/openssl/marshal.rb +1 -1
- data/lib/openssl/ssl.rb +67 -4
- data/lib/openssl/version.rb +1 -1
- data/lib/openssl/x509.rb +1 -1
- data/lib/openssl.rb +2 -1
- metadata +5 -3
- /data/{LICENSE.txt → COPYING} +0 -0
data/ext/openssl/ossl_asn1.c
CHANGED
@@ -5,13 +5,12 @@
|
|
5
5
|
*/
|
6
6
|
/*
|
7
7
|
* This program is licensed under the same licence as Ruby.
|
8
|
-
* (See the file '
|
8
|
+
* (See the file 'COPYING'.)
|
9
9
|
*/
|
10
10
|
#include "ossl.h"
|
11
11
|
|
12
12
|
static VALUE ossl_asn1_decode0(unsigned char **pp, long length, long *offset,
|
13
13
|
int depth, int yield, long *num_read);
|
14
|
-
static VALUE ossl_asn1_initialize(int argc, VALUE *argv, VALUE self);
|
15
14
|
|
16
15
|
/*
|
17
16
|
* DATE conversion
|
@@ -158,38 +157,33 @@ asn1integer_to_num_i(VALUE arg)
|
|
158
157
|
#define ossl_asn1_get_tag_class(o) rb_attr_get((o),sivTAG_CLASS)
|
159
158
|
#define ossl_asn1_get_indefinite_length(o) rb_attr_get((o),sivINDEFINITE_LENGTH)
|
160
159
|
|
161
|
-
#define ossl_asn1_set_value(o,v) rb_ivar_set((o),sivVALUE,(v))
|
162
|
-
#define ossl_asn1_set_tag(o,v) rb_ivar_set((o),sivTAG,(v))
|
163
|
-
#define ossl_asn1_set_tagging(o,v) rb_ivar_set((o),sivTAGGING,(v))
|
164
|
-
#define ossl_asn1_set_tag_class(o,v) rb_ivar_set((o),sivTAG_CLASS,(v))
|
165
160
|
#define ossl_asn1_set_indefinite_length(o,v) rb_ivar_set((o),sivINDEFINITE_LENGTH,(v))
|
166
161
|
|
167
162
|
VALUE mASN1;
|
168
163
|
VALUE eASN1Error;
|
169
164
|
|
170
165
|
VALUE cASN1Data;
|
171
|
-
VALUE cASN1Primitive;
|
172
|
-
VALUE cASN1Constructive;
|
173
|
-
|
174
|
-
VALUE cASN1EndOfContent;
|
175
|
-
VALUE cASN1Boolean; /* BOOLEAN */
|
176
|
-
VALUE cASN1Integer, cASN1Enumerated; /* INTEGER */
|
177
|
-
VALUE cASN1BitString; /* BIT STRING */
|
178
|
-
VALUE cASN1OctetString, cASN1UTF8String; /* STRINGs */
|
179
|
-
VALUE cASN1NumericString, cASN1PrintableString;
|
180
|
-
VALUE cASN1T61String, cASN1VideotexString;
|
181
|
-
VALUE cASN1IA5String, cASN1GraphicString;
|
182
|
-
VALUE cASN1ISO64String, cASN1GeneralString;
|
183
|
-
VALUE cASN1UniversalString, cASN1BMPString;
|
184
|
-
VALUE cASN1Null; /* NULL */
|
185
|
-
VALUE cASN1ObjectId; /* OBJECT IDENTIFIER */
|
186
|
-
VALUE cASN1UTCTime, cASN1GeneralizedTime; /* TIME */
|
187
|
-
VALUE cASN1Sequence, cASN1Set; /* CONSTRUCTIVE */
|
166
|
+
static VALUE cASN1Primitive;
|
167
|
+
static VALUE cASN1Constructive;
|
168
|
+
|
169
|
+
static VALUE cASN1EndOfContent;
|
170
|
+
static VALUE cASN1Boolean; /* BOOLEAN */
|
171
|
+
static VALUE cASN1Integer, cASN1Enumerated; /* INTEGER */
|
172
|
+
static VALUE cASN1BitString; /* BIT STRING */
|
173
|
+
static VALUE cASN1OctetString, cASN1UTF8String; /* STRINGs */
|
174
|
+
static VALUE cASN1NumericString, cASN1PrintableString;
|
175
|
+
static VALUE cASN1T61String, cASN1VideotexString;
|
176
|
+
static VALUE cASN1IA5String, cASN1GraphicString;
|
177
|
+
static VALUE cASN1ISO64String, cASN1GeneralString;
|
178
|
+
static VALUE cASN1UniversalString, cASN1BMPString;
|
179
|
+
static VALUE cASN1Null; /* NULL */
|
180
|
+
static VALUE cASN1ObjectId; /* OBJECT IDENTIFIER */
|
181
|
+
static VALUE cASN1UTCTime, cASN1GeneralizedTime; /* TIME */
|
182
|
+
static VALUE cASN1Sequence, cASN1Set; /* CONSTRUCTIVE */
|
188
183
|
|
189
184
|
static VALUE sym_IMPLICIT, sym_EXPLICIT;
|
190
185
|
static VALUE sym_UNIVERSAL, sym_APPLICATION, sym_CONTEXT_SPECIFIC, sym_PRIVATE;
|
191
186
|
static ID sivVALUE, sivTAG, sivTAG_CLASS, sivTAGGING, sivINDEFINITE_LENGTH, sivUNUSED_BITS;
|
192
|
-
static ID id_each;
|
193
187
|
|
194
188
|
/*
|
195
189
|
* Ruby to ASN1 converters
|
@@ -503,7 +497,7 @@ static VALUE class_tag_map;
|
|
503
497
|
|
504
498
|
static int ossl_asn1_default_tag(VALUE obj);
|
505
499
|
|
506
|
-
ASN1_TYPE*
|
500
|
+
static ASN1_TYPE *
|
507
501
|
ossl_asn1_get_asn1type(VALUE obj)
|
508
502
|
{
|
509
503
|
ASN1_TYPE *ret;
|
@@ -638,35 +632,6 @@ ossl_asn1_class2sym(int tc)
|
|
638
632
|
return sym_UNIVERSAL;
|
639
633
|
}
|
640
634
|
|
641
|
-
/*
|
642
|
-
* call-seq:
|
643
|
-
* OpenSSL::ASN1::ASN1Data.new(value, tag, tag_class) => ASN1Data
|
644
|
-
*
|
645
|
-
* _value_: Please have a look at Constructive and Primitive to see how Ruby
|
646
|
-
* types are mapped to ASN.1 types and vice versa.
|
647
|
-
*
|
648
|
-
* _tag_: An Integer indicating the tag number.
|
649
|
-
*
|
650
|
-
* _tag_class_: A Symbol indicating the tag class. Please cf. ASN1 for
|
651
|
-
* possible values.
|
652
|
-
*
|
653
|
-
* == Example
|
654
|
-
* asn1_int = OpenSSL::ASN1Data.new(42, 2, :UNIVERSAL) # => Same as OpenSSL::ASN1::Integer.new(42)
|
655
|
-
* tagged_int = OpenSSL::ASN1Data.new(42, 0, :CONTEXT_SPECIFIC) # implicitly 0-tagged INTEGER
|
656
|
-
*/
|
657
|
-
static VALUE
|
658
|
-
ossl_asn1data_initialize(VALUE self, VALUE value, VALUE tag, VALUE tag_class)
|
659
|
-
{
|
660
|
-
if(!SYMBOL_P(tag_class))
|
661
|
-
ossl_raise(eASN1Error, "invalid tag class");
|
662
|
-
ossl_asn1_set_tag(self, tag);
|
663
|
-
ossl_asn1_set_value(self, value);
|
664
|
-
ossl_asn1_set_tag_class(self, tag_class);
|
665
|
-
ossl_asn1_set_indefinite_length(self, Qfalse);
|
666
|
-
|
667
|
-
return self;
|
668
|
-
}
|
669
|
-
|
670
635
|
static VALUE
|
671
636
|
to_der_internal(VALUE self, int constructed, int indef_len, VALUE body)
|
672
637
|
{
|
@@ -795,20 +760,19 @@ int_ossl_asn1_decode0_prim(unsigned char **pp, long length, long hlen, int tag,
|
|
795
760
|
if (tc == sym_UNIVERSAL &&
|
796
761
|
tag < ossl_asn1_info_size && ossl_asn1_info[tag].klass) {
|
797
762
|
VALUE klass = *ossl_asn1_info[tag].klass;
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
ossl_asn1_initialize(4, args, asn1data);
|
763
|
+
if (tag == V_ASN1_EOC)
|
764
|
+
asn1data = rb_funcall(cASN1EndOfContent, rb_intern("new"), 0);
|
765
|
+
else {
|
766
|
+
VALUE args[4] = { value, INT2NUM(tag), Qnil, tc };
|
767
|
+
asn1data = rb_funcallv_public(klass, rb_intern("new"), 4, args);
|
768
|
+
}
|
805
769
|
if(tag == V_ASN1_BIT_STRING){
|
806
770
|
rb_ivar_set(asn1data, sivUNUSED_BITS, LONG2NUM(flag));
|
807
771
|
}
|
808
772
|
}
|
809
773
|
else {
|
810
|
-
|
811
|
-
|
774
|
+
VALUE args[3] = { value, INT2NUM(tag), tc };
|
775
|
+
asn1data = rb_funcallv_public(cASN1Data, rb_intern("new"), 3, args);
|
812
776
|
}
|
813
777
|
|
814
778
|
return asn1data;
|
@@ -842,20 +806,20 @@ int_ossl_asn1_decode0_cons(unsigned char **pp, long max_len, long length,
|
|
842
806
|
}
|
843
807
|
|
844
808
|
if (tc == sym_UNIVERSAL) {
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
809
|
+
if (tag == V_ASN1_SEQUENCE) {
|
810
|
+
VALUE args[4] = { ary, INT2NUM(tag), Qnil, tc };
|
811
|
+
asn1data = rb_funcallv_public(cASN1Sequence, rb_intern("new"), 4, args);
|
812
|
+
} else if (tag == V_ASN1_SET) {
|
813
|
+
VALUE args[4] = { ary, INT2NUM(tag), Qnil, tc };
|
814
|
+
asn1data = rb_funcallv_public(cASN1Set, rb_intern("new"), 4, args);
|
815
|
+
} else {
|
816
|
+
VALUE args[4] = { ary, INT2NUM(tag), Qnil, tc };
|
817
|
+
asn1data = rb_funcallv_public(cASN1Constructive, rb_intern("new"), 4, args);
|
818
|
+
}
|
855
819
|
}
|
856
820
|
else {
|
857
|
-
|
858
|
-
|
821
|
+
VALUE args[3] = {ary, INT2NUM(tag), tc};
|
822
|
+
asn1data = rb_funcallv_public(cASN1Data, rb_intern("new"), 3, args);
|
859
823
|
}
|
860
824
|
|
861
825
|
if (indefinite)
|
@@ -1048,83 +1012,6 @@ ossl_asn1_decode_all(VALUE self, VALUE obj)
|
|
1048
1012
|
return ary;
|
1049
1013
|
}
|
1050
1014
|
|
1051
|
-
/*
|
1052
|
-
* call-seq:
|
1053
|
-
* OpenSSL::ASN1::Primitive.new(value [, tag, tagging, tag_class ]) => Primitive
|
1054
|
-
*
|
1055
|
-
* _value_: is mandatory.
|
1056
|
-
*
|
1057
|
-
* _tag_: optional, may be specified for tagged values. If no _tag_ is
|
1058
|
-
* specified, the UNIVERSAL tag corresponding to the Primitive sub-class
|
1059
|
-
* is used by default.
|
1060
|
-
*
|
1061
|
-
* _tagging_: may be used as an encoding hint to encode a value either
|
1062
|
-
* explicitly or implicitly, see ASN1 for possible values.
|
1063
|
-
*
|
1064
|
-
* _tag_class_: if _tag_ and _tagging_ are +nil+ then this is set to
|
1065
|
-
* +:UNIVERSAL+ by default. If either _tag_ or _tagging_ are set then
|
1066
|
-
* +:CONTEXT_SPECIFIC+ is used as the default. For possible values please
|
1067
|
-
* cf. ASN1.
|
1068
|
-
*
|
1069
|
-
* == Example
|
1070
|
-
* int = OpenSSL::ASN1::Integer.new(42)
|
1071
|
-
* zero_tagged_int = OpenSSL::ASN1::Integer.new(42, 0, :IMPLICIT)
|
1072
|
-
* private_explicit_zero_tagged_int = OpenSSL::ASN1::Integer.new(42, 0, :EXPLICIT, :PRIVATE)
|
1073
|
-
*/
|
1074
|
-
static VALUE
|
1075
|
-
ossl_asn1_initialize(int argc, VALUE *argv, VALUE self)
|
1076
|
-
{
|
1077
|
-
VALUE value, tag, tagging, tag_class;
|
1078
|
-
int default_tag;
|
1079
|
-
|
1080
|
-
rb_scan_args(argc, argv, "13", &value, &tag, &tagging, &tag_class);
|
1081
|
-
default_tag = ossl_asn1_default_tag(self);
|
1082
|
-
|
1083
|
-
if (default_tag == -1 || argc > 1) {
|
1084
|
-
if(NIL_P(tag))
|
1085
|
-
ossl_raise(eASN1Error, "must specify tag number");
|
1086
|
-
if(!NIL_P(tagging) && !SYMBOL_P(tagging))
|
1087
|
-
ossl_raise(eASN1Error, "invalid tagging method");
|
1088
|
-
if(NIL_P(tag_class)) {
|
1089
|
-
if (NIL_P(tagging))
|
1090
|
-
tag_class = sym_UNIVERSAL;
|
1091
|
-
else
|
1092
|
-
tag_class = sym_CONTEXT_SPECIFIC;
|
1093
|
-
}
|
1094
|
-
if(!SYMBOL_P(tag_class))
|
1095
|
-
ossl_raise(eASN1Error, "invalid tag class");
|
1096
|
-
}
|
1097
|
-
else{
|
1098
|
-
tag = INT2NUM(default_tag);
|
1099
|
-
tagging = Qnil;
|
1100
|
-
tag_class = sym_UNIVERSAL;
|
1101
|
-
}
|
1102
|
-
ossl_asn1_set_tag(self, tag);
|
1103
|
-
ossl_asn1_set_value(self, value);
|
1104
|
-
ossl_asn1_set_tagging(self, tagging);
|
1105
|
-
ossl_asn1_set_tag_class(self, tag_class);
|
1106
|
-
ossl_asn1_set_indefinite_length(self, Qfalse);
|
1107
|
-
if (default_tag == V_ASN1_BIT_STRING)
|
1108
|
-
rb_ivar_set(self, sivUNUSED_BITS, INT2FIX(0));
|
1109
|
-
|
1110
|
-
return self;
|
1111
|
-
}
|
1112
|
-
|
1113
|
-
static VALUE
|
1114
|
-
ossl_asn1eoc_initialize(VALUE self) {
|
1115
|
-
VALUE tag, tagging, tag_class, value;
|
1116
|
-
tag = INT2FIX(0);
|
1117
|
-
tagging = Qnil;
|
1118
|
-
tag_class = sym_UNIVERSAL;
|
1119
|
-
value = rb_str_new("", 0);
|
1120
|
-
ossl_asn1_set_tag(self, tag);
|
1121
|
-
ossl_asn1_set_value(self, value);
|
1122
|
-
ossl_asn1_set_tagging(self, tagging);
|
1123
|
-
ossl_asn1_set_tag_class(self, tag_class);
|
1124
|
-
ossl_asn1_set_indefinite_length(self, Qfalse);
|
1125
|
-
return self;
|
1126
|
-
}
|
1127
|
-
|
1128
1015
|
static VALUE
|
1129
1016
|
ossl_asn1eoc_to_der(VALUE self)
|
1130
1017
|
{
|
@@ -1163,9 +1050,12 @@ ossl_asn1prim_to_der(VALUE self)
|
|
1163
1050
|
rb_jump_tag(state);
|
1164
1051
|
}
|
1165
1052
|
p0 = p1 = (unsigned char *)RSTRING_PTR(str);
|
1166
|
-
i2d_ASN1_TYPE(asn1, &p0)
|
1053
|
+
if (i2d_ASN1_TYPE(asn1, &p0) < 0) {
|
1054
|
+
ASN1_TYPE_free(asn1);
|
1055
|
+
ossl_raise(eASN1Error, "i2d_ASN1_TYPE");
|
1056
|
+
}
|
1167
1057
|
ASN1_TYPE_free(asn1);
|
1168
|
-
|
1058
|
+
ossl_str_adjust(str, p0);
|
1169
1059
|
|
1170
1060
|
/* Strip header since to_der_internal() wants only the payload */
|
1171
1061
|
j = ASN1_get_object((const unsigned char **)&p1, &bodylen, &tag, &tc, alllen);
|
@@ -1213,27 +1103,6 @@ ossl_asn1cons_to_der(VALUE self)
|
|
1213
1103
|
return to_der_internal(self, 1, indef_len, str);
|
1214
1104
|
}
|
1215
1105
|
|
1216
|
-
/*
|
1217
|
-
* call-seq:
|
1218
|
-
* asn1_ary.each { |asn1| block } => asn1_ary
|
1219
|
-
*
|
1220
|
-
* Calls the given block once for each element in self, passing that element
|
1221
|
-
* as parameter _asn1_. If no block is given, an enumerator is returned
|
1222
|
-
* instead.
|
1223
|
-
*
|
1224
|
-
* == Example
|
1225
|
-
* asn1_ary.each do |asn1|
|
1226
|
-
* puts asn1
|
1227
|
-
* end
|
1228
|
-
*/
|
1229
|
-
static VALUE
|
1230
|
-
ossl_asn1cons_each(VALUE self)
|
1231
|
-
{
|
1232
|
-
rb_block_call(ossl_asn1_get_value(self), id_each, 0, 0, 0, 0);
|
1233
|
-
|
1234
|
-
return self;
|
1235
|
-
}
|
1236
|
-
|
1237
1106
|
/*
|
1238
1107
|
* call-seq:
|
1239
1108
|
* OpenSSL::ASN1::ObjectId.register(object_id, short_name, long_name)
|
@@ -1363,7 +1232,7 @@ ossl_asn1obj_eq(VALUE self, VALUE other)
|
|
1363
1232
|
|
1364
1233
|
#define OSSL_ASN1_IMPL_FACTORY_METHOD(klass) \
|
1365
1234
|
static VALUE ossl_asn1_##klass(int argc, VALUE *argv, VALUE self)\
|
1366
|
-
{ return
|
1235
|
+
{ return rb_funcallv_public(cASN1##klass, rb_intern("new"), argc, argv); }
|
1367
1236
|
|
1368
1237
|
OSSL_ASN1_IMPL_FACTORY_METHOD(Boolean)
|
1369
1238
|
OSSL_ASN1_IMPL_FACTORY_METHOD(Integer)
|
@@ -1649,42 +1518,6 @@ Init_ossl_asn1(void)
|
|
1649
1518
|
* puts int2.value # => 1
|
1650
1519
|
*/
|
1651
1520
|
cASN1Data = rb_define_class_under(mASN1, "ASN1Data", rb_cObject);
|
1652
|
-
/*
|
1653
|
-
* Carries the value of a ASN.1 type.
|
1654
|
-
* Please confer Constructive and Primitive for the mappings between
|
1655
|
-
* ASN.1 data types and Ruby classes.
|
1656
|
-
*/
|
1657
|
-
rb_attr(cASN1Data, rb_intern("value"), 1, 1, 0);
|
1658
|
-
/*
|
1659
|
-
* An Integer representing the tag number of this ASN1Data. Never +nil+.
|
1660
|
-
*/
|
1661
|
-
rb_attr(cASN1Data, rb_intern("tag"), 1, 1, 0);
|
1662
|
-
/*
|
1663
|
-
* A Symbol representing the tag class of this ASN1Data. Never +nil+.
|
1664
|
-
* See ASN1Data for possible values.
|
1665
|
-
*/
|
1666
|
-
rb_attr(cASN1Data, rb_intern("tag_class"), 1, 1, 0);
|
1667
|
-
/*
|
1668
|
-
* Never +nil+. A boolean value indicating whether the encoding uses
|
1669
|
-
* indefinite length (in the case of parsing) or whether an indefinite
|
1670
|
-
* length form shall be used (in the encoding case).
|
1671
|
-
* In DER, every value uses definite length form. But in scenarios where
|
1672
|
-
* large amounts of data need to be transferred it might be desirable to
|
1673
|
-
* have some kind of streaming support available.
|
1674
|
-
* For example, huge OCTET STRINGs are preferably sent in smaller-sized
|
1675
|
-
* chunks, each at a time.
|
1676
|
-
* This is possible in BER by setting the length bytes of an encoding
|
1677
|
-
* to zero and by this indicating that the following value will be
|
1678
|
-
* sent in chunks. Indefinite length encodings are always constructed.
|
1679
|
-
* The end of such a stream of chunks is indicated by sending a EOC
|
1680
|
-
* (End of Content) tag. SETs and SEQUENCEs may use an indefinite length
|
1681
|
-
* encoding, but also primitive types such as e.g. OCTET STRINGS or
|
1682
|
-
* BIT STRINGS may leverage this functionality (cf. ITU-T X.690).
|
1683
|
-
*/
|
1684
|
-
rb_attr(cASN1Data, rb_intern("indefinite_length"), 1, 1, 0);
|
1685
|
-
rb_define_alias(cASN1Data, "infinite_length", "indefinite_length");
|
1686
|
-
rb_define_alias(cASN1Data, "infinite_length=", "indefinite_length=");
|
1687
|
-
rb_define_method(cASN1Data, "initialize", ossl_asn1data_initialize, 3);
|
1688
1521
|
rb_define_method(cASN1Data, "to_der", ossl_asn1data_to_der, 0);
|
1689
1522
|
|
1690
1523
|
/* Document-class: OpenSSL::ASN1::Primitive
|
@@ -1752,16 +1585,6 @@ Init_ossl_asn1(void)
|
|
1752
1585
|
* prim_zero_tagged_explicit = <class>.new(value, 0, :EXPLICIT)
|
1753
1586
|
*/
|
1754
1587
|
cASN1Primitive = rb_define_class_under(mASN1, "Primitive", cASN1Data);
|
1755
|
-
/*
|
1756
|
-
* May be used as a hint for encoding a value either implicitly or
|
1757
|
-
* explicitly by setting it either to +:IMPLICIT+ or to +:EXPLICIT+.
|
1758
|
-
* _tagging_ is not set when a ASN.1 structure is parsed using
|
1759
|
-
* OpenSSL::ASN1.decode.
|
1760
|
-
*/
|
1761
|
-
rb_attr(cASN1Primitive, rb_intern("tagging"), 1, 1, Qtrue);
|
1762
|
-
rb_undef_method(cASN1Primitive, "indefinite_length=");
|
1763
|
-
rb_undef_method(cASN1Primitive, "infinite_length=");
|
1764
|
-
rb_define_method(cASN1Primitive, "initialize", ossl_asn1_initialize, -1);
|
1765
1588
|
rb_define_method(cASN1Primitive, "to_der", ossl_asn1prim_to_der, 0);
|
1766
1589
|
|
1767
1590
|
/* Document-class: OpenSSL::ASN1::Constructive
|
@@ -1792,17 +1615,7 @@ Init_ossl_asn1(void)
|
|
1792
1615
|
* set = OpenSSL::ASN1::Set.new( [ int, str ] )
|
1793
1616
|
*/
|
1794
1617
|
cASN1Constructive = rb_define_class_under(mASN1,"Constructive", cASN1Data);
|
1795
|
-
rb_include_module(cASN1Constructive, rb_mEnumerable);
|
1796
|
-
/*
|
1797
|
-
* May be used as a hint for encoding a value either implicitly or
|
1798
|
-
* explicitly by setting it either to +:IMPLICIT+ or to +:EXPLICIT+.
|
1799
|
-
* _tagging_ is not set when a ASN.1 structure is parsed using
|
1800
|
-
* OpenSSL::ASN1.decode.
|
1801
|
-
*/
|
1802
|
-
rb_attr(cASN1Constructive, rb_intern("tagging"), 1, 1, Qtrue);
|
1803
|
-
rb_define_method(cASN1Constructive, "initialize", ossl_asn1_initialize, -1);
|
1804
1618
|
rb_define_method(cASN1Constructive, "to_der", ossl_asn1cons_to_der, 0);
|
1805
|
-
rb_define_method(cASN1Constructive, "each", ossl_asn1cons_each, 0);
|
1806
1619
|
|
1807
1620
|
#define OSSL_ASN1_DEFINE_CLASS(name, super) \
|
1808
1621
|
do{\
|
@@ -1851,13 +1664,10 @@ do{\
|
|
1851
1664
|
rb_define_alias(cASN1ObjectId, "short_name", "sn");
|
1852
1665
|
rb_define_alias(cASN1ObjectId, "long_name", "ln");
|
1853
1666
|
rb_define_method(cASN1ObjectId, "==", ossl_asn1obj_eq, 1);
|
1854
|
-
rb_attr(cASN1BitString, rb_intern("unused_bits"), 1, 1, 0);
|
1855
1667
|
|
1856
|
-
rb_define_method(cASN1EndOfContent, "initialize", ossl_asn1eoc_initialize, 0);
|
1857
1668
|
rb_define_method(cASN1EndOfContent, "to_der", ossl_asn1eoc_to_der, 0);
|
1858
1669
|
|
1859
1670
|
class_tag_map = rb_hash_new();
|
1860
|
-
rb_gc_register_mark_object(class_tag_map);
|
1861
1671
|
rb_hash_aset(class_tag_map, cASN1EndOfContent, INT2NUM(V_ASN1_EOC));
|
1862
1672
|
rb_hash_aset(class_tag_map, cASN1Boolean, INT2NUM(V_ASN1_BOOLEAN));
|
1863
1673
|
rb_hash_aset(class_tag_map, cASN1Integer, INT2NUM(V_ASN1_INTEGER));
|
@@ -1881,6 +1691,5 @@ do{\
|
|
1881
1691
|
rb_hash_aset(class_tag_map, cASN1GeneralString, INT2NUM(V_ASN1_GENERALSTRING));
|
1882
1692
|
rb_hash_aset(class_tag_map, cASN1UniversalString, INT2NUM(V_ASN1_UNIVERSALSTRING));
|
1883
1693
|
rb_hash_aset(class_tag_map, cASN1BMPString, INT2NUM(V_ASN1_BMPSTRING));
|
1884
|
-
|
1885
|
-
id_each = rb_intern_const("each");
|
1694
|
+
rb_define_const(mASN1, "CLASS_TAG_MAP", class_tag_map);
|
1886
1695
|
}
|
data/ext/openssl/ossl_asn1.h
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
*/
|
6
6
|
/*
|
7
7
|
* This program is licensed under the same licence as Ruby.
|
8
|
-
* (See the file '
|
8
|
+
* (See the file 'COPYING'.)
|
9
9
|
*/
|
10
10
|
#if !defined(_OSSL_ASN1_H_)
|
11
11
|
#define _OSSL_ASN1_H_
|
@@ -38,24 +38,6 @@ extern VALUE mASN1;
|
|
38
38
|
extern VALUE eASN1Error;
|
39
39
|
|
40
40
|
extern VALUE cASN1Data;
|
41
|
-
extern VALUE cASN1Primitive;
|
42
|
-
extern VALUE cASN1Constructive;
|
43
|
-
|
44
|
-
extern VALUE cASN1Boolean; /* BOOLEAN */
|
45
|
-
extern VALUE cASN1Integer, cASN1Enumerated; /* INTEGER */
|
46
|
-
extern VALUE cASN1BitString; /* BIT STRING */
|
47
|
-
extern VALUE cASN1OctetString, cASN1UTF8String; /* STRINGs */
|
48
|
-
extern VALUE cASN1NumericString, cASN1PrintableString;
|
49
|
-
extern VALUE cASN1T61String, cASN1VideotexString;
|
50
|
-
extern VALUE cASN1IA5String, cASN1GraphicString;
|
51
|
-
extern VALUE cASN1ISO64String, cASN1GeneralString;
|
52
|
-
extern VALUE cASN1UniversalString, cASN1BMPString;
|
53
|
-
extern VALUE cASN1Null; /* NULL */
|
54
|
-
extern VALUE cASN1ObjectId; /* OBJECT IDENTIFIER */
|
55
|
-
extern VALUE cASN1UTCTime, cASN1GeneralizedTime; /* TIME */
|
56
|
-
extern VALUE cASN1Sequence, cASN1Set; /* CONSTRUCTIVE */
|
57
|
-
|
58
|
-
ASN1_TYPE *ossl_asn1_get_asn1type(VALUE);
|
59
41
|
|
60
42
|
void Init_ossl_asn1(void);
|
61
43
|
|
data/ext/openssl/ossl_bio.c
CHANGED
data/ext/openssl/ossl_bio.h
CHANGED
data/ext/openssl/ossl_bn.c
CHANGED
@@ -5,15 +5,11 @@
|
|
5
5
|
*/
|
6
6
|
/*
|
7
7
|
* This program is licensed under the same licence as Ruby.
|
8
|
-
* (See the file '
|
8
|
+
* (See the file 'COPYING'.)
|
9
9
|
*/
|
10
10
|
/* modified by Michal Rokos <m.rokos@sh.cvut.cz> */
|
11
11
|
#include "ossl.h"
|
12
12
|
|
13
|
-
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
14
|
-
#include <ruby/ractor.h>
|
15
|
-
#endif
|
16
|
-
|
17
13
|
#define NewBN(klass) \
|
18
14
|
TypedData_Wrap_Struct((klass), &ossl_bn_type, 0)
|
19
15
|
#define SetBN(obj, bn) do { \
|
@@ -41,7 +37,7 @@ static const rb_data_type_t ossl_bn_type = {
|
|
41
37
|
{
|
42
38
|
0, ossl_bn_free,
|
43
39
|
},
|
44
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
40
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE,
|
45
41
|
};
|
46
42
|
|
47
43
|
/*
|
@@ -53,7 +49,7 @@ VALUE cBN;
|
|
53
49
|
*
|
54
50
|
* Generic Error for all of OpenSSL::BN (big num)
|
55
51
|
*/
|
56
|
-
VALUE eBNError;
|
52
|
+
static VALUE eBNError;
|
57
53
|
|
58
54
|
/*
|
59
55
|
* Public
|
@@ -156,19 +152,19 @@ ossl_bn_value_ptr(volatile VALUE *ptr)
|
|
156
152
|
*/
|
157
153
|
|
158
154
|
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
159
|
-
void
|
155
|
+
static void
|
160
156
|
ossl_bn_ctx_free(void *ptr)
|
161
157
|
{
|
162
158
|
BN_CTX *ctx = (BN_CTX *)ptr;
|
163
159
|
BN_CTX_free(ctx);
|
164
160
|
}
|
165
161
|
|
166
|
-
struct rb_ractor_local_storage_type ossl_bn_ctx_key_type = {
|
162
|
+
static struct rb_ractor_local_storage_type ossl_bn_ctx_key_type = {
|
167
163
|
NULL, // mark
|
168
164
|
ossl_bn_ctx_free,
|
169
165
|
};
|
170
166
|
|
171
|
-
rb_ractor_local_key_t ossl_bn_ctx_key;
|
167
|
+
static rb_ractor_local_key_t ossl_bn_ctx_key;
|
172
168
|
|
173
169
|
BN_CTX *
|
174
170
|
ossl_bn_ctx_get(void)
|
@@ -244,7 +240,7 @@ ossl_bn_alloc(VALUE klass)
|
|
244
240
|
* number.
|
245
241
|
* - +10+ - Decimal number representation, with a leading '-' for a negative
|
246
242
|
* number.
|
247
|
-
* - +16+ -
|
243
|
+
* - +16+ - Hexadecimal number representation, with a leading '-' for a
|
248
244
|
* negative number.
|
249
245
|
*/
|
250
246
|
static VALUE
|
@@ -263,6 +259,7 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
|
263
259
|
ossl_raise(rb_eArgError, "invalid argument");
|
264
260
|
}
|
265
261
|
|
262
|
+
rb_check_frozen(self);
|
266
263
|
if (RB_INTEGER_TYPE_P(str)) {
|
267
264
|
GetBN(self, bn);
|
268
265
|
integer_to_bnptr(str, bn);
|
@@ -326,7 +323,7 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
|
326
323
|
* the bignum is ignored.
|
327
324
|
* - +10+ - Decimal number representation, with a leading '-' for a negative
|
328
325
|
* bignum.
|
329
|
-
* - +16+ -
|
326
|
+
* - +16+ - Hexadecimal number representation, with a leading '-' for a
|
330
327
|
* negative bignum.
|
331
328
|
*/
|
332
329
|
static VALUE
|
@@ -693,6 +690,7 @@ BIGNUM_3c(mod_exp)
|
|
693
690
|
ossl_bn_##func(VALUE self, VALUE bit) \
|
694
691
|
{ \
|
695
692
|
BIGNUM *bn; \
|
693
|
+
rb_check_frozen(self); \
|
696
694
|
GetBN(self, bn); \
|
697
695
|
if (BN_##func(bn, NUM2INT(bit)) <= 0) { \
|
698
696
|
ossl_raise(eBNError, NULL); \
|
@@ -782,6 +780,7 @@ BIGNUM_SHIFT(rshift)
|
|
782
780
|
{ \
|
783
781
|
BIGNUM *bn; \
|
784
782
|
int b; \
|
783
|
+
rb_check_frozen(self); \
|
785
784
|
b = NUM2INT(bits); \
|
786
785
|
GetBN(self, bn); \
|
787
786
|
if (BN_##func(bn, bn, b) <= 0) \
|
@@ -1191,6 +1190,7 @@ ossl_bn_set_flags(VALUE self, VALUE arg)
|
|
1191
1190
|
BIGNUM *bn;
|
1192
1191
|
GetBN(self, bn);
|
1193
1192
|
|
1193
|
+
rb_check_frozen(self);
|
1194
1194
|
BN_set_flags(bn, NUM2INT(arg));
|
1195
1195
|
return Qnil;
|
1196
1196
|
}
|
data/ext/openssl/ossl_bn.h
CHANGED
@@ -5,13 +5,12 @@
|
|
5
5
|
*/
|
6
6
|
/*
|
7
7
|
* This program is licensed under the same licence as Ruby.
|
8
|
-
* (See the file '
|
8
|
+
* (See the file 'COPYING'.)
|
9
9
|
*/
|
10
10
|
#if !defined(_OSSL_BN_H_)
|
11
11
|
#define _OSSL_BN_H_
|
12
12
|
|
13
13
|
extern VALUE cBN;
|
14
|
-
extern VALUE eBNError;
|
15
14
|
|
16
15
|
BN_CTX *ossl_bn_ctx_get(void);
|
17
16
|
#define ossl_bn_ctx ossl_bn_ctx_get()
|
data/ext/openssl/ossl_cipher.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
*/
|
6
6
|
/*
|
7
7
|
* This program is licensed under the same licence as Ruby.
|
8
|
-
* (See the file '
|
8
|
+
* (See the file 'COPYING'.)
|
9
9
|
*/
|
10
10
|
#include "ossl.h"
|
11
11
|
|
@@ -30,8 +30,8 @@
|
|
30
30
|
/*
|
31
31
|
* Classes
|
32
32
|
*/
|
33
|
-
VALUE cCipher;
|
34
|
-
VALUE eCipherError;
|
33
|
+
static VALUE cCipher;
|
34
|
+
static VALUE eCipherError;
|
35
35
|
static ID id_auth_tag_len, id_key_set;
|
36
36
|
|
37
37
|
static VALUE ossl_cipher_alloc(VALUE klass);
|
@@ -457,8 +457,8 @@ ossl_cipher_final(VALUE self)
|
|
457
457
|
* call-seq:
|
458
458
|
* cipher.name -> string
|
459
459
|
*
|
460
|
-
* Returns the name of the cipher which may differ slightly from the
|
461
|
-
* name provided.
|
460
|
+
* Returns the short name of the cipher which may differ slightly from the
|
461
|
+
* original name provided.
|
462
462
|
*/
|
463
463
|
static VALUE
|
464
464
|
ossl_cipher_name(VALUE self)
|
data/ext/openssl/ossl_cipher.h
CHANGED
@@ -5,14 +5,11 @@
|
|
5
5
|
*/
|
6
6
|
/*
|
7
7
|
* This program is licensed under the same licence as Ruby.
|
8
|
-
* (See the file '
|
8
|
+
* (See the file 'COPYING'.)
|
9
9
|
*/
|
10
10
|
#if !defined(_OSSL_CIPHER_H_)
|
11
11
|
#define _OSSL_CIPHER_H_
|
12
12
|
|
13
|
-
extern VALUE cCipher;
|
14
|
-
extern VALUE eCipherError;
|
15
|
-
|
16
13
|
const EVP_CIPHER *ossl_evp_get_cipherbyname(VALUE);
|
17
14
|
VALUE ossl_cipher_new(const EVP_CIPHER *);
|
18
15
|
void Init_ossl_cipher(void);
|