this->version = version;
}
-METHOD(tls_t, change_cipher, void,
- private_tls_t *this, bool inbound, signer_t *signer,
- crypter_t *crypter, chunk_t iv)
-{
- this->protection->set_cipher(this->protection, inbound, signer, crypter, iv);
-}
-
METHOD(tls_t, get_eap_msk, chunk_t,
private_tls_t *this)
{
.is_server = _is_server,
.get_version = _get_version,
.set_version = _set_version,
- .change_cipher = _change_cipher,
.get_eap_msk = _get_eap_msk,
.destroy = _destroy,
},
this->fragmentation = tls_fragmentation_create(this->handshake);
this->compression = tls_compression_create(this->fragmentation);
this->protection = tls_protection_create(&this->public, this->compression);
+ this->crypto->set_protection(this->crypto, this->protection);
return &this->public;
}
typedef enum tls_version_t tls_version_t;
typedef enum tls_content_type_t tls_content_type_t;
typedef enum tls_handshake_type_t tls_handshake_type_t;
-typedef enum tls_cipher_suite_t tls_cipher_suite_t;
typedef struct tls_t tls_t;
#include <library.h>
*/
extern enum_name_t *tls_handshake_type_names;
-enum tls_cipher_suite_t {
- TLS_NULL_WITH_NULL_NULL = 0x00,
- TLS_RSA_WITH_NULL_MD5 = 0x01,
- TLS_RSA_WITH_NULL_SHA = 0x02,
- TLS_RSA_WITH_NULL_SHA256 = 0x3B,
- TLS_RSA_WITH_RC4_128_MD5 = 0x04,
- TLS_RSA_WITH_RC4_128_SHA = 0x05,
- TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x0A,
- TLS_RSA_WITH_AES_128_CBC_SHA = 0x2F,
- TLS_RSA_WITH_AES_256_CBC_SHA = 0x35,
- TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x3C,
- TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x3D,
- TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x0D,
- TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x10,
- TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x13,
- TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x16,
- TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x30,
- TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0x31,
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x32,
- TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x33,
- TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x36,
- TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0x37,
- TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x38,
- TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x39,
- TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = 0x3E,
- TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = 0x3F,
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x40,
- TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x67,
- TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = 0x68,
- TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = 0x69,
- TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x6A,
- TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x6B,
- TLS_DH_ANON_WITH_RC4_128_MD5 = 0x18,
- TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA = 0x1B,
- TLS_DH_ANON_WITH_AES_128_CBC_SHA = 0x34,
- TLS_DH_ANON_WITH_AES_256_CBC_SHA = 0x3A,
- TLS_DH_ANON_WITH_AES_128_CBC_SHA256 = 0x6C,
- TLS_DH_ANON_WITH_AES_256_CBC_SHA256 = 0x6D,
-};
-
/**
* A bottom-up driven TLS stack, suitable for EAP implementations.
*/
*/
void (*set_version)(tls_t *this, tls_version_t version);
- /**
- * Change used cipher, including encryption and integrity algorithms.
- *
- * @param inbound TRUE to use cipher for inbound data, FALSE for outbound
- * @param signer new signer to use
- * @param crypter new crypter to use
- * @param iv initial IV for crypter
- */
- void (*change_cipher)(tls_t *this, bool inbound, signer_t *signer,
- crypter_t *crypter, chunk_t iv);
-
/**
* Get the MSK for EAP-TLS.
*
*/
tls_crypto_t public;
+ /**
+ * Protection layer
+ */
+ tls_protection_t *protection;
+
/**
* List of supported/acceptable cipher suites
*/
return 0;
}
+METHOD(tls_crypto_t, set_protection, void,
+ private_tls_crypto_t *this, tls_protection_t *protection)
+{
+ this->protection = protection;
+}
+
METHOD(tls_crypto_t, append_handshake, void,
private_tls_crypto_t *this, tls_handshake_type_t type, chunk_t data)
{
METHOD(tls_crypto_t, change_cipher, void,
private_tls_crypto_t *this, bool inbound)
{
- if (inbound)
- {
- this->tls->change_cipher(this->tls, TRUE, this->signer_in,
- this->crypter_in, this->iv_in);
- }
- else
+ if (this->protection)
{
- this->tls->change_cipher(this->tls, FALSE, this->signer_out,
- this->crypter_out, this->iv_out);
+ if (inbound)
+ {
+ this->protection->set_cipher(this->protection, TRUE,
+ this->signer_in, this->crypter_in, this->iv_in);
+ }
+ else
+ {
+ this->protection->set_cipher(this->protection, FALSE,
+ this->signer_out, this->crypter_out, this->iv_out);
+ }
}
}
.public = {
.get_cipher_suites = _get_cipher_suites,
.select_cipher_suite = _select_cipher_suite,
+ .set_protection = _set_protection,
.append_handshake = _append_handshake,
.sign_handshake = _sign_handshake,
.calculate_finished = _calculate_finished,
#define TLS_CRYPTO_H_
typedef struct tls_crypto_t tls_crypto_t;
+typedef enum tls_cipher_suite_t tls_cipher_suite_t;
#include "tls.h"
#include "tls_prf.h"
+#include "tls_protection.h"
#include <credentials/keys/private_key.h>
+/**
+ * TLS cipher suites
+ */
+enum tls_cipher_suite_t {
+ TLS_NULL_WITH_NULL_NULL = 0x00,
+ TLS_RSA_WITH_NULL_MD5 = 0x01,
+ TLS_RSA_WITH_NULL_SHA = 0x02,
+ TLS_RSA_WITH_NULL_SHA256 = 0x3B,
+ TLS_RSA_WITH_RC4_128_MD5 = 0x04,
+ TLS_RSA_WITH_RC4_128_SHA = 0x05,
+ TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x0A,
+ TLS_RSA_WITH_AES_128_CBC_SHA = 0x2F,
+ TLS_RSA_WITH_AES_256_CBC_SHA = 0x35,
+ TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x3C,
+ TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x3D,
+ TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x0D,
+ TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x10,
+ TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x13,
+ TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x16,
+ TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x30,
+ TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0x31,
+ TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x32,
+ TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x33,
+ TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x36,
+ TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0x37,
+ TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x38,
+ TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x39,
+ TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = 0x3E,
+ TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = 0x3F,
+ TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x40,
+ TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x67,
+ TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = 0x68,
+ TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = 0x69,
+ TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x6A,
+ TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x6B,
+ TLS_DH_ANON_WITH_RC4_128_MD5 = 0x18,
+ TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA = 0x1B,
+ TLS_DH_ANON_WITH_AES_128_CBC_SHA = 0x34,
+ TLS_DH_ANON_WITH_AES_256_CBC_SHA = 0x3A,
+ TLS_DH_ANON_WITH_AES_128_CBC_SHA256 = 0x6C,
+ TLS_DH_ANON_WITH_AES_256_CBC_SHA256 = 0x6D,
+};
+
/**
* TLS crypto helper functions.
*/
tls_cipher_suite_t (*select_cipher_suite)(tls_crypto_t *this,
tls_cipher_suite_t *suites, int count);
+ /**
+ * Set the protection layer of the TLS stack to control it.
+ *
+ * @param protection protection layer to work on
+ */
+ void (*set_protection)(tls_crypto_t *this, tls_protection_t *protection);
+
/**
* Store exchanged handshake data, used for cryptographic operations.
*