1/* 2 * Copyright (c) 2006 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34/* 35 * $Id$ 36 */ 37 38#ifndef _HEIM_DH_H 39#define _HEIM_DH_H 1 40 41/* symbol renaming */ 42#define DH_null_method hc_DH_null_method 43#define DH_imath_method hc_DH_imath_method 44#define DH_cdsa_method hc_DH_cdsa_method 45#define DH_tfm_method hc_DH_tfm_method 46#define DH_ltm_method hc_DH_ltm_method 47#define DH_sf_method hc_DH_sf_method 48#define DH_new hc_DH_new 49#define DH_new_method hc_DH_new_method 50#define DH_free hc_DH_free 51#define DH_up_ref hc_DH_up_ref 52#define DH_size hc_DH_size 53#define DH_set_default_method hc_DH_set_default_method 54#define DH_get_default_method hc_DH_get_default_method 55#define DH_set_method hc_DH_set_method 56#define DH_get_method hc_DH_get_method 57#define DH_set_ex_data hc_DH_set_ex_data 58#define DH_get_ex_data hc_DH_get_ex_data 59#define DH_generate_parameters_ex hc_DH_generate_parameters_ex 60#define DH_check_pubkey hc_DH_check_pubkey 61#define DH_generate_key hc_DH_generate_key 62#define DH_compute_key hc_DH_compute_key 63#define i2d_DHparams hc_i2d_DHparams 64 65/* 66 * 67 */ 68 69typedef struct DH DH; 70typedef struct DH_METHOD DH_METHOD; 71 72#include <hcrypto/bn.h> 73#include <hcrypto/engine.h> 74 75struct DH_METHOD { 76 const char *name; 77 int (*generate_key)(DH *); 78 int (*compute_key)(unsigned char *,const BIGNUM *,DH *); 79 int (*bn_mod_exp)(const DH *, BIGNUM *, const BIGNUM *, 80 const BIGNUM *, const BIGNUM *, BN_CTX *, 81 BN_MONT_CTX *); 82 int (*init)(DH *); 83 int (*finish)(DH *); 84 int flags; 85 void *app_data; 86 int (*generate_params)(DH *, int, int, BN_GENCB *); 87}; 88 89struct DH { 90 int pad; 91 int version; 92 BIGNUM *p; 93 BIGNUM *g; 94 long length; 95 BIGNUM *pub_key; 96 BIGNUM *priv_key; 97 int flags; 98 void *method_mont_p; 99 BIGNUM *q; 100 BIGNUM *j; 101 void *seed; 102 int seedlen; 103 BIGNUM *counter; 104 int references; 105 struct CRYPTO_EX_DATA { 106 void *sk; 107 int dummy; 108 } ex_data; 109 const DH_METHOD *meth; 110 ENGINE *engine; 111}; 112 113/* DH_check_pubkey return codes in `codes' argument. */ 114#define DH_CHECK_PUBKEY_TOO_SMALL 1 115#define DH_CHECK_PUBKEY_TOO_LARGE 2 116 117/* 118 * 119 */ 120 121const DH_METHOD *DH_null_method(void); 122const DH_METHOD *DH_tfm_method(void); 123const DH_METHOD *DH_ltm_method(void); 124const DH_METHOD *DH_imath_method(void); 125const DH_METHOD *DH_cdsa_method(void); 126const DH_METHOD *DH_sf_method(void); 127 128DH * DH_new(void); 129DH * DH_new_method(ENGINE *); 130void DH_free(DH *); 131int DH_up_ref(DH *); 132 133int DH_size(const DH *); 134 135 136void DH_set_default_method(const DH_METHOD *); 137const DH_METHOD * 138 DH_get_default_method(void); 139int DH_set_method(DH *, const DH_METHOD *); 140 141int DH_set_ex_data(DH *, int, void *); 142void * DH_get_ex_data(DH *, int); 143 144int DH_generate_parameters_ex(DH *, int, int, BN_GENCB *); 145int DH_check_pubkey(const DH *, const BIGNUM *, int *); 146int DH_generate_key(DH *); 147int DH_compute_key(unsigned char *,const BIGNUM *,DH *); 148 149int i2d_DHparams(DH *, unsigned char **); 150 151#endif /* _HEIM_DH_H */ 152 153