1221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * project 2006.
3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* ====================================================================
5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Redistribution and use in source and binary forms, with or without
8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * modification, are permitted provided that the following conditions
9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * are met:
10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 1. Redistributions of source code must retain the above copyright
12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    notice, this list of conditions and the following disclaimer.
13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright
15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    notice, this list of conditions and the following disclaimer in
16221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    the documentation and/or other materials provided with the
17221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    distribution.
18221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
19221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 3. All advertising materials mentioning features or use of this
20221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    software must display the following acknowledgment:
21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    "This product includes software developed by the OpenSSL Project
22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    endorse or promote products derived from this software without
26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    prior written permission. For written permission, please contact
27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    licensing@OpenSSL.org.
28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 5. Products derived from this software may not be called "OpenSSL"
30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    nor may "OpenSSL" appear in their names without prior written
31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    permission of the OpenSSL Project.
32221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 6. Redistributions of any form whatsoever must retain the following
34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    acknowledgment:
35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    "This product includes software developed by the OpenSSL Project
36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * OF THE POSSIBILITY OF SUCH DAMAGE.
50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ====================================================================
51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * This product includes cryptographic software written by Eric Young
53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * (eay@cryptsoft.com).  This product includes software written by Tim
54221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Hudson (tjh@cryptsoft.com).
55221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *
56221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <stdio.h>
59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include "cryptlib.h"
60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/asn1t.h>
61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/x509.h>
62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/evp.h>
63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/dh.h>
64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/bn.h>
65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include "evp_locl.h"
66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* DH pkey context structure */
68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef struct
70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Parameter gen parameters */
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int prime_len;
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int generator;
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int use_dsa;
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Keygen callback info */
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int gentmp[2];
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* message digest */
78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	} DH_PKEY_CTX;
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_init(EVP_PKEY_CTX *ctx)
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH_PKEY_CTX *dctx;
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx = OPENSSL_malloc(sizeof(DH_PKEY_CTX));
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!dctx)
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx->prime_len = 1024;
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx->generator = 2;
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx->use_dsa = 0;
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->data = dctx;
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->keygen_info = dctx->gentmp;
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->keygen_info_count = 2;
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH_PKEY_CTX *dctx, *sctx;
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!pkey_dh_init(dst))
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom       	sctx = src->data;
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx = dst->data;
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx->prime_len = sctx->prime_len;
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx->generator = sctx->generator;
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dctx->use_dsa = sctx->use_dsa;
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void pkey_dh_cleanup(EVP_PKEY_CTX *ctx)
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH_PKEY_CTX *dctx = ctx->data;
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (dctx)
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		OPENSSL_free(dctx);
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH_PKEY_CTX *dctx = ctx->data;
120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	switch (type)
121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN:
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (p1 < 256)
124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return -2;
125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		dctx->prime_len = p1;
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 1;
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR:
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		dctx->generator = p1;
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 1;
131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case EVP_PKEY_CTRL_PEER_KEY:
133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* Default behaviour is OK */
134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 1;
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		default:
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return -2;
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_ctrl_str(EVP_PKEY_CTX *ctx,
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			const char *type, const char *value)
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!strcmp(type, "dh_paramgen_prime_len"))
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		int len;
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		len = atoi(value);
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len);
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!strcmp(type, "dh_paramgen_generator"))
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		int len;
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		len = atoi(value);
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, len);
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return -2;
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH *dh = NULL;
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH_PKEY_CTX *dctx = ctx->data;
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	BN_GENCB *pcb, cb;
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int ret;
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->pkey_gencb)
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		pcb = &cb;
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		evp_pkey_set_cb_translate(pcb, ctx);
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		pcb = NULL;
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dh = DH_new();
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!dh)
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret = DH_generate_parameters_ex(dh,
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					dctx->prime_len, dctx->generator, pcb);
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ret)
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVP_PKEY_assign_DH(pkey, dh);
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DH_free(dh);
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return ret;
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DH *dh = NULL;
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->pkey == NULL)
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DHerr(DH_F_PKEY_DH_KEYGEN, DH_R_NO_PARAMETERS_SET);
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dh = DH_new();
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!dh)
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_PKEY_assign_DH(pkey, dh);
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Note: if error return, pkey is freed by parent routine */
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!EVP_PKEY_copy_parameters(pkey, ctx->pkey))
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return DH_generate_key(pkey->pkey.dh);
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int pkey_dh_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int ret;
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!ctx->pkey || !ctx->peerkey)
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DHerr(DH_F_PKEY_DH_DERIVE, DH_R_KEYS_NOT_SET);
210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret = DH_compute_key(key, ctx->peerkey->pkey.dh->pub_key,
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom							ctx->pkey->pkey.dh);
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ret < 0)
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return ret;
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	*keylen = ret;
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst EVP_PKEY_METHOD dh_pkey_meth =
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_PKEY_DH,
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_PKEY_FLAG_AUTOARGLEN,
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_init,
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_copy,
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_cleanup,
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_paramgen,
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_keygen,
233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,0,
241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,0,0,0,
243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,0,
245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,0,
247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0,
249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_derive,
250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_ctrl,
252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pkey_dh_ctrl_str
253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	};
255