Codificación Base64 con OpenSSL

Un sencillo pero útil ejemplo de uso de la librería OpenSSL para codificar y descodificar en base 64.



/******************************************************************************
*
*  autor: Daniel Lerch
*
*  Referencias:
*  Network security with OpenSSL (O'Reilly)
*
*  Compilacion:
*  $ gcc base64.c -o base64 -lssl
*
******************************************************************************/
                                                                                
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
                                                                                
unsigned char *base64_encode (unsigned char *buffer, unsigned int len) {
                                                                                
  unsigned char *ret = (unsigned char *) malloc ((((len+2)/3)*4)+1);
  EVP_EncodeBlock (ret, buffer, len);
  ret[(((len+2)/3)*4)] = 0;
  return ret;
}
                                                                                
unsigned char *base64_decode (unsigned char *buffer, unsigned int len) {
                                                                                
  unsigned char *ret = (unsigned char *) malloc ((((len+2)/3)*4)+1);
  EVP_DecodeBlock (ret, buffer, len);
  ret[(((len+2)/3)*4)] = 0;
  return ret;
}

void usage (char *progname) {
                                                                                
   printf ("Usage: %s [ encode | decode ] Text\n\n", progname);
   exit(0);
}
                                                                                
int main (int argc, char *argv[])
{
   int i;
   unsigned char *ret;
                                                                                
   /* Sin parametros */
   if (argc < 3) usage(argv[0]);
                                                                                
   if (argc == 3) {
                                                                                
      /* Verificamos los algoritmos */
      if (strcmp(argv[1], "encode")  == 0)
         ret = base64_encode (argv[2], strlen(argv[2]));
      else if (strcmp(argv[1], "decode") == 0)
         ret = base64_decode (argv[2], strlen(argv[2]));
   
     printf ("%s\n", ret);
     free(ret);
   }
   else  usage(argv[0]);
 
                                                                               
   return 0;
}




daniellerch.com