rubysl-openssl 2.10 → 2.11
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.
- checksums.yaml +5 -5
- data/ext/rubysl/openssl/deprecation.rb +7 -3
- data/ext/rubysl/openssl/extconf.rb +148 -103
- data/ext/rubysl/openssl/openssl_missing.c +94 -275
- data/ext/rubysl/openssl/openssl_missing.h +167 -98
- data/ext/rubysl/openssl/ossl.c +266 -212
- data/ext/rubysl/openssl/ossl.h +27 -89
- data/ext/rubysl/openssl/ossl_asn1.c +157 -221
- data/ext/rubysl/openssl/ossl_asn1.h +11 -3
- data/ext/rubysl/openssl/ossl_bio.c +10 -40
- data/ext/rubysl/openssl/ossl_bio.h +1 -2
- data/ext/rubysl/openssl/ossl_bn.c +144 -100
- data/ext/rubysl/openssl/ossl_bn.h +3 -1
- data/ext/rubysl/openssl/ossl_cipher.c +270 -195
- data/ext/rubysl/openssl/ossl_config.c +7 -1
- data/ext/rubysl/openssl/ossl_config.h +0 -1
- data/ext/rubysl/openssl/ossl_digest.c +40 -29
- data/ext/rubysl/openssl/ossl_engine.c +23 -62
- data/ext/rubysl/openssl/ossl_hmac.c +82 -55
- data/ext/rubysl/openssl/ossl_ns_spki.c +22 -22
- data/ext/rubysl/openssl/ossl_ocsp.c +894 -144
- data/ext/rubysl/openssl/ossl_ocsp.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs12.c +47 -19
- data/ext/rubysl/openssl/ossl_pkcs5.c +7 -15
- data/ext/rubysl/openssl/ossl_pkcs7.c +38 -15
- data/ext/rubysl/openssl/ossl_pkey.c +151 -99
- data/ext/rubysl/openssl/ossl_pkey.h +123 -29
- data/ext/rubysl/openssl/ossl_pkey_dh.c +143 -92
- data/ext/rubysl/openssl/ossl_pkey_dsa.c +149 -104
- data/ext/rubysl/openssl/ossl_pkey_ec.c +646 -524
- data/ext/rubysl/openssl/ossl_pkey_rsa.c +180 -121
- data/ext/rubysl/openssl/ossl_rand.c +25 -21
- data/ext/rubysl/openssl/ossl_ssl.c +795 -413
- data/ext/rubysl/openssl/ossl_ssl.h +3 -0
- data/ext/rubysl/openssl/ossl_ssl_session.c +83 -77
- data/ext/rubysl/openssl/ossl_version.h +1 -1
- data/ext/rubysl/openssl/ossl_x509.c +92 -8
- data/ext/rubysl/openssl/ossl_x509.h +14 -5
- data/ext/rubysl/openssl/ossl_x509attr.c +77 -41
- data/ext/rubysl/openssl/ossl_x509cert.c +45 -46
- data/ext/rubysl/openssl/ossl_x509crl.c +51 -57
- data/ext/rubysl/openssl/ossl_x509ext.c +39 -33
- data/ext/rubysl/openssl/ossl_x509name.c +68 -45
- data/ext/rubysl/openssl/ossl_x509req.c +32 -38
- data/ext/rubysl/openssl/ossl_x509revoked.c +43 -9
- data/ext/rubysl/openssl/ossl_x509store.c +309 -104
- data/ext/rubysl/openssl/ruby_missing.h +8 -6
- data/lib/openssl/buffering.rb +11 -5
- data/lib/openssl/cipher.rb +23 -15
- data/lib/openssl/digest.rb +7 -10
- data/lib/openssl/pkey.rb +15 -8
- data/lib/openssl/ssl.rb +81 -105
- data/lib/rubysl/openssl.rb +1 -4
- data/lib/rubysl/openssl/version.rb +1 -1
- metadata +3 -4
data/ext/rubysl/openssl/ossl.h
CHANGED
@@ -12,49 +12,14 @@
|
|
12
12
|
|
13
13
|
#include RUBY_EXTCONF_H
|
14
14
|
|
15
|
-
#
|
16
|
-
|
17
|
-
#endif
|
18
|
-
|
19
|
-
#if 0
|
20
|
-
mOSSL = rb_define_module("OpenSSL");
|
21
|
-
mX509 = rb_define_module_under(mOSSL, "X509");
|
22
|
-
#endif
|
23
|
-
|
24
|
-
/*
|
25
|
-
* OpenSSL has defined RFILE and Ruby has defined RFILE - so undef it!
|
26
|
-
*/
|
27
|
-
#if defined(RFILE) /*&& !defined(OSSL_DEBUG)*/
|
28
|
-
# undef RFILE
|
29
|
-
#endif
|
15
|
+
#include <assert.h>
|
16
|
+
#include <errno.h>
|
30
17
|
#include <ruby.h>
|
31
18
|
#include <ruby/io.h>
|
32
19
|
#include <ruby/thread.h>
|
33
|
-
|
34
|
-
/*
|
35
|
-
* Check the OpenSSL version
|
36
|
-
* The only supported are:
|
37
|
-
* OpenSSL >= 0.9.7
|
38
|
-
*/
|
39
20
|
#include <openssl/opensslv.h>
|
40
|
-
|
41
|
-
#ifdef HAVE_ASSERT_H
|
42
|
-
# include <assert.h>
|
43
|
-
#else
|
44
|
-
# define assert(condition)
|
45
|
-
#endif
|
46
|
-
|
47
|
-
#if defined(_WIN32) && !defined(LIBRESSL_VERSION_NUMBER)
|
48
|
-
# include <openssl/e_os2.h>
|
49
|
-
# define OSSL_NO_CONF_API 1
|
50
|
-
# if !defined(OPENSSL_SYS_WIN32)
|
51
|
-
# define OPENSSL_SYS_WIN32 1
|
52
|
-
# endif
|
53
|
-
# include <winsock2.h>
|
54
|
-
#endif
|
55
|
-
#include <errno.h>
|
56
21
|
#include <openssl/err.h>
|
57
|
-
#include <openssl/
|
22
|
+
#include <openssl/asn1.h>
|
58
23
|
#include <openssl/x509v3.h>
|
59
24
|
#include <openssl/ssl.h>
|
60
25
|
#include <openssl/pkcs12.h>
|
@@ -63,25 +28,14 @@ extern "C" {
|
|
63
28
|
#include <openssl/rand.h>
|
64
29
|
#include <openssl/conf.h>
|
65
30
|
#include <openssl/conf_api.h>
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#endif
|
69
|
-
#undef X509_NAME
|
70
|
-
#undef PKCS7_SIGNER_INFO
|
71
|
-
#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_EVP_CIPHER_CTX_ENGINE)
|
72
|
-
# define OSSL_ENGINE_ENABLED
|
31
|
+
#include <openssl/crypto.h>
|
32
|
+
#if !defined(OPENSSL_NO_ENGINE)
|
73
33
|
# include <openssl/engine.h>
|
74
34
|
#endif
|
75
|
-
#if defined(
|
76
|
-
# define OSSL_OCSP_ENABLED
|
35
|
+
#if !defined(OPENSSL_NO_OCSP)
|
77
36
|
# include <openssl/ocsp.h>
|
78
37
|
#endif
|
79
38
|
|
80
|
-
/* OpenSSL requires passwords for PEM-encoded files to be at least four
|
81
|
-
* characters long
|
82
|
-
*/
|
83
|
-
#define OSSL_MIN_PWD_LEN 4
|
84
|
-
|
85
39
|
/*
|
86
40
|
* Common Module
|
87
41
|
*/
|
@@ -115,27 +69,15 @@ extern VALUE eOSSLError;
|
|
115
69
|
}\
|
116
70
|
} while (0)
|
117
71
|
|
118
|
-
/*
|
119
|
-
* Compatibility
|
120
|
-
*/
|
121
|
-
#if OPENSSL_VERSION_NUMBER >= 0x10000000L
|
122
|
-
#define STACK _STACK
|
123
|
-
#endif
|
124
|
-
|
125
|
-
/*
|
126
|
-
* String to HEXString conversion
|
127
|
-
*/
|
128
|
-
int string2hex(const unsigned char *, int, char **, int *);
|
129
|
-
|
130
72
|
/*
|
131
73
|
* Data Conversion
|
132
74
|
*/
|
133
75
|
STACK_OF(X509) *ossl_x509_ary2sk0(VALUE);
|
134
76
|
STACK_OF(X509) *ossl_x509_ary2sk(VALUE);
|
135
77
|
STACK_OF(X509) *ossl_protect_x509_ary2sk(VALUE,int*);
|
136
|
-
VALUE ossl_x509_sk2ary(STACK_OF(X509) *certs);
|
137
|
-
VALUE ossl_x509crl_sk2ary(STACK_OF(X509_CRL) *crl);
|
138
|
-
VALUE ossl_x509name_sk2ary(STACK_OF(X509_NAME) *names);
|
78
|
+
VALUE ossl_x509_sk2ary(const STACK_OF(X509) *certs);
|
79
|
+
VALUE ossl_x509crl_sk2ary(const STACK_OF(X509_CRL) *crl);
|
80
|
+
VALUE ossl_x509name_sk2ary(const STACK_OF(X509_NAME) *names);
|
139
81
|
VALUE ossl_buf2str(char *buf, int len);
|
140
82
|
#define ossl_str_adjust(str, p) \
|
141
83
|
do{\
|
@@ -144,39 +86,39 @@ do{\
|
|
144
86
|
assert(newlen <= len);\
|
145
87
|
rb_str_set_len((str), newlen);\
|
146
88
|
}while(0)
|
89
|
+
/*
|
90
|
+
* Convert binary string to hex string. The caller is responsible for
|
91
|
+
* ensuring out has (2 * len) bytes of capacity.
|
92
|
+
*/
|
93
|
+
void ossl_bin2hex(unsigned char *in, char *out, size_t len);
|
147
94
|
|
148
95
|
/*
|
149
|
-
*
|
96
|
+
* Our default PEM callback
|
150
97
|
*/
|
98
|
+
/* Convert the argument to String and validate the length. Note this may raise. */
|
99
|
+
VALUE ossl_pem_passwd_value(VALUE);
|
100
|
+
/* Can be casted to pem_password_cb. If a password (String) is passed as the
|
101
|
+
* "arbitrary data" (typically the last parameter of PEM_{read,write}_
|
102
|
+
* functions), uses the value. If not, but a block is given, yields to it.
|
103
|
+
* If not either, fallbacks to PEM_def_callback() which reads from stdin. */
|
151
104
|
int ossl_pem_passwd_cb(char *, int, int, void *);
|
152
105
|
|
153
106
|
/*
|
154
107
|
* Clear BIO* with this in PEM/DER fallback scenarios to avoid decoding
|
155
108
|
* errors piling up in OpenSSL::Errors
|
156
109
|
*/
|
157
|
-
#define OSSL_BIO_reset(bio)
|
158
|
-
|
110
|
+
#define OSSL_BIO_reset(bio) do { \
|
111
|
+
(void)BIO_reset((bio)); \
|
112
|
+
ossl_clear_error(); \
|
113
|
+
} while (0)
|
159
114
|
|
160
115
|
/*
|
161
116
|
* ERRor messages
|
162
117
|
*/
|
163
118
|
#define OSSL_ErrMsg() ERR_reason_error_string(ERR_get_error())
|
164
119
|
NORETURN(void ossl_raise(VALUE, const char *, ...));
|
165
|
-
|
166
|
-
|
167
|
-
/*
|
168
|
-
* Verify callback
|
169
|
-
*/
|
170
|
-
extern int ossl_verify_cb_idx;
|
171
|
-
|
172
|
-
struct ossl_verify_cb_args {
|
173
|
-
VALUE proc;
|
174
|
-
VALUE preverify_ok;
|
175
|
-
VALUE store_ctx;
|
176
|
-
};
|
177
|
-
|
178
|
-
VALUE ossl_call_verify_cb_proc(struct ossl_verify_cb_args *);
|
179
|
-
int ossl_verify_cb(int, X509_STORE_CTX *);
|
120
|
+
/* Clear OpenSSL error queue. If dOSSL is set, rb_warn() them. */
|
121
|
+
void ossl_clear_error(void);
|
180
122
|
|
181
123
|
/*
|
182
124
|
* String to DER String
|
@@ -241,8 +183,4 @@ void ossl_debug(const char *, ...);
|
|
241
183
|
|
242
184
|
void Init_openssl(void);
|
243
185
|
|
244
|
-
#if defined(__cplusplus)
|
245
|
-
}
|
246
|
-
#endif
|
247
|
-
|
248
186
|
#endif /* _OSSL_H_ */
|
@@ -9,15 +9,6 @@
|
|
9
9
|
*/
|
10
10
|
#include "ossl.h"
|
11
11
|
|
12
|
-
#if defined(HAVE_SYS_TIME_H)
|
13
|
-
# include <sys/time.h>
|
14
|
-
#elif !defined(NT) && !defined(_WIN32)
|
15
|
-
struct timeval {
|
16
|
-
long tv_sec; /* seconds */
|
17
|
-
long tv_usec; /* and microseconds */
|
18
|
-
};
|
19
|
-
#endif
|
20
|
-
|
21
12
|
static VALUE join_der(VALUE enumerable);
|
22
13
|
static VALUE ossl_asn1_decode0(unsigned char **pp, long length, long *offset,
|
23
14
|
int depth, int yield, long *num_read);
|
@@ -28,7 +19,7 @@ static VALUE ossl_asn1eoc_initialize(VALUE self);
|
|
28
19
|
* DATE conversion
|
29
20
|
*/
|
30
21
|
VALUE
|
31
|
-
asn1time_to_time(ASN1_TIME *time)
|
22
|
+
asn1time_to_time(const ASN1_TIME *time)
|
32
23
|
{
|
33
24
|
struct tm tm;
|
34
25
|
VALUE argv[6];
|
@@ -56,9 +47,15 @@ asn1time_to_time(ASN1_TIME *time)
|
|
56
47
|
}
|
57
48
|
break;
|
58
49
|
case V_ASN1_GENERALIZEDTIME:
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
count = sscanf((const char *)time->data, "%4d%2d%2d%2d%2d%2dZ",
|
51
|
+
&tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min,
|
52
|
+
&tm.tm_sec);
|
53
|
+
if (count == 5) {
|
54
|
+
tm.tm_sec = 0;
|
55
|
+
}
|
56
|
+
else if (count != 6) {
|
57
|
+
ossl_raise(rb_eTypeError, "bad GENERALIZEDTIME format: \"%s\"",
|
58
|
+
time->data);
|
62
59
|
}
|
63
60
|
break;
|
64
61
|
default:
|
@@ -75,83 +72,65 @@ asn1time_to_time(ASN1_TIME *time)
|
|
75
72
|
return rb_funcall2(rb_cTime, rb_intern("utc"), 6, argv);
|
76
73
|
}
|
77
74
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
75
|
+
#if defined(HAVE_ASN1_TIME_ADJ)
|
76
|
+
void
|
77
|
+
ossl_time_split(VALUE time, time_t *sec, int *days)
|
78
|
+
{
|
79
|
+
VALUE num = rb_Integer(time);
|
82
80
|
|
81
|
+
if (FIXNUM_P(num)) {
|
82
|
+
time_t t = FIX2LONG(num);
|
83
|
+
*sec = t % 86400;
|
84
|
+
*days = rb_long2int(t / 86400);
|
85
|
+
}
|
86
|
+
else {
|
87
|
+
*days = NUM2INT(rb_funcall(num, rb_intern("/"), 1, INT2FIX(86400)));
|
88
|
+
*sec = NUM2TIMET(rb_funcall(num, rb_intern("%"), 1, INT2FIX(86400)));
|
89
|
+
}
|
90
|
+
}
|
91
|
+
#else
|
83
92
|
time_t
|
84
93
|
time_to_time_t(VALUE time)
|
85
94
|
{
|
86
|
-
return (time_t)
|
95
|
+
return (time_t)NUM2TIMET(rb_Integer(time));
|
87
96
|
}
|
97
|
+
#endif
|
88
98
|
|
89
99
|
/*
|
90
100
|
* STRING conversion
|
91
101
|
*/
|
92
102
|
VALUE
|
93
|
-
asn1str_to_str(ASN1_STRING *str)
|
103
|
+
asn1str_to_str(const ASN1_STRING *str)
|
94
104
|
{
|
95
105
|
return rb_str_new((const char *)str->data, str->length);
|
96
106
|
}
|
97
107
|
|
98
108
|
/*
|
99
109
|
* ASN1_INTEGER conversions
|
100
|
-
* TODO: Make a decision what's the right way to do this.
|
101
110
|
*/
|
102
|
-
#define DO_IT_VIA_RUBY 0
|
103
111
|
VALUE
|
104
|
-
asn1integer_to_num(ASN1_INTEGER *ai)
|
112
|
+
asn1integer_to_num(const ASN1_INTEGER *ai)
|
105
113
|
{
|
106
114
|
BIGNUM *bn;
|
107
|
-
#if DO_IT_VIA_RUBY
|
108
|
-
char *txt;
|
109
|
-
#endif
|
110
115
|
VALUE num;
|
111
116
|
|
112
117
|
if (!ai) {
|
113
118
|
ossl_raise(rb_eTypeError, "ASN1_INTEGER is NULL!");
|
114
119
|
}
|
115
|
-
if (
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
120
|
+
if (ai->type == V_ASN1_ENUMERATED)
|
121
|
+
/* const_cast: workaround for old OpenSSL */
|
122
|
+
bn = ASN1_ENUMERATED_to_BN((ASN1_ENUMERATED *)ai, NULL);
|
123
|
+
else
|
124
|
+
bn = ASN1_INTEGER_to_BN(ai, NULL);
|
125
|
+
|
126
|
+
if (!bn)
|
121
127
|
ossl_raise(eOSSLError, NULL);
|
122
|
-
}
|
123
|
-
num = rb_cstr_to_inum(txt, 10, Qtrue);
|
124
|
-
OPENSSL_free(txt);
|
125
|
-
#else
|
126
128
|
num = ossl_bn_new(bn);
|
127
|
-
#endif
|
128
129
|
BN_free(bn);
|
129
130
|
|
130
131
|
return num;
|
131
132
|
}
|
132
133
|
|
133
|
-
#if DO_IT_VIA_RUBY
|
134
|
-
ASN1_INTEGER *
|
135
|
-
num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
136
|
-
{
|
137
|
-
BIGNUM *bn = NULL;
|
138
|
-
|
139
|
-
if (RTEST(rb_obj_is_kind_of(obj, cBN))) {
|
140
|
-
bn = GetBNPtr(obj);
|
141
|
-
} else {
|
142
|
-
obj = rb_String(obj);
|
143
|
-
if (!BN_dec2bn(&bn, StringValuePtr(obj))) {
|
144
|
-
ossl_raise(eOSSLError, NULL);
|
145
|
-
}
|
146
|
-
}
|
147
|
-
if (!(ai = BN_to_ASN1_INTEGER(bn, ai))) {
|
148
|
-
BN_free(bn);
|
149
|
-
ossl_raise(eOSSLError, NULL);
|
150
|
-
}
|
151
|
-
BN_free(bn);
|
152
|
-
return ai;
|
153
|
-
}
|
154
|
-
#else
|
155
134
|
ASN1_INTEGER *
|
156
135
|
num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
157
136
|
{
|
@@ -167,7 +146,6 @@ num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
|
167
146
|
|
168
147
|
return ai;
|
169
148
|
}
|
170
|
-
#endif
|
171
149
|
|
172
150
|
/********/
|
173
151
|
/*
|
@@ -207,22 +185,10 @@ VALUE cASN1ObjectId; /* OBJECT IDENTIFIER */
|
|
207
185
|
VALUE cASN1UTCTime, cASN1GeneralizedTime; /* TIME */
|
208
186
|
VALUE cASN1Sequence, cASN1Set; /* CONSTRUCTIVE */
|
209
187
|
|
210
|
-
static
|
211
|
-
static
|
188
|
+
static VALUE sym_IMPLICIT, sym_EXPLICIT;
|
189
|
+
static VALUE sym_UNIVERSAL, sym_APPLICATION, sym_CONTEXT_SPECIFIC, sym_PRIVATE;
|
212
190
|
static ID sivVALUE, sivTAG, sivTAG_CLASS, sivTAGGING, sivINFINITE_LENGTH, sivUNUSED_BITS;
|
213
|
-
|
214
|
-
/*
|
215
|
-
* We need to implement these for backward compatibility
|
216
|
-
* reasons, behavior of ASN1_put_object and ASN1_object_size
|
217
|
-
* for infinite length values is different in OpenSSL <= 0.9.7
|
218
|
-
*/
|
219
|
-
#if OPENSSL_VERSION_NUMBER < 0x00908000L
|
220
|
-
#define ossl_asn1_object_size(cons, len, tag) (cons) == 2 ? (len) + ASN1_object_size((cons), 0, (tag)) : ASN1_object_size((cons), (len), (tag))
|
221
|
-
#define ossl_asn1_put_object(pp, cons, len, tag, xc) (cons) == 2 ? ASN1_put_object((pp), (cons), 0, (tag), (xc)) : ASN1_put_object((pp), (cons), (len), (tag), (xc))
|
222
|
-
#else
|
223
|
-
#define ossl_asn1_object_size(cons, len, tag) ASN1_object_size((cons), (len), (tag))
|
224
|
-
#define ossl_asn1_put_object(pp, cons, len, tag, xc) ASN1_put_object((pp), (cons), (len), (tag), (xc))
|
225
|
-
#endif
|
191
|
+
static ID id_each;
|
226
192
|
|
227
193
|
/*
|
228
194
|
* Ruby to ASN1 converters
|
@@ -233,11 +199,7 @@ obj_to_asn1bool(VALUE obj)
|
|
233
199
|
if (NIL_P(obj))
|
234
200
|
ossl_raise(rb_eTypeError, "Can't convert nil into Boolean");
|
235
201
|
|
236
|
-
#if OPENSSL_VERSION_NUMBER < 0x00907000L
|
237
|
-
return RTEST(obj) ? 0xff : 0x100;
|
238
|
-
#else
|
239
202
|
return RTEST(obj) ? 0xff : 0x0;
|
240
|
-
#endif
|
241
203
|
}
|
242
204
|
|
243
205
|
static ASN1_INTEGER*
|
@@ -293,36 +255,50 @@ obj_to_asn1obj(VALUE obj)
|
|
293
255
|
{
|
294
256
|
ASN1_OBJECT *a1obj;
|
295
257
|
|
296
|
-
|
258
|
+
StringValueCStr(obj);
|
297
259
|
a1obj = OBJ_txt2obj(RSTRING_PTR(obj), 0);
|
298
260
|
if(!a1obj) a1obj = OBJ_txt2obj(RSTRING_PTR(obj), 1);
|
299
|
-
if(!a1obj) ossl_raise(eASN1Error, "invalid OBJECT ID");
|
261
|
+
if(!a1obj) ossl_raise(eASN1Error, "invalid OBJECT ID %"PRIsVALUE, obj);
|
300
262
|
|
301
263
|
return a1obj;
|
302
264
|
}
|
303
265
|
|
304
|
-
static ASN1_UTCTIME*
|
266
|
+
static ASN1_UTCTIME *
|
305
267
|
obj_to_asn1utime(VALUE time)
|
306
268
|
{
|
307
269
|
time_t sec;
|
308
270
|
ASN1_UTCTIME *t;
|
309
271
|
|
272
|
+
#if defined(HAVE_ASN1_TIME_ADJ)
|
273
|
+
int off_days;
|
274
|
+
|
275
|
+
ossl_time_split(time, &sec, &off_days);
|
276
|
+
if (!(t = ASN1_UTCTIME_adj(NULL, sec, off_days, 0)))
|
277
|
+
#else
|
310
278
|
sec = time_to_time_t(time);
|
311
|
-
if(!(t = ASN1_UTCTIME_set(NULL, sec)))
|
312
|
-
|
279
|
+
if (!(t = ASN1_UTCTIME_set(NULL, sec)))
|
280
|
+
#endif
|
281
|
+
ossl_raise(eASN1Error, NULL);
|
313
282
|
|
314
283
|
return t;
|
315
284
|
}
|
316
285
|
|
317
|
-
static ASN1_GENERALIZEDTIME*
|
286
|
+
static ASN1_GENERALIZEDTIME *
|
318
287
|
obj_to_asn1gtime(VALUE time)
|
319
288
|
{
|
320
289
|
time_t sec;
|
321
290
|
ASN1_GENERALIZEDTIME *t;
|
322
291
|
|
292
|
+
#if defined(HAVE_ASN1_TIME_ADJ)
|
293
|
+
int off_days;
|
294
|
+
|
295
|
+
ossl_time_split(time, &sec, &off_days);
|
296
|
+
if (!(t = ASN1_GENERALIZEDTIME_adj(NULL, sec, off_days, 0)))
|
297
|
+
#else
|
323
298
|
sec = time_to_time_t(time);
|
324
|
-
if(!(t =ASN1_GENERALIZEDTIME_set(NULL, sec)))
|
325
|
-
|
299
|
+
if (!(t = ASN1_GENERALIZEDTIME_set(NULL, sec)))
|
300
|
+
#endif
|
301
|
+
ossl_raise(eASN1Error, NULL);
|
326
302
|
|
327
303
|
return t;
|
328
304
|
}
|
@@ -347,14 +323,14 @@ obj_to_asn1derstr(VALUE obj)
|
|
347
323
|
static VALUE
|
348
324
|
decode_bool(unsigned char* der, long length)
|
349
325
|
{
|
350
|
-
|
351
|
-
const unsigned char *p;
|
326
|
+
const unsigned char *p = der;
|
352
327
|
|
353
|
-
|
354
|
-
|
355
|
-
|
328
|
+
if (length != 3)
|
329
|
+
ossl_raise(eASN1Error, "invalid length for BOOLEAN");
|
330
|
+
if (p[0] != 1 || p[1] != 1)
|
331
|
+
ossl_raise(eASN1Error, "invalid BOOLEAN");
|
356
332
|
|
357
|
-
return
|
333
|
+
return p[2] ? Qtrue : Qfalse;
|
358
334
|
}
|
359
335
|
|
360
336
|
static VALUE
|
@@ -368,7 +344,7 @@ decode_int(unsigned char* der, long length)
|
|
368
344
|
p = der;
|
369
345
|
if(!(ai = d2i_ASN1_INTEGER(NULL, &p, length)))
|
370
346
|
ossl_raise(eASN1Error, NULL);
|
371
|
-
ret = rb_protect((VALUE(*)
|
347
|
+
ret = rb_protect((VALUE (*)(VALUE))asn1integer_to_num,
|
372
348
|
(VALUE)ai, &status);
|
373
349
|
ASN1_INTEGER_free(ai);
|
374
350
|
if(status) rb_jump_tag(status);
|
@@ -408,7 +384,7 @@ decode_enum(unsigned char* der, long length)
|
|
408
384
|
p = der;
|
409
385
|
if(!(ai = d2i_ASN1_ENUMERATED(NULL, &p, length)))
|
410
386
|
ossl_raise(eASN1Error, NULL);
|
411
|
-
ret = rb_protect((VALUE(*)
|
387
|
+
ret = rb_protect((VALUE (*)(VALUE))asn1integer_to_num,
|
412
388
|
(VALUE)ai, &status);
|
413
389
|
ASN1_ENUMERATED_free(ai);
|
414
390
|
if(status) rb_jump_tag(status);
|
@@ -470,7 +446,7 @@ decode_time(unsigned char* der, long length)
|
|
470
446
|
p = der;
|
471
447
|
if(!(time = d2i_ASN1_TIME(NULL, &p, length)))
|
472
448
|
ossl_raise(eASN1Error, NULL);
|
473
|
-
ret = rb_protect((VALUE(*)
|
449
|
+
ret = rb_protect((VALUE (*)(VALUE))asn1time_to_time,
|
474
450
|
(VALUE)time, &status);
|
475
451
|
ASN1_TIME_free(time);
|
476
452
|
if(status) rb_jump_tag(status);
|
@@ -616,17 +592,14 @@ ossl_asn1_default_tag(VALUE obj)
|
|
616
592
|
VALUE tmp_class, tag;
|
617
593
|
|
618
594
|
tmp_class = CLASS_OF(obj);
|
619
|
-
while (tmp_class) {
|
595
|
+
while (!NIL_P(tmp_class)) {
|
620
596
|
tag = rb_hash_lookup(class_tag_map, tmp_class);
|
621
|
-
if (tag != Qnil)
|
622
|
-
|
623
|
-
|
624
|
-
tmp_class = rb_class_superclass(tmp_class);
|
597
|
+
if (tag != Qnil)
|
598
|
+
return NUM2INT(tag);
|
599
|
+
tmp_class = rb_class_superclass(tmp_class);
|
625
600
|
}
|
626
601
|
ossl_raise(eASN1Error, "universal tag for %"PRIsVALUE" not found",
|
627
602
|
rb_obj_class(obj));
|
628
|
-
|
629
|
-
return -1; /* dummy */
|
630
603
|
}
|
631
604
|
|
632
605
|
static int
|
@@ -645,59 +618,45 @@ static int
|
|
645
618
|
ossl_asn1_is_explicit(VALUE obj)
|
646
619
|
{
|
647
620
|
VALUE s;
|
648
|
-
int ret = -1;
|
649
621
|
|
650
622
|
s = ossl_asn1_get_tagging(obj);
|
651
|
-
if(NIL_P(s)
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
ret = 1;
|
657
|
-
}
|
658
|
-
if(ret < 0){
|
623
|
+
if (NIL_P(s) || s == sym_IMPLICIT)
|
624
|
+
return 0;
|
625
|
+
else if (s == sym_EXPLICIT)
|
626
|
+
return 1;
|
627
|
+
else
|
659
628
|
ossl_raise(eASN1Error, "invalid tag default");
|
660
|
-
}
|
661
|
-
|
662
|
-
return ret;
|
663
629
|
}
|
664
630
|
|
665
631
|
static int
|
666
632
|
ossl_asn1_tag_class(VALUE obj)
|
667
633
|
{
|
668
634
|
VALUE s;
|
669
|
-
int ret = -1;
|
670
635
|
|
671
636
|
s = ossl_asn1_get_tag_class(obj);
|
672
|
-
if(NIL_P(s)
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
ret = V_ASN1_PRIVATE;
|
682
|
-
}
|
683
|
-
if(ret < 0){
|
637
|
+
if (NIL_P(s) || s == sym_UNIVERSAL)
|
638
|
+
return V_ASN1_UNIVERSAL;
|
639
|
+
else if (s == sym_APPLICATION)
|
640
|
+
return V_ASN1_APPLICATION;
|
641
|
+
else if (s == sym_CONTEXT_SPECIFIC)
|
642
|
+
return V_ASN1_CONTEXT_SPECIFIC;
|
643
|
+
else if (s == sym_PRIVATE)
|
644
|
+
return V_ASN1_PRIVATE;
|
645
|
+
else
|
684
646
|
ossl_raise(eASN1Error, "invalid tag class");
|
685
|
-
}
|
686
|
-
|
687
|
-
return ret;
|
688
647
|
}
|
689
648
|
|
690
649
|
static VALUE
|
691
650
|
ossl_asn1_class2sym(int tc)
|
692
651
|
{
|
693
652
|
if((tc & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)
|
694
|
-
return
|
653
|
+
return sym_PRIVATE;
|
695
654
|
else if((tc & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)
|
696
|
-
return
|
655
|
+
return sym_CONTEXT_SPECIFIC;
|
697
656
|
else if((tc & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
|
698
|
-
return
|
657
|
+
return sym_APPLICATION;
|
699
658
|
else
|
700
|
-
return
|
659
|
+
return sym_UNIVERSAL;
|
701
660
|
}
|
702
661
|
|
703
662
|
/*
|
@@ -721,7 +680,7 @@ ossl_asn1data_initialize(VALUE self, VALUE value, VALUE tag, VALUE tag_class)
|
|
721
680
|
{
|
722
681
|
if(!SYMBOL_P(tag_class))
|
723
682
|
ossl_raise(eASN1Error, "invalid tag class");
|
724
|
-
if(
|
683
|
+
if (tag_class == sym_UNIVERSAL && NUM2INT(tag) > 31)
|
725
684
|
ossl_raise(eASN1Error, "tag number for Universal too large");
|
726
685
|
ossl_asn1_set_tag(self, tag);
|
727
686
|
ossl_asn1_set_value(self, value);
|
@@ -744,7 +703,7 @@ static VALUE
|
|
744
703
|
join_der(VALUE enumerable)
|
745
704
|
{
|
746
705
|
VALUE str = rb_str_new(0, 0);
|
747
|
-
rb_block_call(enumerable,
|
706
|
+
rb_block_call(enumerable, id_each, 0, 0, join_der_i, str);
|
748
707
|
return str;
|
749
708
|
}
|
750
709
|
|
@@ -778,11 +737,11 @@ ossl_asn1data_to_der(VALUE self)
|
|
778
737
|
if (inf_length == Qtrue) {
|
779
738
|
is_cons = 2;
|
780
739
|
}
|
781
|
-
if((length =
|
740
|
+
if((length = ASN1_object_size(is_cons, RSTRING_LENINT(value), tag)) <= 0)
|
782
741
|
ossl_raise(eASN1Error, NULL);
|
783
742
|
der = rb_str_new(0, length);
|
784
743
|
p = (unsigned char *)RSTRING_PTR(der);
|
785
|
-
|
744
|
+
ASN1_put_object(&p, is_cons, RSTRING_LENINT(value), tag, tag_class);
|
786
745
|
memcpy(p, RSTRING_PTR(value), RSTRING_LEN(value));
|
787
746
|
p += RSTRING_LEN(value);
|
788
747
|
ossl_str_adjust(der, p);
|
@@ -800,7 +759,7 @@ int_ossl_asn1_decode0_prim(unsigned char **pp, long length, long hlen, int tag,
|
|
800
759
|
|
801
760
|
p = *pp;
|
802
761
|
|
803
|
-
if(tc ==
|
762
|
+
if(tc == sym_UNIVERSAL && tag < ossl_asn1_info_size) {
|
804
763
|
switch(tag){
|
805
764
|
case V_ASN1_EOC:
|
806
765
|
value = decode_eoc(p, hlen+length);
|
@@ -842,13 +801,14 @@ int_ossl_asn1_decode0_prim(unsigned char **pp, long length, long hlen, int tag,
|
|
842
801
|
*pp += hlen + length;
|
843
802
|
*num_read = hlen + length;
|
844
803
|
|
845
|
-
if (tc ==
|
804
|
+
if (tc == sym_UNIVERSAL &&
|
805
|
+
tag < ossl_asn1_info_size && ossl_asn1_info[tag].klass) {
|
846
806
|
VALUE klass = *ossl_asn1_info[tag].klass;
|
847
807
|
VALUE args[4];
|
848
808
|
args[0] = value;
|
849
809
|
args[1] = INT2NUM(tag);
|
850
810
|
args[2] = Qnil;
|
851
|
-
args[3] =
|
811
|
+
args[3] = tc;
|
852
812
|
asn1data = rb_obj_alloc(klass);
|
853
813
|
ossl_asn1_initialize(4, args, asn1data);
|
854
814
|
if(tag == V_ASN1_BIT_STRING){
|
@@ -857,7 +817,7 @@ int_ossl_asn1_decode0_prim(unsigned char **pp, long length, long hlen, int tag,
|
|
857
817
|
}
|
858
818
|
else {
|
859
819
|
asn1data = rb_obj_alloc(cASN1Data);
|
860
|
-
ossl_asn1data_initialize(asn1data, value, INT2NUM(tag),
|
820
|
+
ossl_asn1data_initialize(asn1data, value, INT2NUM(tag), tc);
|
861
821
|
}
|
862
822
|
|
863
823
|
return asn1data;
|
@@ -870,28 +830,27 @@ int_ossl_asn1_decode0_cons(unsigned char **pp, long max_len, long length,
|
|
870
830
|
{
|
871
831
|
VALUE value, asn1data, ary;
|
872
832
|
int infinite;
|
873
|
-
long off = *offset;
|
833
|
+
long available_len, off = *offset;
|
874
834
|
|
875
835
|
infinite = (j == 0x21);
|
876
836
|
ary = rb_ary_new();
|
877
837
|
|
878
|
-
|
838
|
+
available_len = infinite ? max_len : length;
|
839
|
+
while (available_len > 0) {
|
879
840
|
long inner_read = 0;
|
880
|
-
value = ossl_asn1_decode0(pp,
|
841
|
+
value = ossl_asn1_decode0(pp, available_len, &off, depth + 1, yield, &inner_read);
|
881
842
|
*num_read += inner_read;
|
882
|
-
|
843
|
+
available_len -= inner_read;
|
883
844
|
rb_ary_push(ary, value);
|
884
|
-
if (length > 0)
|
885
|
-
length -= inner_read;
|
886
845
|
|
887
846
|
if (infinite &&
|
888
847
|
NUM2INT(ossl_asn1_get_tag(value)) == V_ASN1_EOC &&
|
889
|
-
|
848
|
+
ossl_asn1_get_tag_class(value) == sym_UNIVERSAL) {
|
890
849
|
break;
|
891
850
|
}
|
892
851
|
}
|
893
852
|
|
894
|
-
if (tc ==
|
853
|
+
if (tc == sym_UNIVERSAL) {
|
895
854
|
VALUE args[4];
|
896
855
|
int not_sequence_or_set;
|
897
856
|
|
@@ -913,12 +872,12 @@ int_ossl_asn1_decode0_cons(unsigned char **pp, long max_len, long length,
|
|
913
872
|
args[0] = ary;
|
914
873
|
args[1] = INT2NUM(tag);
|
915
874
|
args[2] = Qnil;
|
916
|
-
args[3] =
|
875
|
+
args[3] = tc;
|
917
876
|
ossl_asn1_initialize(4, args, asn1data);
|
918
877
|
}
|
919
878
|
else {
|
920
879
|
asn1data = rb_obj_alloc(cASN1Data);
|
921
|
-
ossl_asn1data_initialize(asn1data, ary, INT2NUM(tag),
|
880
|
+
ossl_asn1data_initialize(asn1data, ary, INT2NUM(tag), tc);
|
922
881
|
}
|
923
882
|
|
924
883
|
if (infinite)
|
@@ -948,13 +907,13 @@ ossl_asn1_decode0(unsigned char **pp, long length, long *offset, int depth,
|
|
948
907
|
if(j & 0x80) ossl_raise(eASN1Error, NULL);
|
949
908
|
if(len > length) ossl_raise(eASN1Error, "value is too short");
|
950
909
|
if((tc & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)
|
951
|
-
tag_class =
|
910
|
+
tag_class = sym_PRIVATE;
|
952
911
|
else if((tc & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)
|
953
|
-
tag_class =
|
912
|
+
tag_class = sym_CONTEXT_SPECIFIC;
|
954
913
|
else if((tc & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
|
955
|
-
tag_class =
|
914
|
+
tag_class = sym_APPLICATION;
|
956
915
|
else
|
957
|
-
tag_class =
|
916
|
+
tag_class = sym_UNIVERSAL;
|
958
917
|
|
959
918
|
hlen = p - start;
|
960
919
|
|
@@ -973,7 +932,7 @@ ossl_asn1_decode0(unsigned char **pp, long length, long *offset, int depth,
|
|
973
932
|
if(j & V_ASN1_CONSTRUCTED) {
|
974
933
|
*pp += hlen;
|
975
934
|
off += hlen;
|
976
|
-
asn1data = int_ossl_asn1_decode0_cons(pp, length, len, &off, depth, yield, j, tag, tag_class, &inner_read);
|
935
|
+
asn1data = int_ossl_asn1_decode0_cons(pp, length - hlen, len, &off, depth, yield, j, tag, tag_class, &inner_read);
|
977
936
|
inner_read += hlen;
|
978
937
|
}
|
979
938
|
else {
|
@@ -1146,19 +1105,19 @@ ossl_asn1_initialize(int argc, VALUE *argv, VALUE self)
|
|
1146
1105
|
ossl_raise(eASN1Error, "invalid tagging method");
|
1147
1106
|
if(NIL_P(tag_class)) {
|
1148
1107
|
if (NIL_P(tagging))
|
1149
|
-
tag_class =
|
1108
|
+
tag_class = sym_UNIVERSAL;
|
1150
1109
|
else
|
1151
|
-
tag_class =
|
1110
|
+
tag_class = sym_CONTEXT_SPECIFIC;
|
1152
1111
|
}
|
1153
1112
|
if(!SYMBOL_P(tag_class))
|
1154
1113
|
ossl_raise(eASN1Error, "invalid tag class");
|
1155
|
-
if
|
1114
|
+
if (tagging == sym_IMPLICIT && NUM2INT(tag) > 31)
|
1156
1115
|
ossl_raise(eASN1Error, "tag number for Universal too large");
|
1157
1116
|
}
|
1158
1117
|
else{
|
1159
1118
|
tag = INT2NUM(ossl_asn1_default_tag(self));
|
1160
1119
|
tagging = Qnil;
|
1161
|
-
tag_class =
|
1120
|
+
tag_class = sym_UNIVERSAL;
|
1162
1121
|
}
|
1163
1122
|
ossl_asn1_set_tag(self, tag);
|
1164
1123
|
ossl_asn1_set_value(self, value);
|
@@ -1174,7 +1133,7 @@ ossl_asn1eoc_initialize(VALUE self) {
|
|
1174
1133
|
VALUE tag, tagging, tag_class, value;
|
1175
1134
|
tag = INT2NUM(ossl_asn1_default_tag(self));
|
1176
1135
|
tagging = Qnil;
|
1177
|
-
tag_class =
|
1136
|
+
tag_class = sym_UNIVERSAL;
|
1178
1137
|
value = rb_str_new("", 0);
|
1179
1138
|
ossl_asn1_set_tag(self, tag);
|
1180
1139
|
ossl_asn1_set_value(self, value);
|
@@ -1184,30 +1143,6 @@ ossl_asn1eoc_initialize(VALUE self) {
|
|
1184
1143
|
return self;
|
1185
1144
|
}
|
1186
1145
|
|
1187
|
-
static int
|
1188
|
-
ossl_i2d_ASN1_TYPE(ASN1_TYPE *a, unsigned char **pp)
|
1189
|
-
{
|
1190
|
-
#if OPENSSL_VERSION_NUMBER < 0x00907000L
|
1191
|
-
if(!a) return 0;
|
1192
|
-
if(a->type == V_ASN1_BOOLEAN)
|
1193
|
-
return i2d_ASN1_BOOLEAN(a->value.boolean, pp);
|
1194
|
-
#endif
|
1195
|
-
return i2d_ASN1_TYPE(a, pp);
|
1196
|
-
}
|
1197
|
-
|
1198
|
-
static void
|
1199
|
-
ossl_ASN1_TYPE_free(ASN1_TYPE *a)
|
1200
|
-
{
|
1201
|
-
#if OPENSSL_VERSION_NUMBER < 0x00907000L
|
1202
|
-
if(!a) return;
|
1203
|
-
if(a->type == V_ASN1_BOOLEAN){
|
1204
|
-
OPENSSL_free(a);
|
1205
|
-
return;
|
1206
|
-
}
|
1207
|
-
#endif
|
1208
|
-
ASN1_TYPE_free(a);
|
1209
|
-
}
|
1210
|
-
|
1211
1146
|
/*
|
1212
1147
|
* call-seq:
|
1213
1148
|
* asn1.to_der => DER-encoded String
|
@@ -1228,22 +1163,22 @@ ossl_asn1prim_to_der(VALUE self)
|
|
1228
1163
|
explicit = ossl_asn1_is_explicit(self);
|
1229
1164
|
asn1 = ossl_asn1_get_asn1type(self);
|
1230
1165
|
|
1231
|
-
len =
|
1166
|
+
len = ASN1_object_size(1, i2d_ASN1_TYPE(asn1, NULL), tn);
|
1232
1167
|
if(!(buf = OPENSSL_malloc(len))){
|
1233
|
-
|
1168
|
+
ASN1_TYPE_free(asn1);
|
1234
1169
|
ossl_raise(eASN1Error, "cannot alloc buffer");
|
1235
1170
|
}
|
1236
1171
|
p = buf;
|
1237
1172
|
if (tc == V_ASN1_UNIVERSAL) {
|
1238
|
-
|
1173
|
+
i2d_ASN1_TYPE(asn1, &p);
|
1239
1174
|
} else if (explicit) {
|
1240
|
-
|
1241
|
-
|
1175
|
+
ASN1_put_object(&p, 1, i2d_ASN1_TYPE(asn1, NULL), tn, tc);
|
1176
|
+
i2d_ASN1_TYPE(asn1, &p);
|
1242
1177
|
} else {
|
1243
|
-
|
1178
|
+
i2d_ASN1_TYPE(asn1, &p);
|
1244
1179
|
*buf = tc | tn | (*buf & V_ASN1_CONSTRUCTED);
|
1245
1180
|
}
|
1246
|
-
|
1181
|
+
ASN1_TYPE_free(asn1);
|
1247
1182
|
reallen = p - buf;
|
1248
1183
|
assert(reallen <= len);
|
1249
1184
|
str = ossl_buf2str((char *)buf, rb_long2int(reallen)); /* buf will be free in ossl_buf2str */
|
@@ -1272,8 +1207,8 @@ ossl_asn1cons_to_der(VALUE self)
|
|
1272
1207
|
if (inf_length == Qtrue) {
|
1273
1208
|
VALUE ary, example;
|
1274
1209
|
constructed = 2;
|
1275
|
-
if (
|
1276
|
-
|
1210
|
+
if (rb_obj_class(self) == cASN1Sequence ||
|
1211
|
+
rb_obj_class(self) == cASN1Set) {
|
1277
1212
|
tag = ossl_asn1_default_tag(self);
|
1278
1213
|
}
|
1279
1214
|
else { /* must be a constructive encoding of a primitive value */
|
@@ -1302,26 +1237,26 @@ ossl_asn1cons_to_der(VALUE self)
|
|
1302
1237
|
}
|
1303
1238
|
}
|
1304
1239
|
else {
|
1305
|
-
if (
|
1240
|
+
if (rb_obj_class(self) == cASN1Constructive)
|
1306
1241
|
ossl_raise(eASN1Error, "Constructive shall only be used with infinite length");
|
1307
1242
|
tag = ossl_asn1_default_tag(self);
|
1308
1243
|
}
|
1309
1244
|
explicit = ossl_asn1_is_explicit(self);
|
1310
1245
|
value = join_der(ossl_asn1_get_value(self));
|
1311
1246
|
|
1312
|
-
seq_len =
|
1313
|
-
length =
|
1247
|
+
seq_len = ASN1_object_size(constructed, RSTRING_LENINT(value), tag);
|
1248
|
+
length = ASN1_object_size(constructed, seq_len, tn);
|
1314
1249
|
str = rb_str_new(0, length);
|
1315
1250
|
p = (unsigned char *)RSTRING_PTR(str);
|
1316
1251
|
if(tc == V_ASN1_UNIVERSAL)
|
1317
|
-
|
1252
|
+
ASN1_put_object(&p, constructed, RSTRING_LENINT(value), tn, tc);
|
1318
1253
|
else{
|
1319
1254
|
if(explicit){
|
1320
|
-
|
1321
|
-
|
1255
|
+
ASN1_put_object(&p, constructed, seq_len, tn, tc);
|
1256
|
+
ASN1_put_object(&p, constructed, RSTRING_LENINT(value), tag, V_ASN1_UNIVERSAL);
|
1322
1257
|
}
|
1323
1258
|
else{
|
1324
|
-
|
1259
|
+
ASN1_put_object(&p, constructed, RSTRING_LENINT(value), tn, tc);
|
1325
1260
|
}
|
1326
1261
|
}
|
1327
1262
|
memcpy(p, RSTRING_PTR(value), RSTRING_LEN(value));
|
@@ -1356,7 +1291,8 @@ ossl_asn1cons_to_der(VALUE self)
|
|
1356
1291
|
static VALUE
|
1357
1292
|
ossl_asn1cons_each(VALUE self)
|
1358
1293
|
{
|
1359
|
-
|
1294
|
+
rb_block_call(ossl_asn1_get_value(self), id_each, 0, 0, 0, 0);
|
1295
|
+
|
1360
1296
|
return self;
|
1361
1297
|
}
|
1362
1298
|
|
@@ -1374,9 +1310,9 @@ ossl_asn1cons_each(VALUE self)
|
|
1374
1310
|
static VALUE
|
1375
1311
|
ossl_asn1obj_s_register(VALUE self, VALUE oid, VALUE sn, VALUE ln)
|
1376
1312
|
{
|
1377
|
-
|
1378
|
-
|
1379
|
-
|
1313
|
+
StringValueCStr(oid);
|
1314
|
+
StringValueCStr(sn);
|
1315
|
+
StringValueCStr(ln);
|
1380
1316
|
|
1381
1317
|
if(!OBJ_create(RSTRING_PTR(oid), RSTRING_PTR(sn), RSTRING_PTR(ln)))
|
1382
1318
|
ossl_raise(eASN1Error, NULL);
|
@@ -1399,7 +1335,7 @@ ossl_asn1obj_get_sn(VALUE self)
|
|
1399
1335
|
int nid;
|
1400
1336
|
|
1401
1337
|
val = ossl_asn1_get_value(self);
|
1402
|
-
if ((nid = OBJ_txt2nid(
|
1338
|
+
if ((nid = OBJ_txt2nid(StringValueCStr(val))) != NID_undef)
|
1403
1339
|
ret = rb_str_new2(OBJ_nid2sn(nid));
|
1404
1340
|
|
1405
1341
|
return ret;
|
@@ -1420,7 +1356,7 @@ ossl_asn1obj_get_ln(VALUE self)
|
|
1420
1356
|
int nid;
|
1421
1357
|
|
1422
1358
|
val = ossl_asn1_get_value(self);
|
1423
|
-
if ((nid = OBJ_txt2nid(
|
1359
|
+
if ((nid = OBJ_txt2nid(StringValueCStr(val))) != NID_undef)
|
1424
1360
|
ret = rb_str_new2(OBJ_nid2ln(nid));
|
1425
1361
|
|
1426
1362
|
return ret;
|
@@ -1476,19 +1412,21 @@ OSSL_ASN1_IMPL_FACTORY_METHOD(EndOfContent)
|
|
1476
1412
|
void
|
1477
1413
|
Init_ossl_asn1(void)
|
1478
1414
|
{
|
1415
|
+
#undef rb_intern
|
1479
1416
|
VALUE ary;
|
1480
1417
|
int i;
|
1481
1418
|
|
1482
1419
|
#if 0
|
1483
|
-
mOSSL = rb_define_module("OpenSSL");
|
1420
|
+
mOSSL = rb_define_module("OpenSSL");
|
1421
|
+
eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
|
1484
1422
|
#endif
|
1485
1423
|
|
1486
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1490
|
-
|
1491
|
-
|
1424
|
+
sym_UNIVERSAL = ID2SYM(rb_intern_const("UNIVERSAL"));
|
1425
|
+
sym_CONTEXT_SPECIFIC = ID2SYM(rb_intern_const("CONTEXT_SPECIFIC"));
|
1426
|
+
sym_APPLICATION = ID2SYM(rb_intern_const("APPLICATION"));
|
1427
|
+
sym_PRIVATE = ID2SYM(rb_intern_const("PRIVATE"));
|
1428
|
+
sym_EXPLICIT = ID2SYM(rb_intern_const("EXPLICIT"));
|
1429
|
+
sym_IMPLICIT = ID2SYM(rb_intern_const("IMPLICIT"));
|
1492
1430
|
|
1493
1431
|
sivVALUE = rb_intern("@value");
|
1494
1432
|
sivTAG = rb_intern("@tag");
|
@@ -1781,12 +1719,12 @@ Init_ossl_asn1(void)
|
|
1781
1719
|
* == Primitive sub-classes and their mapping to Ruby classes
|
1782
1720
|
* * OpenSSL::ASN1::EndOfContent <=> +value+ is always +nil+
|
1783
1721
|
* * OpenSSL::ASN1::Boolean <=> +value+ is a +Boolean+
|
1784
|
-
* * OpenSSL::ASN1::Integer <=> +value+ is
|
1722
|
+
* * OpenSSL::ASN1::Integer <=> +value+ is an OpenSSL::BN
|
1785
1723
|
* * OpenSSL::ASN1::BitString <=> +value+ is a +String+
|
1786
1724
|
* * OpenSSL::ASN1::OctetString <=> +value+ is a +String+
|
1787
1725
|
* * OpenSSL::ASN1::Null <=> +value+ is always +nil+
|
1788
1726
|
* * OpenSSL::ASN1::Object <=> +value+ is a +String+
|
1789
|
-
* * OpenSSL::ASN1::Enumerated <=> +value+ is
|
1727
|
+
* * OpenSSL::ASN1::Enumerated <=> +value+ is an OpenSSL::BN
|
1790
1728
|
* * OpenSSL::ASN1::UTF8String <=> +value+ is a +String+
|
1791
1729
|
* * OpenSSL::ASN1::NumericString <=> +value+ is a +String+
|
1792
1730
|
* * OpenSSL::ASN1::PrintableString <=> +value+ is a +String+
|
@@ -1815,10 +1753,6 @@ Init_ossl_asn1(void)
|
|
1815
1753
|
* it is not typically allocated this way, but rather that are received from
|
1816
1754
|
* parsed ASN1 encodings.
|
1817
1755
|
*
|
1818
|
-
* While OpenSSL::ASN1::ObjectId.new will allocate a new ObjectId, it is
|
1819
|
-
* not typically allocated this way, but rather that are received from
|
1820
|
-
* parsed ASN1 encodings.
|
1821
|
-
*
|
1822
1756
|
* === Additional attributes
|
1823
1757
|
* * +sn+: the short name as defined in <openssl/objects.h>.
|
1824
1758
|
* * +ln+: the long name as defined in <openssl/objects.h>.
|
@@ -2000,4 +1934,6 @@ do{\
|
|
2000
1934
|
rb_hash_aset(class_tag_map, cASN1UniversalString, INT2NUM(V_ASN1_UNIVERSALSTRING));
|
2001
1935
|
rb_hash_aset(class_tag_map, cASN1BMPString, INT2NUM(V_ASN1_BMPSTRING));
|
2002
1936
|
rb_global_variable(&class_tag_map);
|
1937
|
+
|
1938
|
+
id_each = rb_intern_const("each");
|
2003
1939
|
}
|