- Added generic cipher wrapper for integration with OpenVPN (donated by Fox-IT)

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 81611ca..1bfce18 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -23,6 +23,7 @@
 add_test_suite(aes)
 add_test_suite(camellia)
 add_test_suite(des)
+add_test_suite(cipher)
 add_test_suite(rsa)
 add_test_suite(xtea)
 add_test_suite(dhm)
diff --git a/tests/Makefile b/tests/Makefile
index 2e4f88a..063245b 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -15,7 +15,8 @@
 		test_suite_mpi			test_suite_rsa		\
 		test_suite_shax			test_suite_x509parse\
 		test_suite_xtea			test_suite_debug	\
-		test_suite_version		test_suite_md
+		test_suite_version		test_suite_md		\
+		test_suite_cipher
 
 .SILENT:
 
@@ -41,6 +42,10 @@
 	echo   "  CC    	$@.c"
 	$(CC) $(CFLAGS) $(OFLAGS) $@.c	$(LDFLAGS) -o $@
 
+test_suite_cipher: test_suite_cipher.c ../library/libpolarssl.a
+	echo   "  CC    	$@.c"
+	$(CC) $(CFLAGS) $(OFLAGS) $@.c	$(LDFLAGS) -o $@
+
 test_suite_des: test_suite_des.c ../library/libpolarssl.a
 	echo   "  CC    	$@.c"
 	$(CC) $(CFLAGS) $(OFLAGS) $@.c	$(LDFLAGS) -o $@
diff --git a/tests/suites/test_suite_cipher.data b/tests/suites/test_suite_cipher.data
new file mode 100644
index 0000000..758aa84
--- /dev/null
+++ b/tests/suites/test_suite_cipher.data
@@ -0,0 +1,707 @@
+Cipher Selftest
+cipher_selftest:
+
+Decrypt empty buffer
+dec_empty_buf:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_128_CBC:AES-128-CBC:128:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_128_CBC:128:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_192_CBC:AES-192-CBC:192:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_192_CBC:192:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_AES_256_CBC:AES-256-CBC:256:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_AES_256_CBC:256:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_128_CBC:CAMELLIA-128-CBC:128:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_128_CBC:128:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_192_CBC:CAMELLIA-192-CBC:192:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_192_CBC:192:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_CAMELLIA_256_CBC:CAMELLIA-256-CBC:256:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_CAMELLIA_256_CBC:256:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_CBC:DES-CBC:56:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_CBC:56:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE_CBC:DES-EDE-CBC:112:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE_CBC:112:16:16:
+
+Encrypt and decrypt 0 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:0
+
+Encrypt and decrypt 1 byte
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:1
+
+Encrypt and decrypt 2 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:2
+
+Encrypt and decrypt 7 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:7
+
+Encrypt and decrypt 8 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:8
+
+Encrypt and decrypt 9 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:9
+
+Encrypt and decrypt 15 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:15
+
+Encrypt and decrypt 16 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:16
+
+Encrypt and decrypt 17 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:17
+
+Encrypt and decrypt 31 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:31
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:32
+
+Encrypt and decrypt 32 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:33
+
+Encrypt and decrypt 47 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:47
+
+Encrypt and decrypt 48 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:48
+
+Encrypt and decrypt 49 bytes
+enc_dec_buf:POLARSSL_CIPHER_DES_EDE3_CBC:DES-EDE3-CBC:168:49
+
+Encrypt and decrypt 0 bytes in multiple parts
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:0:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:1:0:
+
+Encrypt and decrypt 1 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:0:1:
+
+Encrypt and decrypt 16 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:16:0:
+
+Encrypt and decrypt 16 bytes in multiple parts 2
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:0:16:
+
+Encrypt and decrypt 16 bytes in multiple parts 3
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:1:15:
+
+Encrypt and decrypt 16 bytes in multiple parts 4
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:15:1:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:15:7:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:16:6:
+
+Encrypt and decrypt 22 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:17:6:
+
+Encrypt and decrypt 32 bytes in multiple parts 1
+enc_dec_buf_multipart:POLARSSL_CIPHER_DES_EDE3_CBC:168:16:16:
diff --git a/tests/suites/test_suite_cipher.function b/tests/suites/test_suite_cipher.function
new file mode 100644
index 0000000..17b8dc2
--- /dev/null
+++ b/tests/suites/test_suite_cipher.function
@@ -0,0 +1,184 @@
+BEGIN_HEADER
+#include <polarssl/config.h>
+#include <polarssl/cipher.h>
+END_HEADER
+
+BEGIN_CASE
+enc_dec_buf:cipher_id:cipher_string:key_len:length:
+    int length = {length};
+    unsigned char key[32];
+    unsigned char iv[16];
+
+    const cipher_info_t *cipher_info;
+    cipher_context_t ctx_dec;
+    cipher_context_t ctx_enc;
+
+    unsigned char inbuf[64];
+    unsigned char encbuf[64];
+    unsigned char decbuf[64];
+
+    int outlen = 0;
+    int enclen = 0;
+
+    memset( key, 0, 32 );
+    memset( iv , 0, 16 );
+    
+    memset( &ctx_dec, 0, sizeof( ctx_dec ) );
+    memset( &ctx_enc, 0, sizeof( ctx_enc ) );
+    
+    memset( inbuf, 5, 64 );
+    memset( encbuf, 0, 64 );
+    memset( decbuf, 0, 64 );
+
+    /* Check and get info structures */
+    cipher_info = cipher_info_from_type( {cipher_id} );
+    TEST_ASSERT( NULL != cipher_info );
+    TEST_ASSERT( cipher_info_from_string( "{cipher_string}" ) == cipher_info );
+
+    /* Initialise enc and dec contexts */
+    TEST_ASSERT( 0 == cipher_init_ctx( &ctx_dec, cipher_info ) );
+    TEST_ASSERT( 0 == cipher_init_ctx( &ctx_enc, cipher_info ) );
+    
+    TEST_ASSERT( 0 == cipher_setkey( &ctx_dec, key, {key_len}, POLARSSL_DECRYPT ) );
+    TEST_ASSERT( 0 == cipher_setkey( &ctx_enc, key, {key_len}, POLARSSL_ENCRYPT ) );
+
+    TEST_ASSERT( 0 == cipher_reset( &ctx_dec, iv ) );
+    TEST_ASSERT( 0 == cipher_reset( &ctx_enc, iv ) );
+
+    enclen = cipher_get_block_size( &ctx_enc )
+                    * ( 1 + length / cipher_get_block_size( &ctx_enc ) );
+
+    /* encode length number of bytes from inbuf */
+    TEST_ASSERT( 0 == cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) );
+    TEST_ASSERT( outlen == enclen - cipher_get_block_size ( &ctx_enc ) );
+    TEST_ASSERT( 0 == cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) );
+    TEST_ASSERT( outlen == cipher_get_block_size ( &ctx_enc ) );
+
+    /* decode the previously encoded string */
+    TEST_ASSERT( 0 == cipher_update( &ctx_dec, encbuf, enclen, decbuf, &outlen ) );
+    TEST_ASSERT( enclen - cipher_get_block_size ( &ctx_enc ) == outlen );
+    TEST_ASSERT( 0 == cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
+    TEST_ASSERT( length - enclen + cipher_get_block_size ( &ctx_enc ) == outlen );
+
+    TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
+
+    TEST_ASSERT( 0 == cipher_free_ctx( &ctx_dec ) );
+    TEST_ASSERT( 0 == cipher_free_ctx( &ctx_enc ) );
+END_CASE
+
+BEGIN_CASE
+dec_empty_buf:
+    unsigned char key[32];
+    unsigned char iv[16];
+
+    cipher_context_t ctx_dec;
+    const cipher_info_t *cipher_info;
+
+    unsigned char encbuf[64];
+    unsigned char decbuf[64];
+
+    int outlen = 0;
+
+    memset( key, 0, 32 );
+    memset( iv , 0, 16 );
+    
+    memset( &ctx_dec, 0, sizeof( ctx_dec ) );
+    
+    memset( encbuf, 0, 64 );
+    memset( decbuf, 0, 64 );
+
+    /* Initialise enc and dec contexts */
+    cipher_info = cipher_info_from_type( POLARSSL_CIPHER_AES_128_CBC );
+    TEST_ASSERT( NULL != cipher_info);
+    
+    TEST_ASSERT( 0 == cipher_init_ctx( &ctx_dec, cipher_info ) );
+
+    TEST_ASSERT( 0 == cipher_setkey( &ctx_dec, key, 128, POLARSSL_DECRYPT ) );
+
+    TEST_ASSERT( 0 == cipher_reset( &ctx_dec, iv ) );
+
+    /* decode 0-byte string */
+    TEST_ASSERT( 0 == cipher_update( &ctx_dec, encbuf, 0, decbuf, &outlen ) );
+    TEST_ASSERT( 0 == outlen );
+    TEST_ASSERT( 1 == cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
+    TEST_ASSERT( 0 == outlen );
+
+    TEST_ASSERT( 0 == cipher_free_ctx( &ctx_dec ) );
+END_CASE
+
+BEGIN_CASE
+enc_dec_buf_multipart:cipher_id:key_len:first_length:second_length:
+    int first_length = {first_length};
+    int second_length = {second_length};
+    int length = first_length + second_length;
+    unsigned char key[32];
+    unsigned char iv[16];
+
+    cipher_context_t ctx_dec;
+    cipher_context_t ctx_enc;
+    const cipher_info_t *cipher_info;
+
+    unsigned char inbuf[64];
+    unsigned char encbuf[64];
+    unsigned char decbuf[64];
+
+    int outlen = 0;
+    int totaloutlen = 0;
+    int enclen = 0;
+
+    memset( key, 0, 32 );
+    memset( iv , 0, 16 );
+    
+    memset( &ctx_dec, 0, sizeof( ctx_dec ) );
+    memset( &ctx_enc, 0, sizeof( ctx_enc ) );
+        
+    memset( inbuf, 5, 64 );
+    memset( encbuf, 0, 64 );
+    memset( decbuf, 0, 64 );
+
+    /* Initialise enc and dec contexts */
+    cipher_info = cipher_info_from_type( {cipher_id} );
+    TEST_ASSERT( NULL != cipher_info);
+    
+    TEST_ASSERT( 0 == cipher_init_ctx( &ctx_dec, cipher_info ) );
+    TEST_ASSERT( 0 == cipher_init_ctx( &ctx_enc, cipher_info ) );
+    
+    TEST_ASSERT( 0 == cipher_setkey( &ctx_dec, key, {key_len}, POLARSSL_DECRYPT ) );
+    TEST_ASSERT( 0 == cipher_setkey( &ctx_enc, key, {key_len}, POLARSSL_ENCRYPT ) );
+
+    TEST_ASSERT( 0 == cipher_reset( &ctx_dec, iv ) );
+    TEST_ASSERT( 0 == cipher_reset( &ctx_enc, iv ) );
+
+    enclen = cipher_get_block_size(&ctx_enc )
+                    * ( 1 + length / cipher_get_block_size( &ctx_enc ) );
+
+    /* encode length number of bytes from inbuf */
+    TEST_ASSERT( 0 == cipher_update( &ctx_enc, inbuf, first_length, encbuf, &outlen ) );
+    totaloutlen = outlen;
+    TEST_ASSERT( 0 == cipher_update( &ctx_enc, inbuf + first_length, second_length, encbuf + totaloutlen, &outlen ) );
+    totaloutlen += outlen;
+    TEST_ASSERT( totaloutlen == enclen - cipher_get_block_size ( &ctx_enc ) );
+    TEST_ASSERT( 0 == cipher_finish( &ctx_enc, encbuf + totaloutlen, &outlen ) );
+    totaloutlen += outlen;
+    TEST_ASSERT( outlen == cipher_get_block_size ( &ctx_enc ) );
+
+    /* decode the previously encoded string */
+    TEST_ASSERT( 0 == cipher_update( &ctx_dec, encbuf, enclen, decbuf, &outlen ) );
+    TEST_ASSERT( enclen - cipher_get_block_size ( &ctx_enc ) == outlen );
+    TEST_ASSERT( 0 == cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
+    TEST_ASSERT( length - enclen + cipher_get_block_size ( &ctx_enc ) == outlen );
+    
+
+    TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
+
+    TEST_ASSERT( 0 == cipher_free_ctx( &ctx_dec ) );
+    TEST_ASSERT( 0 == cipher_free_ctx( &ctx_enc ) );
+END_CASE
+
+
+BEGIN_CASE
+cipher_selftest:
+{
+    TEST_ASSERT( cipher_self_test( 0 ) == 0 );
+}
+END_CASE