Add cipher_set_padding() (no effect yet)

Fix pattern in tests/.gitignore along the way.
diff --git a/include/polarssl/cipher.h b/include/polarssl/cipher.h
index 8aa8cb0..48fe97d 100644
--- a/include/polarssl/cipher.h
+++ b/include/polarssl/cipher.h
@@ -105,6 +105,10 @@
 } cipher_mode_t;
 
 typedef enum {
+    POLARSSL_PADDING_PKCS7 = 0,     /**< PKCS7 padding (default) */
+} cipher_padding_t;
+
+typedef enum {
     POLARSSL_OPERATION_NONE = -1,
     POLARSSL_DECRYPT = 0,
     POLARSSL_ENCRYPT,
@@ -399,6 +403,18 @@
         const operation_t operation );
 
 /**
+ * \brief               Set padding mode, for cipher modes that use padding.
+ *                      (Default: PKCS7 padding.)
+ *
+ * \param ctx           generic cipher context
+ * \param mode          padding mode
+ *
+ * \returns             0 on success, POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+ *                      if parameters verification fails.
+ */
+int cipher_set_padding_mode( cipher_context_t *ctx, cipher_padding_t mode );
+
+/**
  * \brief               Reset the given context, setting the IV to iv
  *
  * \param ctx           generic cipher context
diff --git a/library/cipher.c b/library/cipher.c
index 2a2d782..d2c8ab3 100644
--- a/library/cipher.c
+++ b/library/cipher.c
@@ -368,6 +368,18 @@
     return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
 }
 
+int cipher_set_padding_mode( cipher_context_t *ctx, cipher_padding_t mode )
+{
+    if( NULL == ctx ||
+        POLARSSL_MODE_CBC != ctx->cipher_info->mode ||
+        POLARSSL_PADDING_PKCS7 != mode )
+    {
+        return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
+    }
+
+    return 0;
+}
+
 int cipher_reset( cipher_context_t *ctx, const unsigned char *iv )
 {
     if( NULL == ctx || NULL == ctx->cipher_info || NULL == iv )
diff --git a/tests/.gitignore b/tests/.gitignore
index 084f664..0d59058 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,2 +1,2 @@
-test_suite*
+/test_suite*
 data_files/mpi_write
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7c01f39..17d31e9 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -44,6 +44,7 @@
 add_test_suite(cipher cipher.camellia)
 add_test_suite(cipher cipher.des)
 add_test_suite(cipher cipher.null)
+add_test_suite(cipher cipher.padding)
 add_test_suite(ctr_drbg)
 add_test_suite(debug)
 add_test_suite(des)
diff --git a/tests/Makefile b/tests/Makefile
index 2435634..b78062c 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -30,6 +30,7 @@
 		test_suite_cipher.blowfish						\
 		test_suite_cipher.camellia						\
 		test_suite_cipher.des	test_suite_cipher.null	\
+		test_suite_cipher.padding						\
 		test_suite_ctr_drbg		test_suite_debug		\
 		test_suite_des			test_suite_dhm			\
 		test_suite_ecdh			test_suite_ecdsa		\
@@ -89,6 +90,10 @@
 	echo   "  Generate	$@"
 	scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.null
 
+test_suite_cipher.padding.c : suites/test_suite_cipher.function suites/test_suite_cipher.padding.data scripts/generate_code.pl suites/helpers.function
+	echo   "  Generate	$@"
+	scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.padding
+
 test_suite_gcm.decrypt_128.c : suites/test_suite_gcm.function suites/test_suite_gcm.decrypt_128.data scripts/generate_code.pl suites/helpers.function
 	echo   "  Generate	$@"
 	scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.decrypt_128
@@ -169,6 +174,10 @@
 	echo   "  CC    	$@.c"
 	$(CC) $(CFLAGS) $(OFLAGS) $@.c	$(LDFLAGS) -o $@
 
+test_suite_cipher.padding: test_suite_cipher.padding.c ../library/libpolarssl.a
+	echo   "  CC    	$@.c"
+	$(CC) $(CFLAGS) $(OFLAGS) $@.c	$(LDFLAGS) -o $@
+
 test_suite_ctr_drbg: test_suite_ctr_drbg.c ../library/libpolarssl.a
 	echo   "  CC    	$@.c"
 	$(CC) $(CFLAGS) $(OFLAGS) $@.c	$(LDFLAGS) -o $@
diff --git a/tests/suites/test_suite_cipher.function b/tests/suites/test_suite_cipher.function
index b7115d9..3024623 100644
--- a/tests/suites/test_suite_cipher.function
+++ b/tests/suites/test_suite_cipher.function
@@ -252,6 +252,19 @@
     TEST_ASSERT( 0 == cipher_free_ctx( &ctx_enc ) );
 END_CASE
 
+BEGIN_CASE
+set_padding:cipher_id:pad_mode:ret:
+    const cipher_info_t *cipher_info;
+    cipher_context_t ctx;
+
+    cipher_info = cipher_info_from_type( {cipher_id} );
+    TEST_ASSERT( NULL != cipher_info );
+    TEST_ASSERT( 0 == cipher_init_ctx( &ctx, cipher_info ) );
+
+    TEST_ASSERT( {ret} == cipher_set_padding_mode( &ctx, {pad_mode} ) );
+
+    TEST_ASSERT( 0 == cipher_free_ctx( &ctx ) );
+END_CASE
 
 BEGIN_CASE
 cipher_selftest:
diff --git a/tests/suites/test_suite_cipher.padding.data b/tests/suites/test_suite_cipher.padding.data
new file mode 100644
index 0000000..3ed6ade
--- /dev/null
+++ b/tests/suites/test_suite_cipher.padding.data
@@ -0,0 +1,59 @@
+Set padding with AES-CBC
+depends_on:POLARSSL_AES_C
+set_padding:POLARSSL_CIPHER_AES_128_CBC:POLARSSL_PADDING_PKCS7:0
+
+Set padding with AES-CFB
+depends_on:POLARSSL_AES_C:POLARSSL_CIPHER_MODE_CFB
+set_padding:POLARSSL_CIPHER_AES_128_CFB128:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set padding with AES-CTR
+depends_on:POLARSSL_AES_C:POLARSSL_CIPHER_MODE_CTR
+set_padding:POLARSSL_CIPHER_AES_128_CTR:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set padding with CAMELLIA-CBC
+depends_on:POLARSSL_CAMELLIA_C
+set_padding:POLARSSL_CIPHER_CAMELLIA_128_CBC:POLARSSL_PADDING_PKCS7:0
+
+Set padding with CAMELLIA-CFB
+depends_on:POLARSSL_CAMELLIA_C:POLARSSL_CIPHER_MODE_CFB
+set_padding:POLARSSL_CIPHER_CAMELLIA_128_CFB128:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set padding with CAMELLIA-CTR
+depends_on:POLARSSL_CAMELLIA_C:POLARSSL_CIPHER_MODE_CTR
+set_padding:POLARSSL_CIPHER_CAMELLIA_128_CTR:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set padding with DES-CBC
+depends_on:POLARSSL_DES_C
+set_padding:POLARSSL_CIPHER_DES_CBC:POLARSSL_PADDING_PKCS7:0
+
+Set padding with BLOWFISH-CBC
+depends_on:POLARSSL_BLOWFISH_C
+set_padding:POLARSSL_CIPHER_BLOWFISH_CBC:POLARSSL_PADDING_PKCS7:0
+
+Set padding with BLOWFISH-CFB
+depends_on:POLARSSL_BLOWFISH_C:POLARSSL_CIPHER_MODE_CFB
+set_padding:POLARSSL_CIPHER_BLOWFISH_CFB64:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set padding with BLOWFISH-CTR
+depends_on:POLARSSL_BLOWFISH_C:POLARSSL_CIPHER_MODE_CTR
+set_padding:POLARSSL_CIPHER_BLOWFISH_CTR:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set padding with NULL
+depends_on:POLARSSL_CIPHER_NULL_CIPHER
+set_padding:POLARSSL_CIPHER_NULL:POLARSSL_PADDING_PKCS7:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set non-existent padding with AES-CBC
+depends_on:POLARSSL_AES_C
+set_padding:POLARSSL_CIPHER_AES_128_CBC:-1:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set non-existent padding with CAMELLIA-CBC
+depends_on:POLARSSL_CAMELLIA_C
+set_padding:POLARSSL_CIPHER_CAMELLIA_128_CBC:-1:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set non-existent padding with DES-CBC
+depends_on:POLARSSL_DES_C
+set_padding:POLARSSL_CIPHER_DES_CBC:-1:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA
+
+Set non-existent padding with BLOWFISH-CBC
+depends_on:POLARSSL_BLOWFISH_C
+set_padding:POLARSSL_CIPHER_BLOWFISH_CBC:-1:POLARSSL_ERR_CIPHER_BAD_INPUT_DATA