aboutsummaryrefslogtreecommitdiffstats
path: root/ossl_ssl.c
diff options
context:
space:
mode:
authorGOTOU Yuuzou <gotoyuzo@notwork.org>2001-11-16 15:36:38 +0000
committerGOTOU Yuuzou <gotoyuzo@notwork.org>2001-11-16 15:36:38 +0000
commit7aef9ad51ff25208bf1a4a60d1371a781ecf3dac (patch)
tree2122c82076828441be29140a1e079dc3a0a3c250 /ossl_ssl.c
parent3d032c89b753d125cf383cb6a1bef6b472b0a981 (diff)
downloadruby-openssl-history-7aef9ad51ff25208bf1a4a60d1371a781ecf3dac.tar.gz
for compatibility with old SSLSocket
Diffstat (limited to 'ossl_ssl.c')
-rw-r--r--ossl_ssl.c113
1 files changed, 83 insertions, 30 deletions
diff --git a/ossl_ssl.c b/ossl_ssl.c
index 1d605e4..fb922ab 100644
--- a/ossl_ssl.c
+++ b/ossl_ssl.c
@@ -38,10 +38,12 @@
#define ssl_def_const(x) rb_define_const(mSSL, #x, INT2FIX(SSL_##x))
#define ssl_get_io(o) rb_ivar_get((o),rb_intern("@io"))
-#define ssl_get_cert(o) rb_ivar_get((o),rb_intern("@cert"))
-#define ssl_get_key(o) rb_ivar_get((o),rb_intern("@key"))
-#define ssl_get_ca(o) rb_ivar_get((o),rb_intern("@ca_cert"))
-#define ssl_get_ca_file(o) rb_ivar_get((o),rb_intern("@ca_file"))
+#define ssl_get_cert(o) rb_ivar_get((o),rb_intern("@cert"))
+#define ssl_get_cert_file(o) rb_ivar_get((o),rb_intern("@cert_file"))
+#define ssl_get_key(o) rb_ivar_get((o),rb_intern("@key"))
+#define ssl_get_key_file(o) rb_ivar_get((o),rb_intern("@key_file"))
+#define ssl_get_ca(o) rb_ivar_get((o),rb_intern("@ca_cert"))
+#define ssl_get_ca_file(o) rb_ivar_get((o),rb_intern("@ca_file"))
#define ssl_get_ca_path(o) rb_ivar_get((o),rb_intern("@ca_path"))
#define ssl_get_timeout(o) rb_ivar_get((o),rb_intern("@timeout"))
#define ssl_get_verify_mode(o) rb_ivar_get((o),rb_intern("@verify_mode"))
@@ -49,16 +51,23 @@
#define ssl_get_verify_cb(o) rb_ivar_get((o),rb_intern("@verify_callback"))
#define ssl_set_io(o,v) rb_ivar_set((o),rb_intern("@io"),(v))
-#define ssl_set_cert(o,v) rb_ivar_set((o),rb_intern("@cert"),(v))
-#define ssl_set_key(o,v) rb_ivar_set((o),rb_intern("@key"),(v))
-#define ssl_set_ca(o,v) rb_ivar_set((o),rb_intern("@ca_cert"),(v))
-#define ssl_set_ca_file(o,v) rb_ivar_set((o),rb_intern("@ca_file"),(v))
+#define ssl_set_cert(o,v) rb_ivar_set((o),rb_intern("@cert"),(v))
+#define ssl_set_cert_file(o,v) rb_ivar_set((o),rb_intern("@cert_file"),(v))
+#define ssl_set_key(o,v) rb_ivar_set((o),rb_intern("@key"),(v))
+#define ssl_set_key_file(o,v) rb_ivar_set((o),rb_intern("@key_file"),(v))
+#define ssl_set_ca(o,v) rb_ivar_set((o),rb_intern("@ca_cert"),(v))
+#define ssl_set_ca_file(o,v) rb_ivar_set((o),rb_intern("@ca_file"),(v))
#define ssl_set_ca_path(o,v) rb_ivar_set((o),rb_intern("@ca_path"),(v))
#define ssl_set_timeout(o,v) rb_ivar_set((o),rb_intern("@timeout"),(v))
#define ssl_set_verify_mode(o,v) rb_ivar_set((o),rb_intern("@verify_mode"),(v))
#define ssl_set_verify_dep(o,v) rb_ivar_set((o),rb_intern("@verify_depth"),(v))
#define ssl_set_verify_cb(o,v) rb_ivar_set((o),rb_intern("@verify_callback"),(v))
+static VALUE ssl_set_cert2(VALUE, VALUE);
+static VALUE ssl_set_cert_file2(VALUE, VALUE);
+static VALUE ssl_set_key2(VALUE, VALUE);
+static VALUE ssl_set_key_file2(VALUE, VALUE);
+
/*
* Classes
*/
@@ -69,10 +78,14 @@ VALUE eSSLError;
* List of instance vars
*/
char *ssl_attrs[] = {
- /* "io", */"cert", "key", "ca_cert", "ca_file", "ca_path",
+ "ca_cert", "ca_file", "ca_path",
"timeout", "verify_mode", "verify_depth", "verify_callback"
};
+char *ssl_attr_readers[] = {
+ "io", "cert", "cert_file", "key", "key_file"
+};
+
/*
* Struct
*/
@@ -235,16 +248,25 @@ static VALUE ssl_initialize(int argc, VALUE *argv, VALUE self)
switch (rb_scan_args(argc, argv, "12", &io, &cert, &key)) {
case 3:
- if (!NIL_P(key))
- OSSL_Check_Type(key, cPKey);
- ssl_set_key(self, key);
+ if (!NIL_P(key)){
+ if(TYPE(key) == T_STRING) ssl_set_key_file2(self, key);
+ else{
+ OSSL_Check_Type(key, cPKey);
+ ssl_set_key2(self, key);
+ }
+ }
+ /* FALLTHROUGH */
case 2:
- if (!NIL_P(cert))
- OSSL_Check_Type(cert, cX509Certificate);
- ssl_set_cert(self, cert);
+ if (!NIL_P(cert)){
+ if(TYPE(cert) == T_STRING) ssl_set_cert_file2(self, cert);
+ else{
+ OSSL_Check_Type(cert, cX509Certificate);
+ ssl_set_cert2(self, cert);
+ }
+ }
+ /* FALLTHROUGH */
case 1:
- if(!NIL_P(io))
- Check_Type(io, T_FILE);
+ Check_Type(io, T_FILE);
ssl_set_io(self, io);
}
@@ -258,13 +280,11 @@ static VALUE ssl_connect(VALUE self)
Data_Get_Struct(self, ssl_st, p);
ssl_ctx_setup(self);
ssl_setup(self);
- rb_thread_critical = 1;
+
ssl_verify_callback_proc = ssl_get_verify_cb(self);
if(SSL_connect(p->ssl) <= 0){
- rb_thread_critical = 0;
rb_raise(eSSLError, "SSL_connect:%s", ossl_error());
}
- rb_thread_critical = 0;
return self;
}
@@ -278,13 +298,11 @@ ssl_accept(self)
Data_Get_Struct(self, ssl_st, p);
ssl_ctx_setup(self);
ssl_setup(self);
- rb_thread_critical = 1;
+
ssl_verify_callback_proc = ssl_get_verify_cb(self);
if(SSL_accept(p->ssl) <= 0){
- rb_thread_critical = 0;
rb_raise(eSSLError, "SSL_accept:%s", ossl_error());
}
- rb_thread_critical = 0;
return self;
}
@@ -515,14 +533,44 @@ ssl_get_state(self)
return ret;
}
+static VALUE ssl_set_cert2(VALUE self, VALUE v)
+{
+ if(!NIL_P(v)) OSSL_Check_Type(v, cX509Certificate);
+ ssl_set_cert(self, v);
+ ssl_set_cert_file(self, Qnil);
+ return v;
+}
+
+static VALUE ssl_set_cert_file2(VALUE self, VALUE v)
+{
+ VALUE cert;
+ cert = NIL_P(v) ? Qnil :ossl_x509_new_from_file(v);
+ ssl_set_cert(self, cert);
+ ssl_set_cert_file(self, v);
+ return v;
+}
+
+static VALUE ssl_set_key2(VALUE self, VALUE v)
+{
+ if(!NIL_P(v)) OSSL_Check_Type(v, cPKey);
+ ssl_set_key(self, v);
+ ssl_set_key_file(self, Qnil);
+ return v;
+}
+
+static VALUE ssl_set_key_file2(VALUE self, VALUE v)
+{
+ VALUE key;
+ key = NIL_P(v) ? Qnil : ossl_pkey_new_from_file(v);
+ ssl_set_key(self, key);
+ ssl_set_key_file(self, v);
+ return v;
+}
+
void Init_ssl(VALUE mSSL)
{
int i;
- /* module SSL */
- rb_define_const(mSSL, "VERSION", rb_str_new2("0.3.3"));
- rb_define_const(mSSL, "OPENSSL_VERSION", rb_str_new2(OPENSSL_VERSION_TEXT));
-
/* class SSLError */
eSSLError = rb_define_class_under(mSSL, "Error", rb_eStandardError);
@@ -530,8 +578,8 @@ void Init_ssl(VALUE mSSL)
cSSLSocket = rb_define_class_under(mSSL, "SSLSocket", rb_cObject);
rb_define_singleton_method(cSSLSocket, "new", ssl_s_new, -1);
rb_define_method(cSSLSocket, "initialize", ssl_initialize, -1);
- rb_define_method(cSSLSocket, "connect", ssl_connect, 0);
- rb_define_method(cSSLSocket, "accept", ssl_accept, 0);
+ rb_define_method(cSSLSocket, "__connect", ssl_connect, 0);
+ rb_define_method(cSSLSocket, "__accept", ssl_accept, 0);
rb_define_method(cSSLSocket, "sysread", ssl_read, 1);
rb_define_method(cSSLSocket, "syswrite", ssl_write, 1);
rb_define_method(cSSLSocket, "sysclose", ssl_close, 0);
@@ -541,9 +589,14 @@ void Init_ssl(VALUE mSSL)
rb_define_method(cSSLSocket, "ciphers", ssl_get_ciphers, 0);
rb_define_method(cSSLSocket, "ciphers=", ssl_set_ciphers, 1);
rb_define_method(cSSLSocket, "state", ssl_get_state, 0);
+ rb_define_method(cSSLSocket, "cert=", ssl_set_cert2, 1);
+ rb_define_method(cSSLSocket, "cert_file=", ssl_set_cert_file2, 1);
+ rb_define_method(cSSLSocket, "key=", ssl_set_key2, 1);
+ rb_define_method(cSSLSocket, "key_file=", ssl_set_key_file2, 1);
for(i = 0; i < numberof(ssl_attrs); i++)
rb_attr(cSSLSocket, rb_intern(ssl_attrs[i]), 1, 1, Qfalse);
- rb_attr(cSSLSocket, rb_intern("io"), 1, 0, Qfalse);
+ for(i = 0; i < numberof(ssl_attr_readers); i++)
+ rb_attr(cSSLSocket, rb_intern(ssl_attr_readers[i]), 1, 0, Qfalse);
rb_define_alias(cSSLSocket, "to_io", "io");
ssl_def_const(VERIFY_NONE);