xref: /titanic_50/usr/src/cmd/ssh/include/kex.h (revision f38cb554a534c6df738be3f4d23327e69888e634)
1 /*
2  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24 /*
25  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 /*	$OpenBSD: kex.h,v 1.32 2002/09/09 14:54:14 markus Exp $	*/
30 
31 #ifndef	_KEX_H
32 #define	_KEX_H
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include <openssl/evp.h>
39 #include <openssl/hmac.h>
40 #include "buffer.h"
41 #include "cipher.h"
42 #include "key.h"
43 
44 #ifdef GSSAPI
45 #ifdef SUNW_GSSAPI
46 #include <gssapi/gssapi.h>
47 #include <gssapi/gssapi_ext.h>
48 #else
49 #ifdef GSS_KRB5
50 #ifdef HEIMDAL
51 #include <gssapi.h>
52 #else
53 #include <gssapi_generic.h>
54 #endif /* HEIMDAL */
55 #endif /* GSS_KRB5 */
56 #endif /* SUNW_GSSAPI */
57 #endif /* GSSAPI */
58 
59 #define	KEX_DH1		"diffie-hellman-group1-sha1"
60 #define	KEX_DHGEX	"diffie-hellman-group-exchange-sha1"
61 
62 enum kex_init_proposals {
63 	PROPOSAL_KEX_ALGS,
64 	PROPOSAL_SERVER_HOST_KEY_ALGS,
65 	PROPOSAL_ENC_ALGS_CTOS,
66 	PROPOSAL_ENC_ALGS_STOC,
67 	PROPOSAL_MAC_ALGS_CTOS,
68 	PROPOSAL_MAC_ALGS_STOC,
69 	PROPOSAL_COMP_ALGS_CTOS,
70 	PROPOSAL_COMP_ALGS_STOC,
71 	PROPOSAL_LANG_CTOS,
72 	PROPOSAL_LANG_STOC,
73 	PROPOSAL_MAX
74 };
75 
76 enum kex_modes {
77 	MODE_IN,
78 	MODE_OUT,
79 	MODE_MAX
80 };
81 
82 enum kex_exchange {
83 	KEX_DH_GRP1_SHA1,
84 	KEX_DH_GEX_SHA1,
85 #ifdef GSSAPI
86 	KEX_GSS_GRP1_SHA1,
87 #endif /* GSSAPI */
88 	KEX_MAX
89 };
90 
91 
92 #define KEX_INIT_SENT	0x0001
93 
94 typedef struct Kex Kex;
95 typedef struct Mac Mac;
96 typedef struct Comp Comp;
97 typedef struct Enc Enc;
98 typedef struct Newkeys Newkeys;
99 
100 struct Enc {
101 	char	*name;
102 	Cipher	*cipher;
103 	int	enabled;
104 	u_int	key_len;
105 	u_int	block_size;
106 	u_char	*key;
107 	u_char	*iv;
108 };
109 struct Mac {
110 	char		*name;
111 	int		enabled;
112 	u_int		mac_len;
113 	u_char		*key;
114 	u_int		key_len;
115 	int		type;
116 	const EVP_MD	*evp_md;
117 	HMAC_CTX	evp_ctx;
118 };
119 struct Comp {
120 	int	type;
121 	int	enabled;
122 	char	*name;
123 };
124 struct Newkeys {
125 	Enc	enc;
126 	Mac	mac;
127 	Comp	comp;
128 };
129 
130 struct KexOptions {
131 	int	gss_deleg_creds;
132 };
133 
134 struct Kex {
135 	u_char	*session_id;
136 	u_int	session_id_len;
137 	Newkeys	*newkeys[MODE_MAX];
138 	int	we_need;
139 	int	server;
140 	char	*serverhost;
141 	char	*name;
142 	int	hostkey_type;
143 	int	kex_type;
144 	Buffer	my;
145 	Buffer	peer;
146 	int	initial_kex_done;
147 	int	done;
148 	int	flags;
149 	char	*client_version_string;
150 	char	*server_version_string;
151 	struct  KexOptions options;
152 	int	(*verify_host_key)(Key *);
153 	int	(*accept_host_key)(Key *); /* for GSS keyex */
154 	Key	*(*load_host_key)(int);
155 	int	(*host_key_index)(Key *);
156 	void    (*kex[KEX_MAX])(Kex *);
157 	void	(*kex_hook)(Kex *, char **); /* for GSS keyex rekeying */
158 #ifdef GSSAPI
159 	gss_OID_set mechs; /* mechs in my proposal */
160 #endif /* GSSAPI */
161 };
162 
163 typedef void (*Kex_hook_func)(Kex *, char **); /* for GSS-API rekeying */
164 
165 Kex	 *kex_setup(const char *host,
166 		    char *proposal[PROPOSAL_MAX],
167 		    Kex_hook_func hook);
168 void	  kex_start(Kex *);
169 void	  kex_finish(Kex *);
170 
171 void	  kex_send_kexinit(Kex *);
172 void	  kex_input_kexinit(int, u_int32_t, void *);
173 void	  kex_derive_keys(Kex *, u_char *, BIGNUM *);
174 
175 Newkeys *kex_get_newkeys(int);
176 
177 void    kexdh_client(Kex *);
178 void    kexdh_server(Kex *);
179 void    kexgex_client(Kex *);
180 void    kexgex_server(Kex *);
181 
182 u_char *
183 kex_dh_hash(char *, char *, char *, int, char *, int, u_char *, int,
184 	    BIGNUM *, BIGNUM *, BIGNUM *);
185 u_char *
186 kexgex_hash(char *, char *, char *, int, char *, int, u_char *, int,
187 	    int, int, int, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *);
188 
189 #ifdef GSSAPI
190 void     kexgss_client(Kex *);
191 void     kexgss_server(Kex *);
192 #endif
193 
194 #if defined(DEBUG_KEX) || defined(DEBUG_KEXDH)
195 void	dump_digest(char *, u_char *, int);
196 #endif
197 
198 #ifdef __cplusplus
199 }
200 #endif
201 
202 #endif /* _KEX_H */
203