Update ssl library to support EVP_PKEY MAC API. Include generic MAC support.
[openssl.git] / ssl / ssl_locl.h
index 0b81e09091c516339a1c34a01ff40932e1c236a2..004e21ddb87210b9570ffd80280be5d0d0747106 100644 (file)
@@ -56,7 +56,7 @@
  * [including the GNU Public Licence.]
  */
 /* ====================================================================
- * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * ECC cipher suite support in OpenSSL originally developed by 
  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
  */
+/* ====================================================================
+ * Copyright 2005 Nokia. All rights reserved.
+ *
+ * The portions of the attached software ("Contribution") is developed by
+ * Nokia Corporation and is licensed pursuant to the OpenSSL open source
+ * license.
+ *
+ * The Contribution, originally written by Mika Kousa and Pasi Eronen of
+ * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
+ * support (see RFC 4279) to OpenSSL.
+ *
+ * No patent licenses or other rights except those expressly stated in
+ * the OpenSSL open source license shall be deemed granted or received
+ * expressly, by implication, estoppel, or otherwise.
+ *
+ * No assurances are provided by Nokia that the Contribution does not
+ * infringe the patent or other intellectual property rights of any third
+ * party or that the license provides you with all the necessary rights
+ * to make use of the Contribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
+ * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
+ * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
+ * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
+ * OTHERWISE.
+ */
 
 #ifndef HEADER_SSL_LOCL_H
 #define HEADER_SSL_LOCL_H
  * that the different entities within are mutually exclusive:
  * ONLY ONE BIT PER MASK CAN BE SET AT A TIME.
  */
-#define SSL_MKEY_MASK          0x000000FFL
+
+/* Bits for algorithm_mkey (key exchange algorithm) */
 #define SSL_kRSA               0x00000001L /* RSA key exchange */
