rubysl-openssl 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/ext/rubysl/openssl/.gitignore +3 -0
- data/ext/rubysl/openssl/deprecation.rb +21 -0
- data/ext/rubysl/openssl/extconf.rb +45 -32
- data/ext/rubysl/openssl/openssl_missing.c +20 -7
- data/ext/rubysl/openssl/openssl_missing.h +22 -15
- data/ext/rubysl/openssl/ossl.c +610 -61
- data/ext/rubysl/openssl/ossl.h +31 -17
- data/ext/rubysl/openssl/ossl_asn1.c +974 -183
- data/ext/rubysl/openssl/ossl_asn1.h +3 -3
- data/ext/rubysl/openssl/ossl_bio.c +4 -3
- data/ext/rubysl/openssl/ossl_bio.h +1 -1
- data/ext/rubysl/openssl/ossl_bn.c +32 -28
- data/ext/rubysl/openssl/ossl_bn.h +1 -1
- data/ext/rubysl/openssl/ossl_cipher.c +494 -93
- data/ext/rubysl/openssl/ossl_cipher.h +1 -1
- data/ext/rubysl/openssl/ossl_config.c +4 -5
- data/ext/rubysl/openssl/ossl_config.h +1 -1
- data/ext/rubysl/openssl/ossl_digest.c +206 -24
- data/ext/rubysl/openssl/ossl_digest.h +1 -1
- data/ext/rubysl/openssl/ossl_engine.c +48 -26
- data/ext/rubysl/openssl/ossl_engine.h +1 -1
- data/ext/rubysl/openssl/ossl_hmac.c +40 -38
- data/ext/rubysl/openssl/ossl_hmac.h +1 -1
- data/ext/rubysl/openssl/ossl_ns_spki.c +157 -25
- data/ext/rubysl/openssl/ossl_ns_spki.h +1 -1
- data/ext/rubysl/openssl/ossl_ocsp.c +57 -40
- data/ext/rubysl/openssl/ossl_ocsp.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs12.c +15 -13
- data/ext/rubysl/openssl/ossl_pkcs12.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs5.c +108 -18
- data/ext/rubysl/openssl/ossl_pkcs7.c +44 -37
- data/ext/rubysl/openssl/ossl_pkcs7.h +1 -1
- data/ext/rubysl/openssl/ossl_pkey.c +211 -15
- data/ext/rubysl/openssl/ossl_pkey.h +19 -9
- data/ext/rubysl/openssl/ossl_pkey_dh.c +180 -47
- data/ext/rubysl/openssl/ossl_pkey_dsa.c +184 -47
- data/ext/rubysl/openssl/ossl_pkey_ec.c +177 -93
- data/ext/rubysl/openssl/ossl_pkey_rsa.c +209 -102
- data/ext/rubysl/openssl/ossl_rand.c +15 -15
- data/ext/rubysl/openssl/ossl_rand.h +1 -1
- data/ext/rubysl/openssl/ossl_ssl.c +939 -192
- data/ext/rubysl/openssl/ossl_ssl.h +6 -6
- data/ext/rubysl/openssl/ossl_ssl_session.c +78 -62
- data/ext/rubysl/openssl/ossl_version.h +2 -2
- data/ext/rubysl/openssl/ossl_x509.c +1 -1
- data/ext/rubysl/openssl/ossl_x509.h +1 -1
- data/ext/rubysl/openssl/ossl_x509attr.c +20 -19
- data/ext/rubysl/openssl/ossl_x509cert.c +169 -67
- data/ext/rubysl/openssl/ossl_x509crl.c +41 -39
- data/ext/rubysl/openssl/ossl_x509ext.c +51 -38
- data/ext/rubysl/openssl/ossl_x509name.c +139 -29
- data/ext/rubysl/openssl/ossl_x509req.c +42 -40
- data/ext/rubysl/openssl/ossl_x509revoked.c +20 -20
- data/ext/rubysl/openssl/ossl_x509store.c +99 -47
- data/ext/rubysl/openssl/ruby_missing.h +3 -16
- data/lib/openssl/bn.rb +19 -19
- data/lib/openssl/buffering.rb +222 -14
- data/lib/openssl/cipher.rb +20 -20
- data/lib/openssl/config.rb +1 -4
- data/lib/openssl/digest.rb +47 -19
- data/lib/openssl/ssl.rb +197 -1
- data/lib/openssl/x509.rb +162 -1
- data/lib/rubysl/openssl.rb +4 -8
- data/lib/rubysl/openssl/version.rb +1 -1
- data/rubysl-openssl.gemspec +1 -2
- metadata +16 -34
- data/ext/rubysl/openssl/extconf.h +0 -50
- data/lib/openssl/net/ftptls.rb +0 -53
- data/lib/openssl/net/telnets.rb +0 -251
- data/lib/openssl/pkcs7.rb +0 -25
- data/lib/openssl/ssl-internal.rb +0 -187
- data/lib/openssl/x509-internal.rb +0 -153
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* $Id
|
2
|
+
* $Id$
|
3
3
|
* 'OpenSSL for Ruby' project
|
4
4
|
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
|
5
5
|
* All rights reserved.
|
@@ -13,16 +13,16 @@
|
|
13
13
|
#include "ossl.h"
|
14
14
|
|
15
15
|
#define MakeHMAC(obj, klass, ctx) \
|
16
|
-
obj = Data_Make_Struct(klass, HMAC_CTX, 0, ossl_hmac_free, ctx)
|
16
|
+
(obj) = Data_Make_Struct((klass), HMAC_CTX, 0, ossl_hmac_free, (ctx))
|
17
17
|
#define GetHMAC(obj, ctx) do { \
|
18
|
-
Data_Get_Struct(obj, HMAC_CTX, ctx); \
|
19
|
-
if (!ctx) { \
|
18
|
+
Data_Get_Struct((obj), HMAC_CTX, (ctx)); \
|
19
|
+
if (!(ctx)) { \
|
20
20
|
ossl_raise(rb_eRuntimeError, "HMAC wasn't initialized"); \
|
21
21
|
} \
|
22
22
|
} while (0)
|
23
23
|
#define SafeGetHMAC(obj, ctx) do { \
|
24
|
-
OSSL_Check_Kind(obj, cHMAC); \
|
25
|
-
GetHMAC(obj, ctx); \
|
24
|
+
OSSL_Check_Kind((obj), cHMAC); \
|
25
|
+
GetHMAC((obj), (ctx)); \
|
26
26
|
} while (0)
|
27
27
|
|
28
28
|
/*
|
@@ -53,7 +53,7 @@ ossl_hmac_alloc(VALUE klass)
|
|
53
53
|
|
54
54
|
MakeHMAC(obj, klass, ctx);
|
55
55
|
HMAC_CTX_init(ctx);
|
56
|
-
|
56
|
+
|
57
57
|
return obj;
|
58
58
|
}
|
59
59
|
|
@@ -70,8 +70,8 @@ ossl_hmac_initialize(VALUE self, VALUE key, VALUE digest)
|
|
70
70
|
|
71
71
|
StringValue(key);
|
72
72
|
GetHMAC(self, ctx);
|
73
|
-
|
74
|
-
GetDigestPtr(digest)
|
73
|
+
HMAC_Init(ctx, RSTRING_PTR(key), RSTRING_LENINT(key),
|
74
|
+
GetDigestPtr(digest));
|
75
75
|
|
76
76
|
return self;
|
77
77
|
}
|
@@ -80,7 +80,7 @@ static VALUE
|
|
80
80
|
ossl_hmac_copy(VALUE self, VALUE other)
|
81
81
|
{
|
82
82
|
HMAC_CTX *ctx1, *ctx2;
|
83
|
-
|
83
|
+
|
84
84
|
rb_check_frozen(self);
|
85
85
|
if (self == other) return self;
|
86
86
|
|
@@ -103,13 +103,13 @@ ossl_hmac_update(VALUE self, VALUE data)
|
|
103
103
|
|
104
104
|
StringValue(data);
|
105
105
|
GetHMAC(self, ctx);
|
106
|
-
HMAC_Update(ctx, RSTRING_PTR(data), RSTRING_LEN(data));
|
106
|
+
HMAC_Update(ctx, (unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data));
|
107
107
|
|
108
108
|
return self;
|
109
109
|
}
|
110
110
|
|
111
111
|
static void
|
112
|
-
hmac_final(HMAC_CTX *ctx, char **buf, int *buf_len)
|
112
|
+
hmac_final(HMAC_CTX *ctx, unsigned char **buf, unsigned int *buf_len)
|
113
113
|
{
|
114
114
|
HMAC_CTX final;
|
115
115
|
|
@@ -132,14 +132,14 @@ static VALUE
|
|
132
132
|
ossl_hmac_digest(VALUE self)
|
133
133
|
{
|
134
134
|
HMAC_CTX *ctx;
|
135
|
-
char *buf;
|
136
|
-
int buf_len;
|
135
|
+
unsigned char *buf;
|
136
|
+
unsigned int buf_len;
|
137
137
|
VALUE digest;
|
138
|
-
|
138
|
+
|
139
139
|
GetHMAC(self, ctx);
|
140
140
|
hmac_final(ctx, &buf, &buf_len);
|
141
|
-
digest = ossl_buf2str(buf, buf_len);
|
142
|
-
|
141
|
+
digest = ossl_buf2str((char *)buf, buf_len);
|
142
|
+
|
143
143
|
return digest;
|
144
144
|
}
|
145
145
|
|
@@ -152,13 +152,14 @@ static VALUE
|
|
152
152
|
ossl_hmac_hexdigest(VALUE self)
|
153
153
|
{
|
154
154
|
HMAC_CTX *ctx;
|
155
|
-
char *buf
|
156
|
-
|
155
|
+
unsigned char *buf;
|
156
|
+
char *hexbuf;
|
157
|
+
unsigned int buf_len;
|
157
158
|
VALUE hexdigest;
|
158
|
-
|
159
|
+
|
159
160
|
GetHMAC(self, ctx);
|
160
161
|
hmac_final(ctx, &buf, &buf_len);
|
161
|
-
if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
|
162
|
+
if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * (int)buf_len) {
|
162
163
|
OPENSSL_free(buf);
|
163
164
|
ossl_raise(eHMACError, "Memory alloc error");
|
164
165
|
}
|
@@ -179,7 +180,7 @@ ossl_hmac_reset(VALUE self)
|
|
179
180
|
HMAC_CTX *ctx;
|
180
181
|
|
181
182
|
GetHMAC(self, ctx);
|
182
|
-
|
183
|
+
HMAC_Init(ctx, NULL, 0, NULL);
|
183
184
|
|
184
185
|
return self;
|
185
186
|
}
|
@@ -192,15 +193,15 @@ ossl_hmac_reset(VALUE self)
|
|
192
193
|
static VALUE
|
193
194
|
ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
|
194
195
|
{
|
195
|
-
char *buf;
|
196
|
-
int buf_len;
|
197
|
-
|
196
|
+
unsigned char *buf;
|
197
|
+
unsigned int buf_len;
|
198
|
+
|
198
199
|
StringValue(key);
|
199
200
|
StringValue(data);
|
200
|
-
buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key),
|
201
|
-
RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
|
201
|
+
buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LENINT(key),
|
202
|
+
(unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
|
202
203
|
|
203
|
-
return rb_str_new(buf, buf_len);
|
204
|
+
return rb_str_new((const char *)buf, buf_len);
|
204
205
|
}
|
205
206
|
|
206
207
|
/*
|
@@ -211,16 +212,17 @@ ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
|
|
211
212
|
static VALUE
|
212
213
|
ossl_hmac_s_hexdigest(VALUE klass, VALUE digest, VALUE key, VALUE data)
|
213
214
|
{
|
214
|
-
char *buf
|
215
|
-
|
215
|
+
unsigned char *buf;
|
216
|
+
char *hexbuf;
|
217
|
+
unsigned int buf_len;
|
216
218
|
VALUE hexdigest;
|
217
219
|
|
218
220
|
StringValue(key);
|
219
221
|
StringValue(data);
|
220
|
-
|
221
|
-
buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key),
|
222
|
-
RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
|
223
|
-
if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
|
222
|
+
|
223
|
+
buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LENINT(key),
|
224
|
+
(unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
|
225
|
+
if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * (int)buf_len) {
|
224
226
|
ossl_raise(eHMACError, "Cannot convert buf to hexbuf");
|
225
227
|
}
|
226
228
|
hexdigest = ossl_buf2str(hexbuf, 2 * buf_len);
|
@@ -234,18 +236,18 @@ ossl_hmac_s_hexdigest(VALUE klass, VALUE digest, VALUE key, VALUE data)
|
|
234
236
|
void
|
235
237
|
Init_ossl_hmac()
|
236
238
|
{
|
237
|
-
#if 0
|
238
|
-
mOSSL = rb_define_module("OpenSSL");
|
239
|
+
#if 0
|
240
|
+
mOSSL = rb_define_module("OpenSSL"); /* let rdoc know about mOSSL */
|
239
241
|
#endif
|
240
242
|
|
241
243
|
eHMACError = rb_define_class_under(mOSSL, "HMACError", eOSSLError);
|
242
|
-
|
244
|
+
|
243
245
|
cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_cObject);
|
244
246
|
|
245
247
|
rb_define_alloc_func(cHMAC, ossl_hmac_alloc);
|
246
248
|
rb_define_singleton_method(cHMAC, "digest", ossl_hmac_s_digest, 3);
|
247
249
|
rb_define_singleton_method(cHMAC, "hexdigest", ossl_hmac_s_hexdigest, 3);
|
248
|
-
|
250
|
+
|
249
251
|
rb_define_method(cHMAC, "initialize", ossl_hmac_initialize, 2);
|
250
252
|
rb_define_copy_func(cHMAC, ossl_hmac_copy);
|
251
253
|
|
@@ -11,14 +11,14 @@
|
|
11
11
|
#include "ossl.h"
|
12
12
|
|
13
13
|
#define WrapSPKI(klass, obj, spki) do { \
|
14
|
-
if (!spki) { \
|
14
|
+
if (!(spki)) { \
|
15
15
|
ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
|
16
16
|
} \
|
17
|
-
obj = Data_Wrap_Struct(klass, 0, NETSCAPE_SPKI_free, spki); \
|
17
|
+
(obj) = Data_Wrap_Struct((klass), 0, NETSCAPE_SPKI_free, (spki)); \
|
18
18
|
} while (0)
|
19
19
|
#define GetSPKI(obj, spki) do { \
|
20
|
-
Data_Get_Struct(obj, NETSCAPE_SPKI, spki); \
|
21
|
-
if (!spki) { \
|
20
|
+
Data_Get_Struct((obj), NETSCAPE_SPKI, (spki)); \
|
21
|
+
if (!(spki)) { \
|
22
22
|
ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
|
23
23
|
} \
|
24
24
|
} while (0)
|
@@ -42,28 +42,35 @@ ossl_spki_alloc(VALUE klass)
|
|
42
42
|
{
|
43
43
|
NETSCAPE_SPKI *spki;
|
44
44
|
VALUE obj;
|
45
|
-
|
45
|
+
|
46
46
|
if (!(spki = NETSCAPE_SPKI_new())) {
|
47
47
|
ossl_raise(eSPKIError, NULL);
|
48
|
-
}
|
48
|
+
}
|
49
49
|
WrapSPKI(klass, obj, spki);
|
50
|
-
|
50
|
+
|
51
51
|
return obj;
|
52
52
|
}
|
53
53
|
|
54
|
+
/*
|
55
|
+
* call-seq:
|
56
|
+
* SPKI.new([request]) => spki
|
57
|
+
*
|
58
|
+
* === Parameters
|
59
|
+
* * +request+ - optional raw request, either in PEM or DER format.
|
60
|
+
*/
|
54
61
|
static VALUE
|
55
62
|
ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
|
56
63
|
{
|
57
64
|
NETSCAPE_SPKI *spki;
|
58
65
|
VALUE buffer;
|
59
66
|
const unsigned char *p;
|
60
|
-
|
67
|
+
|
61
68
|
if (rb_scan_args(argc, argv, "01", &buffer) == 0) {
|
62
69
|
return self;
|
63
70
|
}
|
64
71
|
StringValue(buffer);
|
65
72
|
if (!(spki = NETSCAPE_SPKI_b64_decode(RSTRING_PTR(buffer), -1))) {
|
66
|
-
p = (
|
73
|
+
p = (unsigned char *)RSTRING_PTR(buffer);
|
67
74
|
if (!(spki = d2i_NETSCAPE_SPKI(NULL, &p, RSTRING_LEN(buffer)))) {
|
68
75
|
ossl_raise(eSPKIError, NULL);
|
69
76
|
}
|
@@ -75,6 +82,12 @@ ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
|
|
75
82
|
return self;
|
76
83
|
}
|
77
84
|
|
85
|
+
/*
|
86
|
+
* call-seq:
|
87
|
+
* spki.to_der => DER-encoded string
|
88
|
+
*
|
89
|
+
* Returns the DER encoding of this SPKI.
|
90
|
+
*/
|
78
91
|
static VALUE
|
79
92
|
ossl_spki_to_der(VALUE self)
|
80
93
|
{
|
@@ -87,30 +100,43 @@ ossl_spki_to_der(VALUE self)
|
|
87
100
|
if ((len = i2d_NETSCAPE_SPKI(spki, NULL)) <= 0)
|
88
101
|
ossl_raise(eX509CertError, NULL);
|
89
102
|
str = rb_str_new(0, len);
|
90
|
-
p = RSTRING_PTR(str);
|
103
|
+
p = (unsigned char *)RSTRING_PTR(str);
|
91
104
|
if (i2d_NETSCAPE_SPKI(spki, &p) <= 0)
|
92
105
|
ossl_raise(eX509CertError, NULL);
|
93
106
|
ossl_str_adjust(str, p);
|
94
|
-
|
107
|
+
|
95
108
|
return str;
|
96
109
|
}
|
97
110
|
|
111
|
+
/*
|
112
|
+
* call-seq:
|
113
|
+
* spki.to_pem => PEM-encoded string
|
114
|
+
*
|
115
|
+
* Returns the PEM encoding of this SPKI.
|
116
|
+
*/
|
98
117
|
static VALUE
|
99
118
|
ossl_spki_to_pem(VALUE self)
|
100
119
|
{
|
101
120
|
NETSCAPE_SPKI *spki;
|
102
121
|
char *data;
|
103
122
|
VALUE str;
|
104
|
-
|
123
|
+
|
105
124
|
GetSPKI(self, spki);
|
106
125
|
if (!(data = NETSCAPE_SPKI_b64_encode(spki))) {
|
107
126
|
ossl_raise(eSPKIError, NULL);
|
108
127
|
}
|
109
|
-
str = ossl_buf2str(data, strlen(data));
|
128
|
+
str = ossl_buf2str(data, rb_long2int(strlen(data)));
|
110
129
|
|
111
130
|
return str;
|
112
131
|
}
|
113
132
|
|
133
|
+
/*
|
134
|
+
* call-seq:
|
135
|
+
* spki.to_text => string
|
136
|
+
*
|
137
|
+
* Returns a textual representation of this SPKI, useful for debugging
|
138
|
+
* purposes.
|
139
|
+
*/
|
114
140
|
static VALUE
|
115
141
|
ossl_spki_print(VALUE self)
|
116
142
|
{
|
@@ -118,7 +144,7 @@ ossl_spki_print(VALUE self)
|
|
118
144
|
BIO *out;
|
119
145
|
BUF_MEM *buf;
|
120
146
|
VALUE str;
|
121
|
-
|
147
|
+
|
122
148
|
GetSPKI(self, spki);
|
123
149
|
if (!(out = BIO_new(BIO_s_mem()))) {
|
124
150
|
ossl_raise(eSPKIError, NULL);
|
@@ -130,10 +156,17 @@ ossl_spki_print(VALUE self)
|
|
130
156
|
BIO_get_mem_ptr(out, &buf);
|
131
157
|
str = rb_str_new(buf->data, buf->length);
|
132
158
|
BIO_free(out);
|
133
|
-
|
159
|
+
|
134
160
|
return str;
|
135
161
|
}
|
136
162
|
|
163
|
+
/*
|
164
|
+
* call-seq:
|
165
|
+
* spki.public_key => pkey
|
166
|
+
*
|
167
|
+
* Returns the public key associated with the SPKI, an instance of
|
168
|
+
* OpenSSL::PKey.
|
169
|
+
*/
|
137
170
|
static VALUE
|
138
171
|
ossl_spki_get_public_key(VALUE self)
|
139
172
|
{
|
@@ -148,6 +181,17 @@ ossl_spki_get_public_key(VALUE self)
|
|
148
181
|
return ossl_pkey_new(pkey); /* NO DUP - OK */
|
149
182
|
}
|
150
183
|
|
184
|
+
/*
|
185
|
+
* call-seq:
|
186
|
+
* spki.public_key = pub => pkey
|
187
|
+
*
|
188
|
+
* === Parameters
|
189
|
+
* * +pub+ - the public key to be set for this instance
|
190
|
+
*
|
191
|
+
* Sets the public key to be associated with the SPKI, an instance of
|
192
|
+
* OpenSSL::PKey. This should be the public key corresponding to the
|
193
|
+
* private key used for signing the SPKI.
|
194
|
+
*/
|
151
195
|
static VALUE
|
152
196
|
ossl_spki_set_public_key(VALUE self, VALUE key)
|
153
197
|
{
|
@@ -161,6 +205,12 @@ ossl_spki_set_public_key(VALUE self, VALUE key)
|
|
161
205
|
return key;
|
162
206
|
}
|
163
207
|
|
208
|
+
/*
|
209
|
+
* call-seq:
|
210
|
+
* spki.challenge => string
|
211
|
+
*
|
212
|
+
* Returns the challenge string associated with this SPKI.
|
213
|
+
*/
|
164
214
|
static VALUE
|
165
215
|
ossl_spki_get_challenge(VALUE self)
|
166
216
|
{
|
@@ -172,10 +222,20 @@ ossl_spki_get_challenge(VALUE self)
|
|
172
222
|
return rb_str_new(0, 0);
|
173
223
|
}
|
174
224
|
|
175
|
-
return rb_str_new(spki->spkac->challenge->data,
|
225
|
+
return rb_str_new((const char *)spki->spkac->challenge->data,
|
176
226
|
spki->spkac->challenge->length);
|
177
227
|
}
|
178
228
|
|
229
|
+
/*
|
230
|
+
* call-seq:
|
231
|
+
* spki.challenge = str => string
|
232
|
+
*
|
233
|
+
* === Parameters
|
234
|
+
* * +str+ - the challenge string to be set for this instance
|
235
|
+
*
|
236
|
+
* Sets the challenge to be associated with the SPKI. May be used by the
|
237
|
+
* server, e.g. to prevent replay.
|
238
|
+
*/
|
179
239
|
static VALUE
|
180
240
|
ossl_spki_set_challenge(VALUE self, VALUE str)
|
181
241
|
{
|
@@ -184,13 +244,26 @@ ossl_spki_set_challenge(VALUE self, VALUE str)
|
|
184
244
|
StringValue(str);
|
185
245
|
GetSPKI(self, spki);
|
186
246
|
if (!ASN1_STRING_set(spki->spkac->challenge, RSTRING_PTR(str),
|
187
|
-
|
247
|
+
RSTRING_LENINT(str))) {
|
188
248
|
ossl_raise(eSPKIError, NULL);
|
189
249
|
}
|
190
|
-
|
250
|
+
|
191
251
|
return str;
|
192
252
|
}
|
193
253
|
|
254
|
+
/*
|
255
|
+
* call-seq:
|
256
|
+
* spki.sign(key, digest) => spki
|
257
|
+
*
|
258
|
+
* === Parameters
|
259
|
+
* * +key+ - the private key to be used for signing this instance
|
260
|
+
* * +digest+ - the digest to be used for signing this instance
|
261
|
+
*
|
262
|
+
* To sign an SPKI, the private key corresponding to the public key set
|
263
|
+
* for this instance should be used, in addition to a digest algorithm in
|
264
|
+
* the form of an OpenSSL::Digest. The private key should be an instance of
|
265
|
+
* OpenSSL::PKey.
|
266
|
+
*/
|
194
267
|
static VALUE
|
195
268
|
ossl_spki_sign(VALUE self, VALUE key, VALUE digest)
|
196
269
|
{
|
@@ -209,7 +282,14 @@ ossl_spki_sign(VALUE self, VALUE key, VALUE digest)
|
|
209
282
|
}
|
210
283
|
|
211
284
|
/*
|
212
|
-
*
|
285
|
+
* call-seq:
|
286
|
+
* spki.verify(key) => boolean
|
287
|
+
*
|
288
|
+
* === Parameters
|
289
|
+
* * +key+ - the public key to be used for verifying the SPKI signature
|
290
|
+
*
|
291
|
+
* Returns +true+ if the signature is valid, +false+ otherwise. To verify an
|
292
|
+
* SPKI, the public key contained within the SPKI should be used.
|
213
293
|
*/
|
214
294
|
static VALUE
|
215
295
|
ossl_spki_verify(VALUE self, VALUE key)
|
@@ -228,21 +308,73 @@ ossl_spki_verify(VALUE self, VALUE key)
|
|
228
308
|
return Qnil; /* dummy */
|
229
309
|
}
|
230
310
|
|
231
|
-
/*
|
232
|
-
*
|
311
|
+
/* Document-class: OpenSSL::Netscape::SPKI
|
312
|
+
*
|
313
|
+
* A Simple Public Key Infrastructure implementation (pronounced "spookey").
|
314
|
+
* The structure is defined as
|
315
|
+
* PublicKeyAndChallenge ::= SEQUENCE {
|
316
|
+
* spki SubjectPublicKeyInfo,
|
317
|
+
* challenge IA5STRING
|
318
|
+
* }
|
319
|
+
*
|
320
|
+
* SignedPublicKeyAndChallenge ::= SEQUENCE {
|
321
|
+
* publicKeyAndChallenge PublicKeyAndChallenge,
|
322
|
+
* signatureAlgorithm AlgorithmIdentifier,
|
323
|
+
* signature BIT STRING
|
324
|
+
* }
|
325
|
+
* where the definitions of SubjectPublicKeyInfo and AlgorithmIdentifier can
|
326
|
+
* be found in RFC5280. SPKI is typically used in browsers for generating
|
327
|
+
* a public/private key pair and a subsequent certificate request, using
|
328
|
+
* the HTML <keygen> element.
|
329
|
+
*
|
330
|
+
* == Examples
|
331
|
+
*
|
332
|
+
* === Creating an SPKI
|
333
|
+
* key = OpenSSL::PKey::RSA.new 2048
|
334
|
+
* spki = OpenSSL::Netscape::SPKI.new
|
335
|
+
* spki.challenge = "RandomChallenge"
|
336
|
+
* spki.public_key = key.public_key
|
337
|
+
* spki.sign(key, OpenSSL::Digest::SHA256.new)
|
338
|
+
* #send a request containing this to a server generating a certificate
|
339
|
+
* === Verifiying an SPKI request
|
340
|
+
* request = #...
|
341
|
+
* spki = OpenSSL::Netscape::SPKI.new request
|
342
|
+
* unless spki.verify(spki.public_key)
|
343
|
+
* # signature is invalid
|
344
|
+
* end
|
345
|
+
* #proceed
|
233
346
|
*/
|
347
|
+
|
348
|
+
/* Document-module: OpenSSL::Netscape
|
349
|
+
*
|
350
|
+
* OpenSSL::Netscape is a namespace for SPKI (Simple Public Key
|
351
|
+
* Infrastructure) which implements Signed Public Key and Challenge.
|
352
|
+
* See {RFC 2692}[http://tools.ietf.org/html/rfc2692] and {RFC
|
353
|
+
* 2693}[http://tools.ietf.org/html/rfc2692] for details.
|
354
|
+
*/
|
355
|
+
|
356
|
+
/* Document-class: OpenSSL::Netscape::SPKIError
|
357
|
+
*
|
358
|
+
* Generic Exception class that is raised if an error occurs during an
|
359
|
+
* operation on an instance of OpenSSL::Netscape::SPKI.
|
360
|
+
*/
|
361
|
+
|
234
362
|
void
|
235
363
|
Init_ossl_ns_spki()
|
236
364
|
{
|
365
|
+
#if 0
|
366
|
+
mOSSL = rb_define_module("OpenSSL"); /* let rdoc know about mOSSL */
|
367
|
+
#endif
|
368
|
+
|
237
369
|
mNetscape = rb_define_module_under(mOSSL, "Netscape");
|
238
|
-
|
370
|
+
|
239
371
|
eSPKIError = rb_define_class_under(mNetscape, "SPKIError", eOSSLError);
|
240
|
-
|
372
|
+
|
241
373
|
cSPKI = rb_define_class_under(mNetscape, "SPKI", rb_cObject);
|
242
|
-
|
374
|
+
|
243
375
|
rb_define_alloc_func(cSPKI, ossl_spki_alloc);
|
244
376
|
rb_define_method(cSPKI, "initialize", ossl_spki_initialize, -1);
|
245
|
-
|
377
|
+
|
246
378
|
rb_define_method(cSPKI, "to_der", ossl_spki_to_der, 0);
|
247
379
|
rb_define_method(cSPKI, "to_pem", ossl_spki_to_pem, 0);
|
248
380
|
rb_define_alias(cSPKI, "to_s", "to_pem");
|