2
* $Id: openssl_missing.c 11708 2007-02-12 23:01:19Z shyouhei $
3
* 'OpenSSL for Ruby' project
4
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
8
* This program is licenced under the same licence as Ruby.
9
* (See the file 'LICENCE'.)
11
#include RUBY_EXTCONF_H
13
#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ST_ENGINE)
14
# include <openssl/engine.h>
16
#include <openssl/x509_vfy.h>
18
#if !defined(OPENSSL_NO_HMAC)
19
#include <string.h> /* memcpy() */
20
#include <openssl/hmac.h>
22
#include "openssl_missing.h"
24
#if !defined(HAVE_HMAC_CTX_COPY)
26
HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
28
if (!out || !in) return 0;
29
memcpy(out, in, sizeof(HMAC_CTX));
31
if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)
32
|| !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)
33
|| !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx))
37
#endif /* HAVE_HMAC_CTX_COPY */
40
#if !defined(HAVE_X509_STORE_SET_EX_DATA)
42
int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data)
44
return CRYPTO_set_ex_data(&str->ex_data, idx, data);
47
void *X509_STORE_get_ex_data(X509_STORE *str, int idx)
49
return CRYPTO_get_ex_data(&str->ex_data, idx);
53
#if !defined(HAVE_EVP_MD_CTX_CREATE)
55
EVP_MD_CTX_create(void)
57
EVP_MD_CTX *ctx = OPENSSL_malloc(sizeof(EVP_MD_CTX));
58
if (!ctx) return NULL;
60
memset(ctx, 0, sizeof(EVP_MD_CTX));
66
#if !defined(HAVE_EVP_MD_CTX_CLEANUP)
68
EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
71
memset(ctx, 0, sizeof(EVP_MD_CTX));
77
#if !defined(HAVE_EVP_MD_CTX_DESTROY)
79
EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
81
EVP_MD_CTX_cleanup(ctx);
86
#if !defined(HAVE_EVP_MD_CTX_INIT)
88
EVP_MD_CTX_init(EVP_MD_CTX *ctx)
90
memset(ctx, 0, sizeof(EVP_MD_CTX));
94
#if !defined(HAVE_HMAC_CTX_INIT)
96
HMAC_CTX_init(HMAC_CTX *ctx)
98
EVP_MD_CTX_init(&ctx->i_ctx);
99
EVP_MD_CTX_init(&ctx->o_ctx);
100
EVP_MD_CTX_init(&ctx->md_ctx);
104
#if !defined(HAVE_HMAC_CTX_CLEANUP)
106
HMAC_CTX_cleanup(HMAC_CTX *ctx)
108
EVP_MD_CTX_cleanup(&ctx->i_ctx);
109
EVP_MD_CTX_cleanup(&ctx->o_ctx);
110
EVP_MD_CTX_cleanup(&ctx->md_ctx);
111
memset(ctx, 0, sizeof(HMAC_CTX));
115
#if !defined(HAVE_EVP_CIPHER_CTX_COPY)
117
* this function does not exist in OpenSSL yet... or ever?.
118
* a future version may break this function.
122
EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, EVP_CIPHER_CTX *in)
124
memcpy(out, in, sizeof(EVP_CIPHER_CTX));
126
#if defined(HAVE_ENGINE_ADD) && defined(HAVE_ST_ENGINE)
127
if (in->engine) ENGINE_add(out->engine);
128
if (in->cipher_data) {
129
out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size);
130
memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size);
138
#if !defined(HAVE_X509_CRL_SET_VERSION)
140
X509_CRL_set_version(X509_CRL *x, long version)
142
if (x == NULL || x->crl == NULL) return 0;
143
if (x->crl->version == NULL) {
144
x->crl->version = M_ASN1_INTEGER_new();
145
if (x->crl->version == NULL) return 0;
147
return ASN1_INTEGER_set(x->crl->version, version);
151
#if !defined(HAVE_X509_CRL_SET_ISSUER_NAME)
153
X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
155
if (x == NULL || x->crl == NULL) return 0;
156
return X509_NAME_set(&x->crl->issuer, name);
160
#if !defined(HAVE_X509_CRL_SORT)
162
X509_CRL_sort(X509_CRL *c)
166
/* sort the data so it will be written in serial
168
sk_X509_REVOKED_sort(c->crl->revoked);
169
for (i=0; i<sk_X509_REVOKED_num(c->crl->revoked); i++) {
170
r=sk_X509_REVOKED_value(c->crl->revoked, i);
177
#if !defined(HAVE_X509_CRL_ADD0_REVOKED)
179
OSSL_X509_REVOKED_cmp(const X509_REVOKED * const *a, const X509_REVOKED * const *b)
181
return(ASN1_STRING_cmp(
182
(ASN1_STRING *)(*a)->serialNumber,
183
(ASN1_STRING *)(*b)->serialNumber));
187
X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
193
inf->revoked = sk_X509_REVOKED_new(OSSL_X509_REVOKED_cmp);
194
if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev))
200
#if !defined(HAVE_BN_MOD_SQR)
202
BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
204
if (!BN_sqr(r, (BIGNUM*)a, ctx)) return 0;
205
return BN_mod(r, r, m, ctx);
209
#if !defined(HAVE_BN_MOD_ADD) || !defined(HAVE_BN_MOD_SUB)
210
int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx)
212
if (!BN_mod(r,m,d,ctx)) return 0;
213
if (!r->neg) return 1;
214
return (d->neg ? BN_sub : BN_add)(r, r, d);
218
#if !defined(HAVE_BN_MOD_ADD)
220
BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx)
222
if (!BN_add(r, a, b)) return 0;
223
return BN_nnmod(r, r, m, ctx);
227
#if !defined(HAVE_BN_MOD_SUB)
229
BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx)
231
if (!BN_sub(r, a, b)) return 0;
232
return BN_nnmod(r, r, m, ctx);
236
#if !defined(HAVE_BN_RAND_RANGE) || !defined(HAVE_BN_PSEUDO_RAND_RANGE)
238
bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range)
240
int (*bn_rand)(BIGNUM *, int, int, int) = pseudo ? BN_pseudo_rand : BN_rand;
243
if (range->neg || BN_is_zero(range)) return 0;
245
n = BN_num_bits(range);
248
if (!BN_zero(r)) return 0;
249
} else if (!BN_is_bit_set(range, n - 2) && !BN_is_bit_set(range, n - 3)) {
251
if (!bn_rand(r, n + 1, -1, 0)) return 0;
252
if (BN_cmp(r ,range) >= 0) {
253
if (!BN_sub(r, r, range)) return 0;
254
if (BN_cmp(r, range) >= 0)
255
if (!BN_sub(r, r, range)) return 0;
257
} while (BN_cmp(r, range) >= 0);
260
if (!bn_rand(r, n, -1, 0)) return 0;
261
} while (BN_cmp(r, range) >= 0);
268
#if !defined(HAVE_BN_RAND_RANGE)
270
BN_rand_range(BIGNUM *r, BIGNUM *range)
272
return bn_rand_range(0, r, range);
276
#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
278
BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range)
280
return bn_rand_range(1, r, range);
284
#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
285
#define OPENSSL_CONF "openssl.cnf"
287
CONF_get1_default_config_file(void)
292
file = getenv("OPENSSL_CONF");
293
if (file) return BUF_strdup(file);
294
len = strlen(X509_get_default_cert_area());
295
#ifndef OPENSSL_SYS_VMS
298
len += strlen(OPENSSL_CONF);
299
file = OPENSSL_malloc(len + 1);
300
if (!file) return NULL;
301
strcpy(file,X509_get_default_cert_area());
302
#ifndef OPENSSL_SYS_VMS
305
strcat(file,OPENSSL_CONF);
311
#if !defined(HAVE_PEM_DEF_CALLBACK)
312
#define OSSL_PASS_MIN_LENGTH 4
314
PEM_def_callback(char *buf, int num, int w, void *key)
321
i = (i > num) ? num : i;
326
prompt = EVP_get_pw_prompt();
327
if (prompt == NULL) prompt = "Enter PEM pass phrase:";
329
i = EVP_read_pw_string(buf, num, prompt, w);
331
memset(buf, 0, (unsigned int)num);
335
if (j < OSSL_PASS_MIN_LENGTH) {
337
"phrase is too short, needs to be at least %d chars\n",
338
OSSL_PASS_MIN_LENGTH);