1323124Sdes/* $OpenBSD: kex.h,v 1.78 2016/05/02 10:26:04 djm Exp $ */ 276259Sgreen 360573Skris/* 492555Sdes * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. 560573Skris * 660573Skris * Redistribution and use in source and binary forms, with or without 760573Skris * modification, are permitted provided that the following conditions 860573Skris * are met: 960573Skris * 1. Redistributions of source code must retain the above copyright 1060573Skris * notice, this list of conditions and the following disclaimer. 1160573Skris * 2. Redistributions in binary form must reproduce the above copyright 1260573Skris * notice, this list of conditions and the following disclaimer in the 1360573Skris * documentation and/or other materials provided with the distribution. 1460573Skris * 1560573Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1660573Skris * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1760573Skris * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1860573Skris * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1960573Skris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2060573Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2160573Skris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2260573Skris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2360573Skris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2460573Skris * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2560573Skris */ 2660573Skris#ifndef KEX_H 2760573Skris#define KEX_H 2860573Skris 29295367Sdes#include "mac.h" 30295367Sdes#include "buffer.h" /* XXX for typedef */ 31295367Sdes#include "key.h" /* XXX for typedef */ 32295367Sdes 33295367Sdes#ifdef WITH_LEAKMALLOC 34295367Sdes#include "leakmalloc.h" 35221420Sdes#endif 3676259Sgreen 37295367Sdes#ifdef WITH_OPENSSL 38295367Sdes# ifdef OPENSSL_HAS_ECC 39295367Sdes# include <openssl/ec.h> 40295367Sdes# else /* OPENSSL_HAS_ECC */ 41295367Sdes# define EC_KEY void 42295367Sdes# define EC_GROUP void 43295367Sdes# define EC_POINT void 44295367Sdes# endif /* OPENSSL_HAS_ECC */ 45295367Sdes#else /* WITH_OPENSSL */ 46295367Sdes# define EC_KEY void 47295367Sdes# define EC_GROUP void 48295367Sdes# define EC_POINT void 49295367Sdes#endif /* WITH_OPENSSL */ 50295367Sdes 51197679Sdes#define KEX_COOKIE_LEN 16 52197679Sdes 53157016Sdes#define KEX_DH1 "diffie-hellman-group1-sha1" 54323124Sdes#define KEX_DH14_SHA1 "diffie-hellman-group14-sha1" 55323124Sdes#define KEX_DH14_SHA256 "diffie-hellman-group14-sha256" 56323124Sdes#define KEX_DH16_SHA512 "diffie-hellman-group16-sha512" 57323124Sdes#define KEX_DH18_SHA512 "diffie-hellman-group18-sha512" 58157016Sdes#define KEX_DHGEX_SHA1 "diffie-hellman-group-exchange-sha1" 59162852Sdes#define KEX_DHGEX_SHA256 "diffie-hellman-group-exchange-sha256" 60255767Sdes#define KEX_ECDH_SHA2_NISTP256 "ecdh-sha2-nistp256" 61255767Sdes#define KEX_ECDH_SHA2_NISTP384 "ecdh-sha2-nistp384" 62255767Sdes#define KEX_ECDH_SHA2_NISTP521 "ecdh-sha2-nistp521" 63262566Sdes#define KEX_CURVE25519_SHA256 "curve25519-sha256@libssh.org" 6460573Skris 65149749Sdes#define COMP_NONE 0 66149749Sdes#define COMP_ZLIB 1 67149749Sdes#define COMP_DELAYED 2 68149749Sdes 69295367Sdes#define CURVE25519_SIZE 32 70295367Sdes 7160573Skrisenum kex_init_proposals { 7260573Skris PROPOSAL_KEX_ALGS, 7360573Skris PROPOSAL_SERVER_HOST_KEY_ALGS, 7460573Skris PROPOSAL_ENC_ALGS_CTOS, 7560573Skris PROPOSAL_ENC_ALGS_STOC, 7660573Skris PROPOSAL_MAC_ALGS_CTOS, 7760573Skris PROPOSAL_MAC_ALGS_STOC, 7860573Skris PROPOSAL_COMP_ALGS_CTOS, 7960573Skris PROPOSAL_COMP_ALGS_STOC, 8060573Skris PROPOSAL_LANG_CTOS, 8160573Skris PROPOSAL_LANG_STOC, 8260573Skris PROPOSAL_MAX 8360573Skris}; 8460573Skris 8560573Skrisenum kex_modes { 8660573Skris MODE_IN, 8760573Skris MODE_OUT, 8860573Skris MODE_MAX 8960573Skris}; 9060573Skris 9169587Sgreenenum kex_exchange { 92113908Sdes KEX_DH_GRP1_SHA1, 93137015Sdes KEX_DH_GRP14_SHA1, 94323124Sdes KEX_DH_GRP14_SHA256, 95323124Sdes KEX_DH_GRP16_SHA512, 96323124Sdes KEX_DH_GRP18_SHA512, 97113908Sdes KEX_DH_GEX_SHA1, 98162852Sdes KEX_DH_GEX_SHA256, 99221420Sdes KEX_ECDH_SHA2, 100262566Sdes KEX_C25519_SHA256, 101113908Sdes KEX_MAX 10269587Sgreen}; 10376259Sgreen 10476259Sgreen#define KEX_INIT_SENT 0x0001 10576259Sgreen 106295367Sdesstruct sshenc { 10776259Sgreen char *name; 108295367Sdes const struct sshcipher *cipher; 10976259Sgreen int enabled; 11092555Sdes u_int key_len; 111248619Sdes u_int iv_len; 11292555Sdes u_int block_size; 11376259Sgreen u_char *key; 11476259Sgreen u_char *iv; 11560573Skris}; 116295367Sdesstruct sshcomp { 117295367Sdes u_int type; 11876259Sgreen int enabled; 11976259Sgreen char *name; 12060573Skris}; 121295367Sdesstruct newkeys { 122295367Sdes struct sshenc enc; 123295367Sdes struct sshmac mac; 124295367Sdes struct sshcomp comp; 12576259Sgreen}; 126295367Sdes 127295367Sdesstruct ssh; 128295367Sdes 129295367Sdesstruct kex { 13076259Sgreen u_char *session_id; 131295367Sdes size_t session_id_len; 132295367Sdes struct newkeys *newkeys[MODE_MAX]; 133149749Sdes u_int we_need; 134262566Sdes u_int dh_need; 13576259Sgreen int server; 13676259Sgreen char *name; 137296781Sdes char *hostkey_alg; 13876259Sgreen int hostkey_type; 139295367Sdes int hostkey_nid; 140295367Sdes u_int kex_type; 141296781Sdes int rsa_sha2; 142296781Sdes int ext_info_c; 143295367Sdes struct sshbuf *my; 144295367Sdes struct sshbuf *peer; 145162852Sdes sig_atomic_t done; 146295367Sdes u_int flags; 147262566Sdes int hash_alg; 148255767Sdes int ec_nid; 14976259Sgreen char *client_version_string; 15076259Sgreen char *server_version_string; 151295367Sdes char *failed_choice; 152295367Sdes int (*verify_host_key)(struct sshkey *, struct ssh *); 153295367Sdes struct sshkey *(*load_host_public_key)(int, int, struct ssh *); 154295367Sdes struct sshkey *(*load_host_private_key)(int, int, struct ssh *); 155295367Sdes int (*host_key_index)(struct sshkey *, int, struct ssh *); 156296781Sdes int (*sign)(struct sshkey *, struct sshkey *, u_char **, size_t *, 157296781Sdes const u_char *, size_t, const char *, u_int); 158295367Sdes int (*kex[KEX_MAX])(struct ssh *); 159295367Sdes /* kex specific state */ 160295367Sdes DH *dh; /* DH */ 161295367Sdes u_int min, max, nbits; /* GEX */ 162295367Sdes EC_KEY *ec_client_key; /* ECDH */ 163295367Sdes const EC_GROUP *ec_group; /* ECDH */ 164295367Sdes u_char c25519_client_key[CURVE25519_SIZE]; /* 25519 */ 165295367Sdes u_char c25519_client_pubkey[CURVE25519_SIZE]; /* 25519 */ 16660573Skris}; 16760573Skris 168221420Sdesint kex_names_valid(const char *); 169262566Sdeschar *kex_alg_list(char); 170295367Sdeschar *kex_names_cat(const char *, const char *); 171295367Sdesint kex_assemble_names(const char *, char **); 172221420Sdes 173295367Sdesint kex_new(struct ssh *, char *[PROPOSAL_MAX], struct kex **); 174295367Sdesint kex_setup(struct ssh *, char *[PROPOSAL_MAX]); 175295367Sdesvoid kex_free_newkeys(struct newkeys *); 176295367Sdesvoid kex_free(struct kex *); 17760573Skris 178295367Sdesint kex_buf2prop(struct sshbuf *, int *, char ***); 179295367Sdesint kex_prop2buf(struct sshbuf *, char *proposal[PROPOSAL_MAX]); 180295367Sdesvoid kex_prop_free(char **); 18160573Skris 182295367Sdesint kex_send_kexinit(struct ssh *); 183295367Sdesint kex_input_kexinit(int, u_int32_t, void *); 184296781Sdesint kex_input_ext_info(int, u_int32_t, void *); 185295367Sdesint kex_derive_keys(struct ssh *, u_char *, u_int, const struct sshbuf *); 186295367Sdesint kex_derive_keys_bn(struct ssh *, u_char *, u_int, const BIGNUM *); 187295367Sdesint kex_send_newkeys(struct ssh *); 188296781Sdesint kex_start_rekex(struct ssh *); 18976259Sgreen 190295367Sdesint kexdh_client(struct ssh *); 191295367Sdesint kexdh_server(struct ssh *); 192295367Sdesint kexgex_client(struct ssh *); 193295367Sdesint kexgex_server(struct ssh *); 194295367Sdesint kexecdh_client(struct ssh *); 195295367Sdesint kexecdh_server(struct ssh *); 196295367Sdesint kexc25519_client(struct ssh *); 197295367Sdesint kexc25519_server(struct ssh *); 198113908Sdes 199323124Sdesint kex_dh_hash(int, const char *, const char *, 200295367Sdes const u_char *, size_t, const u_char *, size_t, const u_char *, size_t, 201295367Sdes const BIGNUM *, const BIGNUM *, const BIGNUM *, u_char *, size_t *); 202113908Sdes 203295367Sdesint kexgex_hash(int, const char *, const char *, 204295367Sdes const u_char *, size_t, const u_char *, size_t, const u_char *, size_t, 205295367Sdes int, int, int, 206295367Sdes const BIGNUM *, const BIGNUM *, const BIGNUM *, 207295367Sdes const BIGNUM *, const BIGNUM *, 208295367Sdes u_char *, size_t *); 209295367Sdes 210295367Sdesint kex_ecdh_hash(int, const EC_GROUP *, const char *, const char *, 211295367Sdes const u_char *, size_t, const u_char *, size_t, const u_char *, size_t, 212295367Sdes const EC_POINT *, const EC_POINT *, const BIGNUM *, u_char *, size_t *); 213295367Sdes 214323124Sdesint kex_c25519_hash(int, const char *, const char *, 215323124Sdes const u_char *, size_t, const u_char *, size_t, 216323124Sdes const u_char *, size_t, const u_char *, const u_char *, 217295367Sdes const u_char *, size_t, u_char *, size_t *); 218295367Sdes 219295367Sdesvoid kexc25519_keygen(u_char key[CURVE25519_SIZE], u_char pub[CURVE25519_SIZE]) 220262566Sdes __attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE))) 221262566Sdes __attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE))); 222295367Sdesint kexc25519_shared_key(const u_char key[CURVE25519_SIZE], 223295367Sdes const u_char pub[CURVE25519_SIZE], struct sshbuf *out) 224262566Sdes __attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE))) 225262566Sdes __attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE))); 226262566Sdes 227295367Sdesint 228137015Sdesderive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]); 229137015Sdes 230221420Sdes#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH) 23192555Sdesvoid dump_digest(char *, u_char *, int); 23260573Skris#endif 23376259Sgreen 234295367Sdes#if !defined(WITH_OPENSSL) || !defined(OPENSSL_HAS_ECC) 235295367Sdes# undef EC_KEY 236295367Sdes# undef EC_GROUP 237295367Sdes# undef EC_POINT 23876259Sgreen#endif 239295367Sdes 240295367Sdes#endif 241