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