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