1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $OpenBSD: kex.h,v 1.71 2015/02/16 22:13:32 djm Exp $ */
2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Redistribution and use in source and binary forms, with or without
7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * modification, are permitted provided that the following conditions
8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * are met:
9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 1. Redistributions of source code must retain the above copyright
10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *    notice, this list of conditions and the following disclaimer.
11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 2. Redistributions in binary form must reproduce the above copyright
12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *    notice, this list of conditions and the following disclaimer in the
13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *    documentation and/or other materials provided with the distribution.
14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifndef KEX_H
27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define KEX_H
28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
29d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "mac.h"
30d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "buffer.h" /* XXX for typedef */
31d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "key.h" /* XXX for typedef */
32d059297112922cabb0c674840589be8db821fd9aAdam Langley
33d059297112922cabb0c674840589be8db821fd9aAdam Langley#ifdef WITH_LEAKMALLOC
34d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "leakmalloc.h"
35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
37d059297112922cabb0c674840589be8db821fd9aAdam Langley#ifdef WITH_OPENSSL
38d059297112922cabb0c674840589be8db821fd9aAdam Langley# ifdef OPENSSL_HAS_ECC
39d059297112922cabb0c674840589be8db821fd9aAdam Langley#  include <openssl/ec.h>
40d059297112922cabb0c674840589be8db821fd9aAdam Langley# else /* OPENSSL_HAS_ECC */
41d059297112922cabb0c674840589be8db821fd9aAdam Langley#  define EC_KEY	void
42d059297112922cabb0c674840589be8db821fd9aAdam Langley#  define EC_GROUP	void
43d059297112922cabb0c674840589be8db821fd9aAdam Langley#  define EC_POINT	void
44d059297112922cabb0c674840589be8db821fd9aAdam Langley# endif /* OPENSSL_HAS_ECC */
45d059297112922cabb0c674840589be8db821fd9aAdam Langley#else /* WITH_OPENSSL */
46d059297112922cabb0c674840589be8db821fd9aAdam Langley# define EC_KEY		void
47d059297112922cabb0c674840589be8db821fd9aAdam Langley# define EC_GROUP	void
48d059297112922cabb0c674840589be8db821fd9aAdam Langley# define EC_POINT	void
49d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif /* WITH_OPENSSL */
50d059297112922cabb0c674840589be8db821fd9aAdam Langley
51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define KEX_COOKIE_LEN	16
52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define	KEX_DH1			"diffie-hellman-group1-sha1"
54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define	KEX_DH14		"diffie-hellman-group14-sha1"
55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define	KEX_DHGEX_SHA1		"diffie-hellman-group-exchange-sha1"
56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define	KEX_DHGEX_SHA256	"diffie-hellman-group-exchange-sha256"
57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define	KEX_RESUME		"resume@appgate.com"
58d059297112922cabb0c674840589be8db821fd9aAdam Langley#define	KEX_ECDH_SHA2_NISTP256	"ecdh-sha2-nistp256"
59d059297112922cabb0c674840589be8db821fd9aAdam Langley#define	KEX_ECDH_SHA2_NISTP384	"ecdh-sha2-nistp384"
60d059297112922cabb0c674840589be8db821fd9aAdam Langley#define	KEX_ECDH_SHA2_NISTP521	"ecdh-sha2-nistp521"
61d059297112922cabb0c674840589be8db821fd9aAdam Langley#define	KEX_CURVE25519_SHA256	"curve25519-sha256@libssh.org"
62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define COMP_NONE	0
64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define COMP_ZLIB	1
65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define COMP_DELAYED	2
66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
67d059297112922cabb0c674840589be8db821fd9aAdam Langley#define CURVE25519_SIZE 32
68d059297112922cabb0c674840589be8db821fd9aAdam Langley
69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanenum kex_init_proposals {
70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_KEX_ALGS,
71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_SERVER_HOST_KEY_ALGS,
72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_ENC_ALGS_CTOS,
73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_ENC_ALGS_STOC,
74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_MAC_ALGS_CTOS,
75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_MAC_ALGS_STOC,
76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_COMP_ALGS_CTOS,
77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_COMP_ALGS_STOC,
78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_LANG_CTOS,
79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_LANG_STOC,
80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	PROPOSAL_MAX
81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanenum kex_modes {
84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	MODE_IN,
85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	MODE_OUT,
86bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	MODE_MAX
87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
89bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanenum kex_exchange {
90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	KEX_DH_GRP1_SHA1,
91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	KEX_DH_GRP14_SHA1,
92bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	KEX_DH_GEX_SHA1,
93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	KEX_DH_GEX_SHA256,
94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	KEX_ECDH_SHA2,
95d059297112922cabb0c674840589be8db821fd9aAdam Langley	KEX_C25519_SHA256,
96bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	KEX_MAX
97bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
98bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
99bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define KEX_INIT_SENT	0x0001
100bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
101d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct sshenc {
102bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char	*name;
103d059297112922cabb0c674840589be8db821fd9aAdam Langley	const struct sshcipher *cipher;
104bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	int	enabled;
105bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int	key_len;
106d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int	iv_len;
107bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int	block_size;
108bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_char	*key;
109bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_char	*iv;
110bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
111d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct sshcomp {
112d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int	type;
113bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	int	enabled;
114bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char	*name;
115bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
116d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct newkeys {
117d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshenc	enc;
118d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshmac	mac;
119d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshcomp  comp;
120bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
121d059297112922cabb0c674840589be8db821fd9aAdam Langley
122d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct ssh;
123d059297112922cabb0c674840589be8db821fd9aAdam Langley
124d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct kex {
125bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_char	*session_id;
126d059297112922cabb0c674840589be8db821fd9aAdam Langley	size_t	session_id_len;
127d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct newkeys	*newkeys[MODE_MAX];
128bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int	we_need;
129d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int	dh_need;
130bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	int	server;
131bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char	*name;
132bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	int	hostkey_type;
133d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	hostkey_nid;
134d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int	kex_type;
135bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	int	roaming;
136d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshbuf *my;
137d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshbuf *peer;
138bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	sig_atomic_t done;
139d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int	flags;
140d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	hash_alg;
141d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	ec_nid;
142bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char	*client_version_string;
143bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char	*server_version_string;
144d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	(*verify_host_key)(struct sshkey *, struct ssh *);
145d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshkey *(*load_host_public_key)(int, int, struct ssh *);
146d059297112922cabb0c674840589be8db821fd9aAdam Langley	struct sshkey *(*load_host_private_key)(int, int, struct ssh *);
147d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	(*host_key_index)(struct sshkey *, int, struct ssh *);
148d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	(*sign)(struct sshkey *, struct sshkey *,
149d059297112922cabb0c674840589be8db821fd9aAdam Langley	    u_char **, size_t *, const u_char *, size_t, u_int);
150d059297112922cabb0c674840589be8db821fd9aAdam Langley	int	(*kex[KEX_MAX])(struct ssh *);
151d059297112922cabb0c674840589be8db821fd9aAdam Langley	/* kex specific state */
152d059297112922cabb0c674840589be8db821fd9aAdam Langley	DH	*dh;			/* DH */
153d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int	min, max, nbits;	/* GEX */
154d059297112922cabb0c674840589be8db821fd9aAdam Langley	EC_KEY	*ec_client_key;		/* ECDH */
155d059297112922cabb0c674840589be8db821fd9aAdam Langley	const EC_GROUP *ec_group;	/* ECDH */
156d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_char c25519_client_key[CURVE25519_SIZE]; /* 25519 */
157d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_char c25519_client_pubkey[CURVE25519_SIZE]; /* 25519 */
158bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
159bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
160bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint	 kex_names_valid(const char *);
161d059297112922cabb0c674840589be8db821fd9aAdam Langleychar	*kex_alg_list(char);
162d059297112922cabb0c674840589be8db821fd9aAdam Langley
163d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_new(struct ssh *, char *[PROPOSAL_MAX], struct kex **);
164d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_setup(struct ssh *, char *[PROPOSAL_MAX]);
165d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid	 kex_free_newkeys(struct newkeys *);
166d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid	 kex_free(struct kex *);
167d059297112922cabb0c674840589be8db821fd9aAdam Langley
168d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_buf2prop(struct sshbuf *, int *, char ***);
169d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_prop2buf(struct sshbuf *, char *proposal[PROPOSAL_MAX]);
170d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid	 kex_prop_free(char **);
171d059297112922cabb0c674840589be8db821fd9aAdam Langley
172d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_send_kexinit(struct ssh *);
173d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_input_kexinit(int, u_int32_t, void *);
174d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_derive_keys(struct ssh *, u_char *, u_int, const struct sshbuf *);
175d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_derive_keys_bn(struct ssh *, u_char *, u_int, const BIGNUM *);
176d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_send_newkeys(struct ssh *);
177d059297112922cabb0c674840589be8db821fd9aAdam Langley
178d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexdh_client(struct ssh *);
179d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexdh_server(struct ssh *);
180d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexgex_client(struct ssh *);
181d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexgex_server(struct ssh *);
182d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexecdh_client(struct ssh *);
183d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexecdh_server(struct ssh *);
184d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexc25519_client(struct ssh *);
185d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexc25519_server(struct ssh *);
186d059297112922cabb0c674840589be8db821fd9aAdam Langley
187d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_dh_hash(const char *, const char *,
188d059297112922cabb0c674840589be8db821fd9aAdam Langley    const u_char *, size_t, const u_char *, size_t, const u_char *, size_t,
189d059297112922cabb0c674840589be8db821fd9aAdam Langley    const BIGNUM *, const BIGNUM *, const BIGNUM *, u_char *, size_t *);
190d059297112922cabb0c674840589be8db821fd9aAdam Langley
191d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kexgex_hash(int, const char *, const char *,
192d059297112922cabb0c674840589be8db821fd9aAdam Langley    const u_char *, size_t, const u_char *, size_t, const u_char *, size_t,
193d059297112922cabb0c674840589be8db821fd9aAdam Langley    int, int, int,
194d059297112922cabb0c674840589be8db821fd9aAdam Langley    const BIGNUM *, const BIGNUM *, const BIGNUM *,
195d059297112922cabb0c674840589be8db821fd9aAdam Langley    const BIGNUM *, const BIGNUM *,
196d059297112922cabb0c674840589be8db821fd9aAdam Langley    u_char *, size_t *);
197d059297112922cabb0c674840589be8db821fd9aAdam Langley
198d059297112922cabb0c674840589be8db821fd9aAdam Langleyint kex_ecdh_hash(int, const EC_GROUP *, const char *, const char *,
199d059297112922cabb0c674840589be8db821fd9aAdam Langley    const u_char *, size_t, const u_char *, size_t, const u_char *, size_t,
200d059297112922cabb0c674840589be8db821fd9aAdam Langley    const EC_POINT *, const EC_POINT *, const BIGNUM *, u_char *, size_t *);
201d059297112922cabb0c674840589be8db821fd9aAdam Langley
202d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	 kex_c25519_hash(int, const char *, const char *, const char *, size_t,
203d059297112922cabb0c674840589be8db821fd9aAdam Langley    const char *, size_t, const u_char *, size_t, const u_char *, const u_char *,
204d059297112922cabb0c674840589be8db821fd9aAdam Langley    const u_char *, size_t, u_char *, size_t *);
205d059297112922cabb0c674840589be8db821fd9aAdam Langley
206d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid	kexc25519_keygen(u_char key[CURVE25519_SIZE], u_char pub[CURVE25519_SIZE])
207d059297112922cabb0c674840589be8db821fd9aAdam Langley	__attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
208d059297112922cabb0c674840589be8db821fd9aAdam Langley	__attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
209d059297112922cabb0c674840589be8db821fd9aAdam Langleyint	kexc25519_shared_key(const u_char key[CURVE25519_SIZE],
210d059297112922cabb0c674840589be8db821fd9aAdam Langley    const u_char pub[CURVE25519_SIZE], struct sshbuf *out)
211d059297112922cabb0c674840589be8db821fd9aAdam Langley	__attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
212d059297112922cabb0c674840589be8db821fd9aAdam Langley	__attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
213d059297112922cabb0c674840589be8db821fd9aAdam Langley
214d059297112922cabb0c674840589be8db821fd9aAdam Langleyint
215bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanderive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]);
216bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
217bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH)
218bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid	dump_digest(char *, u_char *, int);
219bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
220bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
221d059297112922cabb0c674840589be8db821fd9aAdam Langley#if !defined(WITH_OPENSSL) || !defined(OPENSSL_HAS_ECC)
222d059297112922cabb0c674840589be8db821fd9aAdam Langley# undef EC_KEY
223d059297112922cabb0c674840589be8db821fd9aAdam Langley# undef EC_GROUP
224d059297112922cabb0c674840589be8db821fd9aAdam Langley# undef EC_POINT
225d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif
226d059297112922cabb0c674840589be8db821fd9aAdam Langley
227bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
228