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