11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: kex.h,v 1.52 2010/09/22 05:01:29 djm Exp $ */
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met:
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer.
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer in the
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    documentation and/or other materials provided with the distribution.
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef KEX_H
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define KEX_H
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <signal.h>
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <openssl/evp.h>
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <openssl/hmac.h>
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef OPENSSL_HAS_ECC
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <openssl/ec.h>
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define KEX_COOKIE_LEN	16
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define	KEX_DH1			"diffie-hellman-group1-sha1"
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define	KEX_DH14		"diffie-hellman-group14-sha1"
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define	KEX_DHGEX_SHA1		"diffie-hellman-group-exchange-sha1"
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define	KEX_DHGEX_SHA256	"diffie-hellman-group-exchange-sha256"
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define	KEX_RESUME		"resume@appgate.com"
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* The following represents the family of ECDH methods */
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define	KEX_ECDH_SHA2_STEM	"ecdh-sha2-"
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define COMP_NONE	0
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define COMP_ZLIB	1
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define COMP_DELAYED	2
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodenum kex_init_proposals {
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_KEX_ALGS,
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_SERVER_HOST_KEY_ALGS,
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_ENC_ALGS_CTOS,
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_ENC_ALGS_STOC,
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_MAC_ALGS_CTOS,
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_MAC_ALGS_STOC,
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_COMP_ALGS_CTOS,
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_COMP_ALGS_STOC,
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_LANG_CTOS,
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_LANG_STOC,
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PROPOSAL_MAX
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodenum kex_modes {
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	MODE_IN,
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	MODE_OUT,
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	MODE_MAX
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodenum kex_exchange {
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	KEX_DH_GRP1_SHA1,
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	KEX_DH_GRP14_SHA1,
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	KEX_DH_GEX_SHA1,
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	KEX_DH_GEX_SHA256,
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	KEX_ECDH_SHA2,
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	KEX_MAX
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define KEX_INIT_SENT	0x0001
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtypedef struct Kex Kex;
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtypedef struct Mac Mac;
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtypedef struct Comp Comp;
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtypedef struct Enc Enc;
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtypedef struct Newkeys Newkeys;
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstruct Enc {
881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char	*name;
891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Cipher	*cipher;
901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	enabled;
911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int	key_len;
921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int	block_size;
931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char	*key;
941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char	*iv;
951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstruct Mac {
971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char	*name;
981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	enabled;
991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int	mac_len;
1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char	*key;
1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int	key_len;
1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	type;
1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	const EVP_MD	*evp_md;
1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	HMAC_CTX	evp_ctx;
1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	struct umac_ctx *umac_ctx;
1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstruct Comp {
1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	type;
1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	enabled;
1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char	*name;
1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstruct Newkeys {
1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Enc	enc;
1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Mac	mac;
1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Comp	comp;
1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstruct Kex {
1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char	*session_id;
1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int	session_id_len;
1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Newkeys	*newkeys[MODE_MAX];
1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int	we_need;
1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	server;
1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char	*name;
1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	hostkey_type;
1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	kex_type;
1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	roaming;
1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Buffer	my;
1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Buffer	peer;
1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	sig_atomic_t done;
1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	flags;
1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	const EVP_MD *evp_md;
1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char	*client_version_string;
1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char	*server_version_string;
1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	(*verify_host_key)(Key *);
1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Key	*(*load_host_public_key)(int);
1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Key	*(*load_host_private_key)(int);
1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int	(*host_key_index)(Key *);
1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	void	(*kex[KEX_MAX])(Kex *);
1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint	 kex_names_valid(const char *);
1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodKex	*kex_setup(char *[PROPOSAL_MAX]);
1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kex_finish(Kex *);
1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kex_send_kexinit(Kex *);
1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kex_input_kexinit(int, u_int32_t, void *);
1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kex_derive_keys(Kex *, u_char *, u_int, BIGNUM *);
1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodNewkeys *kex_get_newkeys(int);
1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kexdh_client(Kex *);
1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kexdh_server(Kex *);
1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kexgex_client(Kex *);
1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kexgex_server(Kex *);
1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kexecdh_client(Kex *);
1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	 kexecdh_server(Kex *);
1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodkex_dh_hash(char *, char *, char *, int, char *, int, u_char *, int,
1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    BIGNUM *, BIGNUM *, BIGNUM *, u_char **, u_int *);
1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodkexgex_hash(const EVP_MD *, char *, char *, char *, int, char *,
1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    int, u_char *, int, int, int, int, BIGNUM *, BIGNUM *, BIGNUM *,
1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    BIGNUM *, BIGNUM *, u_char **, u_int *);
1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef OPENSSL_HAS_ECC
1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodkex_ecdh_hash(const EVP_MD *, const EC_GROUP *, char *, char *, char *, int,
1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    char *, int, u_char *, int, const EC_POINT *, const EC_POINT *,
1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    const BIGNUM *, u_char **, u_int *);
1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint	kex_ecdh_name_to_nid(const char *);
1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodconst EVP_MD *kex_ecdh_name_to_evpmd(const char *);
1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#else
1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# define kex_ecdh_name_to_nid(x) (-1)
1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# define kex_ecdh_name_to_evpmd(x) (NULL)
1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodderive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]);
1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH)
1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid	dump_digest(char *, u_char *, int);
1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
186