-#define SSL_kDHr               0x00000002L /* DH cert RSA CA cert */
-#define SSL_kDHd               0x00000004L /* DH cert DSA CA cert */
-#define SSL_kFZA               0x00000008L
-#define SSL_kEDH               0x00000010L /* tmp DH key no DH cert */
-#define SSL_kKRB5              0x00000020L /* Kerberos5 key exchange */
-#define SSL_kECDH               0x00000040L /* ECDH w/ long-term keys */
-#define SSL_kECDHE              0x00000080L /* ephemeral ECDH */
-#define SSL_EDH                        (SSL_kEDH|(SSL_AUTH_MASK^SSL_aNULL))
-
-#define SSL_AUTH_MASK          0x00007F00L
-#define SSL_aRSA               0x00000100L /* Authenticate with RSA */
-#define SSL_aDSS               0x00000200L /* Authenticate with DSS */
-#define SSL_DSS                SSL_aDSS
-#define SSL_aFZA               0x00000400L
-#define SSL_aNULL              0x00000800L /* no Authenticate, ADH */
-#define SSL_aDH                0x00001000L /* no Authenticate, ADH */
-#define SSL_aKRB5               0x00002000L /* Authenticate with KRB5 */
-#define SSL_aECDSA              0x00004000L /* Authenticate with ECDSA */
-
-#define SSL_NULL               (SSL_eNULL)
-#define SSL_ADH                        (SSL_kEDH|SSL_aNULL)
-#define SSL_RSA                        (SSL_kRSA|SSL_aRSA)
-#define SSL_DH                 (SSL_kDHr|SSL_kDHd|SSL_kEDH)
-#define SSL_ECDH               (SSL_kECDH|SSL_kECDHE)
-#define SSL_FZA                        (SSL_aFZA|SSL_kFZA|SSL_eFZA)
-#define SSL_KRB5                (SSL_kKRB5|SSL_aKRB5)
-
-#define SSL_ENC_MASK           0x043F8000L
-#define SSL_DES                        0x00008000L
-#define SSL_3DES               0x00010000L
-#define SSL_RC4                        0x00020000L
-#define SSL_RC2                        0x00040000L
-#define SSL_IDEA               0x00080000L
-#define SSL_eFZA               0x00100000L
-#define SSL_eNULL              0x00200000L
-#define SSL_AES                        0x04000000L
-
-#define SSL_MAC_MASK           0x00c00000L
-#define SSL_MD5                        0x00400000L
-#define SSL_SHA1               0x00800000L
-#define SSL_SHA                        (SSL_SHA1)
-
-#define SSL_SSL_MASK           0x03000000L
-#define SSL_SSLV2              0x01000000L
-#define SSL_SSLV3              0x02000000L
+#define SSL_kDHr               0x00000002L /* DH cert, RSA CA cert */ /* no such ciphersuites supported! */
+#define SSL_kDHd               0x00000004L /* DH cert, DSA CA cert */ /* no such ciphersuite supported! */
+#define SSL_kEDH               0x00000008L /* tmp DH key no DH cert */
+#define SSL_kKRB5              0x00000010L /* Kerberos5 key exchange */
+#define SSL_kECDHr             0x00000020L /* ECDH cert, RSA CA cert */
+#define SSL_kECDHe             0x00000040L /* ECDH cert, ECDSA CA cert */
+#define SSL_kEECDH             0x00000080L /* ephemeral ECDH */
+#define SSL_kPSK               0x00000100L /* PSK */
+
+
+/* Bits for algorithm_auth (server authentication) */
+#define SSL_aRSA               0x00000001L /* RSA auth */
+#define SSL_aDSS               0x00000002L /* DSS auth */
+#define SSL_aNULL              0x00000004L /* no auth (i.e. use ADH or AECDH) */
+#define SSL_aDH                0x00000008L /* Fixed DH auth (kDHd or kDHr) */ /* no such ciphersuites supported! */
+#define SSL_aECDH              0x00000010L /* Fixed ECDH auth (kECDHe or kECDHr) */
+#define SSL_aKRB5               0x00000020L /* KRB5 auth */
+#define SSL_aECDSA              0x00000040L /* ECDSA auth*/
+#define SSL_aPSK                0x00000080L /* PSK auth */
+
+
+/* Bits for algorithm_enc (symmetric encryption) */
+#define SSL_DES                        0x00000001L
+#define SSL_3DES               0x00000002L
+#define SSL_RC4                        0x00000004L
+#define SSL_RC2                        0x00000008L
+#define SSL_IDEA               0x00000010L
+#define SSL_eNULL              0x00000020L
+#define SSL_AES128             0x00000040L
+#define SSL_AES256             0x00000080L
+#define SSL_CAMELLIA128                0x00000100L
+#define SSL_CAMELLIA256                0x00000200L
+#define SSL_eGOST2814789CNT    0x00000400L
+#define SSL_SEED               0x00000800L
+
+#define SSL_AES                        (SSL_AES128|SSL_AES256)
+#define SSL_CAMELLIA           (SSL_CAMELLIA128|SSL_CAMELLIA256)
+
+
+/* Bits for algorithm_mac (symmetric authentication) */
+#define SSL_MD5                        0x00000001L
+#define SSL_SHA1               0x00000002L
+#define SSL_GOST94      0x00000004L
+#define SSL_GOST89MAC   0x00000008L
+
+/* Bits for algorithm_ssl (protocol version) */
+#define SSL_SSLV2              0x00000001L
+#define SSL_SSLV3              0x00000002L
 #define SSL_TLSV1              SSL_SSLV3       /* for now */
 
-/* we have used 07ffffff - 5 bits left to go. */
 
 /*
  * Export and cipher strength information. For each cipher we have to decide
  * be possible.
  */
 #define SSL_EXP_MASK           0x00000003L
+#define SSL_STRONG_MASK                0x000000fcL
+
 #define SSL_NOT_EXP            0x00000001L
 #define SSL_EXPORT             0x00000002L
 
-#define SSL_STRONG_MASK                0x000000fcL
 #define SSL_STRONG_NONE                0x00000004L
 #define SSL_EXP40              0x00000008L
 #define SSL_MICRO              (SSL_EXP40)
 #define SSL_C_IS_EXPORT40(c)   SSL_IS_EXPORT40((c)->algo_strength)
 
 #define SSL_EXPORT_KEYLENGTH(a,s)      (SSL_IS_EXPORT40(s) ? 5 : \
