- Added support for NULL cipher (POLARSSL_CIPHER_NULL_CIPHER) and weak ciphersuites (POLARSSL_ENABLE_WEAK_CIPHERSUITES). They are disabled by default!
diff --git a/library/cipher.c b/library/cipher.c
index 485a09b..85c74ab 100644
--- a/library/cipher.c
+++ b/library/cipher.c
@@ -5,7 +5,7 @@
*
* \author Adriaan de Jong <dejong@fox-it.com>
*
- * Copyright (C) 2006-2010, Brainspark B.V.
+ * Copyright (C) 2006-2012, Brainspark B.V.
*
* This file is part of PolarSSL (http://www.polarssl.org)
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
@@ -86,6 +86,10 @@
POLARSSL_CIPHER_DES_EDE3_CBC,
#endif /* defined(POLARSSL_DES_C) */
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ POLARSSL_CIPHER_NULL,
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
0
};
@@ -164,6 +168,11 @@
return &des_ede3_cbc_info;
#endif
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ case POLARSSL_CIPHER_NULL:
+ return &null_cipher_info;
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
default:
return NULL;
}
@@ -237,6 +246,12 @@
if( !strcasecmp( "DES-EDE3-CBC", cipher_name ) )
return cipher_info_from_type( POLARSSL_CIPHER_DES_EDE3_CBC );
#endif
+
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ if( !strcasecmp( "NULL", cipher_name ) )
+ return cipher_info_from_type( POLARSSL_CIPHER_NULL );
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
return NULL;
}
@@ -274,6 +289,11 @@
ctx->key_length = key_length;
ctx->operation = operation;
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ if( ctx->cipher_info->mode == POLARSSL_MODE_NULL )
+ return 0;
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
/*
* For CFB128 and CTR mode always use the encryption key schedule
*/
@@ -318,6 +338,15 @@
*olen = 0;
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ if( ctx->cipher_info->mode == POLARSSL_MODE_NULL )
+ {
+ memcpy( output, input, ilen );
+ *olen = ilen;
+ return 0;
+ }
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
if( ctx->cipher_info->mode == POLARSSL_MODE_CBC )
{
/*
@@ -465,7 +494,8 @@
*olen = 0;
if( POLARSSL_MODE_CFB128 == ctx->cipher_info->mode ||
- POLARSSL_MODE_CTR == ctx->cipher_info->mode )
+ POLARSSL_MODE_CTR == ctx->cipher_info->mode ||
+ POLARSSL_MODE_NULL == ctx->cipher_info->mode )
{
return 0;
}
diff --git a/library/cipher_wrap.c b/library/cipher_wrap.c
index 8edc06f..c5aa99b 100644
--- a/library/cipher_wrap.c
+++ b/library/cipher_wrap.c
@@ -5,7 +5,7 @@
*
* \author Adriaan de Jong <dejong@fox-it.com>
*
- * Copyright (C) 2006-2011, Brainspark B.V.
+ * Copyright (C) 2006-2012, Brainspark B.V.
*
* This file is part of PolarSSL (http://www.polarssl.org)
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
@@ -549,4 +549,38 @@
};
#endif
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+static void * null_ctx_alloc( void )
+{
+ return (void *) 1;
+}
+
+
+static void null_ctx_free( void *ctx )
+{
+ ((void) ctx);
+}
+
+const cipher_base_t null_base_info = {
+ POLARSSL_CIPHER_ID_NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ null_ctx_alloc,
+ null_ctx_free
+};
+
+const cipher_info_t null_cipher_info = {
+ POLARSSL_CIPHER_NULL,
+ POLARSSL_MODE_NULL,
+ 0,
+ "NULL",
+ 1,
+ 1,
+ &null_base_info
+};
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
#endif
diff --git a/library/ssl_cli.c b/library/ssl_cli.c
index 95ceea6..7547d9f 100644
--- a/library/ssl_cli.c
+++ b/library/ssl_cli.c
@@ -1,7 +1,7 @@
/*
* SSLv3/TLSv1 client-side functions
*
- * Copyright (C) 2006-2010, Brainspark B.V.
+ * Copyright (C) 2006-2012, Brainspark B.V.
*
* This file is part of PolarSSL (http://www.polarssl.org)
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
@@ -342,7 +342,8 @@
SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
- if( ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
+ if( ssl->session->ciphersuite != SSL_EDH_RSA_DES_SHA &&
+ ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
@@ -536,7 +537,8 @@
SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
- if( ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
+ if( ssl->session->ciphersuite == SSL_EDH_RSA_DES_SHA ||
+ ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
diff --git a/library/ssl_srv.c b/library/ssl_srv.c
index 5f2891d..70ca5bb 100644
--- a/library/ssl_srv.c
+++ b/library/ssl_srv.c
@@ -1,7 +1,7 @@
/*
* SSLv3/TLSv1 server-side functions
*
- * Copyright (C) 2006-2010, Brainspark B.V.
+ * Copyright (C) 2006-2012, Brainspark B.V.
*
* This file is part of PolarSSL (http://www.polarssl.org)
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
@@ -544,7 +544,8 @@
SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
- if( ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
+ if( ssl->session->ciphersuite != SSL_EDH_RSA_DES_SHA &&
+ ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
@@ -716,7 +717,8 @@
return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
}
- if( ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
+ if( ssl->session->ciphersuite == SSL_EDH_RSA_DES_SHA ||
+ ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index 44e972c..bbe8388 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -1,7 +1,7 @@
/*
* SSLv3/TLSv1 shared functions
*
- * Copyright (C) 2006-2010, Brainspark B.V.
+ * Copyright (C) 2006-2012, Brainspark B.V.
*
* This file is part of PolarSSL (http://www.polarssl.org)
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
@@ -41,6 +41,7 @@
#include "polarssl/des.h"
#include "polarssl/debug.h"
#include "polarssl/ssl.h"
+#include "polarssl/sha2.h"
#include <stdlib.h>
#include <time.h>
@@ -277,6 +278,33 @@
break;
#endif
+#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ case SSL_RSA_NULL_MD5:
+ ssl->keylen = 0; ssl->minlen = 0;
+ ssl->ivlen = 0; ssl->maclen = 16;
+ break;
+
+ case SSL_RSA_NULL_SHA:
+ ssl->keylen = 0; ssl->minlen = 0;
+ ssl->ivlen = 0; ssl->maclen = 20;
+ break;
+
+ case SSL_RSA_NULL_SHA256:
+ ssl->keylen = 0; ssl->minlen = 0;
+ ssl->ivlen = 0; ssl->maclen = 32;
+ break;
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
+#if defined(POLARSSL_DES_C)
+ case SSL_RSA_DES_SHA:
+ case SSL_EDH_RSA_DES_SHA:
+ ssl->keylen = 8; ssl->minlen = 8;
+ ssl->ivlen = 8; ssl->maclen = 20;
+ break;
+#endif
+#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
+
default:
SSL_DEBUG_MSG( 1, ( "ciphersuite %s is not available",
ssl_get_ciphersuite( ssl ) ) );
@@ -366,6 +394,23 @@
break;
#endif
+#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ case SSL_RSA_NULL_MD5:
+ case SSL_RSA_NULL_SHA:
+ case SSL_RSA_NULL_SHA256:
+ break;
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
+#if defined(POLARSSL_DES_C)
+ case SSL_RSA_DES_SHA:
+ case SSL_EDH_RSA_DES_SHA:
+ des_setkey_enc( (des_context *) ssl->ctx_enc, key1 );
+ des_setkey_dec( (des_context *) ssl->ctx_dec, key2 );
+ break;
+#endif
+#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
+
default:
return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
}
@@ -521,7 +566,12 @@
if( ssl->maclen == 20 )
sha1_hmac( ssl->mac_enc, 20,
ssl->out_ctr, ssl->out_msglen + 13,
- ssl->out_msg + ssl->out_msglen );
+ ssl->out_msg + ssl->out_msglen );
+
+ if( ssl->maclen == 32 )
+ sha2_hmac( ssl->mac_enc, 32,
+ ssl->out_ctr, ssl->out_msglen + 13,
+ ssl->out_msg + ssl->out_msglen, 0);
}
SSL_DEBUG_BUF( 4, "computed mac",
@@ -535,7 +585,6 @@
if( ssl->ivlen == 0 )
{
-#if defined(POLARSSL_ARC4_C)
padlen = 0;
SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
@@ -545,12 +594,23 @@
SSL_DEBUG_BUF( 4, "before encrypt: output payload",
ssl->out_msg, ssl->out_msglen );
- arc4_crypt( (arc4_context *) ssl->ctx_enc,
- ssl->out_msglen, ssl->out_msg,
- ssl->out_msg );
-#else
- return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
+#if defined(POLARSSL_ARC4_C)
+ if( ssl->session->ciphersuite == SSL_RSA_RC4_128_MD5 ||
+ ssl->session->ciphersuite == SSL_RSA_RC4_128_SHA )
+ {
+ arc4_crypt( (arc4_context *) ssl->ctx_enc,
+ ssl->out_msglen, ssl->out_msg,
+ ssl->out_msg );
+ } else
#endif
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ if( ssl->session->ciphersuite == SSL_RSA_NULL_MD5 ||
+ ssl->session->ciphersuite == SSL_RSA_NULL_SHA ||
+ ssl->session->ciphersuite == SSL_RSA_NULL_SHA256 )
+ {
+ } else
+#endif
+ return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
}
else
{
@@ -605,11 +665,21 @@
switch( ssl->ivlen )
{
- case 8:
#if defined(POLARSSL_DES_C)
- des3_crypt_cbc( (des3_context *) ssl->ctx_enc,
- DES_ENCRYPT, enc_msglen,
- ssl->iv_enc, enc_msg, enc_msg );
+ case 8:
+#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
+ if( ssl->session->ciphersuite == SSL_RSA_DES_SHA ||
+ ssl->session->ciphersuite == SSL_EDH_RSA_DES_SHA )
+ {
+ des_crypt_cbc( (des_context *) ssl->ctx_enc,
+ DES_ENCRYPT, enc_msglen,
+ ssl->iv_enc, enc_msg, enc_msg );
+ }
+ else
+#endif
+ des3_crypt_cbc( (des3_context *) ssl->ctx_enc,
+ DES_ENCRYPT, enc_msglen,
+ ssl->iv_enc, enc_msg, enc_msg );
break;
#endif
@@ -650,10 +720,15 @@
return( 0 );
}
+/*
+ * TODO: Use digest version when integrated!
+ */
+#define POLARSSL_SSL_MAX_MAC_SIZE 32
+
static int ssl_decrypt_buf( ssl_context *ssl )
{
size_t i, padlen;
- unsigned char tmp[20];
+ unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
@@ -668,12 +743,22 @@
{
#if defined(POLARSSL_ARC4_C)
padlen = 0;
- arc4_crypt( (arc4_context *) ssl->ctx_dec,
+ if( ssl->session->ciphersuite == SSL_RSA_RC4_128_MD5 ||
+ ssl->session->ciphersuite == SSL_RSA_RC4_128_SHA )
+ {
+ arc4_crypt( (arc4_context *) ssl->ctx_dec,
ssl->in_msglen, ssl->in_msg,
ssl->in_msg );
-#else
- return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
+ } else
#endif
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ if( ssl->session->ciphersuite == SSL_RSA_NULL_MD5 ||
+ ssl->session->ciphersuite == SSL_RSA_NULL_SHA ||
+ ssl->session->ciphersuite == SSL_RSA_NULL_SHA256 )
+ {
+ } else
+#endif
+ return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
}
else
{
@@ -712,9 +797,19 @@
{
#if defined(POLARSSL_DES_C)
case 8:
- des3_crypt_cbc( (des3_context *) ssl->ctx_dec,
- DES_DECRYPT, dec_msglen,
- ssl->iv_dec, dec_msg, dec_msg_result );
+#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
+ if( ssl->session->ciphersuite == SSL_RSA_DES_SHA ||
+ ssl->session->ciphersuite == SSL_EDH_RSA_DES_SHA )
+ {
+ des_crypt_cbc( (des_context *) ssl->ctx_dec,
+ DES_DECRYPT, dec_msglen,
+ ssl->iv_dec, dec_msg, dec_msg_result );
+ }
+ else
+#endif
+ des3_crypt_cbc( (des3_context *) ssl->ctx_dec,
+ DES_DECRYPT, dec_msglen,
+ ssl->iv_dec, dec_msg, dec_msg_result );
break;
#endif
@@ -790,7 +885,7 @@
ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
- memcpy( tmp, ssl->in_msg + ssl->in_msglen, 20 );
+ memcpy( tmp, ssl->in_msg + ssl->in_msglen, POLARSSL_SSL_MAX_MAC_SIZE );
if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
{
@@ -798,7 +893,7 @@
ssl_mac_md5( ssl->mac_dec,
ssl->in_msg, ssl->in_msglen,
ssl->in_ctr, ssl->in_msgtype );
- else
+ else if( ssl->maclen == 20 )
ssl_mac_sha1( ssl->mac_dec,
ssl->in_msg, ssl->in_msglen,
ssl->in_ctr, ssl->in_msgtype );
@@ -809,10 +904,14 @@
md5_hmac( ssl->mac_dec, 16,
ssl->in_ctr, ssl->in_msglen + 13,
ssl->in_msg + ssl->in_msglen );
- else
+ else if( ssl->maclen == 20 )
sha1_hmac( ssl->mac_dec, 20,
ssl->in_ctr, ssl->in_msglen + 13,
ssl->in_msg + ssl->in_msglen );
+ else if( ssl->maclen == 32 )
+ sha2_hmac( ssl->mac_dec, 32,
+ ssl->in_ctr, ssl->in_msglen + 13,
+ ssl->in_msg + ssl->in_msglen, 0 );
}
SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->maclen );
@@ -1991,6 +2090,24 @@
return( "SSL-EDH-RSA-CAMELLIA-256-SHA" );
#endif
+#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ case SSL_RSA_NULL_MD5:
+ return( "SSL-RSA-NULL-MD5" );
+ case SSL_RSA_NULL_SHA:
+ return( "SSL-RSA-NULL-SHA" );
+ case SSL_RSA_NULL_SHA256:
+ return( "SSL-RSA-NULL-SHA256" );
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
+#if defined(POLARSSL_DES_C)
+ case SSL_RSA_DES_SHA:
+ return( "SSL-RSA-DES-SHA" );
+ case SSL_EDH_RSA_DES_SHA:
+ return( "SSL-EDH-RSA-DES-SHA" );
+#endif
+#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
+
default:
break;
}
@@ -2036,6 +2153,24 @@
return( SSL_EDH_RSA_CAMELLIA_256_SHA );
#endif
+#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
+#if defined(POLARSSL_CIPHER_NULL_CIPHER)
+ if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-NULL-MD5"))
+ return( SSL_RSA_NULL_MD5 );
+ if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-NULL-SHA"))
+ return( SSL_RSA_NULL_SHA );
+ if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-NULL-SHA256"))
+ return( SSL_RSA_NULL_SHA256 );
+#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
+
+#if defined(POLARSSL_DES_C)
+ if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-DES-SHA"))
+ return( SSL_RSA_DES_SHA );
+ if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-DES-SHA"))
+ return( SSL_EDH_RSA_DES_SHA );
+#endif
+#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
+
return( 0 );
}