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