-                                ((a)&SSL_ENC_MASK) == SSL_DES ? 8 : 7)
+                                (a) == SSL_DES ? 8 : 7)
 #define SSL_EXPORT_PKEYLENGTH(a) (SSL_IS_EXPORT40(a) ? 512 : 1024)
-#define SSL_C_EXPORT_KEYLENGTH(c)      SSL_EXPORT_KEYLENGTH((c)->algorithms, \
+#define SSL_C_EXPORT_KEYLENGTH(c)      SSL_EXPORT_KEYLENGTH((c)->algorithm_enc, \
                                (c)->algo_strength)
 #define SSL_C_EXPORT_PKEYLENGTH(c)     SSL_EXPORT_PKEYLENGTH((c)->algo_strength)
 
 
-#define SSL_ALL                        0xffffffffL
-#define SSL_ALL_CIPHERS                (SSL_MKEY_MASK|SSL_AUTH_MASK|SSL_ENC_MASK|\
-                               SSL_MAC_MASK)
-#define SSL_ALL_STRENGTHS      (SSL_EXP_MASK|SSL_STRONG_MASK)
+
 
 /* Mostly for SSLv3 */
 #define SSL_PKEY_RSA_ENC       0
@@ -412,8 +439,10 @@ typedef struct cert_st
        /* The following masks are for the key and auth
         * algorithms that are supported by the certs below */
        int valid;
-       unsigned long mask;
-       unsigned long export_mask;
+       unsigned long mask_k;
+       unsigned long mask_a;
+       unsigned long export_mask_k;
+       unsigned long export_mask_a;
 #ifndef OPENSSL_NO_RSA
        RSA *rsa_tmp;
        RSA *(*rsa_tmp_cb)(SSL *ssl,int is_export,int keysize);
@@ -725,7 +754,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *meth,
                                             const char *rule_str);
 void ssl_update_cache(SSL *s, int mode);
 int ssl_cipher_get_evp(const SSL_SESSION *s,const EVP_CIPHER **enc,
-                      const EVP_MD **md,SSL_COMP **comp);
+                      const EVP_MD **md,int *mac_pkey_type,int *mac_secret_size, SSL_COMP **comp);
 int ssl_verify_cert_chain(SSL *s,STACK_OF(X509) *sk);
 int ssl_undefined_function(SSL *s);
 int ssl_undefined_void_function(void);
@@ -736,6 +765,7 @@ int ssl_cert_type(X509 *x,EVP_PKEY *pkey);
 void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher);
 STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s);
 int ssl_verify_alarm_type(long type);
+void ssl_load_ciphers(void);
 
 int ssl2_enc_init(SSL *s, int client);
 int ssl2_generate_key_material(SSL *s);
@@ -935,9 +965,27 @@ int tls1_alert_code(int code);
 int ssl3_alert_code(int code);
 int ssl_ok(SSL *s);
 
-int check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs);
+#ifndef OPENSSL_NO_ECDH
+int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs);
+#endif
 
 SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n);
 
-
+#ifndef OPENSSL_NO_EC
+int tls1_ec_curve_id2nid(int curve_id);
+int tls1_ec_nid2curve_id(int nid);
+#endif /* OPENSSL_NO_EC */
+
+#ifndef OPENSSL_NO_TLSEXT
+unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit); 
+unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit); 
+int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data, unsigned char *d, int n, int *al);
+int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data, unsigned char *d, int n, int *al);
+int ssl_prepare_clienthello_tlsext(SSL *s);
+int ssl_prepare_serverhello_tlsext(SSL *s);
+int ssl_check_clienthello_tlsext(SSL *s);
+int ssl_check_serverhello_tlsext(SSL *s);
+EVP_MD_CTX* ssl_replace_hash(EVP_MD_CTX **hash,const EVP_MD *md) ;
+void ssl_clear_hash_ctx(EVP_MD_CTX **hash);
+#endif
 #endif