#include <openssl/evp.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{

       EVP_CIPHER_CTX ctx;
               char key[EVP_MAX_KEY_LENGTH];
                       char iv[EVP_MAX_IV_LENGTH];
                               char *ct, *out;
                                       char final[EVP_MAX_BLOCK_LENGTH];
                                               char str[] = "123456789abcdef";
                                                       int i;

                                                               strcpy(key,"secret");
                                                                       strcpy(iv,"foo");
                                                                               ct = malloc(EVP_MAX_BLOCK_LENGTH);
                                                                                       out = malloc(EVP_MAX_BLOCK_LENGTH);

                                                                                               EVP_EncryptInit(&ctx, EVP_bf_cbc(), key, iv);
                                                                                                       EVP_EncryptUpdate(&ctx, ct, &i, str, strlen(str));
                                                                                                               printf("Ciphertext is %d bytes.\n",i);
                                                                                                                       printf("Ciphertext is >>%s<<\n",ct);


                                                                                                                               EVP_DecryptInit(&ctx, EVP_bf_cbc(), key, iv);
                                                                                                                                       EVP_DecryptUpdate(&ctx, out, &i, ct, i);
                                                                                                                                               printf("Decrypted: >>%s<<\n",out);
                                                                                                                                                       EVP_DecryptUpdate(&ctx, out, &i, ct, i);
                                                                                                                                                               printf("Decrypted: >>%s<<\n",out);

                                                                                                                                                                       if (!EVP_DecryptFinal(&ctx, final, &i))
                                                                                                                                                                                       err(-1,"padding incorrect");

                                                                                                                                                                                               final[i] = 0;
                                                                                                                                                                                                       printf("Decrypted: >>%s<<\n",final);
                                                                                                                                                                                                               exit(0);
                                                                                                                                                                                                               }