/*
* Portions Copyright (C) 1999-2002, 2004-2009, 2011-2017 Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Portions Copyright (C) 1995-2000 by Network Associates, Inc.
*
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NETWORK ASSOCIATES DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE
* FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* Principal Author: Brian Wellington
* $Id: openssldh_link.c,v 1.20 2011/01/11 23:47:13 tbox Exp $
*/
#ifdef OPENSSL
#include <config.h>
#ifndef PK11_DH_DISABLE
#include <ctype.h>
#include "dst_internal.h"
#include "dst_openssl.h"
#include "dst_parse.h"
"A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25" \
"F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF"
"8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF2" \
"5F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406" \
"B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF"
"29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \
"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \
"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \
"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \
"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \
"83655D23DCA3AD961C62F356208552BB9ED529077096966D" \
"670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF"
/*
* DH_get0_key, DH_set0_key, DH_get0_pqg and DH_set0_pqg
* are from OpenSSL 1.1.0.
*/
static void
}
static int
/* Note that it is valid for priv_key to be NULL */
return 0;
return 1;
}
static void
{
if (p != NULL)
*p = dh->p;
if (q != NULL)
*q = dh->q;
if (g != NULL)
*g = dh->g;
}
static int
/* q is optional */
return(0);
dh->p = p;
dh->q = q;
dh->g = g;
if (q != NULL) {
}
return(1);
}
#endif
static isc_result_t
{
int ret;
isc_region_t r;
unsigned int len;
return (ISC_R_NOSPACE);
if (ret <= 0)
return (dst__openssl_toresult2("DH_compute_key",
return (ISC_R_SUCCESS);
}
static isc_boolean_t
return (ISC_TRUE);
return (ISC_FALSE);
return (ISC_FALSE);
return (ISC_FALSE);
return (ISC_FALSE);
}
return (ISC_TRUE);
}
static isc_boolean_t
return (ISC_TRUE);
return (ISC_FALSE);
return (ISC_FALSE);
return (ISC_TRUE);
}
#if OPENSSL_VERSION_NUMBER > 0x00908000L
static int
union {
void *dptr;
void (*fptr)(int);
} u;
UNUSED(n);
u.fptr(p);
return (1);
}
#endif
static isc_result_t
#if OPENSSL_VERSION_NUMBER > 0x00908000L
#endif
union {
void *dptr;
void (*fptr)(int);
} u;
#else
#endif
if (generator == 0) {
{
BIGNUM *p, *g;
else
if (p != NULL)
BN_free(p);
if (g != NULL)
BN_free(g);
return (dst__openssl_toresult(ISC_R_NOMEMORY));
}
} else
generator = 2;
}
if (generator != 0) {
#if OPENSSL_VERSION_NUMBER > 0x00908000L
return (dst__openssl_toresult(ISC_R_NOMEMORY));
cb = BN_GENCB_new();
return (dst__openssl_toresult(ISC_R_NOMEMORY));
}
#endif
} else {
}
cb)) {
return (dst__openssl_toresult2(
"DH_generate_parameters_ex",
}
#else
return (dst__openssl_toresult2(
"DH_generate_parameters",
#endif
}
if (DH_generate_key(dh) == 0) {
return (dst__openssl_toresult2("DH_generate_key",
}
return (ISC_R_SUCCESS);
}
static isc_boolean_t
}
static void
return;
}
static void
}
static isc_uint16_t
return (val);
}
static isc_result_t
isc_region_t r;
plen = 1;
glen = 0;
}
else {
plen = BN_num_bytes(p);
glen = BN_num_bytes(g);
}
return (ISC_R_NOSPACE);
uint16_toregion(plen, &r);
if (plen == 1) {
*r.base = 1;
*r.base = 2;
else
*r.base = 3;
} else
isc_region_consume(&r, plen);
uint16_toregion(glen, &r);
if (glen > 0)
isc_region_consume(&r, glen);
uint16_toregion(publen, &r);
isc_region_consume(&r, publen);
return (ISC_R_SUCCESS);
}
static isc_result_t
isc_region_t r;
int special = 0;
if (r.length == 0)
return (ISC_R_SUCCESS);
return (dst__openssl_toresult(ISC_R_NOMEMORY));
/*
* Read the prime length. 1 & 2 are table entries, > 16 means a
* prime follows, otherwise an error.
*/
if (r.length < 2) {
return (DST_R_INVALIDPUBLICKEY);
}
plen = uint16_fromregion(&r);
return (DST_R_INVALIDPUBLICKEY);
}
return (DST_R_INVALIDPUBLICKEY);
}
if (plen == 1) {
isc_region_consume(&r, 1);
} else {
special = uint16_fromregion(&r);
}
switch (special) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
return (DST_R_INVALIDPUBLICKEY);
}
} else {
isc_region_consume(&r, plen);
}
/*
* Read the generator length. This should be 0 if the prime was
* special, but it might not be. If it's 0 and the prime is not
* special, we have a problem.
*/
if (r.length < 2) {
return (DST_R_INVALIDPUBLICKEY);
}
glen = uint16_fromregion(&r);
return (DST_R_INVALIDPUBLICKEY);
}
if (special != 0) {
if (glen == 0)
else {
BN_free(g);
return (DST_R_INVALIDPUBLICKEY);
}
}
} else {
if (glen == 0) {
return (DST_R_INVALIDPUBLICKEY);
}
}
isc_region_consume(&r, glen);
if (p != NULL)
BN_free(p);
if (g != NULL)
BN_free(g);
return (dst__openssl_toresult(ISC_R_NOMEMORY));
}
if (r.length < 2) {
return (DST_R_INVALIDPUBLICKEY);
}
publen = uint16_fromregion(&r);
return (DST_R_INVALIDPUBLICKEY);
}
return (dst__openssl_toresult(ISC_R_NOMEMORY));
}
isc_region_consume(&r, publen);
return (ISC_R_SUCCESS);
}
static isc_result_t
int i;
return (DST_R_NULLKEY);
return (DST_R_EXTERNALKEY);
for (i = 0; i < 4; i++) {
goto fail;
}
}
i = 0;
i++;
i++;
i++;
i++;
fail:
for (i = 0; i < 4; i++) {
break;
}
return (result);
}
static isc_result_t
int i;
/* read private key file */
if (ret != ISC_R_SUCCESS)
return (ret);
case TAG_DH_PRIME:
p = bn;
break;
case TAG_DH_GENERATOR:
g = bn;
break;
case TAG_DH_PRIVATE:
break;
case TAG_DH_PUBLIC:
break;
}
}
return (ISC_R_SUCCESS);
err:
if (p != NULL)
BN_free(p);
if (g != NULL)
BN_free(g);
return (ret);
}
static void
unsigned int i;
const char *s;
RUNTIME_CHECK(s != NULL);
RUNTIME_CHECK(s != NULL);
}
}
static void
openssldh_cleanup(void) {
}
NULL, /*%< createctx */
NULL, /*%< createctx2 */
NULL, /*%< destroyctx */
NULL, /*%< adddata */
NULL, /*%< openssldh_sign */
NULL, /*%< openssldh_verify */
NULL, /*%< openssldh_verify2 */
NULL, /*%< fromlabel */
NULL, /*%< dump */
NULL, /*%< restore */
};
goto cleanup;
*funcp = &openssldh_functions;
}
return (ISC_R_SUCCESS);
return (ISC_R_NOMEMORY);
}
#endif /* !PK11_DH_DISABLE */
#else /* OPENSSL */
#endif /* OPENSSL */
/*! \file */