*/
#ifdef OPENSSL
-#ifndef USE_EVP
-#define USE_EVP 1
-#endif
#include <config.h>
static isc_result_t
openssldsa_createctx(dst_key_t *key, dst_context_t *dctx) {
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx;
UNUSED(key);
dctx->ctxdata.evp_md_ctx = evp_md_ctx;
return (ISC_R_SUCCESS);
-#else
- isc_sha1_t *sha1ctx;
-
- UNUSED(key);
-
- sha1ctx = isc_mem_get(dctx->mctx, sizeof(isc_sha1_t));
- if (sha1ctx == NULL)
- return (ISC_R_NOMEMORY);
- isc_sha1_init(sha1ctx);
- dctx->ctxdata.sha1ctx = sha1ctx;
- return (ISC_R_SUCCESS);
-#endif
}
static void
openssldsa_destroyctx(dst_context_t *dctx) {
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
if (evp_md_ctx != NULL) {
EVP_MD_CTX_destroy(evp_md_ctx);
dctx->ctxdata.evp_md_ctx = NULL;
}
-#else
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-
- if (sha1ctx != NULL) {
- isc_sha1_invalidate(sha1ctx);
- isc_mem_put(dctx->mctx, sha1ctx, sizeof(isc_sha1_t));
- dctx->ctxdata.sha1ctx = NULL;
- }
-#endif
}
static isc_result_t
openssldsa_adddata(dst_context_t *dctx, const isc_region_t *data) {
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
if (!EVP_DigestUpdate(evp_md_ctx, data->base, data->length)) {
return (ISC_R_FAILURE);
}
-#else
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-
- isc_sha1_update(sha1ctx, data->base, data->length);
-#endif
return (ISC_R_SUCCESS);
}
DSA_SIG *dsasig;
const BIGNUM *r = 0, *s = NULL;
unsigned int klen;
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
EVP_PKEY *pkey;
unsigned char *sigbuf;
const unsigned char *sb;
unsigned int siglen;
-#else
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
- unsigned char digest[ISC_SHA1_DIGESTLENGTH];
-#endif
isc_buffer_availableregion(sig, ®ion);
if (region.length < ISC_SHA1_DIGESTLENGTH * 2 + 1)
return (ISC_R_NOSPACE);
-#if USE_EVP
pkey = EVP_PKEY_new();
if (pkey == NULL)
return (ISC_R_NOMEMORY);
}
free(sigbuf);
-#elif 0
- /* Only use EVP for the Digest */
- if (!EVP_DigestFinal_ex(evp_md_ctx, digest, &siglen)) {
- return (dst__openssl_toresult3(dctx->category,
- "EVP_DigestFinal_ex",
- ISC_R_FAILURE));
- }
- dsasig = DSA_do_sign(digest, ISC_SHA1_DIGESTLENGTH, dsa);
- if (dsasig == NULL)
- return (dst__openssl_toresult3(dctx->category,
- "DSA_do_sign",
- DST_R_SIGNFAILURE));
-#else
- isc_sha1_final(sha1ctx, digest);
-
- dsasig = DSA_do_sign(digest, ISC_SHA1_DIGESTLENGTH, dsa);
- if (dsasig == NULL)
- return (dst__openssl_toresult3(dctx->category,
- "DSA_do_sign",
- DST_R_SIGNFAILURE));
-#endif
-
klen = (key->key_size - 512)/64;
if (klen > 255)
return (ISC_R_FAILURE);
int status = 0;
unsigned char *cp = sig->base;
DSA_SIG *dsasig;
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
-#if 0
- EVP_PKEY *pkey;
- unsigned char *sigbuf;
-#endif
unsigned int siglen;
-#else
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-#endif
unsigned char digest[ISC_SHA1_DIGESTLENGTH];
-
-#if USE_EVP
-#if 1
/* Only use EVP for the digest */
if (!EVP_DigestFinal_ex(evp_md_ctx, digest, &siglen)) {
return (ISC_R_FAILURE);
}
-#endif
-#else
- isc_sha1_final(sha1ctx, digest);
-#endif
if (sig->length != 2 * ISC_SHA1_DIGESTLENGTH + 1) {
return (DST_R_VERIFYFAILURE);
s = BN_bin2bn(cp, ISC_SHA1_DIGESTLENGTH, NULL);
DSA_SIG_set0(dsasig, r, s);
-#if 0
- pkey = EVP_PKEY_new();
- if (pkey == NULL)
- return (ISC_R_NOMEMORY);
- if (!EVP_PKEY_set1_DSA(pkey, dsa)) {
- EVP_PKEY_free(pkey);
- return (ISC_R_FAILURE);
- }
- /* Convert to Dss-Sig-Value (RFC2459). */
- sigbuf = malloc(EVP_PKEY_size(pkey) + 50);
- if (sigbuf == NULL) {
- EVP_PKEY_free(pkey);
- return (ISC_R_NOMEMORY);
- }
- siglen = (unsigned) i2d_DSA_SIG(dsasig, &sigbuf);
- INSIST(EVP_PKEY_size(pkey) >= (int) siglen);
- status = EVP_VerifyFinal(evp_md_ctx, sigbuf, siglen, pkey);
- EVP_PKEY_free(pkey);
- free(sigbuf);
-#else
status = DSA_do_verify(digest, ISC_SHA1_DIGESTLENGTH, dsasig, dsa);
-#endif
+
DSA_SIG_free(dsasig);
switch (status) {
case 1:
return (ISC_TRUE);
}
-#if OPENSSL_VERSION_NUMBER > 0x00908000L
static int
progress_cb(int p, int n, BN_GENCB *cb) {
union {
u.fptr(p);
return (1);
}
-#endif
static isc_result_t
openssldsa_generate(dst_key_t *key, int unused, void (*callback)(int)) {
DSA *dsa;
unsigned char rand_array[ISC_SHA1_DIGESTLENGTH];
isc_result_t result;
-#if OPENSSL_VERSION_NUMBER > 0x00908000L
BN_GENCB *cb;
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
BN_GENCB _cb;
void (*fptr)(int);
} u;
-#else
-
- UNUSED(callback);
-#endif
UNUSED(unused);
result = dst__entropy_getdata(rand_array, sizeof(rand_array),
if (result != ISC_R_SUCCESS)
return (result);
-#if OPENSSL_VERSION_NUMBER > 0x00908000L
dsa = DSA_new();
if (dsa == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
}
BN_GENCB_free(cb);
cb = NULL;
-#else
- dsa = DSA_generate_parameters(key->key_size, rand_array,
- ISC_SHA1_DIGESTLENGTH, NULL, NULL,
- NULL, NULL);
- if (dsa == NULL)
- return (dst__openssl_toresult2("DSA_generate_parameters",
- DST_R_OPENSSLFAILURE));
-#endif
if (DSA_generate_key(dsa) == 0) {
DSA_free(dsa);
#ifdef OPENSSL
#include <config.h>
-#ifndef USE_EVP
-#if !defined(HAVE_EVP_SHA256) || !defined(HAVE_EVP_SHA512)
-#define USE_EVP 0
-#else
-#define USE_EVP 1
-#endif
-#endif
-
-
#include <isc/entropy.h>
#include <isc/md5.h>
#include <isc/mem.h>
#include <openssl/err.h>
#include <openssl/objects.h>
#include <openssl/rsa.h>
-#if OPENSSL_VERSION_NUMBER > 0x00908000L
#include <openssl/bn.h>
-#endif
#if !defined(OPENSSL_NO_ENGINE)
#include <openssl/engine.h>
#endif
* We don't use configure for windows so enforce the OpenSSL version
* here. Unlike with configure we don't support overriding this test.
*/
-#ifdef WIN32
-#if !((OPENSSL_VERSION_NUMBER >= 0x009070cfL && \
- OPENSSL_VERSION_NUMBER < 0x00908000L) || \
- (OPENSSL_VERSION_NUMBER >= 0x0090804fL && \
- OPENSSL_VERSION_NUMBER < 0x10002000L) || \
- OPENSSL_VERSION_NUMBER >= 0x1000205fL)
-#error Please upgrade OpenSSL to 0.9.8d/0.9.7l or greater.
-#endif
-#endif
-
-
- /*
- * XXXMPA Temporarily disable RSA_BLINDING as it requires
- * good quality random data that cannot currently be guaranteed.
- * XXXMPA Find which versions of openssl use pseudo random data
- * and set RSA_FLAG_BLINDING for those.
- */
-
-#if 0
-#if OPENSSL_VERSION_NUMBER < 0x0090601fL
-#define SET_FLAGS(rsa) \
- do { \
- (rsa)->flags &= ~(RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE); \
- (rsa)->flags |= RSA_FLAG_BLINDING; \
- } while (0)
-#else
-#define SET_FLAGS(rsa) \
- do { \
- (rsa)->flags |= RSA_FLAG_BLINDING; \
- } while (0)
-#endif
+#if defined(WIN32) && (OPENSSL_VERSION_NUMBER < 0x10000000L)
+#error Please upgrade OpenSSL to 1.0.0 or greater.
#endif
-#if OPENSSL_VERSION_NUMBER < 0x0090601fL
-#define SET_FLAGS(rsa) \
- do { \
- (rsa)->flags &= ~(RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE); \
- (rsa)->flags &= ~RSA_FLAG_BLINDING; \
- } while (0)
-#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
-#if defined(RSA_FLAG_NO_BLINDING)
-#define SET_FLAGS(rsa) \
- do { \
- (rsa)->flags &= ~RSA_FLAG_BLINDING; \
- (rsa)->flags |= RSA_FLAG_NO_BLINDING; \
- } while (0)
-#else
-#define SET_FLAGS(rsa) \
- do { \
- (rsa)->flags &= ~RSA_FLAG_BLINDING; \
- } while (0)
-#endif
-#else
-#define SET_FLAGS(rsa) \
- do { \
- RSA_clear_flags(rsa, RSA_FLAG_BLINDING); \
- RSA_set_flags(rsa, RSA_FLAG_NO_BLINDING); \
- } while (0)
-#endif
#define DST_RET(a) {ret = a; goto err;}
#if !defined(HAVE_RSA_SET0_KEY)
static isc_result_t
opensslrsa_createctx(dst_key_t *key, dst_context_t *dctx) {
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx;
const EVP_MD *type = NULL;
-#endif
UNUSED(key);
#ifndef PK11_MD5_DISABLE
INSIST(0);
}
-#if USE_EVP
evp_md_ctx = EVP_MD_CTX_create();
if (evp_md_ctx == NULL)
return (ISC_R_NOMEMORY);
case DST_ALG_NSEC3RSASHA1:
type = EVP_sha1(); /* SHA1 + RSA */
break;
-#ifdef HAVE_EVP_SHA256
case DST_ALG_RSASHA256:
type = EVP_sha256(); /* SHA256 + RSA */
break;
-#endif
-#ifdef HAVE_EVP_SHA512
case DST_ALG_RSASHA512:
type = EVP_sha512();
break;
-#endif
default:
INSIST(0);
}
ISC_R_FAILURE));
}
dctx->ctxdata.evp_md_ctx = evp_md_ctx;
-#else
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
- {
- isc_md5_t *md5ctx;
-
- md5ctx = isc_mem_get(dctx->mctx, sizeof(isc_md5_t));
- if (md5ctx == NULL)
- return (ISC_R_NOMEMORY);
- isc_md5_init(md5ctx);
- dctx->ctxdata.md5ctx = md5ctx;
- }
- break;
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- {
- isc_sha1_t *sha1ctx;
-
- sha1ctx = isc_mem_get(dctx->mctx, sizeof(isc_sha1_t));
- if (sha1ctx == NULL)
- return (ISC_R_NOMEMORY);
- isc_sha1_init(sha1ctx);
- dctx->ctxdata.sha1ctx = sha1ctx;
- }
- break;
- case DST_ALG_RSASHA256:
- {
- isc_sha256_t *sha256ctx;
-
- sha256ctx = isc_mem_get(dctx->mctx,
- sizeof(isc_sha256_t));
- if (sha256ctx == NULL)
- return (ISC_R_NOMEMORY);
- isc_sha256_init(sha256ctx);
- dctx->ctxdata.sha256ctx = sha256ctx;
- }
- break;
- case DST_ALG_RSASHA512:
- {
- isc_sha512_t *sha512ctx;
-
- sha512ctx = isc_mem_get(dctx->mctx,
- sizeof(isc_sha512_t));
- if (sha512ctx == NULL)
- return (ISC_R_NOMEMORY);
- isc_sha512_init(sha512ctx);
- dctx->ctxdata.sha512ctx = sha512ctx;
- }
- break;
- default:
- INSIST(0);
- }
-#endif
return (ISC_R_SUCCESS);
}
static void
opensslrsa_destroyctx(dst_context_t *dctx) {
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
-#endif
#ifndef PK11_MD5_DISABLE
REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 ||
dctx->key->key_alg == DST_ALG_RSASHA512);
#endif
-#if USE_EVP
if (evp_md_ctx != NULL) {
EVP_MD_CTX_destroy(evp_md_ctx);
dctx->ctxdata.evp_md_ctx = NULL;
}
-#else
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
- {
- isc_md5_t *md5ctx = dctx->ctxdata.md5ctx;
-
- if (md5ctx != NULL) {
- isc_md5_invalidate(md5ctx);
- isc_mem_put(dctx->mctx, md5ctx,
- sizeof(isc_md5_t));
- dctx->ctxdata.md5ctx = NULL;
- }
- }
- break;
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- {
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-
- if (sha1ctx != NULL) {
- isc_sha1_invalidate(sha1ctx);
- isc_mem_put(dctx->mctx, sha1ctx,
- sizeof(isc_sha1_t));
- dctx->ctxdata.sha1ctx = NULL;
- }
- }
- break;
- case DST_ALG_RSASHA256:
- {
- isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx;
-
- if (sha256ctx != NULL) {
- isc_sha256_invalidate(sha256ctx);
- isc_mem_put(dctx->mctx, sha256ctx,
- sizeof(isc_sha256_t));
- dctx->ctxdata.sha256ctx = NULL;
- }
- }
- break;
- case DST_ALG_RSASHA512:
- {
- isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx;
-
- if (sha512ctx != NULL) {
- isc_sha512_invalidate(sha512ctx);
- isc_mem_put(dctx->mctx, sha512ctx,
- sizeof(isc_sha512_t));
- dctx->ctxdata.sha512ctx = NULL;
- }
- }
- break;
- default:
- INSIST(0);
- }
-#endif
}
static isc_result_t
opensslrsa_adddata(dst_context_t *dctx, const isc_region_t *data) {
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
-#endif
#ifndef PK11_MD5_DISABLE
REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 ||
dctx->key->key_alg == DST_ALG_RSASHA512);
#endif
-#if USE_EVP
if (!EVP_DigestUpdate(evp_md_ctx, data->base, data->length)) {
return (dst__openssl_toresult3(dctx->category,
"EVP_DigestUpdate",
ISC_R_FAILURE));
}
-#else
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
- {
- isc_md5_t *md5ctx = dctx->ctxdata.md5ctx;
-
- isc_md5_update(md5ctx, data->base, data->length);
- }
- break;
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- {
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-
- isc_sha1_update(sha1ctx, data->base, data->length);
- }
- break;
- case DST_ALG_RSASHA256:
- {
- isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx;
-
- isc_sha256_update(sha256ctx, data->base, data->length);
- }
- break;
- case DST_ALG_RSASHA512:
- {
- isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx;
-
- isc_sha512_update(sha512ctx, data->base, data->length);
- }
- break;
- default:
- INSIST(0);
- }
-#endif
return (ISC_R_SUCCESS);
}
-#if ! USE_EVP && OPENSSL_VERSION_NUMBER < 0x00908000L
-/*
- * Digest prefixes from RFC 5702.
- */
-static unsigned char sha256_prefix[] =
- { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48,
- 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20};
-static unsigned char sha512_prefix[] =
- { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48,
- 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40};
-#define PREFIXLEN sizeof(sha512_prefix)
-#else
-#define PREFIXLEN 0
-#endif
-
static isc_result_t
opensslrsa_sign(dst_context_t *dctx, isc_buffer_t *sig) {
dst_key_t *key = dctx->key;
isc_region_t r;
unsigned int siglen = 0;
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
EVP_PKEY *pkey = key->keydata.pkey;
-#else
- RSA *rsa = key->keydata.rsa;
- /* note: ISC_SHA512_DIGESTLENGTH >= ISC_*_DIGESTLENGTH */
- unsigned char digest[PREFIXLEN + ISC_SHA512_DIGESTLENGTH];
- int status;
- int type = 0;
- unsigned int digestlen = 0;
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- unsigned int prefixlen = 0;
- const unsigned char *prefix = NULL;
-#endif
-#endif
#ifndef PK11_MD5_DISABLE
REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 ||
isc_buffer_availableregion(sig, &r);
-#if USE_EVP
if (r.length < (unsigned int) EVP_PKEY_size(pkey))
return (ISC_R_NOSPACE);
"EVP_SignFinal",
ISC_R_FAILURE));
}
-#else
- if (r.length < (unsigned int) RSA_size(rsa))
- return (ISC_R_NOSPACE);
-
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
- {
- isc_md5_t *md5ctx = dctx->ctxdata.md5ctx;
-
- isc_md5_final(md5ctx, digest);
- type = NID_md5;
- digestlen = ISC_MD5_DIGESTLENGTH;
- }
- break;
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- {
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-
- isc_sha1_final(sha1ctx, digest);
- type = NID_sha1;
- digestlen = ISC_SHA1_DIGESTLENGTH;
- }
- break;
- case DST_ALG_RSASHA256:
- {
- isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx;
-
- isc_sha256_final(digest, sha256ctx);
- digestlen = ISC_SHA256_DIGESTLENGTH;
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- prefix = sha256_prefix;
- prefixlen = sizeof(sha256_prefix);
-#else
- type = NID_sha256;
-#endif
- }
- break;
- case DST_ALG_RSASHA512:
- {
- isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx;
-
- isc_sha512_final(digest, sha512ctx);
- digestlen = ISC_SHA512_DIGESTLENGTH;
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- prefix = sha512_prefix;
- prefixlen = sizeof(sha512_prefix);
-#else
- type = NID_sha512;
-#endif
- }
- break;
- default:
- INSIST(0);
- }
-
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- INSIST(type != 0);
- status = RSA_sign(type, digest, digestlen, r.base,
- &siglen, rsa);
- break;
-
- case DST_ALG_RSASHA256:
- case DST_ALG_RSASHA512:
- INSIST(prefix != NULL);
- INSIST(prefixlen != 0);
- INSIST(prefixlen + digestlen <= sizeof(digest));
-
- memmove(digest + prefixlen, digest, digestlen);
- memmove(digest, prefix, prefixlen);
- status = RSA_private_encrypt(digestlen + prefixlen,
- digest, r.base, rsa,
- RSA_PKCS1_PADDING);
- if (status < 0)
- status = 0;
- else
- siglen = status;
- break;
-
- default:
- INSIST(0);
- }
-#else
- INSIST(type != 0);
- status = RSA_sign(type, digest, digestlen, r.base, &siglen, rsa);
-#endif
- if (status == 0)
- return (dst__openssl_toresult3(dctx->category,
- "RSA_sign",
- DST_R_OPENSSLFAILURE));
-#endif
isc_buffer_add(sig, siglen);
dst_key_t *key = dctx->key;
int status = 0;
const BIGNUM *e = NULL;
-#if USE_EVP
EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
EVP_PKEY *pkey = key->keydata.pkey;
RSA *rsa;
int bits;
-#else
- /* note: ISC_SHA512_DIGESTLENGTH >= ISC_*_DIGESTLENGTH */
- unsigned char digest[ISC_SHA512_DIGESTLENGTH];
- int type = 0;
- unsigned int digestlen = 0;
- RSA *rsa = key->keydata.rsa;
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- unsigned int prefixlen = 0;
- const unsigned char *prefix = NULL;
-#endif
-#endif
#ifndef PK11_MD5_DISABLE
REQUIRE(dctx->key->key_alg == DST_ALG_RSAMD5 ||
dctx->key->key_alg == DST_ALG_RSASHA512);
#endif
-#if USE_EVP
rsa = EVP_PKEY_get1_RSA(pkey);
if (rsa == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
"EVP_VerifyFinal",
DST_R_VERIFYFAILURE));
}
-#else
- RSA_get0_key(rsa, NULL, &e, NULL);
- if (BN_num_bits(e) > maxbits && maxbits != 0)
- return (DST_R_VERIFYFAILURE);
-
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
- {
- isc_md5_t *md5ctx = dctx->ctxdata.md5ctx;
-
- isc_md5_final(md5ctx, digest);
- type = NID_md5;
- digestlen = ISC_MD5_DIGESTLENGTH;
- }
- break;
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- {
- isc_sha1_t *sha1ctx = dctx->ctxdata.sha1ctx;
-
- isc_sha1_final(sha1ctx, digest);
- type = NID_sha1;
- digestlen = ISC_SHA1_DIGESTLENGTH;
- }
- break;
- case DST_ALG_RSASHA256:
- {
- isc_sha256_t *sha256ctx = dctx->ctxdata.sha256ctx;
-
- isc_sha256_final(digest, sha256ctx);
- digestlen = ISC_SHA256_DIGESTLENGTH;
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- prefix = sha256_prefix;
- prefixlen = sizeof(sha256_prefix);
-#else
- type = NID_sha256;
-#endif
- }
- break;
- case DST_ALG_RSASHA512:
- {
- isc_sha512_t *sha512ctx = dctx->ctxdata.sha512ctx;
-
- isc_sha512_final(digest, sha512ctx);
- digestlen = ISC_SHA512_DIGESTLENGTH;
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- prefix = sha512_prefix;
- prefixlen = sizeof(sha512_prefix);
-#else
- type = NID_sha512;
-#endif
- }
- break;
- default:
- INSIST(0);
- }
-
- if (sig->length != (unsigned int) RSA_size(rsa))
- return (DST_R_VERIFYFAILURE);
-
-#if OPENSSL_VERSION_NUMBER < 0x00908000L
- switch (dctx->key->key_alg) {
-#ifndef PK11_MD5_DISABLE
- case DST_ALG_RSAMD5:
-#endif
- case DST_ALG_RSASHA1:
- case DST_ALG_NSEC3RSASHA1:
- INSIST(type != 0);
- status = RSA_verify(type, digest, digestlen, sig->base,
- RSA_size(rsa), rsa);
- break;
-
- case DST_ALG_RSASHA256:
- case DST_ALG_RSASHA512:
- {
- /*
- * 1024 is big enough for all valid RSA bit sizes
- * for use with DNSSEC.
- */
- unsigned char original[PREFIXLEN + 1024];
-
- INSIST(prefix != NULL);
- INSIST(prefixlen != 0U);
-
- if (RSA_size(rsa) > (int)sizeof(original))
- return (DST_R_VERIFYFAILURE);
-
- status = RSA_public_decrypt(sig->length, sig->base,
- original, rsa,
- RSA_PKCS1_PADDING);
- if (status <= 0)
- return (dst__openssl_toresult3(
- dctx->category,
- "RSA_public_decrypt",
- DST_R_VERIFYFAILURE));
- if (status != (int)(prefixlen + digestlen))
- return (DST_R_VERIFYFAILURE);
- if (!isc_safe_memequal(original, prefix, prefixlen))
- return (DST_R_VERIFYFAILURE);
- if (!isc_safe_memequal(original + prefixlen,
- digest, digestlen))
- return (DST_R_VERIFYFAILURE);
- status = 1;
- }
- break;
-
- default:
- INSIST(0);
- }
-#else
- INSIST(type != 0);
- status = RSA_verify(type, digest, digestlen, sig->base,
- RSA_size(rsa), rsa);
-#endif
- if (status != 1)
- return (dst__openssl_toresult(DST_R_VERIFYFAILURE));
- return (ISC_R_SUCCESS);
-#endif
}
static isc_result_t
const BIGNUM *d1 = NULL, *d2 = NULL;
const BIGNUM *p1 = NULL, *p2 = NULL;
const BIGNUM *q1 = NULL, *q2 = NULL;
-#if USE_EVP
EVP_PKEY *pkey1, *pkey2;
-#endif
-#if USE_EVP
pkey1 = key1->keydata.pkey;
pkey2 = key2->keydata.pkey;
/*
rsa2 = EVP_PKEY_get1_RSA(pkey2);
RSA_free(rsa2);
}
-#else
- rsa1 = key1->keydata.rsa;
- rsa2 = key2->keydata.rsa;
-#endif
if (rsa1 == NULL && rsa2 == NULL)
return (ISC_TRUE);
if (status != 0)
return (ISC_FALSE);
-#if USE_EVP
if (RSA_test_flags(rsa1, RSA_FLAG_EXT_PKEY) != 0 ||
RSA_test_flags(rsa2, RSA_FLAG_EXT_PKEY) != 0) {
if (RSA_test_flags(rsa1, RSA_FLAG_EXT_PKEY) == 0 ||
*/
return (ISC_TRUE);
}
-#endif
if (d1 != NULL || d2 != NULL) {
if (d1 == NULL || d2 == NULL)
return (ISC_TRUE);
}
-#if OPENSSL_VERSION_NUMBER > 0x00908000L
static int
progress_cb(int p, int n, BN_GENCB *cb) {
union {
u.fptr(p);
return (1);
}
-#endif
static isc_result_t
opensslrsa_generate(dst_key_t *key, int exp, void (*callback)(int)) {
-#if OPENSSL_VERSION_NUMBER > 0x00908000L
isc_result_t ret = DST_R_OPENSSLFAILURE;
union {
void *dptr;
BN_GENCB _cb;
#endif
BN_GENCB *cb = BN_GENCB_new();
-#if USE_EVP
EVP_PKEY *pkey = EVP_PKEY_new();
-#endif
/*
* Reject incorrect RSA key lengths.
if (rsa == NULL || e == NULL || cb == NULL)
goto err;
-#if USE_EVP
if (pkey == NULL)
goto err;
if (!EVP_PKEY_set1_RSA(pkey, rsa))
goto err;
-#endif
if (exp == 0) {
/* RSA_F4 0x10001 */
BN_free(e);
BN_GENCB_free(cb);
cb = NULL;
- SET_FLAGS(rsa);
-#if USE_EVP
key->keydata.pkey = pkey;
RSA_free(rsa);
-#else
- key->keydata.rsa = rsa;
-#endif
return (ISC_R_SUCCESS);
}
ret = dst__openssl_toresult2("RSA_generate_key_ex",
DST_R_OPENSSLFAILURE);
err:
-#if USE_EVP
if (pkey != NULL) {
EVP_PKEY_free(pkey);
pkey = NULL;
}
-#endif
if (e != NULL) {
BN_free(e);
e = NULL;
cb = NULL;
}
return (dst__openssl_toresult(ret));
-#else
- RSA *rsa;
- unsigned long e;
-#if USE_EVP
- EVP_PKEY *pkey = EVP_PKEY_new();
-
- UNUSED(callback);
-
- if (pkey == NULL)
- return (ISC_R_NOMEMORY);
-#else
- UNUSED(callback);
-#endif
-
- if (exp == 0)
- e = RSA_F4;
- else
- e = 0x40000003;
- rsa = RSA_generate_key(key->key_size, e, NULL, NULL);
- if (rsa == NULL) {
-#if USE_EVP
- EVP_PKEY_free(pkey);
-#endif
- return (dst__openssl_toresult2("RSA_generate_key",
- DST_R_OPENSSLFAILURE));
- }
- SET_FLAGS(rsa);
-#if USE_EVP
- if (!EVP_PKEY_set1_RSA(pkey, rsa)) {
- EVP_PKEY_free(pkey);
- RSA_free(rsa);
- return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
- }
- key->keydata.pkey = pkey;
- RSA_free(rsa);
-#else
- key->keydata.rsa = rsa;
-#endif
-
- return (ISC_R_SUCCESS);
-#endif
}
static isc_boolean_t
opensslrsa_isprivate(const dst_key_t *key) {
const BIGNUM *d = NULL;
-#if USE_EVP
RSA *rsa = EVP_PKEY_get1_RSA(key->keydata.pkey);
INSIST(rsa != NULL);
RSA_free(rsa);
/* key->keydata.pkey still has a reference so rsa is still valid. */
-#else
- RSA *rsa = key->keydata.rsa;
-#endif
if (rsa != NULL && RSA_test_flags(rsa, RSA_FLAG_EXT_PKEY) != 0)
return (ISC_TRUE);
RSA_get0_key(rsa, NULL, NULL, &d);
static void
opensslrsa_destroy(dst_key_t *key) {
-#if USE_EVP
EVP_PKEY *pkey = key->keydata.pkey;
EVP_PKEY_free(pkey);
key->keydata.pkey = NULL;
-#else
- RSA *rsa = key->keydata.rsa;
- RSA_free(rsa);
- key->keydata.rsa = NULL;
-#endif
}
static isc_result_t
unsigned int mod_bytes;
isc_result_t ret;
RSA *rsa;
-#if USE_EVP
EVP_PKEY *pkey;
-#endif
const BIGNUM *e = NULL, *n = NULL;
-#if USE_EVP
REQUIRE(key->keydata.pkey != NULL);
-#else
- REQUIRE(key->keydata.rsa != NULL);
-#endif
-#if USE_EVP
pkey = key->keydata.pkey;
rsa = EVP_PKEY_get1_RSA(pkey);
if (rsa == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
-#else
- rsa = key->keydata.rsa;
-#endif
isc_buffer_availableregion(data, &r);
ret = ISC_R_SUCCESS;
err:
-#if USE_EVP
if (rsa != NULL)
RSA_free(rsa);
-#endif
return (ret);
}
isc_region_t r;
unsigned int e_bytes;
unsigned int length;
-#if USE_EVP
EVP_PKEY *pkey;
-#endif
BIGNUM *e = NULL, *n = NULL;
isc_buffer_remainingregion(data, &r);
rsa = RSA_new();
if (rsa == NULL)
return (dst__openssl_toresult(ISC_R_NOMEMORY));
- SET_FLAGS(rsa);
if (r.length < 1) {
RSA_free(rsa);
isc_buffer_forward(data, length);
-#if USE_EVP
pkey = EVP_PKEY_new();
if (pkey == NULL) {
RSA_free(rsa);
}
key->keydata.pkey = pkey;
RSA_free(rsa);
-#else
- key->keydata.rsa = rsa;
-#endif
return (ISC_R_SUCCESS);
}
const BIGNUM *p = NULL, *q = NULL;
const BIGNUM *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
-#if USE_EVP
if (key->keydata.pkey == NULL)
return (DST_R_NULLKEY);
rsa = EVP_PKEY_get1_RSA(key->keydata.pkey);
if (rsa == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
-#else
- if (key->keydata.rsa == NULL)
- return (DST_R_NULLKEY);
- rsa = key->keydata.rsa;
-#endif
memset(bufs, 0, sizeof(bufs));
RSA_get0_key(rsa, &n, &e, &d);
priv.nelements = i;
result = dst__privstruct_writefile(key, &priv, directory);
fail:
-#if USE_EVP
RSA_free(rsa);
-#endif
for (i = 0; i < 8; i++) {
if (bufs[i] == NULL)
break;
#endif
isc_mem_t *mctx = key->mctx;
const char *engine = NULL, *label = NULL;
-#if !defined(OPENSSL_NO_ENGINE) || USE_EVP
EVP_PKEY *pkey = NULL;
-#endif
BIGNUM *n = NULL, *e = NULL, *d = NULL;
BIGNUM *p = NULL, *q = NULL;
BIGNUM *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
return (ISC_R_SUCCESS);
}
-#if USE_EVP
if (pub != NULL && pub->keydata.pkey != NULL)
pubrsa = EVP_PKEY_get1_RSA(pub->keydata.pkey);
-#else
- if (pub != NULL && pub->keydata.rsa != NULL) {
- pubrsa = pub->keydata.rsa;
- pub->keydata.rsa = NULL;
- }
-#endif
for (i = 0; i < priv.nelements; i++) {
switch (priv.elements[i].tag) {
if (pubrsa != NULL)
RSA_free(pubrsa);
key->key_size = EVP_PKEY_bits(pkey);
-#if USE_EVP
key->keydata.pkey = pkey;
RSA_free(rsa);
-#else
- key->keydata.rsa = rsa;
- EVP_PKEY_free(pkey);
-#endif
dst__privstruct_free(&priv, mctx);
isc_safe_memwipe(&priv, sizeof(priv));
return (ISC_R_SUCCESS);
rsa = RSA_new();
if (rsa == NULL)
DST_RET(ISC_R_NOMEMORY);
- SET_FLAGS(rsa);
-#if USE_EVP
pkey = EVP_PKEY_new();
if (pkey == NULL)
DST_RET(ISC_R_NOMEMORY);
if (!EVP_PKEY_set1_RSA(pkey, rsa))
DST_RET(ISC_R_FAILURE);
key->keydata.pkey = pkey;
-#else
- key->keydata.rsa = rsa;
-#endif
for (i = 0; i < priv.nelements; i++) {
BIGNUM *bn;
key->key_size = BN_num_bits(n);
if (pubrsa != NULL)
RSA_free(pubrsa);
-#if USE_EVP
RSA_free(rsa);
-#endif
return (ISC_R_SUCCESS);
err:
-#if USE_EVP
if (pkey != NULL)
EVP_PKEY_free(pkey);
-#endif
if (rsa != NULL)
RSA_free(rsa);
if (pubrsa != NULL)
if (pubrsa != NULL)
RSA_free(pubrsa);
key->key_size = EVP_PKEY_bits(pkey);
-#if USE_EVP
key->keydata.pkey = pkey;
RSA_free(rsa);
-#else
- key->keydata.rsa = rsa;
- EVP_PKEY_free(pkey);
-#endif
return (ISC_R_SUCCESS);
err:
dst__opensslrsa_init(dst_func_t **funcp, unsigned char algorithm) {
REQUIRE(funcp != NULL);
+ UNUSED(algorithm);
+
if (*funcp == NULL) {
- switch (algorithm) {
- case DST_ALG_RSASHA256:
-#if defined(HAVE_EVP_SHA256) || !USE_EVP
- *funcp = &opensslrsa_functions;
-#endif
- break;
- case DST_ALG_RSASHA512:
-#if defined(HAVE_EVP_SHA512) || !USE_EVP
- *funcp = &opensslrsa_functions;
-#endif
- break;
- default:
- *funcp = &opensslrsa_functions;
- break;
- }
+ *funcp = &opensslrsa_functions;
}
return (ISC_R_SUCCESS);
}