#include <iostream>
#include <fstream>
#include <openssl/evp.h>
#include <openssl/bio.h>

int main (int argc, char *argv[])
{
   BIO *bio_64_dec = BIO_new (BIO_f_base64 ());
   BIO *bio_mem_dec = BIO_new (BIO_s_mem ());
   BIO_push (bio_64_dec, bio_mem_dec);

   ifstream in (argv[1]);
   ofstream out (argv[2]);
   char buffer[4095];
   int n;
   int count;
   bool eof;
   bool fail;
   while (!(eof = in.eof ()))
     {
        in.read(buffer, 4095);
        count = in.gcount ();
        if (count > 0)
          {
            n = BIO_write (bio_mem_dec, buffer, count);
            if (n > 0)
              {
                char *b = new char[n];
                n = BIO_read (bio_64_dec, b, n);
                if (n > 0)
                  out.write (b, n);
                delete[] b;
              }
          }
        else
          break;
     }

  BIO_free (bio_mem_dec);
  BIO_free (bio_64_dec);
}
