Merge branch 'vendor/OPENSSH'
[dragonfly.git] / crypto / openssh / kex.h
index 3b4d4b5..4abf673 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.h,v 1.52 2010/09/22 05:01:29 djm Exp $ */
+/* $OpenBSD: kex.h,v 1.64 2014/05/02 03:27:54 djm Exp $ */
 
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
 #define        KEX_DHGEX_SHA1          "diffie-hellman-group-exchange-sha1"
 #define        KEX_DHGEX_SHA256        "diffie-hellman-group-exchange-sha256"
 #define        KEX_RESUME              "resume@appgate.com"
-/* The following represents the family of ECDH methods */
-#define        KEX_ECDH_SHA2_STEM      "ecdh-sha2-"
+#define        KEX_ECDH_SHA2_NISTP256  "ecdh-sha2-nistp256"
+#define        KEX_ECDH_SHA2_NISTP384  "ecdh-sha2-nistp384"
+#define        KEX_ECDH_SHA2_NISTP521  "ecdh-sha2-nistp521"
+#define        KEX_CURVE25519_SHA256   "curve25519-sha256@libssh.org"
 
 #define COMP_NONE      0
 #define COMP_ZLIB      1
@@ -73,6 +75,7 @@ enum kex_exchange {
        KEX_DH_GEX_SHA1,
        KEX_DH_GEX_SHA256,
        KEX_ECDH_SHA2,
+       KEX_C25519_SHA256,
        KEX_MAX
 };
 
@@ -86,9 +89,10 @@ typedef struct Newkeys Newkeys;
 
 struct Enc {
        char    *name;
-       Cipher  *cipher;
+       const Cipher *cipher;
        int     enabled;
        u_int   key_len;
+       u_int   iv_len;
        u_int   block_size;
        u_char  *key;
        u_char  *iv;
@@ -100,9 +104,9 @@ struct Mac {
        u_char  *key;
        u_int   key_len;
        int     type;
-       const EVP_MD    *evp_md;
-       HMAC_CTX        evp_ctx;
-       struct umac_ctx *umac_ctx;
+       int     etm;            /* Encrypt-then-MAC */
+       struct ssh_hmac_ctx     *hmac_ctx;
+       struct umac_ctx         *umac_ctx;
 };
 struct Comp {
        int     type;
@@ -119,6 +123,7 @@ struct Kex {
        u_int   session_id_len;
        Newkeys *newkeys[MODE_MAX];
        u_int   we_need;
+       u_int   dh_need;
        int     server;
        char    *name;
        int     hostkey_type;
@@ -128,17 +133,20 @@ struct Kex {
        Buffer  peer;
        sig_atomic_t done;
        int     flags;
-       const EVP_MD *evp_md;
+       int     hash_alg;
+       int     ec_nid;
        char    *client_version_string;
        char    *server_version_string;
        int     (*verify_host_key)(Key *);
        Key     *(*load_host_public_key)(int);
        Key     *(*load_host_private_key)(int);
        int     (*host_key_index)(Key *);
+       void    (*sign)(Key *, Key *, u_char **, u_int *, u_char *, u_int);
        void    (*kex[KEX_MAX])(Kex *);
 };
 
 int     kex_names_valid(const char *);
+char   *kex_alg_list(char);
 
 void kex_prop2buf(Buffer *, char *proposal[PROPOSAL_MAX]);
 
@@ -147,7 +155,8 @@ void         kex_finish(Kex *);
 
 void    kex_send_kexinit(Kex *);
 void    kex_input_kexinit(int, u_int32_t, void *);
-void    kex_derive_keys(Kex *, u_char *, u_int, BIGNUM *);
+void    kex_derive_keys(Kex *, u_char *, u_int, const u_char *, u_int);
+void    kex_derive_keys_bn(Kex *, u_char *, u_int, const BIGNUM *);
 
 Newkeys *kex_get_newkeys(int);
 
@@ -157,25 +166,35 @@ void       kexgex_client(Kex *);
 void    kexgex_server(Kex *);
 void    kexecdh_client(Kex *);
 void    kexecdh_server(Kex *);
+void    kexc25519_client(Kex *);
+void    kexc25519_server(Kex *);
 
 void
 kex_dh_hash(char *, char *, char *, int, char *, int, u_char *, int,
     BIGNUM *, BIGNUM *, BIGNUM *, u_char **, u_int *);
 void
-kexgex_hash(const EVP_MD *, char *, char *, char *, int, char *,
+kexgex_hash(int, char *, char *, char *, int, char *,
     int, u_char *, int, int, int, int, BIGNUM *, BIGNUM *, BIGNUM *,
     BIGNUM *, BIGNUM *, u_char **, u_int *);
 #ifdef OPENSSL_HAS_ECC
 void
-kex_ecdh_hash(const EVP_MD *, const EC_GROUP *, char *, char *, char *, int,
+kex_ecdh_hash(int, const EC_GROUP *, char *, char *, char *, int,
     char *, int, u_char *, int, const EC_POINT *, const EC_POINT *,
     const BIGNUM *, u_char **, u_int *);
-int    kex_ecdh_name_to_nid(const char *);
-const EVP_MD *kex_ecdh_name_to_evpmd(const char *);
-#else
-# define kex_ecdh_name_to_nid(x) (-1)
-# define kex_ecdh_name_to_evpmd(x) (NULL)
 #endif
+void
+kex_c25519_hash(int, char *, char *, char *, int,
+    char *, int, u_char *, int, const u_char *, const u_char *,
+    const u_char *, u_int, u_char **, u_int *);
+
+#define CURVE25519_SIZE 32
+void   kexc25519_keygen(u_char[CURVE25519_SIZE], u_char[CURVE25519_SIZE])
+       __attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
+       __attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
+void kexc25519_shared_key(const u_char key[CURVE25519_SIZE],
+    const u_char pub[CURVE25519_SIZE], Buffer *out)
+       __attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
+       __attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
 
 void
 derive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]);