From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/ext/openssl/ossl_config.c | 83 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 jni/ruby/ext/openssl/ossl_config.c (limited to 'jni/ruby/ext/openssl/ossl_config.c') diff --git a/jni/ruby/ext/openssl/ossl_config.c b/jni/ruby/ext/openssl/ossl_config.c new file mode 100644 index 0000000..af92b4b --- /dev/null +++ b/jni/ruby/ext/openssl/ossl_config.c @@ -0,0 +1,83 @@ +/* + * $Id: ossl_config.c 47744 2014-09-30 05:25:32Z nobu $ + * 'OpenSSL for Ruby' project + * Copyright (C) 2001-2002 Michal Rokos + * All rights reserved. + */ +/* + * This program is licenced under the same licence as Ruby. + * (See the file 'LICENCE'.) + */ +#include "ossl.h" + + +/* + * Classes + */ +VALUE cConfig; +/* Document-class: OpenSSL::ConfigError + * + * General error for openssl library configuration files. Including formatting, + * parsing errors, etc. + */ +VALUE eConfigError; + +/* + * Public + */ + +/* + * GetConfigPtr is a public C-level function for getting OpenSSL CONF struct + * from an OpenSSL::Config(eConfig) instance. We decided to implement + * OpenSSL::Config in Ruby level but we need to pass native CONF struct for + * some OpenSSL features such as X509V3_EXT_*. + */ +CONF * +GetConfigPtr(VALUE obj) +{ + CONF *conf; + VALUE str; + BIO *bio; + long eline = -1; + + OSSL_Check_Kind(obj, cConfig); + str = rb_funcall(obj, rb_intern("to_s"), 0); + bio = ossl_obj2bio(str); + conf = NCONF_new(NULL); + if(!conf){ + BIO_free(bio); + ossl_raise(eConfigError, NULL); + } + if(!NCONF_load_bio(conf, bio, &eline)){ + BIO_free(bio); + NCONF_free(conf); + if (eline <= 0) ossl_raise(eConfigError, "wrong config format"); + else ossl_raise(eConfigError, "error in line %d", eline); + ossl_raise(eConfigError, NULL); + } + BIO_free(bio); + + return conf; +} + +/* Document-const: DEFAULT_CONFIG_FILE + * + * The default system configuration file for openssl + */ + +/* + * INIT + */ +void +Init_ossl_config(void) +{ + char *default_config_file; + eConfigError = rb_define_class_under(mOSSL, "ConfigError", eOSSLError); + cConfig = rb_define_class_under(mOSSL, "Config", rb_cObject); + + default_config_file = CONF_get1_default_config_file(); + rb_define_const(cConfig, "DEFAULT_CONFIG_FILE", + rb_str_new2(default_config_file)); + OPENSSL_free(default_config_file); + /* methods are defined by openssl/config.rb */ +} -- cgit v1.2.3