diff --git a/programs/Makefile b/programs/Makefile
index 696ba17..7380ad2 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -7,7 +7,8 @@
 OFLAGS	= -O
 LDFLAGS	= -L../library -lpolarssl
 
-APPS =	aes/aescrypt2		hash/hello		\
+APPS =	aes/aescrypt2	aes/crypt_and_hash	\
+	hash/hello								\
 	hash/md5sum			hash/sha1sum		\
 	hash/sha2sum		pkey/dh_client		\
 	pkey/dh_genprime	pkey/dh_server		\
@@ -26,6 +27,10 @@
 	echo   "  CC    aes/aescrypt2.c"
 	$(CC) $(CFLAGS) $(OFLAGS) aes/aescrypt2.c    $(LDFLAGS) -o $@
 
+aes/crypt_and_hash: aes/crypt_and_hash.c ../library/libpolarssl.a
+	echo   "  CC    aes/crypt_and_hash.c"
+	$(CC) $(CFLAGS) $(OFLAGS) aes/crypt_and_hash.c $(LDFLAGS) -o $@
+
 hash/hello: hash/hello.c ../library/libpolarssl.a
 	echo   "  CC    hash/hello.c"
 	$(CC) $(CFLAGS) $(OFLAGS) hash/hello.c       $(LDFLAGS) -o $@
diff --git a/programs/aes/CMakeLists.txt b/programs/aes/CMakeLists.txt
index 52b5e12..0695a34 100644
--- a/programs/aes/CMakeLists.txt
+++ b/programs/aes/CMakeLists.txt
@@ -1,6 +1,9 @@
 add_executable(aescrypt2 aescrypt2.c)
 target_link_libraries(aescrypt2 polarssl)
 
