1264377Sdes/* $OpenBSD: kex.h,v 1.62 2014/01/27 18:58:14 markus Exp $ */
2224638Sbrooks/* $FreeBSD$ */
376259Sgreen
460573Skris/*
592555Sdes * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
660573Skris *
760573Skris * Redistribution and use in source and binary forms, with or without
860573Skris * modification, are permitted provided that the following conditions
960573Skris * are met:
1060573Skris * 1. Redistributions of source code must retain the above copyright
1160573Skris *    notice, this list of conditions and the following disclaimer.
1260573Skris * 2. Redistributions in binary form must reproduce the above copyright
1360573Skris *    notice, this list of conditions and the following disclaimer in the
1460573Skris *    documentation and/or other materials provided with the distribution.
1560573Skris *
1660573Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1760573Skris * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1860573Skris * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1960573Skris * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2060573Skris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2160573Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2260573Skris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2360573Skris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2460573Skris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2560573Skris * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2660573Skris */
2760573Skris#ifndef KEX_H
2860573Skris#define KEX_H
2960573Skris
30162852Sdes#include <signal.h>
3176259Sgreen#include <openssl/evp.h>
32181111Sdes#include <openssl/hmac.h>
33221420Sdes#ifdef OPENSSL_HAS_ECC
34221420Sdes#include <openssl/ec.h>
35221420Sdes#endif
3676259Sgreen
37197679Sdes#define KEX_COOKIE_LEN	16
38197679Sdes
39157016Sdes#define	KEX_DH1			"diffie-hellman-group1-sha1"
40157016Sdes#define	KEX_DH14		"diffie-hellman-group14-sha1"
41157016Sdes#define	KEX_DHGEX_SHA1		"diffie-hellman-group-exchange-sha1"
42162852Sdes#define	KEX_DHGEX_SHA256	"diffie-hellman-group-exchange-sha256"
43204917Sdes#define	KEX_RESUME		"resume@appgate.com"
44255767Sdes#define	KEX_ECDH_SHA2_NISTP256	"ecdh-sha2-nistp256"
45255767Sdes#define	KEX_ECDH_SHA2_NISTP384	"ecdh-sha2-nistp384"
46255767Sdes#define	KEX_ECDH_SHA2_NISTP521	"ecdh-sha2-nistp521"
47262566Sdes#define	KEX_CURVE25519_SHA256	"curve25519-sha256@libssh.org"
4860573Skris
49149749Sdes#define COMP_NONE	0
50149749Sdes#define COMP_ZLIB	1
51149749Sdes#define COMP_DELAYED	2
52149749Sdes
5360573Skrisenum kex_init_proposals {
5460573Skris	PROPOSAL_KEX_ALGS,
5560573Skris	PROPOSAL_SERVER_HOST_KEY_ALGS,
5660573Skris	PROPOSAL_ENC_ALGS_CTOS,
5760573Skris	PROPOSAL_ENC_ALGS_STOC,
5860573Skris	PROPOSAL_MAC_ALGS_CTOS,
5960573Skris	PROPOSAL_MAC_ALGS_STOC,
6060573Skris	PROPOSAL_COMP_ALGS_CTOS,
6160573Skris	PROPOSAL_COMP_ALGS_STOC,
6260573Skris	PROPOSAL_LANG_CTOS,
6360573Skris	PROPOSAL_LANG_STOC,
6460573Skris	PROPOSAL_MAX
6560573Skris};
6660573Skris
6760573Skrisenum kex_modes {
6860573Skris	MODE_IN,
6960573Skris	MODE_OUT,
7060573Skris	MODE_MAX
7160573Skris};
7260573Skris
7369587Sgreenenum kex_exchange {
74113908Sdes	KEX_DH_GRP1_SHA1,
75137015Sdes	KEX_DH_GRP14_SHA1,
76113908Sdes	KEX_DH_GEX_SHA1,
77162852Sdes	KEX_DH_GEX_SHA256,
78221420Sdes	KEX_ECDH_SHA2,
79262566Sdes	KEX_C25519_SHA256,
80113908Sdes	KEX_MAX
8169587Sgreen};
8276259Sgreen
8376259Sgreen#define KEX_INIT_SENT	0x0001
8476259Sgreen
8560573Skristypedef struct Kex Kex;
8660573Skristypedef struct Mac Mac;
8760573Skristypedef struct Comp Comp;
8860573Skristypedef struct Enc Enc;
8976259Sgreentypedef struct Newkeys Newkeys;
9060573Skris
9160573Skrisstruct Enc {
9276259Sgreen	char	*name;
93255767Sdes	const Cipher *cipher;
9476259Sgreen	int	enabled;
9592555Sdes	u_int	key_len;
96248619Sdes	u_int	iv_len;
9792555Sdes	u_int	block_size;
9876259Sgreen	u_char	*key;
9976259Sgreen	u_char	*iv;
10060573Skris};
10160573Skrisstruct Mac {
10276259Sgreen	char	*name;
10376259Sgreen	int	enabled;
104149749Sdes	u_int	mac_len;
10576259Sgreen	u_char	*key;
106149749Sdes	u_int	key_len;
107181111Sdes	int	type;
108248619Sdes	int	etm;		/* Encrypt-then-MAC */
109264377Sdes	struct ssh_hmac_ctx	*hmac_ctx;
110264377Sdes	struct umac_ctx		*umac_ctx;
11160573Skris};
11260573Skrisstruct Comp {
11376259Sgreen	int	type;
11476259Sgreen	int	enabled;
11576259Sgreen	char	*name;
11660573Skris};
11776259Sgreenstruct Newkeys {
11876259Sgreen	Enc	enc;
11976259Sgreen	Mac	mac;
12076259Sgreen	Comp	comp;
12176259Sgreen};
12260573Skrisstruct Kex {
12376259Sgreen	u_char	*session_id;
124106121Sdes	u_int	session_id_len;
12576259Sgreen	Newkeys	*newkeys[MODE_MAX];
126149749Sdes	u_int	we_need;
127262566Sdes	u_int	dh_need;
12876259Sgreen	int	server;
12976259Sgreen	char	*name;
13076259Sgreen	int	hostkey_type;
13176259Sgreen	int	kex_type;
132204917Sdes	int	roaming;
13376259Sgreen	Buffer	my;
13476259Sgreen	Buffer	peer;
135162852Sdes	sig_atomic_t done;
13676259Sgreen	int	flags;
137262566Sdes	int	hash_alg;
138255767Sdes	int	ec_nid;
13976259Sgreen	char	*client_version_string;
14076259Sgreen	char	*server_version_string;
14192555Sdes	int	(*verify_host_key)(Key *);
142204917Sdes	Key	*(*load_host_public_key)(int);
143204917Sdes	Key	*(*load_host_private_key)(int);
14498675Sdes	int	(*host_key_index)(Key *);
145255767Sdes	void    (*sign)(Key *, Key *, u_char **, u_int *, u_char *, u_int);
146113908Sdes	void	(*kex[KEX_MAX])(Kex *);
14760573Skris};
14860573Skris
149221420Sdesint	 kex_names_valid(const char *);
150262566Sdeschar	*kex_alg_list(char);
151221420Sdes
152224638Sbrooks#ifdef	NONE_CIPHER_ENABLED
153224638Sbrooksvoid	 kex_prop2buf(Buffer *, char *[PROPOSAL_MAX]);
154224638Sbrooks#endif
155224638Sbrooks
15692555SdesKex	*kex_setup(char *[PROPOSAL_MAX]);
15792555Sdesvoid	 kex_finish(Kex *);
15860573Skris
15992555Sdesvoid	 kex_send_kexinit(Kex *);
16092555Sdesvoid	 kex_input_kexinit(int, u_int32_t, void *);
161262566Sdesvoid	 kex_derive_keys(Kex *, u_char *, u_int, const u_char *, u_int);
162262566Sdesvoid	 kex_derive_keys_bn(Kex *, u_char *, u_int, const BIGNUM *);
16360573Skris
16492555SdesNewkeys *kex_get_newkeys(int);
16576259Sgreen
166113908Sdesvoid	 kexdh_client(Kex *);
167113908Sdesvoid	 kexdh_server(Kex *);
168113908Sdesvoid	 kexgex_client(Kex *);
169113908Sdesvoid	 kexgex_server(Kex *);
170221420Sdesvoid	 kexecdh_client(Kex *);
171221420Sdesvoid	 kexecdh_server(Kex *);
172262566Sdesvoid	 kexc25519_client(Kex *);
173262566Sdesvoid	 kexc25519_server(Kex *);
174113908Sdes
175157016Sdesvoid
176113908Sdeskex_dh_hash(char *, char *, char *, int, char *, int, u_char *, int,
177157016Sdes    BIGNUM *, BIGNUM *, BIGNUM *, u_char **, u_int *);
178157016Sdesvoid
179262566Sdeskexgex_hash(int, char *, char *, char *, int, char *,
180162852Sdes    int, u_char *, int, int, int, int, BIGNUM *, BIGNUM *, BIGNUM *,
181157016Sdes    BIGNUM *, BIGNUM *, u_char **, u_int *);
182221420Sdes#ifdef OPENSSL_HAS_ECC
183221420Sdesvoid
184262566Sdeskex_ecdh_hash(int, const EC_GROUP *, char *, char *, char *, int,
185221420Sdes    char *, int, u_char *, int, const EC_POINT *, const EC_POINT *,
186221420Sdes    const BIGNUM *, u_char **, u_int *);
187221420Sdes#endif
188262566Sdesvoid
189262566Sdeskex_c25519_hash(int, char *, char *, char *, int,
190262566Sdes    char *, int, u_char *, int, const u_char *, const u_char *,
191262566Sdes    const u_char *, u_int, u_char **, u_int *);
192113908Sdes
193262566Sdes#define CURVE25519_SIZE 32
194262566Sdesvoid	kexc25519_keygen(u_char[CURVE25519_SIZE], u_char[CURVE25519_SIZE])
195262566Sdes	__attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
196262566Sdes	__attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
197262566Sdesvoid kexc25519_shared_key(const u_char key[CURVE25519_SIZE],
198262566Sdes    const u_char pub[CURVE25519_SIZE], Buffer *out)
199262566Sdes	__attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
200262566Sdes	__attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
201262566Sdes
202137015Sdesvoid
203137015Sdesderive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]);
204137015Sdes
205221420Sdes#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH)
20692555Sdesvoid	dump_digest(char *, u_char *, int);
20760573Skris#endif
20876259Sgreen
20976259Sgreen#endif
210