mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
OpenSSL update
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ecf0c48d5a
commit
bd96b4c8cc
17 changed files with 409 additions and 335 deletions
24
ChangeLog
24
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Fri Sep 12 22:41:48 2003 Michal Rokos <m.rokos@sh.cvut.cz>
|
||||
|
||||
* ext/openssl/ossl.c: move ASN.1 stuff to ossl_asn1.[ch]
|
||||
|
||||
* ext/openssl/ossl.c: move BIO stuff to ossl_bio.[ch]
|
||||
|
||||
* ext/openssl/ossl_asn1.[ch]: new files
|
||||
|
||||
* ext/openssl/ossl_bio.[ch]: new files
|
||||
|
||||
Fri Sep 12 12:30:41 2003 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* intern.h (rb_disable_super, rb_enable_super): replace with dummy
|
||||
|
@ -56,6 +66,10 @@ Tue Sep 9 05:17:04 2003 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
|||
|
||||
* ext/openssl/ossl_config.rb: avoid compile error in OpenSSL-0.9.6.
|
||||
|
||||
Tue Sep 9 02:41:35 2003 Michal Rokos <m.rokos@sh.cvut.cz>
|
||||
|
||||
* ext/openssl/ossl_config.c: Refine compatibility.
|
||||
|
||||
Tue Sep 9 01:50:45 2003 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
||||
|
||||
* lib/webrick/httpserver.rb (HTTPServer#access_log): add "\n" to
|
||||
|
@ -764,6 +778,16 @@ Fri Aug 15 02:08:53 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
|||
* gc.c (id2ref): recycle check should be done by klass == 0.
|
||||
[ruby-core:01408]
|
||||
|
||||
Fri Aug 15 01:34:23 2003 Michal Rokos <m.rokos@sh.cvut.cz>
|
||||
|
||||
* ext/openssl/ossl_pkey.c: move generate_cb here
|
||||
|
||||
* ext/openssl/ossl_pkey_{dh|dsa|rsa}.c: adapt to this cb
|
||||
|
||||
* ext/openssl/openssl_missing.[ch]: add (0.9.6x, x<j) missing BN funcs
|
||||
|
||||
* ext/openssl/ossl_bn.c: use supplied funcs from openssl_missing.c
|
||||
|
||||
Fri Aug 15 00:38:00 2003 Shigeo Kobayashi <shigek@ruby-lang.org>
|
||||
|
||||
* ext/bigdecimal/bigdecimal.c: Bug in div method fixed.
|
||||
|
|
|
@ -15,6 +15,10 @@ openssl_missing.c
|
|||
openssl_missing.h
|
||||
ossl.c
|
||||
ossl.h
|
||||
ossl_asn1.c
|
||||
ossl_asn1.h
|
||||
ossl_bio.c
|
||||
ossl_bio.h
|
||||
ossl_bn.c
|
||||
ossl_bn.h
|
||||
ossl_cipher.c
|
||||
|
|
|
@ -17,21 +17,13 @@
|
|||
int
|
||||
HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
|
||||
{
|
||||
if (!out || !in) {
|
||||
/* HMACerr(HMAC_CTX_COPY,HMAC_R_INPUT_NOT_INITIALIZED); */
|
||||
return 0;
|
||||
}
|
||||
if (!out || !in) return 0;
|
||||
memcpy(out, in, sizeof(HMAC_CTX));
|
||||
|
||||
if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)) {
|
||||
if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)
|
||||
|| !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)
|
||||
|| !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx))
|
||||
return 0;
|
||||
}
|
||||
if (!EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)) {
|
||||
return 0;
|
||||
}
|
||||
if (!EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx)) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif /* HAVE_HMAC_CTX_COPY */
|
||||
|
@ -42,12 +34,12 @@ HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
|
|||
|
||||
int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data)
|
||||
{
|
||||
return CRYPTO_set_ex_data(&str->ex_data,idx,data);
|
||||
return CRYPTO_set_ex_data(&str->ex_data, idx, data);
|
||||
}
|
||||
|
||||
void *X509_STORE_get_ex_data(X509_STORE *str, int idx)
|
||||
{
|
||||
return CRYPTO_get_ex_data(&str->ex_data,idx);
|
||||
return CRYPTO_get_ex_data(&str->ex_data, idx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -55,9 +47,10 @@ void *X509_STORE_get_ex_data(X509_STORE *str, int idx)
|
|||
EVP_MD_CTX *
|
||||
EVP_MD_CTX_create(void)
|
||||
{
|
||||
EVP_MD_CTX *ctx = OPENSSL_malloc(sizeof *ctx);
|
||||
EVP_MD_CTX *ctx = OPENSSL_malloc(sizeof(EVP_MD_CTX));
|
||||
if (!ctx) return NULL;
|
||||
|
||||
memset(ctx, '\0', sizeof *ctx);
|
||||
memset(ctx, 0, sizeof(EVP_MD_CTX));
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
@ -68,7 +61,7 @@ int
|
|||
EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
|
||||
{
|
||||
/* FIXME!!! */
|
||||
memset(ctx, '\0', sizeof *ctx);
|
||||
memset(ctx, 0, sizeof(EVP_MD_CTX));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -87,7 +80,7 @@ EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
|
|||
void
|
||||
EVP_MD_CTX_init(EVP_MD_CTX *ctx)
|
||||
{
|
||||
memset(ctx,'\0',sizeof *ctx);
|
||||
memset(ctx, 0, sizeof(EVP_MD_CTX));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -108,7 +101,7 @@ HMAC_CTX_cleanup(HMAC_CTX *ctx)
|
|||
EVP_MD_CTX_cleanup(&ctx->i_ctx);
|
||||
EVP_MD_CTX_cleanup(&ctx->o_ctx);
|
||||
EVP_MD_CTX_cleanup(&ctx->md_ctx);
|
||||
memset(ctx,0,sizeof *ctx);
|
||||
memset(ctx, 0, sizeof(HMAC_CTX));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -116,13 +109,12 @@ HMAC_CTX_cleanup(HMAC_CTX *ctx)
|
|||
int
|
||||
X509_CRL_set_version(X509_CRL *x, long version)
|
||||
{
|
||||
if (x == NULL) return(0);
|
||||
if (x->crl->version == NULL)
|
||||
{
|
||||
if ((x->crl->version=M_ASN1_INTEGER_new()) == NULL)
|
||||
return(0);
|
||||
}
|
||||
return(ASN1_INTEGER_set(x->crl->version,version));
|
||||
if (x == NULL || x->crl == NULL) return 0;
|
||||
if (x->crl->version == NULL) {
|
||||
x->crl->version = M_ASN1_INTEGER_new();
|
||||
if (x->crl->version == NULL) return 0;
|
||||
}
|
||||
return ASN1_INTEGER_set(x->crl->version, version);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -130,8 +122,8 @@ X509_CRL_set_version(X509_CRL *x, long version)
|
|||
int
|
||||
X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
|
||||
{
|
||||
if ((x == NULL) || (x->crl == NULL)) return(0);
|
||||
return(X509_NAME_set(&x->crl->issuer,name));
|
||||
if (x == NULL || x->crl == NULL) return 0;
|
||||
return X509_NAME_set(&x->crl->issuer, name);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -144,8 +136,8 @@ X509_CRL_sort(X509_CRL *c)
|
|||
/* sort the data so it will be written in serial
|
||||
* number order */
|
||||
sk_X509_REVOKED_sort(c->crl->revoked);
|
||||
for (i=0; i<sk_X509_REVOKED_num(c->crl->revoked); i++){
|
||||
r=sk_X509_REVOKED_value(c->crl->revoked,i);
|
||||
for (i=0; i<sk_X509_REVOKED_num(c->crl->revoked); i++) {
|
||||
r=sk_X509_REVOKED_value(c->crl->revoked, i);
|
||||
r->sequence=i;
|
||||
}
|
||||
return 1;
|
||||
|
@ -165,13 +157,12 @@ int
|
|||
X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
|
||||
{
|
||||
X509_CRL_INFO *inf;
|
||||
|
||||
inf = crl->crl;
|
||||
if(!inf->revoked)
|
||||
if (!inf->revoked)
|
||||
inf->revoked = sk_X509_REVOKED_new(OSSL_X509_REVOKED_cmp);
|
||||
if(!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) {
|
||||
/* ASN1err(ASN1_F_X509_CRL_ADD0_REVOKED, ERR_R_MALLOC_FAILURE); */
|
||||
if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
@ -181,7 +172,6 @@ int
|
|||
BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
|
||||
{
|
||||
if (!BN_sqr(r, (BIGNUM*)a, ctx)) return 0;
|
||||
/* r->neg == 0, thus we don't need BN_nnmod */
|
||||
return BN_mod(r, r, m, ctx);
|
||||
}
|
||||
#endif
|
||||
|
@ -189,11 +179,8 @@ BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
|
|||
#if !defined(HAVE_BN_MOD_ADD) || !defined(HAVE_BN_MOD_SUB)
|
||||
int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx)
|
||||
{
|
||||
/* like BN_mod, but returns non-negative remainder
|
||||
* (i.e., 0 <= r < |d| always holds) */
|
||||
if (!(BN_mod(r,m,d,ctx))) return 0;
|
||||
if (!BN_mod(r,m,d,ctx)) return 0;
|
||||
if (!r->neg) return 1;
|
||||
/* now -|d| < r < 0, so we have to set r := r + |d| */
|
||||
return (d->neg ? BN_sub : BN_add)(r, r, d);
|
||||
}
|
||||
#endif
|
||||
|
@ -216,6 +203,54 @@ BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX
|
|||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_BN_RAND_RANGE) || !defined(HAVE_BN_PSEUDO_RAND_RANGE)
|
||||
static int
|
||||
bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range)
|
||||
{
|
||||
int (*bn_rand)(BIGNUM *, int, int, int) = pseudo ? BN_pseudo_rand : BN_rand;
|
||||
int n;
|
||||
|
||||
if (range->neg || BN_is_zero(range)) return 0;
|
||||
|
||||
n = BN_num_bits(range);
|
||||
|
||||
if (n == 1) {
|
||||
if (!BN_zero(r)) return 0;
|
||||
} else if (!BN_is_bit_set(range, n - 2) && !BN_is_bit_set(range, n - 3)) {
|
||||
do {
|
||||
if (!bn_rand(r, n + 1, -1, 0)) return 0;
|
||||
if (BN_cmp(r ,range) >= 0) {
|
||||
if (!BN_sub(r, r, range)) return 0;
|
||||
if (BN_cmp(r, range) >= 0)
|
||||
if (!BN_sub(r, r, range)) return 0;
|
||||
}
|
||||
} while (BN_cmp(r, range) >= 0);
|
||||
} else {
|
||||
do {
|
||||
if (!bn_rand(r, n, -1, 0)) return 0;
|
||||
} while (BN_cmp(r, range) >= 0);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_BN_RAND_RANGE)
|
||||
int
|
||||
BN_rand_range(BIGNUM *r, BIGNUM *range)
|
||||
{
|
||||
return bn_rand_range(0, r, range);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
|
||||
int
|
||||
BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range)
|
||||
{
|
||||
return bn_rand_range(1, r, range);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
|
||||
#define OPENSSL_CONF "openssl.cnf"
|
||||
char *
|
||||
|
@ -250,30 +285,31 @@ PEM_def_callback(char *buf, int num, int w, void *key)
|
|||
{
|
||||
int i,j;
|
||||
const char *prompt;
|
||||
if(key){
|
||||
|
||||
if (key) {
|
||||
i = strlen(key);
|
||||
i = (i > num) ? num : i;
|
||||
memcpy(buf, key, i);
|
||||
return(i);
|
||||
return i;
|
||||
}
|
||||
|
||||
prompt = EVP_get_pw_prompt();
|
||||
if (prompt == NULL) prompt= "Enter PEM pass phrase:";
|
||||
for(;;){
|
||||
if (prompt == NULL) prompt = "Enter PEM pass phrase:";
|
||||
for (;;) {
|
||||
i = EVP_read_pw_string(buf, num, prompt, w);
|
||||
if(i != 0){
|
||||
memset(buf,0,(unsigned int)num);
|
||||
if (i != 0) {
|
||||
memset(buf, 0, (unsigned int)num);
|
||||
return(-1);
|
||||
}
|
||||
j = strlen(buf);
|
||||
if(j < OSSL_PASS_MIN_LENGTH){
|
||||
if (j < OSSL_PASS_MIN_LENGTH) {
|
||||
fprintf(stderr,
|
||||
"phrase is too short, needs to be at least %d chars\n",
|
||||
OSSL_PASS_MIN_LENGTH);
|
||||
}
|
||||
else break;
|
||||
}
|
||||
return(j);
|
||||
return j;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -90,11 +90,10 @@ int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
|
|||
int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
|
||||
int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
|
||||
int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
|
||||
int BN_rand_range(BIGNUM *r, BIGNUM *range);
|
||||
int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range);
|
||||
char *CONF_get1_default_config_file(void);
|
||||
|
||||
#if !defined(HAVE_PEM_DEF_CALLBACK)
|
||||
int PEM_def_callback(char *buf, int num, int w, void *key);
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
|
|
|
@ -11,142 +11,6 @@
|
|||
#include "ossl.h"
|
||||
#include <stdarg.h> /* for ossl_raise */
|
||||
|
||||
#if defined(HAVE_SYS_TIME_H)
|
||||
# include <sys/time.h>
|
||||
#elif !defined(NT) && !defined(_WIN32)
|
||||
struct timeval {
|
||||
long tv_sec; /* seconds */
|
||||
long tv_usec; /* and microseconds */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* DATE conversion
|
||||
*/
|
||||
VALUE
|
||||
asn1time_to_time(ASN1_TIME *time)
|
||||
{
|
||||
struct tm tm;
|
||||
VALUE argv[6];
|
||||
|
||||
if (!time) {
|
||||
ossl_raise(rb_eTypeError, "ASN1_TIME is NULL!");
|
||||
}
|
||||
memset(&tm, 0, sizeof(struct tm));
|
||||
|
||||
switch (time->type) {
|
||||
case V_ASN1_UTCTIME:
|
||||
if (sscanf(time->data, "%2d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
|
||||
&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
|
||||
ossl_raise(rb_eTypeError, "bad UTCTIME format");
|
||||
}
|
||||
if (tm.tm_year < 69) {
|
||||
tm.tm_year += 2000;
|
||||
} else {
|
||||
tm.tm_year += 1900;
|
||||
}
|
||||
tm.tm_mon -= 1;
|
||||
break;
|
||||
case V_ASN1_GENERALIZEDTIME:
|
||||
if (sscanf(time->data, "%4d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
|
||||
&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
|
||||
ossl_raise(rb_eTypeError, "bad GENERALIZEDTIME format" );
|
||||
}
|
||||
tm.tm_mon -= 1;
|
||||
break;
|
||||
default:
|
||||
rb_warning("unknown time format");
|
||||
return Qnil;
|
||||
}
|
||||
argv[0] = INT2NUM(tm.tm_year);
|
||||
argv[1] = INT2NUM(tm.tm_mon+1);
|
||||
argv[2] = INT2NUM(tm.tm_mday);
|
||||
argv[3] = INT2NUM(tm.tm_hour);
|
||||
argv[4] = INT2NUM(tm.tm_min);
|
||||
argv[5] = INT2NUM(tm.tm_sec);
|
||||
|
||||
return rb_funcall2(rb_cTime, rb_intern("utc"), 6, argv);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is not exported in Ruby's *.h
|
||||
*/
|
||||
extern struct timeval rb_time_timeval(VALUE);
|
||||
|
||||
time_t
|
||||
time_to_time_t(VALUE time)
|
||||
{
|
||||
struct timeval t = rb_time_timeval(time);
|
||||
return t.tv_sec;
|
||||
}
|
||||
|
||||
/*
|
||||
* ASN1_INTEGER conversions
|
||||
* TODO: Make a decision what's the right way to do this.
|
||||
*/
|
||||
#define DO_IT_VIA_RUBY 0
|
||||
VALUE
|
||||
asn1integer_to_num(ASN1_INTEGER *ai)
|
||||
{
|
||||
BIGNUM *bn;
|
||||
#if DO_IT_VIA_RUBY
|
||||
char *txt;
|
||||
#endif
|
||||
VALUE num;
|
||||
|
||||
if (!ai) {
|
||||
ossl_raise(rb_eTypeError, "ASN1_INTEGER is NULL!");
|
||||
}
|
||||
if (!(bn = ASN1_INTEGER_to_BN(ai, NULL))) {
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
#if DO_IT_VIA_RUBY
|
||||
if (!(txt = BN_bn2dec(bn))) {
|
||||
BN_free(bn);
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
num = rb_cstr_to_inum(txt, 10, Qtrue);
|
||||
OPENSSL_free(txt);
|
||||
#else
|
||||
num = ossl_bn_new(bn);
|
||||
#endif
|
||||
BN_free(bn);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
#if DO_IT_VIA_RUBY
|
||||
ASN1_INTEGER *num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
||||
{
|
||||
BIGNUM *bn = NULL;
|
||||
|
||||
if (RTEST(rb_obj_is_kind_of(obj, cBN))) {
|
||||
bn = GetBNPtr(obj);
|
||||
} else {
|
||||
obj = rb_String(obj);
|
||||
if (!BN_dec2bn(&bn, StringValuePtr(obj))) {
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
}
|
||||
if (!(ai = BN_to_ASN1_INTEGER(bn, ai))) {
|
||||
BN_free(bn);
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
BN_free(bn);
|
||||
return ai;
|
||||
}
|
||||
#else
|
||||
ASN1_INTEGER *num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
||||
{
|
||||
BIGNUM *bn = GetBNPtr(obj);
|
||||
|
||||
if (!(ai = BN_to_ASN1_INTEGER(bn, ai))) {
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
return ai;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* String to HEXString conversion
|
||||
*/
|
||||
|
@ -183,52 +47,6 @@ string2hex(char *buf, int buf_len, char **hexbuf, int *hexbuf_len)
|
|||
/*
|
||||
* Data Conversion
|
||||
*/
|
||||
BIO *
|
||||
ossl_obj2bio(VALUE obj)
|
||||
{
|
||||
BIO *bio;
|
||||
|
||||
if (TYPE(obj) == T_FILE) {
|
||||
OpenFile *fptr;
|
||||
GetOpenFile(obj, fptr);
|
||||
rb_io_check_readable(fptr);
|
||||
bio = BIO_new_fp(fptr->f, BIO_NOCLOSE);
|
||||
}
|
||||
else {
|
||||
StringValue(obj);
|
||||
bio = BIO_new_mem_buf(RSTRING(obj)->ptr, RSTRING(obj)->len);
|
||||
}
|
||||
if (!bio) ossl_raise(eOSSLError, NULL);
|
||||
|
||||
return bio;
|
||||
}
|
||||
|
||||
BIO *
|
||||
ossl_protect_obj2bio(VALUE obj, int *status)
|
||||
{
|
||||
BIO *ret = NULL;
|
||||
ret = (BIO*)rb_protect((VALUE(*)_((VALUE)))ossl_obj2bio, obj, status);
|
||||
return ret;
|
||||
}
|
||||
|
||||
VALUE
|
||||
ossl_membio2str(BIO *bio)
|
||||
{
|
||||
VALUE ret;
|
||||
BUF_MEM *buf;
|
||||
|
||||
BIO_get_mem_ptr(bio, &buf);
|
||||
ret = rb_str_new(buf->data, buf->length);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
VALUE
|
||||
ossl_protect_membio2str(BIO *bio, int *status)
|
||||
{
|
||||
return rb_protect((VALUE(*)_((VALUE)))ossl_membio2str, (VALUE)bio, status);
|
||||
}
|
||||
|
||||
STACK_OF(X509) *
|
||||
ossl_x509_ary2sk(VALUE ary)
|
||||
{
|
||||
|
|
|
@ -87,18 +87,6 @@ extern VALUE eOSSLError;
|
|||
}\
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* ASN1_DATE conversions
|
||||
*/
|
||||
VALUE asn1time_to_time(ASN1_TIME *);
|
||||
time_t time_to_time_t(VALUE);
|
||||
|
||||
/*
|
||||
* ASN1_INTEGER conversions
|
||||
*/
|
||||
VALUE asn1integer_to_num(ASN1_INTEGER *);
|
||||
ASN1_INTEGER *num_to_asn1integer(VALUE, ASN1_INTEGER *);
|
||||
|
||||
/*
|
||||
* String to HEXString conversion
|
||||
*/
|
||||
|
@ -107,10 +95,6 @@ int string2hex(char *, int, char **, int *);
|
|||
/*
|
||||
* Data Conversion
|
||||
*/
|
||||
BIO *ossl_obj2bio(VALUE);
|
||||
BIO *ossl_protect_obj2bio(VALUE,int*);
|
||||
VALUE ossl_membio2str(BIO*);
|
||||
VALUE ossl_protect_membio2str(BIO*,int*);
|
||||
STACK_OF(X509) *ossl_x509_ary2sk(VALUE);
|
||||
STACK_OF(X509) *ossl_protect_x509_ary2sk(VALUE,int*);
|
||||
|
||||
|
@ -174,19 +158,21 @@ void ossl_debug(const char *, ...);
|
|||
*/
|
||||
#include "openssl_missing.h"
|
||||
#include "ruby_missing.h"
|
||||
#include "ossl_asn1.h"
|
||||
#include "ossl_bio.h"
|
||||
#include "ossl_bn.h"
|
||||
#include "ossl_cipher.h"
|
||||
#include "ossl_config.h"
|
||||
#include "ossl_digest.h"
|
||||
#include "ossl_hmac.h"
|
||||
#include "ossl_ns_spki.h"
|
||||
#include "ossl_ocsp.h"
|
||||
#include "ossl_pkcs7.h"
|
||||
#include "ossl_pkey.h"
|
||||
#include "ossl_rand.h"
|
||||
#include "ossl_ssl.h"
|
||||
#include "ossl_version.h"
|
||||
#include "ossl_x509.h"
|
||||
#include "ossl_ocsp.h"
|
||||
|
||||
void Init_openssl(void);
|
||||
|
||||
|
|
148
ext/openssl/ossl_asn1.c
Normal file
148
ext/openssl/ossl_asn1.c
Normal file
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* $Id$
|
||||
* 'OpenSSL for Ruby' team members
|
||||
* Copyright (C) 2003
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* This program is licenced under the same licence as Ruby.
|
||||
* (See the file 'LICENCE'.)
|
||||
*/
|
||||
#include "ossl.h"
|
||||
|
||||
#if defined(HAVE_SYS_TIME_H)
|
||||
# include <sys/time.h>
|
||||
#elif !defined(NT) && !defined(_WIN32)
|
||||
struct timeval {
|
||||
long tv_sec; /* seconds */
|
||||
long tv_usec; /* and microseconds */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* DATE conversion
|
||||
*/
|
||||
VALUE
|
||||
asn1time_to_time(ASN1_TIME *time)
|
||||
{
|
||||
struct tm tm;
|
||||
VALUE argv[6];
|
||||
|
||||
if (!time) {
|
||||
ossl_raise(rb_eTypeError, "ASN1_TIME is NULL!");
|
||||
}
|
||||
memset(&tm, 0, sizeof(struct tm));
|
||||
|
||||
switch (time->type) {
|
||||
case V_ASN1_UTCTIME:
|
||||
if (sscanf(time->data, "%2d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
|
||||
&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
|
||||
ossl_raise(rb_eTypeError, "bad UTCTIME format");
|
||||
}
|
||||
if (tm.tm_year < 69) {
|
||||
tm.tm_year += 2000;
|
||||
} else {
|
||||
tm.tm_year += 1900;
|
||||
}
|
||||
tm.tm_mon -= 1;
|
||||
break;
|
||||
case V_ASN1_GENERALIZEDTIME:
|
||||
if (sscanf(time->data, "%4d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
|
||||
&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
|
||||
ossl_raise(rb_eTypeError, "bad GENERALIZEDTIME format" );
|
||||
}
|
||||
tm.tm_mon -= 1;
|
||||
break;
|
||||
default:
|
||||
rb_warning("unknown time format");
|
||||
return Qnil;
|
||||
}
|
||||
argv[0] = INT2NUM(tm.tm_year);
|
||||
argv[1] = INT2NUM(tm.tm_mon+1);
|
||||
argv[2] = INT2NUM(tm.tm_mday);
|
||||
argv[3] = INT2NUM(tm.tm_hour);
|
||||
argv[4] = INT2NUM(tm.tm_min);
|
||||
argv[5] = INT2NUM(tm.tm_sec);
|
||||
|
||||
return rb_funcall2(rb_cTime, rb_intern("utc"), 6, argv);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is not exported in Ruby's *.h
|
||||
*/
|
||||
extern struct timeval rb_time_timeval(VALUE);
|
||||
|
||||
time_t
|
||||
time_to_time_t(VALUE time)
|
||||
{
|
||||
struct timeval t = rb_time_timeval(time);
|
||||
return t.tv_sec;
|
||||
}
|
||||
|
||||
/*
|
||||
* ASN1_INTEGER conversions
|
||||
* TODO: Make a decision what's the right way to do this.
|
||||
*/
|
||||
#define DO_IT_VIA_RUBY 0
|
||||
VALUE
|
||||
asn1integer_to_num(ASN1_INTEGER *ai)
|
||||
{
|
||||
BIGNUM *bn;
|
||||
#if DO_IT_VIA_RUBY
|
||||
char *txt;
|
||||
#endif
|
||||
VALUE num;
|
||||
|
||||
if (!ai) {
|
||||
ossl_raise(rb_eTypeError, "ASN1_INTEGER is NULL!");
|
||||
}
|
||||
if (!(bn = ASN1_INTEGER_to_BN(ai, NULL))) {
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
#if DO_IT_VIA_RUBY
|
||||
if (!(txt = BN_bn2dec(bn))) {
|
||||
BN_free(bn);
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
num = rb_cstr_to_inum(txt, 10, Qtrue);
|
||||
OPENSSL_free(txt);
|
||||
#else
|
||||
num = ossl_bn_new(bn);
|
||||
#endif
|
||||
BN_free(bn);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
#if DO_IT_VIA_RUBY
|
||||
ASN1_INTEGER *num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
||||
{
|
||||
BIGNUM *bn = NULL;
|
||||
|
||||
if (RTEST(rb_obj_is_kind_of(obj, cBN))) {
|
||||
bn = GetBNPtr(obj);
|
||||
} else {
|
||||
obj = rb_String(obj);
|
||||
if (!BN_dec2bn(&bn, StringValuePtr(obj))) {
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
}
|
||||
if (!(ai = BN_to_ASN1_INTEGER(bn, ai))) {
|
||||
BN_free(bn);
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
BN_free(bn);
|
||||
return ai;
|
||||
}
|
||||
#else
|
||||
ASN1_INTEGER *num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
|
||||
{
|
||||
BIGNUM *bn = GetBNPtr(obj);
|
||||
|
||||
if (!(ai = BN_to_ASN1_INTEGER(bn, ai))) {
|
||||
ossl_raise(eOSSLError, NULL);
|
||||
}
|
||||
return ai;
|
||||
}
|
||||
#endif
|
||||
|
27
ext/openssl/ossl_asn1.h
Normal file
27
ext/openssl/ossl_asn1.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* $Id$
|
||||
* 'OpenSSL for Ruby' team members
|
||||
* Copyright (C) 2003
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* This program is licenced under the same licence as Ruby.
|
||||
* (See the file 'LICENCE'.)
|
||||
*/
|
||||
#if !defined(_OSSL_ASN1_H_)
|
||||
#define _OSSL_ASN1_H_
|
||||
|
||||
/*
|
||||
* ASN1_DATE conversions
|
||||
*/
|
||||
VALUE asn1time_to_time(ASN1_TIME *);
|
||||
time_t time_to_time_t(VALUE);
|
||||
|
||||
/*
|
||||
* ASN1_INTEGER conversions
|
||||
*/
|
||||
VALUE asn1integer_to_num(ASN1_INTEGER *);
|
||||
ASN1_INTEGER *num_to_asn1integer(VALUE, ASN1_INTEGER *);
|
||||
|
||||
#endif
|
||||
|
58
ext/openssl/ossl_bio.c
Normal file
58
ext/openssl/ossl_bio.c
Normal file
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* $Id$
|
||||
* 'OpenSSL for Ruby' team members
|
||||
* Copyright (C) 2003
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* This program is licenced under the same licence as Ruby.
|
||||
* (See the file 'LICENCE'.)
|
||||
*/
|
||||
#include "ossl.h"
|
||||
|
||||
BIO *
|
||||
ossl_obj2bio(VALUE obj)
|
||||
{
|
||||
BIO *bio;
|
||||
|
||||
if (TYPE(obj) == T_FILE) {
|
||||
OpenFile *fptr;
|
||||
GetOpenFile(obj, fptr);
|
||||
rb_io_check_readable(fptr);
|
||||
bio = BIO_new_fp(fptr->f, BIO_NOCLOSE);
|
||||
}
|
||||
else {
|
||||
StringValue(obj);
|
||||
bio = BIO_new_mem_buf(RSTRING(obj)->ptr, RSTRING(obj)->len);
|
||||
}
|
||||
if (!bio) ossl_raise(eOSSLError, NULL);
|
||||
|
||||
return bio;
|
||||
}
|
||||
|
||||
BIO *
|
||||
ossl_protect_obj2bio(VALUE obj, int *status)
|
||||
{
|
||||
BIO *ret = NULL;
|
||||
ret = (BIO*)rb_protect((VALUE(*)_((VALUE)))ossl_obj2bio, obj, status);
|
||||
return ret;
|
||||
}
|
||||
|
||||
VALUE
|
||||
ossl_membio2str(BIO *bio)
|
||||
{
|
||||
VALUE ret;
|
||||
BUF_MEM *buf;
|
||||
|
||||
BIO_get_mem_ptr(bio, &buf);
|
||||
ret = rb_str_new(buf->data, buf->length);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
VALUE
|
||||
ossl_protect_membio2str(BIO *bio, int *status)
|
||||
{
|
||||
return rb_protect((VALUE(*)_((VALUE)))ossl_membio2str, (VALUE)bio, status);
|
||||
}
|
||||
|
20
ext/openssl/ossl_bio.h
Normal file
20
ext/openssl/ossl_bio.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* $Id$
|
||||
* 'OpenSSL for Ruby' team members
|
||||
* Copyright (C) 2003
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* This program is licenced under the same licence as Ruby.
|
||||
* (See the file 'LICENCE'.)
|
||||
*/
|
||||
#if !defined(_OSSL_BIO_H_)
|
||||
#define _OSSL_BIO_H_
|
||||
|
||||
BIO *ossl_obj2bio(VALUE);
|
||||
BIO *ossl_protect_obj2bio(VALUE,int*);
|
||||
VALUE ossl_membio2str(BIO*);
|
||||
VALUE ossl_protect_membio2str(BIO*,int*);
|
||||
|
||||
#endif
|
||||
|
|
@ -471,25 +471,8 @@ BIGNUM_RAND(pseudo_rand);
|
|||
WrapBN(klass, obj, result); \
|
||||
return obj; \
|
||||
}
|
||||
|
||||
#define BIGNUM_RAND_RANGE_NOT_IMPL(func) \
|
||||
static VALUE \
|
||||
ossl_bn_s_##func##_range(VALUE klass, VALUE range) \
|
||||
{ \
|
||||
rb_notimplement(); \
|
||||
}
|
||||
|
||||
#if defined(HAVE_BN_RAND_RANGE)
|
||||
BIGNUM_RAND_RANGE(rand);
|
||||
#else
|
||||
BIGNUM_RAND_RANGE_NOT_IMPL(rand);
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_BN_PSEUDO_RAND_RANGE)
|
||||
BIGNUM_RAND_RANGE(pseudo_rand);
|
||||
#else
|
||||
BIGNUM_RAND_RANGE_NOT_IMPL(pseudo_rand);
|
||||
#endif
|
||||
|
||||
static VALUE
|
||||
ossl_bn_s_generate_prime(int argc, VALUE *argv, VALUE klass)
|
||||
|
|
|
@ -52,7 +52,6 @@ GetConfigPtr(VALUE obj)
|
|||
CONF *
|
||||
DupConfigPtr(VALUE obj)
|
||||
{
|
||||
CONF *conf;
|
||||
VALUE str;
|
||||
|
||||
OSSL_Check_Kind(obj, cConfig);
|
||||
|
@ -70,7 +69,6 @@ parse_config(VALUE str, CONF *dst)
|
|||
CONF *conf;
|
||||
BIO *bio;
|
||||
long eline = -1;
|
||||
VALUE obj;
|
||||
|
||||
bio = ossl_obj2bio(str);
|
||||
conf = dst ? dst : NCONF_new(NULL);
|
||||
|
@ -210,7 +208,17 @@ static VALUE
|
|||
ossl_config_get_value_old(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
VALUE section, name;
|
||||
|
||||
rb_scan_args(argc, argv, "11", §ion, &name);
|
||||
|
||||
/* support conf.value(nil, "HOME") -> conf.get_value("", "HOME") */
|
||||
if (NIL_P(section)) section = rb_str_new2("");
|
||||
/* support conf.value("HOME") -> conf.get_value("", "HOME") */
|
||||
if (NIL_P(name)) {
|
||||
name = section;
|
||||
section = rb_str_new2("");
|
||||
}
|
||||
/* NOTE: Don't care about conf.get_value(nil, nil) */
|
||||
rb_warn("Config#value is deprecated; use Config#get_value");
|
||||
return ossl_config_get_value(self, section, name);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,21 @@ VALUE cPKey;
|
|||
VALUE ePKeyError;
|
||||
ID id_private_q;
|
||||
|
||||
/*
|
||||
* callback for generating keys
|
||||
*/
|
||||
void
|
||||
ossl_generate_cb(int p, int n, void *arg)
|
||||
{
|
||||
VALUE ary;
|
||||
|
||||
ary = rb_ary_new2(2);
|
||||
rb_ary_store(ary, 0, INT2NUM(p));
|
||||
rb_ary_store(ary, 1, INT2NUM(n));
|
||||
|
||||
rb_yield(ary);
|
||||
}
|
||||
|
||||
/*
|
||||
* Public
|
||||
*/
|
||||
|
|
|
@ -33,6 +33,8 @@ extern ID id_private_q;
|
|||
GetPKey(obj, pkey); \
|
||||
} while (0)
|
||||
|
||||
void ossl_generate_cb(int, int, void *);
|
||||
|
||||
VALUE ossl_pkey_new(EVP_PKEY *);
|
||||
VALUE ossl_pkey_new_from_file(VALUE);
|
||||
EVP_PKEY *GetPKeyPtr(VALUE);
|
||||
|
|
|
@ -74,34 +74,16 @@ ossl_dh_new(EVP_PKEY *pkey)
|
|||
/*
|
||||
* Private
|
||||
*/
|
||||
/*
|
||||
* CB for yielding when generating DH params
|
||||
*/
|
||||
static void
|
||||
ossl_dh_generate_cb(int p, int n, void *arg)
|
||||
{
|
||||
VALUE ary;
|
||||
|
||||
ary = rb_ary_new2(2);
|
||||
rb_ary_store(ary, 0, INT2NUM(p));
|
||||
rb_ary_store(ary, 1, INT2NUM(n));
|
||||
|
||||
rb_yield(ary);
|
||||
}
|
||||
|
||||
static DH *
|
||||
dh_generate(int size, int gen)
|
||||
{
|
||||
DH *dh;
|
||||
void (*cb)(int, int, void *) = NULL;
|
||||
|
||||
dh = DH_generate_parameters(size, gen,
|
||||
rb_block_given_p() ? ossl_generate_cb : NULL,
|
||||
NULL);
|
||||
if (!dh) return 0;
|
||||
|
||||
if (rb_block_given_p()) {
|
||||
cb = ossl_dh_generate_cb;
|
||||
}
|
||||
/* arg to cb = NULL */
|
||||
if (!(dh = DH_generate_parameters(size, gen, cb, NULL))) {
|
||||
return 0;
|
||||
}
|
||||
if (!DH_generate_key(dh)) {
|
||||
DH_free(dh);
|
||||
return 0;
|
||||
|
|
|
@ -74,21 +74,6 @@ ossl_dsa_new(EVP_PKEY *pkey)
|
|||
/*
|
||||
* Private
|
||||
*/
|
||||
/*
|
||||
* CB for yielding when generating DSA params
|
||||
*/
|
||||
static void
|
||||
ossl_dsa_generate_cb(int p, int n, void *arg)
|
||||
{
|
||||
VALUE ary;
|
||||
|
||||
ary = rb_ary_new2(2);
|
||||
rb_ary_store(ary, 0, INT2NUM(p));
|
||||
rb_ary_store(ary, 1, INT2NUM(n));
|
||||
|
||||
rb_yield(ary);
|
||||
}
|
||||
|
||||
static DSA *
|
||||
dsa_generate(int size)
|
||||
{
|
||||
|
@ -96,18 +81,15 @@ dsa_generate(int size)
|
|||
unsigned char seed[20];
|
||||
int seed_len = 20, counter;
|
||||
unsigned long h;
|
||||
void (*cb)(int, int, void *) = NULL;
|
||||
|
||||
if (!RAND_bytes(seed, seed_len)) {
|
||||
return 0;
|
||||
}
|
||||
if (rb_block_given_p()) {
|
||||
cb = ossl_dsa_generate_cb;
|
||||
}
|
||||
dsa = DSA_generate_parameters(size, seed, seed_len, &counter, &h, cb, NULL);
|
||||
if(!dsa) { /* arg to cb = NULL */
|
||||
return 0;
|
||||
}
|
||||
dsa = DSA_generate_parameters(size, seed, seed_len, &counter, &h,
|
||||
rb_block_given_p() ? ossl_generate_cb : NULL,
|
||||
NULL);
|
||||
if(!dsa) return 0;
|
||||
|
||||
if (!DSA_generate_key(dsa)) {
|
||||
DSA_free(dsa);
|
||||
return 0;
|
||||
|
|
|
@ -75,30 +75,12 @@ ossl_rsa_new(EVP_PKEY *pkey)
|
|||
/*
|
||||
* Private
|
||||
*/
|
||||
/*
|
||||
* CB for yielding when generating RSA data
|
||||
*/
|
||||
static void
|
||||
ossl_rsa_generate_cb(int p, int n, void *arg)
|
||||
{
|
||||
VALUE ary;
|
||||
|
||||
ary = rb_ary_new2(2);
|
||||
rb_ary_store(ary, 0, INT2NUM(p));
|
||||
rb_ary_store(ary, 1, INT2NUM(n));
|
||||
|
||||
rb_yield(ary);
|
||||
}
|
||||
|
||||
static RSA *
|
||||
rsa_generate(int size, int exp)
|
||||
{
|
||||
void (*cb)(int, int, void *) = NULL;
|
||||
|
||||
if (rb_block_given_p()) {
|
||||
cb = ossl_rsa_generate_cb;
|
||||
}
|
||||
return RSA_generate_key(size, exp, cb, NULL);
|
||||
return RSA_generate_key(size, exp,
|
||||
rb_block_given_p() ? ossl_generate_cb : NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
|
Loading…
Reference in a new issue