-INSTALL(TARGETS aescrypt2
+add_executable(crypt_and_hash crypt_and_hash.c)
+target_link_libraries(crypt_and_hash polarssl)
+
+INSTALL(TARGETS aescrypt2 crypt_and_hash
         DESTINATION "bin"
         PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
diff --git a/programs/aes/aescrypt2.c b/programs/aes/aescrypt2.c
index 1988ec6..c291c18 100644
--- a/programs/aes/aescrypt2.c
+++ b/programs/aes/aescrypt2.c
@@ -56,7 +56,7 @@
 {
     int ret = 1, i, n;
     int keylen, mode, lastn;
-    FILE *fkey, *fin, *fout;
+    FILE *fkey, *fin = NULL, *fout = NULL;
 
     char *p;
     unsigned char IV[16];
@@ -390,6 +390,8 @@
     ret = 0;
 
 exit:
+    fclose( fin );
+    fclose( fout );
 
     memset( buffer, 0, sizeof( buffer ) );
     memset( digest, 0, sizeof( digest ) );
diff --git a/programs/aes/crypt_and_hash.c b/programs/aes/crypt_and_hash.c
new file mode 100644
index 0000000..7014af0
--- /dev/null
+++ b/programs/aes/crypt_and_hash.c
@@ -0,0 +1,462 @@
+/*
+ *  \brief  Generic file encryption program using generic wrappers for configured
+ *          security.
+ *
+ *  Copyright (C) 2006-2010, Brainspark B.V.
+ *
+ *  This file is part of PolarSSL (http://www.polarssl.org)
+ *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
+ *
+ *  All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _CRT_SECURE_NO_DEPRECATE
+#define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+
+#if defined(WIN32)
+#include <windows.h>
+#include <io.h>
+#else
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include "polarssl/cipher.h"
+#include "polarssl/md.h"
+
+#define MODE_ENCRYPT    0
+#define MODE_DECRYPT    1
+
+#define USAGE   \
+    "\n  crypt_and_hash <mode> <input filename> <output filename> <cipher> <md> <key>\n" \
+    "\n   <mode>: 0 = encrypt, 1 = decrypt\n" \
+    "\n  example: crypt_and_hash 0 file file.aes AES-128-CBC SHA1 hex:E76B2413958B00E193\n" \
+    "\n"
+
+int main( int argc, char *argv[] )
+{
+    int ret = 1, i, n;
+    int keylen, mode, lastn, olen;
+    FILE *fkey, *fin = NULL, *fout = NULL;
+
+    char *p;
+    unsigned char IV[16];
+    unsigned char key[512];
+    unsigned char digest[POLARSSL_MD_MAX_SIZE];
+    unsigned char buffer[1024];
+    unsigned char output[1024];
+
+    const cipher_info_t *cipher_info;
+    const md_info_t *md_info;
+    cipher_context_t cipher_ctx;
+    md_context_t md_ctx;
+#if defined(WIN32)
+       LARGE_INTEGER li_size;
+    __int64 filesize, offset;
+#else
+      off_t filesize, offset;
+#endif
+
+    memset( &cipher_ctx, 0, sizeof( cipher_context_t ));
+    memset( &md_ctx, 0, sizeof( md_context_t ));
+
+    /*
+     * Parse the command-line arguments.
+     */
+    if( argc != 7 )
+    {
+        const int *list;
+
+        printf( USAGE );
+
+        printf( "Available ciphers:\n" );
+        list = cipher_list();
+        while( *list )
+        {
+            cipher_info = cipher_info_from_type( *list );
+            printf( "  %s\n", cipher_info->name );
+            list++;
+        }
+
+        printf( "\nAvailable message digests:\n" );
+        list = md_list();
+        while( *list )
+        {
+            md_info = md_info_from_type( *list );
+            printf( "  %s\n", md_info->name );
+            list++;
+        }
+
+#if defined(WIN32)
+        printf( "\n  Press Enter to exit this program.\n" );
+        fflush( stdout ); getchar();
+#endif
+
+        goto exit;
+    }
+
+    mode = atoi( argv[1] );
+
+    if( mode != MODE_ENCRYPT && mode != MODE_DECRYPT )
+    {
+        fprintf( stderr, "invalid operation mode\n" );
+        goto exit;
+    }
+
+    if( strcmp( argv[2], argv[3] ) == 0 )
+    {
+        fprintf( stderr, "input and output filenames must differ\n" );
+        goto exit;
+    }
+
+    if( ( fin = fopen( argv[2], "rb" ) ) == NULL )
+    {
+        fprintf( stderr, "fopen(%s,rb) failed\n", argv[2] );
+        goto exit;
+    }
+
+    if( ( fout = fopen( argv[3], "wb+" ) ) == NULL )
+    {
+        fprintf( stderr, "fopen(%s,wb+) failed\n", argv[3] );
+        goto exit;
+    }
+
+    /*
+     * Read the Cipher and MD from the command line
+     */
+    cipher_info = cipher_info_from_string( argv[4] );
+    if( cipher_info == NULL )
+    {
+        fprintf( stderr, "Cipher '%s' not found\n", argv[4] );
+        goto exit;
+    }
+    cipher_init_ctx( &cipher_ctx, cipher_info);
+
+    md_info = md_info_from_string( argv[5] );
+    if( md_info == NULL )
+    {
+        fprintf( stderr, "Message Digest '%s' not found\n", argv[5] );
+        goto exit;
+    }
+    md_init_ctx( &md_ctx, md_info);
+
+    /*
+     * Read the secret key and clean the command line.
+     */
+    if( ( fkey = fopen( argv[6], "rb" ) ) != NULL )
+    {
+        keylen = fread( key, 1, sizeof( key ), fkey );
+        fclose( fkey );
+    }
+    else
+    {
+        if( memcmp( argv[6], "hex:", 4 ) == 0 )
+        {
+            p = &argv[6][4];
+            keylen = 0;
+
+            while( sscanf( p, "%02X", &n ) > 0 &&
+                   keylen < (int) sizeof( key ) )
+            {
+                key[keylen++] = (unsigned char) n;
+                p += 2;
+            }
+        }
+        else
+        {
+            keylen = strlen( argv[6] );
+
+            if( keylen > (int) sizeof( key ) )
+                keylen = (int) sizeof( key );
+
+            memcpy( key, argv[6], keylen );
+        }
+    }
+
+    memset( argv[6], 0, strlen( argv[6] ) );
+
+#if defined(WIN32)
+    /*
+     * Support large files (> 2Gb) on Win32
+     */
+    li_size.QuadPart = 0;
+    li_size.LowPart  =
+        SetFilePointer( (HANDLE) _get_osfhandle( _fileno( fin ) ),
+                        li_size.LowPart, &li_size.HighPart, FILE_END );
+
+    if( li_size.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR )
+    {
+        fprintf( stderr, "SetFilePointer(0,FILE_END) failed\n" );
+        goto exit;
+    }
+
+    filesize = li_size.QuadPart;
+#else
+    if( ( filesize = lseek( fileno( fin ), 0, SEEK_END ) ) < 0 )
+    {
+        perror( "lseek" );
+        goto exit;
+    }
+#endif
+
+    if( fseek( fin, 0, SEEK_SET ) < 0 )
+    {
+        fprintf( stderr, "fseek(0,SEEK_SET) failed\n" );
+        goto exit;
+    }
+
+    if( mode == MODE_ENCRYPT )
+    {
+        /*
+         * Generate the initialization vector as:
+         * IV = SHA-256( filesize || filename )[0..15]
+         */
+        for( i = 0; i < 8; i++ )
+            buffer[i] = (unsigned char)( filesize >> ( i << 3 ) );
+
+        p = argv[2];
+
+        md_starts( &md_ctx );
+        md_update( &md_ctx, buffer, 8 );
+        md_update( &md_ctx, (unsigned char *) p, strlen( p ) );
+        md_finish( &md_ctx, digest );
+
+        memcpy( IV, digest, 16 );
+
+        /*
+         * The last four bits in the IV are actually used
+         * to store the file size modulo the AES block size.
+         */
+        lastn = (int)( filesize & 0x0F );
+
+        IV[15] = (unsigned char)
+            ( ( IV[15] & 0xF0 ) | lastn );
+
+        /*
+         * Append the IV at the beginning of the output.
+         */
+        if( fwrite( IV, 1, 16, fout ) != 16 )
+        {
+            fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
+            goto exit;
+        }
+
+        /*
+         * Hash the IV and the secret key together 8192 times
+         * using the result to setup the AES context and HMAC.
+         */
+        memset( digest, 0,  32 );
+        memcpy( digest, IV, 16 );
+
+        for( i = 0; i < 8192; i++ )
+        {
+            md_starts( &md_ctx );
+            md_update( &md_ctx, digest, 32 );
+            md_update( &md_ctx, key, keylen );
+            md_finish( &md_ctx, digest );
+
+        }
+
+        memset( key, 0, sizeof( key ) );
+
+        cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
+            POLARSSL_ENCRYPT );
+        cipher_reset( &cipher_ctx, IV);
+
+        md_hmac_starts( &md_ctx, digest, 32 );
+
+        /*
+         * Encrypt and write the ciphertext.
+         */
+        for( offset = 0; offset < filesize; offset += cipher_get_block_size( &cipher_ctx ) )
+        {
+            n = ( filesize - offset > cipher_get_block_size( &cipher_ctx ) ) ?
+                cipher_get_block_size( &cipher_ctx ) : (int) ( filesize - offset );
+
+            if( fread( buffer, 1, n, fin ) != (size_t) n )
+            {
+                fprintf( stderr, "fread(%d bytes) failed\n", n );
+                goto exit;
+            }
+
+            cipher_update( &cipher_ctx, buffer, n, output, &olen );
+            md_hmac_update( &md_ctx, output, olen );
+
+            if( fwrite( output, 1, olen, fout ) != (size_t) olen )
+            {
+                fprintf( stderr, "fwrite(%d bytes) failed\n", olen );
+                goto exit;
+            }
+        }
+
+        cipher_finish( &cipher_ctx, output, &olen );
+        md_hmac_update( &md_ctx, output, olen );
+
+        if( fwrite( output, 1, olen, fout ) != (size_t) olen )
+        {
+            fprintf( stderr, "fwrite(%d bytes) failed\n", n );
+            goto exit;
+        }
+        /*
+         * Finally write the HMAC.
+         */
+        md_hmac_finish( &md_ctx, digest );
+
+        if( fwrite( digest, 1, md_get_size( md_info), fout ) != md_get_size( md_info) )
+        {
+            fprintf( stderr, "fwrite(%d bytes) failed\n", md_get_size( md_info) );
+            goto exit;
+        }
+    }
+
+    if( mode == MODE_DECRYPT )
+    {
+        /*
+         *  The encrypted file must be structured as follows:
+         *
+         *        00 .. 15              Initialization Vector
+         *        16 .. 31              AES Encrypted Block #1
+         *           ..
+         *      N*16 .. (N+1)*16 - 1    AES Encrypted Block #N
+         *  (N+1)*16 .. (N+1)*16 + 32   HMAC-SHA-256(ciphertext)
+         */
+        if( filesize < 16 + md_get_size( md_info) )
+        {
+            fprintf( stderr, "File too short to be encrypted.\n" );
+            goto exit;
+        }
+
+        if( ( filesize & 0x0F ) != 0 )
+        {
+            fprintf( stderr, "File size not a multiple of 16.\n" );
+            goto exit;
+        }
+
+        /*
+         * Substract the IV + HMAC length.
+         */
+        filesize -= ( 16 + md_get_size( md_info ) );
+
+        /*
+         * Read the IV and original filesize modulo 16.
+         */
+        if( fread( buffer, 1, 16, fin ) != 16 )
+        {
+            fprintf( stderr, "fread(%d bytes) failed\n", 16 );
+            goto exit;
+        }
+
+        memcpy( IV, buffer, 16 );
+        lastn = IV[15] & 0x0F;
+
+        /*
+         * Hash the IV and the secret key together 8192 times
+         * using the result to setup the AES context and HMAC.
+         */
+        memset( digest, 0,  32 );
+        memcpy( digest, IV, 16 );
+
+        for( i = 0; i < 8192; i++ )
+        {
+            md_starts( &md_ctx );
+            md_update( &md_ctx, digest, 32 );
+            md_update( &md_ctx, key, keylen );
+            md_finish( &md_ctx, digest );
+        }
+
+        memset( key, 0, sizeof( key ) );
+
+        cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
+            POLARSSL_DECRYPT );
+        cipher_reset( &cipher_ctx, IV);
+
+        md_hmac_starts( &md_ctx, digest, 32 );
+
+        /*
+         * Decrypt and write the plaintext.
+         */
+        for( offset = 0; offset < filesize; offset += cipher_get_block_size( &cipher_ctx ) )
+        {
+            if( fread( buffer, 1, cipher_get_block_size( &cipher_ctx ), fin ) !=
+                (size_t) cipher_get_block_size( &cipher_ctx ) )
+            {
+                fprintf( stderr, "fread(%d bytes) failed\n",
+                    cipher_get_block_size( &cipher_ctx ) );
+                goto exit;
+            }
+
+            md_hmac_update( &md_ctx, buffer, cipher_get_block_size( &cipher_ctx ) );
+            cipher_update( &cipher_ctx, buffer, cipher_get_block_size( &cipher_ctx ),
+                output, &olen );
+
+            if( fwrite( output, 1, olen, fout ) != (size_t) olen )
+            {
+                fprintf( stderr, "fwrite(%d bytes) failed\n", olen );
+                goto exit;
+            }
+        }
+
+        /*
+         * Write the final block of data
+         */
+        cipher_finish( &cipher_ctx, output, &olen );
+
+        if( fwrite( output, 1, olen, fout ) != (size_t) olen )
+        {
+            fprintf( stderr, "fwrite(%d bytes) failed\n", olen );
+            goto exit;
+        }
+
+        /*
+         * Verify the message authentication code.
+         */
+        md_hmac_finish( &md_ctx, digest );
+
+        if( fread( buffer, 1, md_get_size( md_info ), fin ) != md_get_size( md_info ) )
+        {
+            fprintf( stderr, "fread(%d bytes) failed\n", md_get_size( md_info ) );
+            goto exit;
+        }
+
+        if( memcmp( digest, buffer, md_get_size( md_info ) ) != 0 )
+        {
+            fprintf( stderr, "HMAC check failed: wrong key, "
+                             "or file corrupted.\n" );
+            goto exit;
+        }
+    }
+
+    ret = 0;
+
+exit:
+    fclose( fin );
+    fclose( fout );
+
+    memset( buffer, 0, sizeof( buffer ) );
+    memset( digest, 0, sizeof( digest ) );
+
+    cipher_free_ctx( &cipher_ctx );
+    md_free_ctx( &md_ctx );
+
+    return( ret );
+}
