From 37e230c0226f435f4029f0aa5702c164326a07f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20P=C3=A9gouri=C3=A9-Gonnard?= Date: Wed, 28 Aug 2013 13:50:42 +0200 Subject: [PATCH] Add arc4 support in the cipher layer --- include/polarssl/cipher.h | 4 + library/cipher.c | 29 ++++++ library/cipher_wrap.c | 35 ++++++-- tests/CMakeLists.txt | 1 + tests/Makefile | 9 ++ tests/suites/test_suite_cipher.arc4.data | 110 +++++++++++++++++++++++ 6 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 tests/suites/test_suite_cipher.arc4.data diff --git a/include/polarssl/cipher.h b/include/polarssl/cipher.h index 0ab2b563b..3164a9a63 100644 --- a/include/polarssl/cipher.h +++ b/include/polarssl/cipher.h @@ -151,6 +151,10 @@ typedef struct { int (*ctr_func)( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ); + /** Encrypt using STREAM */ + int (*stream_func)( void *ctx, size_t length, + const unsigned char *input, unsigned char *output ); + /** Set key for encryption purposes */ int (*setkey_enc_func)( void *ctx, const unsigned char *key, unsigned int key_length); diff --git a/library/cipher.c b/library/cipher.c index 826d8fcd2..5a260a0bc 100644 --- a/library/cipher.c +++ b/library/cipher.c @@ -36,6 +36,10 @@ #include +#if defined(POLARSSL_ARC4_C) +#define POLARSSL_CIPHER_MODE_STREAM +#endif + #if defined _MSC_VER && !defined strcasecmp #define strcasecmp _stricmp #endif @@ -61,6 +65,10 @@ static const int supported_ciphers[] = { #endif /* defined(POLARSSL_AES_C) */ +#if defined(POLARSSL_ARC4_C) + POLARSSL_CIPHER_ARC4_128, +#endif + #if defined(POLARSSL_CAMELLIA_C) POLARSSL_CIPHER_CAMELLIA_128_CBC, POLARSSL_CIPHER_CAMELLIA_192_CBC, @@ -279,6 +287,11 @@ const cipher_info_t *cipher_info_from_string( const char *cipher_name ) #endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ #endif +#if defined(POLARSSL_ARC4_C) + if( !strcasecmp( "ARC4-128", cipher_name ) ) + return( cipher_info_from_type( POLARSSL_CIPHER_ARC4_128 ) ); +#endif + #if defined(POLARSSL_DES_C) if( !strcasecmp( "DES-CBC", cipher_name ) ) return cipher_info_from_type( POLARSSL_CIPHER_DES_CBC ); @@ -527,6 +540,21 @@ int cipher_update( cipher_context_t *ctx, const unsigned char *input, size_t ile } #endif +#if defined(POLARSSL_CIPHER_MODE_STREAM) + if( ctx->cipher_info->mode == POLARSSL_MODE_STREAM ) + { + if( 0 != ( ret = ctx->cipher_info->base->stream_func( ctx->cipher_ctx, + ilen, input, output ) ) ) + { + return ret; + } + + *olen = ilen; + + return 0; + } +#endif + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; } @@ -697,6 +725,7 @@ int cipher_finish( cipher_context_t *ctx, unsigned char *output, size_t *olen) if( POLARSSL_MODE_CFB == ctx->cipher_info->mode || POLARSSL_MODE_CTR == ctx->cipher_info->mode || + POLARSSL_MODE_STREAM == 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 baff2aac3..7a4ff753b 100644 --- a/library/cipher_wrap.c +++ b/library/cipher_wrap.c @@ -37,6 +37,10 @@ #include "polarssl/aes.h" #endif +#if defined(POLARSSL_ARC4_C) +#include "polarssl/arc4.h" +#endif + #if defined(POLARSSL_CAMELLIA_C) #include "polarssl/camellia.h" #endif @@ -129,6 +133,7 @@ const cipher_base_t aes_info = { aes_crypt_cbc_wrap, aes_crypt_cfb128_wrap, aes_crypt_ctr_wrap, + NULL, aes_setkey_enc_wrap, aes_setkey_dec_wrap, aes_ctx_alloc, @@ -324,6 +329,7 @@ const cipher_base_t camellia_info = { camellia_crypt_cbc_wrap, camellia_crypt_cfb128_wrap, camellia_crypt_ctr_wrap, + NULL, camellia_setkey_enc_wrap, camellia_setkey_dec_wrap, camellia_ctx_alloc, @@ -531,6 +537,7 @@ const cipher_base_t des_info = { des_crypt_cbc_wrap, des_crypt_cfb128_wrap, des_crypt_ctr_wrap, + NULL, des_setkey_enc_wrap, des_setkey_dec_wrap, des_ctx_alloc, @@ -552,6 +559,7 @@ const cipher_base_t des_ede_info = { des3_crypt_cbc_wrap, des_crypt_cfb128_wrap, des_crypt_ctr_wrap, + NULL, des3_set2key_enc_wrap, des3_set2key_dec_wrap, des3_ctx_alloc, @@ -573,6 +581,7 @@ const cipher_base_t des_ede3_info = { des3_crypt_cbc_wrap, des_crypt_cfb128_wrap, des_crypt_ctr_wrap, + NULL, des3_set3key_enc_wrap, des3_set3key_dec_wrap, des3_ctx_alloc, @@ -661,6 +670,7 @@ const cipher_base_t blowfish_info = { blowfish_crypt_cbc_wrap, blowfish_crypt_cfb64_wrap, blowfish_crypt_ctr_wrap, + NULL, blowfish_setkey_enc_wrap, blowfish_setkey_dec_wrap, blowfish_ctx_alloc, @@ -703,15 +713,28 @@ const cipher_info_t blowfish_ctr_info = { #endif /* POLARSSL_BLOWFISH_C */ #if defined(POLARSSL_ARC4_C) -static void * arc4_ctx_alloc( void ) +static int arc4_crypt_stream_wrap( void *ctx, size_t length, + const unsigned char *input, + unsigned char *output ) { - return (void *) 1; + return( arc4_crypt( (arc4_context *) ctx, length, input, output ) ); } +static int arc4_setkey_wrap( void *ctx, const unsigned char *key, + unsigned int key_length ) +{ + arc4_setup( (arc4_context *) ctx, key, key_length ); + return( 0 ); +} + +static void * arc4_ctx_alloc( void ) +{ + return polarssl_malloc( sizeof( arc4_context ) ); +} static void arc4_ctx_free( void *ctx ) { - ((void) ctx); + polarssl_free( ctx ); } const cipher_base_t arc4_base_info = { @@ -719,8 +742,9 @@ const cipher_base_t arc4_base_info = { NULL, NULL, NULL, - NULL, - NULL, + arc4_crypt_stream_wrap, + arc4_setkey_wrap, + arc4_setkey_wrap, arc4_ctx_alloc, arc4_ctx_free }; @@ -755,6 +779,7 @@ const cipher_base_t null_base_info = { NULL, NULL, NULL, + NULL, null_ctx_alloc, null_ctx_free }; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2bd41c0af..cac80a4c9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,6 +40,7 @@ add_test_suite(base64) add_test_suite(blowfish) add_test_suite(camellia) add_test_suite(cipher cipher.aes) +add_test_suite(cipher cipher.arc4) add_test_suite(cipher cipher.blowfish) add_test_suite(cipher cipher.camellia) add_test_suite(cipher cipher.des) diff --git a/tests/Makefile b/tests/Makefile index 4d70858e8..ad678ea76 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -27,6 +27,7 @@ APPS = test_suite_aes.ecb test_suite_aes.cbc \ test_suite_arc4 \ test_suite_base64 test_suite_blowfish \ test_suite_camellia test_suite_cipher.aes \ + test_suite_cipher.arc4 \ test_suite_cipher.blowfish \ test_suite_cipher.camellia \ test_suite_cipher.des test_suite_cipher.null \ @@ -74,6 +75,10 @@ test_suite_cipher.aes.c : suites/test_suite_cipher.function suites/test_suite_ci echo " Generate $@" scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.aes +test_suite_cipher.arc4.c : suites/test_suite_cipher.function suites/test_suite_cipher.arc4.data scripts/generate_code.pl suites/helpers.function suites/main_test.function + echo " Generate $@" + scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.arc4 + test_suite_cipher.blowfish.c : suites/test_suite_cipher.function suites/test_suite_cipher.blowfish.data scripts/generate_code.pl suites/helpers.function suites/main_test.function echo " Generate $@" scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.blowfish @@ -158,6 +163,10 @@ test_suite_cipher.aes: test_suite_cipher.aes.c ../library/libpolarssl.a echo " CC $@.c" $(CC) $(CFLAGS) $(OFLAGS) $@.c $(LDFLAGS) -o $@ +test_suite_cipher.arc4: test_suite_cipher.arc4.c ../library/libpolarssl.a + echo " CC $@.c" + $(CC) $(CFLAGS) $(OFLAGS) $@.c $(LDFLAGS) -o $@ + test_suite_cipher.blowfish: test_suite_cipher.blowfish.c ../library/libpolarssl.a echo " CC $@.c" $(CC) $(CFLAGS) $(OFLAGS) $@.c $(LDFLAGS) -o $@ diff --git a/tests/suites/test_suite_cipher.arc4.data b/tests/suites/test_suite_cipher.arc4.data new file mode 100644 index 000000000..93d35b35d --- /dev/null +++ b/tests/suites/test_suite_cipher.arc4.data @@ -0,0 +1,110 @@ +Cipher Selftest +depends_on:POLARSSL_SELF_TEST +cipher_selftest: + +Decrypt empty buffer +dec_empty_buf: + +ARC4 Encrypt and decrypt 0 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:0:-1 + +ARC4 Encrypt and decrypt 1 byte +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:1:-1 + +ARC4 Encrypt and decrypt 2 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:2:-1 + +ARC4 Encrypt and decrypt 7 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:7:-1 + +ARC4 Encrypt and decrypt 8 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:8:-1 + +ARC4 Encrypt and decrypt 9 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:9:-1 + +ARC4 Encrypt and decrypt 15 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:15:-1 + +ARC4 Encrypt and decrypt 16 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:16:-1 + +ARC4 Encrypt and decrypt 17 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:17:-1 + +ARC4 Encrypt and decrypt 31 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:31:-1 + +ARC4 Encrypt and decrypt 32 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:32:-1 + +ARC4 Encrypt and decrypt 32 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:33:-1 + +ARC4 Encrypt and decrypt 47 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:47:-1 + +ARC4 Encrypt and decrypt 48 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:48:-1 + +ARC4 Encrypt and decrypt 49 bytes +depends_on:POLARSSL_ARC4_C +enc_dec_buf:POLARSSL_CIPHER_ARC4_128:"ARC4-128":128:49:-1 + +ARC4 Encrypt and decrypt 0 bytes in multiple parts +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:0:0: + +ARC4 Encrypt and decrypt 1 bytes in multiple parts 1 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:1:0: + +ARC4 Encrypt and decrypt 1 bytes in multiple parts 2 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:0:1: + +ARC4 Encrypt and decrypt 16 bytes in multiple parts 1 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:16:0: + +ARC4 Encrypt and decrypt 16 bytes in multiple parts 2 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:0:16: + +ARC4 Encrypt and decrypt 16 bytes in multiple parts 3 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:1:15: + +ARC4 Encrypt and decrypt 16 bytes in multiple parts 4 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:15:1: + +ARC4 Encrypt and decrypt 22 bytes in multiple parts 1 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:15:7: + +ARC4 Encrypt and decrypt 22 bytes in multiple parts 1 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:16:6: + +ARC4 Encrypt and decrypt 22 bytes in multiple parts 1 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:17:6: + +ARC4 Encrypt and decrypt 32 bytes in multiple parts 1 +depends_on:POLARSSL_ARC4_C +enc_dec_buf_multipart:POLARSSL_CIPHER_ARC4_128:128:16:16: