kex.h revision 137015
160484Sobrien/* $OpenBSD: kex.h,v 1.35 2004/06/13 12:53:24 djm Exp $ */ 2218822Sdim 3218822Sdim/* 460484Sobrien * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. 560484Sobrien * 6130561Sobrien * Redistribution and use in source and binary forms, with or without 760484Sobrien * modification, are permitted provided that the following conditions 8130561Sobrien * are met: 9130561Sobrien * 1. Redistributions of source code must retain the above copyright 10130561Sobrien * notice, this list of conditions and the following disclaimer. 11130561Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1260484Sobrien * notice, this list of conditions and the following disclaimer in the 13130561Sobrien * documentation and/or other materials provided with the distribution. 14130561Sobrien * 15130561Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16130561Sobrien * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1760484Sobrien * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18130561Sobrien * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19130561Sobrien * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20218822Sdim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21218822Sdim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2260484Sobrien * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2360484Sobrien * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2460484Sobrien * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2560484Sobrien */ 2660484Sobrien#ifndef KEX_H 2760484Sobrien#define KEX_H 2860484Sobrien 2960484Sobrien#include <openssl/evp.h> 3060484Sobrien#include "buffer.h" 3160484Sobrien#include "cipher.h" 3260484Sobrien#include "key.h" 3360484Sobrien 3460484Sobrien#define KEX_DH1 "diffie-hellman-group1-sha1" 3560484Sobrien#define KEX_DH14 "diffie-hellman-group14-sha1" 3660484Sobrien#define KEX_DHGEX "diffie-hellman-group-exchange-sha1" 3760484Sobrien 3860484Sobrienenum kex_init_proposals { 3960484Sobrien PROPOSAL_KEX_ALGS, 4060484Sobrien PROPOSAL_SERVER_HOST_KEY_ALGS, 41130561Sobrien PROPOSAL_ENC_ALGS_CTOS, 42130561Sobrien PROPOSAL_ENC_ALGS_STOC, 43130561Sobrien PROPOSAL_MAC_ALGS_CTOS, 44130561Sobrien PROPOSAL_MAC_ALGS_STOC, 45130561Sobrien PROPOSAL_COMP_ALGS_CTOS, 46130561Sobrien PROPOSAL_COMP_ALGS_STOC, 47130561Sobrien PROPOSAL_LANG_CTOS, 48130561Sobrien PROPOSAL_LANG_STOC, 49130561Sobrien PROPOSAL_MAX 50130561Sobrien}; 51130561Sobrien 52130561Sobrienenum kex_modes { 53130561Sobrien MODE_IN, 54130561Sobrien MODE_OUT, 55130561Sobrien MODE_MAX 56130561Sobrien}; 57130561Sobrien 58130561Sobrienenum kex_exchange { 59130561Sobrien KEX_DH_GRP1_SHA1, 60130561Sobrien KEX_DH_GRP14_SHA1, 61130561Sobrien KEX_DH_GEX_SHA1, 62130561Sobrien KEX_MAX 63130561Sobrien}; 64130561Sobrien 65130561Sobrien#define KEX_INIT_SENT 0x0001 66130561Sobrien 67130561Sobrientypedef struct Kex Kex; 68130561Sobrientypedef struct Mac Mac; 69130561Sobrientypedef struct Comp Comp; 70130561Sobrientypedef struct Enc Enc; 71130561Sobrientypedef struct Newkeys Newkeys; 72218822Sdim 73218822Sdimstruct Enc { 74130561Sobrien char *name; 75130561Sobrien Cipher *cipher; 7660484Sobrien int enabled; 7760484Sobrien u_int key_len; 7860484Sobrien u_int block_size; 79218822Sdim u_char *key; 8060484Sobrien u_char *iv; 8160484Sobrien}; 8260484Sobrienstruct Mac { 8360484Sobrien char *name; 8460484Sobrien int enabled; 8560484Sobrien const EVP_MD *md; 8660484Sobrien int mac_len; 8760484Sobrien u_char *key; 8860484Sobrien int key_len; 8960484Sobrien}; 9060484Sobrienstruct Comp { 9160484Sobrien int type; 9260484Sobrien int enabled; 93218822Sdim char *name; 9460484Sobrien}; 9560484Sobrienstruct Newkeys { 9660484Sobrien Enc enc; 97218822Sdim Mac mac; 98218822Sdim Comp comp; 99218822Sdim}; 100218822Sdimstruct Kex { 10160484Sobrien u_char *session_id; 10260484Sobrien u_int session_id_len; 10360484Sobrien Newkeys *newkeys[MODE_MAX]; 10460484Sobrien int we_need; 105218822Sdim int server; 10660484Sobrien char *name; 10760484Sobrien int hostkey_type; 10860484Sobrien int kex_type; 10960484Sobrien Buffer my; 110218822Sdim Buffer peer; 11160484Sobrien int done; 11260484Sobrien int flags; 11360484Sobrien char *client_version_string; 11460484Sobrien char *server_version_string; 115218822Sdim int (*verify_host_key)(Key *); 11660484Sobrien Key *(*load_host_key)(int); 11760484Sobrien int (*host_key_index)(Key *); 11860484Sobrien void (*kex[KEX_MAX])(Kex *); 11960484Sobrien}; 120218822Sdim 12160484SobrienKex *kex_setup(char *[PROPOSAL_MAX]); 12260484Sobrienvoid kex_finish(Kex *); 12360484Sobrien 12460484Sobrienvoid kex_send_kexinit(Kex *); 125218822Sdimvoid kex_input_kexinit(int, u_int32_t, void *); 12660484Sobrienvoid kex_derive_keys(Kex *, u_char *, BIGNUM *); 12760484Sobrien 12860484SobrienNewkeys *kex_get_newkeys(int); 12960484Sobrien 130218822Sdimvoid kexdh_client(Kex *); 13160484Sobrienvoid kexdh_server(Kex *); 13260484Sobrienvoid kexgex_client(Kex *); 13360484Sobrienvoid kexgex_server(Kex *); 13460484Sobrien 13560484Sobrienu_char * 136218822Sdimkex_dh_hash(char *, char *, char *, int, char *, int, u_char *, int, 13760484Sobrien BIGNUM *, BIGNUM *, BIGNUM *); 13860484Sobrienu_char * 13960484Sobrienkexgex_hash(char *, char *, char *, int, char *, int, u_char *, int, 14060484Sobrien int, int, int, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *); 14160484Sobrien 142218822Sdimvoid 14360484Sobrienderive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]); 14460484Sobrien 14560484Sobrien#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) 14660484Sobrienvoid dump_digest(char *, u_char *, int); 14760484Sobrien#endif 148218822Sdim 14960484Sobrien#endif 15060484Sobrien