148f54b9dSDamien Miller /* $OpenBSD: dsa_lib.c,v 1.29 2018/04/14 07:09:21 tb Exp $ */
248f54b9dSDamien Miller /* $OpenBSD: rsa_lib.c,v 1.37 2018/04/14 07:09:21 tb Exp $ */
348f54b9dSDamien Miller /* $OpenBSD: evp_lib.c,v 1.17 2018/09/12 06:35:38 djm Exp $ */
448f54b9dSDamien Miller /* $OpenBSD: dh_lib.c,v 1.32 2018/05/02 15:48:38 tb Exp $ */
548f54b9dSDamien Miller /* $OpenBSD: p_lib.c,v 1.24 2018/05/30 15:40:50 tb Exp $ */
648f54b9dSDamien Miller /* $OpenBSD: digest.c,v 1.30 2018/04/14 07:09:21 tb Exp $ */
748f54b9dSDamien Miller /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
848f54b9dSDamien Miller  * All rights reserved.
948f54b9dSDamien Miller  *
1048f54b9dSDamien Miller  * This package is an SSL implementation written
1148f54b9dSDamien Miller  * by Eric Young (eay@cryptsoft.com).
1248f54b9dSDamien Miller  * The implementation was written so as to conform with Netscapes SSL.
1348f54b9dSDamien Miller  *
1448f54b9dSDamien Miller  * This library is free for commercial and non-commercial use as long as
1548f54b9dSDamien Miller  * the following conditions are aheared to.  The following conditions
1648f54b9dSDamien Miller  * apply to all code found in this distribution, be it the RC4, RSA,
1748f54b9dSDamien Miller  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1848f54b9dSDamien Miller  * included with this distribution is covered by the same copyright terms
1948f54b9dSDamien Miller  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
2048f54b9dSDamien Miller  *
2148f54b9dSDamien Miller  * Copyright remains Eric Young's, and as such any Copyright notices in
2248f54b9dSDamien Miller  * the code are not to be removed.
2348f54b9dSDamien Miller  * If this package is used in a product, Eric Young should be given attribution
2448f54b9dSDamien Miller  * as the author of the parts of the library used.
2548f54b9dSDamien Miller  * This can be in the form of a textual message at program startup or
2648f54b9dSDamien Miller  * in documentation (online or textual) provided with the package.
2748f54b9dSDamien Miller  *
2848f54b9dSDamien Miller  * Redistribution and use in source and binary forms, with or without
2948f54b9dSDamien Miller  * modification, are permitted provided that the following conditions
3048f54b9dSDamien Miller  * are met:
3148f54b9dSDamien Miller  * 1. Redistributions of source code must retain the copyright
3248f54b9dSDamien Miller  *    notice, this list of conditions and the following disclaimer.
3348f54b9dSDamien Miller  * 2. Redistributions in binary form must reproduce the above copyright
3448f54b9dSDamien Miller  *    notice, this list of conditions and the following disclaimer in the
3548f54b9dSDamien Miller  *    documentation and/or other materials provided with the distribution.
3648f54b9dSDamien Miller  * 3. All advertising materials mentioning features or use of this software
3748f54b9dSDamien Miller  *    must display the following acknowledgement:
3848f54b9dSDamien Miller  *    "This product includes cryptographic software written by
3948f54b9dSDamien Miller  *     Eric Young (eay@cryptsoft.com)"
4048f54b9dSDamien Miller  *    The word 'cryptographic' can be left out if the rouines from the library
4148f54b9dSDamien Miller  *    being used are not cryptographic related :-).
4248f54b9dSDamien Miller  * 4. If you include any Windows specific code (or a derivative thereof) from
4348f54b9dSDamien Miller  *    the apps directory (application code) you must include an acknowledgement:
4448f54b9dSDamien Miller  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4548f54b9dSDamien Miller  *
4648f54b9dSDamien Miller  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4748f54b9dSDamien Miller  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4848f54b9dSDamien Miller  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4948f54b9dSDamien Miller  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
5048f54b9dSDamien Miller  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
5148f54b9dSDamien Miller  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
5248f54b9dSDamien Miller  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
5348f54b9dSDamien Miller  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
5448f54b9dSDamien Miller  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5548f54b9dSDamien Miller  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5648f54b9dSDamien Miller  * SUCH DAMAGE.
5748f54b9dSDamien Miller  *
5848f54b9dSDamien Miller  * The licence and distribution terms for any publically available version or
5948f54b9dSDamien Miller  * derivative of this code cannot be changed.  i.e. this code cannot simply be
6048f54b9dSDamien Miller  * copied and put under another distribution licence
6148f54b9dSDamien Miller  * [including the GNU Public Licence.]
6248f54b9dSDamien Miller  */
6348f54b9dSDamien Miller 
6448f54b9dSDamien Miller /* $OpenBSD: dsa_asn1.c,v 1.22 2018/06/14 17:03:19 jsing Exp $ */
6548f54b9dSDamien Miller /* $OpenBSD: ecs_asn1.c,v 1.9 2018/03/17 15:24:44 tb Exp $ */
6648f54b9dSDamien Miller /* $OpenBSD: digest.c,v 1.30 2018/04/14 07:09:21 tb Exp $ */
6748f54b9dSDamien Miller /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
6848f54b9dSDamien Miller  * project 2000.
6948f54b9dSDamien Miller  */
7048f54b9dSDamien Miller /* ====================================================================
7148f54b9dSDamien Miller  * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
7248f54b9dSDamien Miller  *
7348f54b9dSDamien Miller  * Redistribution and use in source and binary forms, with or without
7448f54b9dSDamien Miller  * modification, are permitted provided that the following conditions
7548f54b9dSDamien Miller  * are met:
7648f54b9dSDamien Miller  *
7748f54b9dSDamien Miller  * 1. Redistributions of source code must retain the above copyright
7848f54b9dSDamien Miller  *    notice, this list of conditions and the following disclaimer.
7948f54b9dSDamien Miller  *
8048f54b9dSDamien Miller  * 2. Redistributions in binary form must reproduce the above copyright
8148f54b9dSDamien Miller  *    notice, this list of conditions and the following disclaimer in
8248f54b9dSDamien Miller  *    the documentation and/or other materials provided with the
8348f54b9dSDamien Miller  *    distribution.
8448f54b9dSDamien Miller  *
8548f54b9dSDamien Miller  * 3. All advertising materials mentioning features or use of this
8648f54b9dSDamien Miller  *    software must display the following acknowledgment:
8748f54b9dSDamien Miller  *    "This product includes software developed by the OpenSSL Project
8848f54b9dSDamien Miller  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
8948f54b9dSDamien Miller  *
9048f54b9dSDamien Miller  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
9148f54b9dSDamien Miller  *    endorse or promote products derived from this software without
9248f54b9dSDamien Miller  *    prior written permission. For written permission, please contact
9348f54b9dSDamien Miller  *    licensing@OpenSSL.org.
9448f54b9dSDamien Miller  *
9548f54b9dSDamien Miller  * 5. Products derived from this software may not be called "OpenSSL"
9648f54b9dSDamien Miller  *    nor may "OpenSSL" appear in their names without prior written
9748f54b9dSDamien Miller  *    permission of the OpenSSL Project.
9848f54b9dSDamien Miller  *
9948f54b9dSDamien Miller  * 6. Redistributions of any form whatsoever must retain the following
10048f54b9dSDamien Miller  *    acknowledgment:
10148f54b9dSDamien Miller  *    "This product includes software developed by the OpenSSL Project
10248f54b9dSDamien Miller  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
10348f54b9dSDamien Miller  *
10448f54b9dSDamien Miller  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
10548f54b9dSDamien Miller  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
10648f54b9dSDamien Miller  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
10748f54b9dSDamien Miller  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
10848f54b9dSDamien Miller  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10948f54b9dSDamien Miller  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
11048f54b9dSDamien Miller  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
11148f54b9dSDamien Miller  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
11248f54b9dSDamien Miller  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
11348f54b9dSDamien Miller  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
11448f54b9dSDamien Miller  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
11548f54b9dSDamien Miller  * OF THE POSSIBILITY OF SUCH DAMAGE.
11648f54b9dSDamien Miller  * ====================================================================
11748f54b9dSDamien Miller  *
11848f54b9dSDamien Miller  * This product includes cryptographic software written by Eric Young
11948f54b9dSDamien Miller  * (eay@cryptsoft.com).  This product includes software written by Tim
12048f54b9dSDamien Miller  * Hudson (tjh@cryptsoft.com).
12148f54b9dSDamien Miller  *
12248f54b9dSDamien Miller  */
12348f54b9dSDamien Miller 
12448f54b9dSDamien Miller /*	$OpenBSD: rsa_meth.c,v 1.2 2018/09/12 06:35:38 djm Exp $	*/
12548f54b9dSDamien Miller /*
12648f54b9dSDamien Miller  * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
12748f54b9dSDamien Miller  *
12848f54b9dSDamien Miller  * Permission to use, copy, modify, and distribute this software for any
12948f54b9dSDamien Miller  * purpose with or without fee is hereby granted, provided that the above
13048f54b9dSDamien Miller  * copyright notice and this permission notice appear in all copies.
13148f54b9dSDamien Miller  *
13248f54b9dSDamien Miller  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13348f54b9dSDamien Miller  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13448f54b9dSDamien Miller  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13548f54b9dSDamien Miller  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13648f54b9dSDamien Miller  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13748f54b9dSDamien Miller  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13848f54b9dSDamien Miller  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
13948f54b9dSDamien Miller  */
14048f54b9dSDamien Miller 
14148f54b9dSDamien Miller #include "includes.h"
14248f54b9dSDamien Miller 
14348f54b9dSDamien Miller #ifdef WITH_OPENSSL
14448f54b9dSDamien Miller 
14548f54b9dSDamien Miller #include <sys/types.h>
14648f54b9dSDamien Miller 
14748f54b9dSDamien Miller #include <stdlib.h>
14848f54b9dSDamien Miller #include <string.h>
14948f54b9dSDamien Miller 
15048f54b9dSDamien Miller #include <openssl/err.h>
15148f54b9dSDamien Miller #include <openssl/bn.h>
15248f54b9dSDamien Miller #include <openssl/dsa.h>
15348f54b9dSDamien Miller #include <openssl/rsa.h>
15448f54b9dSDamien Miller #include <openssl/evp.h>
155*624d19acSEneas U de Queiroz #ifdef OPENSSL_HAS_ECC
15648f54b9dSDamien Miller #include <openssl/ecdsa.h>
157*624d19acSEneas U de Queiroz #endif
15848f54b9dSDamien Miller #include <openssl/dh.h>
15948f54b9dSDamien Miller 
16048f54b9dSDamien Miller #ifndef HAVE_DSA_GET0_PQG
16148f54b9dSDamien Miller void
DSA_get0_pqg(const DSA * d,const BIGNUM ** p,const BIGNUM ** q,const BIGNUM ** g)16248f54b9dSDamien Miller DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
16348f54b9dSDamien Miller {
16448f54b9dSDamien Miller 	if (p != NULL)
16548f54b9dSDamien Miller 		*p = d->p;
16648f54b9dSDamien Miller 	if (q != NULL)
16748f54b9dSDamien Miller 		*q = d->q;
16848f54b9dSDamien Miller 	if (g != NULL)
16948f54b9dSDamien Miller 		*g = d->g;
17048f54b9dSDamien Miller }
17148f54b9dSDamien Miller #endif /* HAVE_DSA_GET0_PQG */
17248f54b9dSDamien Miller 
17348f54b9dSDamien Miller #ifndef HAVE_DSA_SET0_PQG
17448f54b9dSDamien Miller int
DSA_set0_pqg(DSA * d,BIGNUM * p,BIGNUM * q,BIGNUM * g)17548f54b9dSDamien Miller DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
17648f54b9dSDamien Miller {
17748f54b9dSDamien Miller 	if ((d->p == NULL && p == NULL) || (d->q == NULL && q == NULL) ||
17848f54b9dSDamien Miller 	    (d->g == NULL && g == NULL))
17948f54b9dSDamien Miller 		return 0;
18048f54b9dSDamien Miller 
18148f54b9dSDamien Miller 	if (p != NULL) {
18248f54b9dSDamien Miller 		BN_free(d->p);
18348f54b9dSDamien Miller 		d->p = p;
18448f54b9dSDamien Miller 	}
18548f54b9dSDamien Miller 	if (q != NULL) {
18648f54b9dSDamien Miller 		BN_free(d->q);
18748f54b9dSDamien Miller 		d->q = q;
18848f54b9dSDamien Miller 	}
18948f54b9dSDamien Miller 	if (g != NULL) {
19048f54b9dSDamien Miller 		BN_free(d->g);
19148f54b9dSDamien Miller 		d->g = g;
19248f54b9dSDamien Miller 	}
19348f54b9dSDamien Miller 
19448f54b9dSDamien Miller 	return 1;
19548f54b9dSDamien Miller }
19648f54b9dSDamien Miller #endif /* HAVE_DSA_SET0_PQG */
19748f54b9dSDamien Miller 
19848f54b9dSDamien Miller #ifndef HAVE_DSA_GET0_KEY
19948f54b9dSDamien Miller void
DSA_get0_key(const DSA * d,const BIGNUM ** pub_key,const BIGNUM ** priv_key)20048f54b9dSDamien Miller DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key)
20148f54b9dSDamien Miller {
20248f54b9dSDamien Miller 	if (pub_key != NULL)
20348f54b9dSDamien Miller 		*pub_key = d->pub_key;
20448f54b9dSDamien Miller 	if (priv_key != NULL)
20548f54b9dSDamien Miller 		*priv_key = d->priv_key;
20648f54b9dSDamien Miller }
20748f54b9dSDamien Miller #endif /* HAVE_DSA_GET0_KEY */
20848f54b9dSDamien Miller 
20948f54b9dSDamien Miller #ifndef HAVE_DSA_SET0_KEY
21048f54b9dSDamien Miller int
DSA_set0_key(DSA * d,BIGNUM * pub_key,BIGNUM * priv_key)21148f54b9dSDamien Miller DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
21248f54b9dSDamien Miller {
21348f54b9dSDamien Miller 	if (d->pub_key == NULL && pub_key == NULL)
21448f54b9dSDamien Miller 		return 0;
21548f54b9dSDamien Miller 
21648f54b9dSDamien Miller 	if (pub_key != NULL) {
21748f54b9dSDamien Miller 		BN_free(d->pub_key);
21848f54b9dSDamien Miller 		d->pub_key = pub_key;
21948f54b9dSDamien Miller 	}
22048f54b9dSDamien Miller 	if (priv_key != NULL) {
22148f54b9dSDamien Miller 		BN_free(d->priv_key);
22248f54b9dSDamien Miller 		d->priv_key = priv_key;
22348f54b9dSDamien Miller 	}
22448f54b9dSDamien Miller 
22548f54b9dSDamien Miller 	return 1;
22648f54b9dSDamien Miller }
22748f54b9dSDamien Miller #endif /* HAVE_DSA_SET0_KEY */
22848f54b9dSDamien Miller 
22948f54b9dSDamien Miller #ifndef HAVE_RSA_GET0_KEY
23048f54b9dSDamien Miller void
RSA_get0_key(const RSA * r,const BIGNUM ** n,const BIGNUM ** e,const BIGNUM ** d)23148f54b9dSDamien Miller RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
23248f54b9dSDamien Miller {
23348f54b9dSDamien Miller 	if (n != NULL)
23448f54b9dSDamien Miller 		*n = r->n;
23548f54b9dSDamien Miller 	if (e != NULL)
23648f54b9dSDamien Miller 		*e = r->e;
23748f54b9dSDamien Miller 	if (d != NULL)
23848f54b9dSDamien Miller 		*d = r->d;
23948f54b9dSDamien Miller }
24048f54b9dSDamien Miller #endif /* HAVE_RSA_GET0_KEY */
24148f54b9dSDamien Miller 
24248f54b9dSDamien Miller #ifndef HAVE_RSA_SET0_KEY
24348f54b9dSDamien Miller int
RSA_set0_key(RSA * r,BIGNUM * n,BIGNUM * e,BIGNUM * d)24448f54b9dSDamien Miller RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
24548f54b9dSDamien Miller {
24648f54b9dSDamien Miller 	if ((r->n == NULL && n == NULL) || (r->e == NULL && e == NULL))
24748f54b9dSDamien Miller 		return 0;
24848f54b9dSDamien Miller 
24948f54b9dSDamien Miller 	if (n != NULL) {
25048f54b9dSDamien Miller 		BN_free(r->n);
25148f54b9dSDamien Miller 		r->n = n;
25248f54b9dSDamien Miller 	}
25348f54b9dSDamien Miller 	if (e != NULL) {
25448f54b9dSDamien Miller 		BN_free(r->e);
25548f54b9dSDamien Miller 		r->e = e;
25648f54b9dSDamien Miller 	}
25748f54b9dSDamien Miller 	if (d != NULL) {
25848f54b9dSDamien Miller 		BN_free(r->d);
25948f54b9dSDamien Miller 		r->d = d;
26048f54b9dSDamien Miller 	}
26148f54b9dSDamien Miller 
26248f54b9dSDamien Miller 	return 1;
26348f54b9dSDamien Miller }
26448f54b9dSDamien Miller #endif /* HAVE_RSA_SET0_KEY */
26548f54b9dSDamien Miller 
26648f54b9dSDamien Miller #ifndef HAVE_RSA_GET0_CRT_PARAMS
26748f54b9dSDamien Miller void
RSA_get0_crt_params(const RSA * r,const BIGNUM ** dmp1,const BIGNUM ** dmq1,const BIGNUM ** iqmp)26848f54b9dSDamien Miller RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1,
26948f54b9dSDamien Miller     const BIGNUM **iqmp)
27048f54b9dSDamien Miller {
27148f54b9dSDamien Miller 	if (dmp1 != NULL)
27248f54b9dSDamien Miller 		*dmp1 = r->dmp1;
27348f54b9dSDamien Miller 	if (dmq1 != NULL)
27448f54b9dSDamien Miller 		*dmq1 = r->dmq1;
27548f54b9dSDamien Miller 	if (iqmp != NULL)
27648f54b9dSDamien Miller 		*iqmp = r->iqmp;
27748f54b9dSDamien Miller }
27848f54b9dSDamien Miller #endif /* HAVE_RSA_GET0_CRT_PARAMS */
27948f54b9dSDamien Miller 
28048f54b9dSDamien Miller #ifndef HAVE_RSA_SET0_CRT_PARAMS
28148f54b9dSDamien Miller int
RSA_set0_crt_params(RSA * r,BIGNUM * dmp1,BIGNUM * dmq1,BIGNUM * iqmp)28248f54b9dSDamien Miller RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)
28348f54b9dSDamien Miller {
28448f54b9dSDamien Miller 	if ((r->dmp1 == NULL && dmp1 == NULL) ||
28548f54b9dSDamien Miller 	    (r->dmq1 == NULL && dmq1 == NULL) ||
28648f54b9dSDamien Miller 	    (r->iqmp == NULL && iqmp == NULL))
28748f54b9dSDamien Miller 		return 0;
28848f54b9dSDamien Miller 
28948f54b9dSDamien Miller 	if (dmp1 != NULL) {
29048f54b9dSDamien Miller 		BN_free(r->dmp1);
29148f54b9dSDamien Miller 		r->dmp1 = dmp1;
29248f54b9dSDamien Miller 	}
29348f54b9dSDamien Miller 	if (dmq1 != NULL) {
29448f54b9dSDamien Miller 		BN_free(r->dmq1);
29548f54b9dSDamien Miller 		r->dmq1 = dmq1;
29648f54b9dSDamien Miller 	}
29748f54b9dSDamien Miller 	if (iqmp != NULL) {
29848f54b9dSDamien Miller 		BN_free(r->iqmp);
29948f54b9dSDamien Miller 		r->iqmp = iqmp;
30048f54b9dSDamien Miller 	}
30148f54b9dSDamien Miller 
30248f54b9dSDamien Miller 	return 1;
30348f54b9dSDamien Miller }
30448f54b9dSDamien Miller #endif /* HAVE_RSA_SET0_CRT_PARAMS */
30548f54b9dSDamien Miller 
30648f54b9dSDamien Miller #ifndef HAVE_RSA_GET0_FACTORS
30748f54b9dSDamien Miller void
RSA_get0_factors(const RSA * r,const BIGNUM ** p,const BIGNUM ** q)30848f54b9dSDamien Miller RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)
30948f54b9dSDamien Miller {
31048f54b9dSDamien Miller 	if (p != NULL)
31148f54b9dSDamien Miller 		*p = r->p;
31248f54b9dSDamien Miller 	if (q != NULL)
31348f54b9dSDamien Miller 		*q = r->q;
31448f54b9dSDamien Miller }
31548f54b9dSDamien Miller #endif /* HAVE_RSA_GET0_FACTORS */
31648f54b9dSDamien Miller 
31748f54b9dSDamien Miller #ifndef HAVE_RSA_SET0_FACTORS
31848f54b9dSDamien Miller int
RSA_set0_factors(RSA * r,BIGNUM * p,BIGNUM * q)31948f54b9dSDamien Miller RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
32048f54b9dSDamien Miller {
32148f54b9dSDamien Miller 	if ((r->p == NULL && p == NULL) || (r->q == NULL && q == NULL))
32248f54b9dSDamien Miller 		return 0;
32348f54b9dSDamien Miller 
32448f54b9dSDamien Miller 	if (p != NULL) {
32548f54b9dSDamien Miller 		BN_free(r->p);
32648f54b9dSDamien Miller 		r->p = p;
32748f54b9dSDamien Miller 	}
32848f54b9dSDamien Miller 	if (q != NULL) {
32948f54b9dSDamien Miller 		BN_free(r->q);
33048f54b9dSDamien Miller 		r->q = q;
33148f54b9dSDamien Miller 	}
33248f54b9dSDamien Miller 
33348f54b9dSDamien Miller 	return 1;
33448f54b9dSDamien Miller }
33548f54b9dSDamien Miller #endif /* HAVE_RSA_SET0_FACTORS */
33648f54b9dSDamien Miller 
33748f54b9dSDamien Miller #ifndef HAVE_EVP_CIPHER_CTX_GET_IV
33848f54b9dSDamien Miller int
EVP_CIPHER_CTX_get_iv(const EVP_CIPHER_CTX * ctx,unsigned char * iv,size_t len)33948f54b9dSDamien Miller EVP_CIPHER_CTX_get_iv(const EVP_CIPHER_CTX *ctx, unsigned char *iv, size_t len)
34048f54b9dSDamien Miller {
34148f54b9dSDamien Miller 	if (ctx == NULL)
34248f54b9dSDamien Miller 		return 0;
34348f54b9dSDamien Miller 	if (EVP_CIPHER_CTX_iv_length(ctx) < 0)
34448f54b9dSDamien Miller 		return 0;
34548f54b9dSDamien Miller 	if (len != (size_t)EVP_CIPHER_CTX_iv_length(ctx))
34648f54b9dSDamien Miller 		return 0;
34748f54b9dSDamien Miller 	if (len > EVP_MAX_IV_LENGTH)
34848f54b9dSDamien Miller 		return 0; /* sanity check; shouldn't happen */
34948f54b9dSDamien Miller 	/*
35048f54b9dSDamien Miller 	 * Skip the memcpy entirely when the requested IV length is zero,
35148f54b9dSDamien Miller 	 * since the iv pointer may be NULL or invalid.
35248f54b9dSDamien Miller 	 */
35348f54b9dSDamien Miller 	if (len != 0) {
35448f54b9dSDamien Miller 		if (iv == NULL)
35548f54b9dSDamien Miller 			return 0;
35648f54b9dSDamien Miller # ifdef HAVE_EVP_CIPHER_CTX_IV
35748f54b9dSDamien Miller 		memcpy(iv, EVP_CIPHER_CTX_iv(ctx), len);
35848f54b9dSDamien Miller # else
35948f54b9dSDamien Miller 		memcpy(iv, ctx->iv, len);
36048f54b9dSDamien Miller # endif /* HAVE_EVP_CIPHER_CTX_IV */
36148f54b9dSDamien Miller 	}
36248f54b9dSDamien Miller 	return 1;
36348f54b9dSDamien Miller }
36448f54b9dSDamien Miller #endif /* HAVE_EVP_CIPHER_CTX_GET_IV */
36548f54b9dSDamien Miller 
36648f54b9dSDamien Miller #ifndef HAVE_EVP_CIPHER_CTX_SET_IV
36748f54b9dSDamien Miller int
EVP_CIPHER_CTX_set_iv(EVP_CIPHER_CTX * ctx,const unsigned char * iv,size_t len)36848f54b9dSDamien Miller EVP_CIPHER_CTX_set_iv(EVP_CIPHER_CTX *ctx, const unsigned char *iv, size_t len)
36948f54b9dSDamien Miller {
37048f54b9dSDamien Miller 	if (ctx == NULL)
37148f54b9dSDamien Miller 		return 0;
37248f54b9dSDamien Miller 	if (EVP_CIPHER_CTX_iv_length(ctx) < 0)
37348f54b9dSDamien Miller 		return 0;
37448f54b9dSDamien Miller 	if (len != (size_t)EVP_CIPHER_CTX_iv_length(ctx))
37548f54b9dSDamien Miller 		return 0;
37648f54b9dSDamien Miller 	if (len > EVP_MAX_IV_LENGTH)
37748f54b9dSDamien Miller 		return 0; /* sanity check; shouldn't happen */
37848f54b9dSDamien Miller 	/*
37948f54b9dSDamien Miller 	 * Skip the memcpy entirely when the requested IV length is zero,
38048f54b9dSDamien Miller 	 * since the iv pointer may be NULL or invalid.
38148f54b9dSDamien Miller 	 */
38248f54b9dSDamien Miller 	if (len != 0) {
38348f54b9dSDamien Miller 		if (iv == NULL)
38448f54b9dSDamien Miller 			return 0;
38548f54b9dSDamien Miller # ifdef HAVE_EVP_CIPHER_CTX_IV_NOCONST
38648f54b9dSDamien Miller 		memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, len);
38748f54b9dSDamien Miller # else
38848f54b9dSDamien Miller 		memcpy(ctx->iv, iv, len);
38948f54b9dSDamien Miller # endif /* HAVE_EVP_CIPHER_CTX_IV_NOCONST */
39048f54b9dSDamien Miller 	}
39148f54b9dSDamien Miller 	return 1;
39248f54b9dSDamien Miller }
39348f54b9dSDamien Miller #endif /* HAVE_EVP_CIPHER_CTX_SET_IV */
39448f54b9dSDamien Miller 
39548f54b9dSDamien Miller #ifndef HAVE_DSA_SIG_GET0
39648f54b9dSDamien Miller void
DSA_SIG_get0(const DSA_SIG * sig,const BIGNUM ** pr,const BIGNUM ** ps)39748f54b9dSDamien Miller DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)
39848f54b9dSDamien Miller {
39948f54b9dSDamien Miller 	if (pr != NULL)
40048f54b9dSDamien Miller 		*pr = sig->r;
40148f54b9dSDamien Miller 	if (ps != NULL)
40248f54b9dSDamien Miller 		*ps = sig->s;
40348f54b9dSDamien Miller }
40448f54b9dSDamien Miller #endif /* HAVE_DSA_SIG_GET0 */
40548f54b9dSDamien Miller 
40648f54b9dSDamien Miller #ifndef HAVE_DSA_SIG_SET0
40748f54b9dSDamien Miller int
DSA_SIG_set0(DSA_SIG * sig,BIGNUM * r,BIGNUM * s)40848f54b9dSDamien Miller DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s)
40948f54b9dSDamien Miller {
41048f54b9dSDamien Miller 	if (r == NULL || s == NULL)
41148f54b9dSDamien Miller 		return 0;
41248f54b9dSDamien Miller 
41348f54b9dSDamien Miller 	BN_clear_free(sig->r);
41448f54b9dSDamien Miller 	sig->r = r;
41548f54b9dSDamien Miller 	BN_clear_free(sig->s);
41648f54b9dSDamien Miller 	sig->s = s;
41748f54b9dSDamien Miller 
41848f54b9dSDamien Miller 	return 1;
41948f54b9dSDamien Miller }
42048f54b9dSDamien Miller #endif /* HAVE_DSA_SIG_SET0 */
42148f54b9dSDamien Miller 
422*624d19acSEneas U de Queiroz #ifdef OPENSSL_HAS_ECC
42348f54b9dSDamien Miller #ifndef HAVE_ECDSA_SIG_GET0
42448f54b9dSDamien Miller void
ECDSA_SIG_get0(const ECDSA_SIG * sig,const BIGNUM ** pr,const BIGNUM ** ps)42548f54b9dSDamien Miller ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)
42648f54b9dSDamien Miller {
42748f54b9dSDamien Miller 	if (pr != NULL)
42848f54b9dSDamien Miller 		*pr = sig->r;
42948f54b9dSDamien Miller 	if (ps != NULL)
43048f54b9dSDamien Miller 		*ps = sig->s;
43148f54b9dSDamien Miller }
43248f54b9dSDamien Miller #endif /* HAVE_ECDSA_SIG_GET0 */
43348f54b9dSDamien Miller 
43448f54b9dSDamien Miller #ifndef HAVE_ECDSA_SIG_SET0
43548f54b9dSDamien Miller int
ECDSA_SIG_set0(ECDSA_SIG * sig,BIGNUM * r,BIGNUM * s)43648f54b9dSDamien Miller ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s)
43748f54b9dSDamien Miller {
43848f54b9dSDamien Miller 	if (r == NULL || s == NULL)
43948f54b9dSDamien Miller 		return 0;
44048f54b9dSDamien Miller 
44148f54b9dSDamien Miller 	BN_clear_free(sig->r);
44248f54b9dSDamien Miller 	BN_clear_free(sig->s);
44348f54b9dSDamien Miller 	sig->r = r;
44448f54b9dSDamien Miller 	sig->s = s;
44548f54b9dSDamien Miller 	return 1;
44648f54b9dSDamien Miller }
44748f54b9dSDamien Miller #endif /* HAVE_ECDSA_SIG_SET0 */
448*624d19acSEneas U de Queiroz #endif /* OPENSSL_HAS_ECC */
44948f54b9dSDamien Miller 
45048f54b9dSDamien Miller #ifndef HAVE_DH_GET0_PQG
45148f54b9dSDamien Miller void
DH_get0_pqg(const DH * dh,const BIGNUM ** p,const BIGNUM ** q,const BIGNUM ** g)45248f54b9dSDamien Miller DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
45348f54b9dSDamien Miller {
45448f54b9dSDamien Miller 	if (p != NULL)
45548f54b9dSDamien Miller 		*p = dh->p;
45648f54b9dSDamien Miller 	if (q != NULL)
45748f54b9dSDamien Miller 		*q = dh->q;
45848f54b9dSDamien Miller 	if (g != NULL)
45948f54b9dSDamien Miller 		*g = dh->g;
46048f54b9dSDamien Miller }
46148f54b9dSDamien Miller #endif /* HAVE_DH_GET0_PQG */
46248f54b9dSDamien Miller 
46348f54b9dSDamien Miller #ifndef HAVE_DH_SET0_PQG
46448f54b9dSDamien Miller int
DH_set0_pqg(DH * dh,BIGNUM * p,BIGNUM * q,BIGNUM * g)46548f54b9dSDamien Miller DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
46648f54b9dSDamien Miller {
46748f54b9dSDamien Miller 	if ((dh->p == NULL && p == NULL) || (dh->g == NULL && g == NULL))
46848f54b9dSDamien Miller 		return 0;
46948f54b9dSDamien Miller 
47048f54b9dSDamien Miller 	if (p != NULL) {
47148f54b9dSDamien Miller 		BN_free(dh->p);
47248f54b9dSDamien Miller 		dh->p = p;
47348f54b9dSDamien Miller 	}
47448f54b9dSDamien Miller 	if (q != NULL) {
47548f54b9dSDamien Miller 		BN_free(dh->q);
47648f54b9dSDamien Miller 		dh->q = q;
47748f54b9dSDamien Miller 	}
47848f54b9dSDamien Miller 	if (g != NULL) {
47948f54b9dSDamien Miller 		BN_free(dh->g);
48048f54b9dSDamien Miller 		dh->g = g;
48148f54b9dSDamien Miller 	}
48248f54b9dSDamien Miller 
48348f54b9dSDamien Miller 	return 1;
48448f54b9dSDamien Miller }
48548f54b9dSDamien Miller #endif /* HAVE_DH_SET0_PQG */
48648f54b9dSDamien Miller 
48748f54b9dSDamien Miller #ifndef HAVE_DH_GET0_KEY
48848f54b9dSDamien Miller void
DH_get0_key(const DH * dh,const BIGNUM ** pub_key,const BIGNUM ** priv_key)48948f54b9dSDamien Miller DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
49048f54b9dSDamien Miller {
49148f54b9dSDamien Miller 	if (pub_key != NULL)
49248f54b9dSDamien Miller 		*pub_key = dh->pub_key;
49348f54b9dSDamien Miller 	if (priv_key != NULL)
49448f54b9dSDamien Miller 		*priv_key = dh->priv_key;
49548f54b9dSDamien Miller }
49648f54b9dSDamien Miller #endif /* HAVE_DH_GET0_KEY */
49748f54b9dSDamien Miller 
49848f54b9dSDamien Miller #ifndef HAVE_DH_SET0_KEY
49948f54b9dSDamien Miller int
DH_set0_key(DH * dh,BIGNUM * pub_key,BIGNUM * priv_key)50048f54b9dSDamien Miller DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
50148f54b9dSDamien Miller {
50248f54b9dSDamien Miller 	if (pub_key != NULL) {
50348f54b9dSDamien Miller 		BN_free(dh->pub_key);
50448f54b9dSDamien Miller 		dh->pub_key = pub_key;
50548f54b9dSDamien Miller 	}
50648f54b9dSDamien Miller 	if (priv_key != NULL) {
50748f54b9dSDamien Miller 		BN_free(dh->priv_key);
50848f54b9dSDamien Miller 		dh->priv_key = priv_key;
50948f54b9dSDamien Miller 	}
51048f54b9dSDamien Miller 
51148f54b9dSDamien Miller 	return 1;
51248f54b9dSDamien Miller }
51348f54b9dSDamien Miller #endif /* HAVE_DH_SET0_KEY */
51448f54b9dSDamien Miller 
51548f54b9dSDamien Miller #ifndef HAVE_DH_SET_LENGTH
51648f54b9dSDamien Miller int
DH_set_length(DH * dh,long length)51748f54b9dSDamien Miller DH_set_length(DH *dh, long length)
51848f54b9dSDamien Miller {
51948f54b9dSDamien Miller 	if (length < 0 || length > INT_MAX)
52048f54b9dSDamien Miller 		return 0;
52148f54b9dSDamien Miller 
52248f54b9dSDamien Miller 	dh->length = length;
52348f54b9dSDamien Miller 	return 1;
52448f54b9dSDamien Miller }
52548f54b9dSDamien Miller #endif /* HAVE_DH_SET_LENGTH */
52648f54b9dSDamien Miller 
52748f54b9dSDamien Miller #ifndef HAVE_RSA_METH_FREE
52848f54b9dSDamien Miller void
RSA_meth_free(RSA_METHOD * meth)52948f54b9dSDamien Miller RSA_meth_free(RSA_METHOD *meth)
53048f54b9dSDamien Miller {
53148f54b9dSDamien Miller 	if (meth != NULL) {
53248f54b9dSDamien Miller 		free((char *)meth->name);
53348f54b9dSDamien Miller 		free(meth);
53448f54b9dSDamien Miller 	}
53548f54b9dSDamien Miller }
53648f54b9dSDamien Miller #endif /* HAVE_RSA_METH_FREE */
53748f54b9dSDamien Miller 
53848f54b9dSDamien Miller #ifndef HAVE_RSA_METH_DUP
53948f54b9dSDamien Miller RSA_METHOD *
RSA_meth_dup(const RSA_METHOD * meth)54048f54b9dSDamien Miller RSA_meth_dup(const RSA_METHOD *meth)
54148f54b9dSDamien Miller {
54248f54b9dSDamien Miller 	RSA_METHOD *copy;
54348f54b9dSDamien Miller 
54448f54b9dSDamien Miller 	if ((copy = calloc(1, sizeof(*copy))) == NULL)
54548f54b9dSDamien Miller 		return NULL;
54648f54b9dSDamien Miller 	memcpy(copy, meth, sizeof(*copy));
54748f54b9dSDamien Miller 	if ((copy->name = strdup(meth->name)) == NULL) {
54848f54b9dSDamien Miller 		free(copy);
54948f54b9dSDamien Miller 		return NULL;
55048f54b9dSDamien Miller 	}
55148f54b9dSDamien Miller 
55248f54b9dSDamien Miller 	return copy;
55348f54b9dSDamien Miller }
55448f54b9dSDamien Miller #endif /* HAVE_RSA_METH_DUP */
55548f54b9dSDamien Miller 
55648f54b9dSDamien Miller #ifndef HAVE_RSA_METH_SET1_NAME
55748f54b9dSDamien Miller int
RSA_meth_set1_name(RSA_METHOD * meth,const char * name)55848f54b9dSDamien Miller RSA_meth_set1_name(RSA_METHOD *meth, const char *name)
55948f54b9dSDamien Miller {
56048f54b9dSDamien Miller 	char *copy;
56148f54b9dSDamien Miller 
56248f54b9dSDamien Miller 	if ((copy = strdup(name)) == NULL)
56348f54b9dSDamien Miller 		return 0;
56448f54b9dSDamien Miller 	free((char *)meth->name);
56548f54b9dSDamien Miller 	meth->name = copy;
56648f54b9dSDamien Miller 	return 1;
56748f54b9dSDamien Miller }
56848f54b9dSDamien Miller #endif /* HAVE_RSA_METH_SET1_NAME */
56948f54b9dSDamien Miller 
57048f54b9dSDamien Miller #ifndef HAVE_RSA_METH_GET_FINISH
57148f54b9dSDamien Miller int
RSA_meth_get_finish(const RSA_METHOD * meth)57248f54b9dSDamien Miller (*RSA_meth_get_finish(const RSA_METHOD *meth))(RSA *rsa)
57348f54b9dSDamien Miller {
57448f54b9dSDamien Miller 	return meth->finish;
57548f54b9dSDamien Miller }
57648f54b9dSDamien Miller #endif /* HAVE_RSA_METH_GET_FINISH */
57748f54b9dSDamien Miller 
57848f54b9dSDamien Miller #ifndef HAVE_RSA_METH_SET_PRIV_ENC
57948f54b9dSDamien Miller int
RSA_meth_set_priv_enc(RSA_METHOD * meth,int (* priv_enc)(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding))58048f54b9dSDamien Miller RSA_meth_set_priv_enc(RSA_METHOD *meth, int (*priv_enc)(int flen,
58148f54b9dSDamien Miller     const unsigned char *from, unsigned char *to, RSA *rsa, int padding))
58248f54b9dSDamien Miller {
58348f54b9dSDamien Miller 	meth->rsa_priv_enc = priv_enc;
58448f54b9dSDamien Miller 	return 1;
58548f54b9dSDamien Miller }
58648f54b9dSDamien Miller #endif /* HAVE_RSA_METH_SET_PRIV_ENC */
58748f54b9dSDamien Miller 
58848f54b9dSDamien Miller #ifndef HAVE_RSA_METH_SET_PRIV_DEC
58948f54b9dSDamien Miller int
RSA_meth_set_priv_dec(RSA_METHOD * meth,int (* priv_dec)(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding))59048f54b9dSDamien Miller RSA_meth_set_priv_dec(RSA_METHOD *meth, int (*priv_dec)(int flen,
59148f54b9dSDamien Miller     const unsigned char *from, unsigned char *to, RSA *rsa, int padding))
59248f54b9dSDamien Miller {
59348f54b9dSDamien Miller 	meth->rsa_priv_dec = priv_dec;
59448f54b9dSDamien Miller 	return 1;
59548f54b9dSDamien Miller }
59648f54b9dSDamien Miller #endif /* HAVE_RSA_METH_SET_PRIV_DEC */
59748f54b9dSDamien Miller 
59848f54b9dSDamien Miller #ifndef HAVE_RSA_METH_SET_FINISH
59948f54b9dSDamien Miller int
RSA_meth_set_finish(RSA_METHOD * meth,int (* finish)(RSA * rsa))60048f54b9dSDamien Miller RSA_meth_set_finish(RSA_METHOD *meth, int (*finish)(RSA *rsa))
60148f54b9dSDamien Miller {
60248f54b9dSDamien Miller 	meth->finish = finish;
60348f54b9dSDamien Miller 	return 1;
60448f54b9dSDamien Miller }
60548f54b9dSDamien Miller #endif /* HAVE_RSA_METH_SET_FINISH */
60648f54b9dSDamien Miller 
60748f54b9dSDamien Miller #ifndef HAVE_EVP_PKEY_GET0_RSA
60848f54b9dSDamien Miller RSA *
EVP_PKEY_get0_RSA(EVP_PKEY * pkey)60948f54b9dSDamien Miller EVP_PKEY_get0_RSA(EVP_PKEY *pkey)
61048f54b9dSDamien Miller {
61148f54b9dSDamien Miller 	if (pkey->type != EVP_PKEY_RSA) {
61248f54b9dSDamien Miller 		/* EVPerror(EVP_R_EXPECTING_AN_RSA_KEY); */
61348f54b9dSDamien Miller 		return NULL;
61448f54b9dSDamien Miller 	}
61548f54b9dSDamien Miller 	return pkey->pkey.rsa;
61648f54b9dSDamien Miller }
61748f54b9dSDamien Miller #endif /* HAVE_EVP_PKEY_GET0_RSA */
61848f54b9dSDamien Miller 
61948f54b9dSDamien Miller #ifndef HAVE_EVP_MD_CTX_NEW
62048f54b9dSDamien Miller EVP_MD_CTX *
EVP_MD_CTX_new(void)62148f54b9dSDamien Miller EVP_MD_CTX_new(void)
62248f54b9dSDamien Miller {
62348f54b9dSDamien Miller 	return calloc(1, sizeof(EVP_MD_CTX));
62448f54b9dSDamien Miller }
62548f54b9dSDamien Miller #endif /* HAVE_EVP_MD_CTX_NEW */
62648f54b9dSDamien Miller 
62748f54b9dSDamien Miller #ifndef HAVE_EVP_MD_CTX_FREE
62848f54b9dSDamien Miller void
EVP_MD_CTX_free(EVP_MD_CTX * ctx)62948f54b9dSDamien Miller EVP_MD_CTX_free(EVP_MD_CTX *ctx)
63048f54b9dSDamien Miller {
63148f54b9dSDamien Miller 	if (ctx == NULL)
63248f54b9dSDamien Miller 		return;
63348f54b9dSDamien Miller 
63448f54b9dSDamien Miller 	EVP_MD_CTX_cleanup(ctx);
63548f54b9dSDamien Miller 
63648f54b9dSDamien Miller 	free(ctx);
63748f54b9dSDamien Miller }
63848f54b9dSDamien Miller #endif /* HAVE_EVP_MD_CTX_FREE */
63948f54b9dSDamien Miller 
64048f54b9dSDamien Miller #endif /* WITH_OPENSSL */
641