Re: [Programación] openssl

emiliano nuñez nunez.emiliano en gmail.com
Lun Oct 27 13:57:07 ART 2008


> Hola Emiliano,
>
> Estoy tratando de implementar en un sistema de gestión la utilización de
> factura electrónica.
>
> El sistema esta en Progress 9.1B (Base datos + lenguaje 4gl) este no soporta
> conexiones seguras.
> Así que eché mano de las dll de Openssl y estoy
> tratando de implementar algunas funciones (las mismas que estas usando
> vos) declarando las mismas como procedimientos externos y haciendo llamadas
> a las mismas.
>
> Al igual que vos la funcion PEM_read_bio_PrivateKey me da problemas,
> directamente me aborta el programa.
> Yo le achaco el problema a que outPriK del tipo BIO o Puntero a un tipo
> BIO no se genera correctamente.
>
> Me podrías explicar que es ese tipo BIO, si es un tipo de variable como las int
> o char (simples) o es un puntero a una estructura.
>

Hola, parece que estamos en la misma, yo también estoy con el tema del
AFIP, conseguí firmar un texto ( en el caso será el tr.xml), para mi
problema me faltaba llamar a OpenSSL_add_all_algorithms();

Te muestro lo que hice a ver si te puede ayudar un poco:

Esto funciona, claro que fué una prueba para probar las funciones:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/bio.h>
#include <openssl/pem.h>
#include <openssl/pkcs7.h>

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

   /******** HABILITAMOS ALGORITMOS *********/
   OpenSSL_add_all_algorithms();
	
   /******** ABRIMOS Y LEEMOS CERTIFICADO  ************/
   BIO *outCert;
   outCert = BIO_new_file("/home/emiliano/ssl/test1.selfsigned.cer", "r");
   if(!outCert){printf( "Error abriendo el archivo del
certificado\n");return 0;}

   X509 *x;
   x = PEM_read_bio_X509(outCert, NULL, 0, NULL);
   if (x == NULL){printf("Error leyendo el certificado\n");return 0;}

   /******* ABRIMOS Y LEEMOS LA CLAVE PRIVADA ********/
   BIO *outPriK;
   outPriK = BIO_new_file("/home/emiliano/ssl/test1.pem", "r");
   if(!outPriK){printf( "Error abriendo el archivo de clave
primaria\n");return 0;}

   EVP_PKEY * key;
   key = PEM_read_bio_PrivateKey(outPriK, NULL, NULL, "emilianito");
   if (key == NULL) {printf("Error leyendo la clave privada\n"); return 0;}

   /********* CREAMOS EL MENSAJE  A FIRMAR *************/
   BIO *mensaje;
   mensaje = BIO_new(BIO_s_mem());
   if(!mensaje){printf("Error creando BIO memory\n");return 0;}
   int size = BIO_write(mensaje, "hola", 4);
   if(size <= 0){printf("Error copiando los datos\n");return 0;}

   /************ FIRMAMOS UN MENSAJE *****************/
   PKCS7 * pk7;
   pk7 = PKCS7_sign(x, key, NULL, mensaje, PKCS7_BINARY);
   if(!pk7){printf("Quilombo con PKCS7_sign()\n");return 0;}

   /************ LIBERAMOS MEMORIA *************/
   BIO_free(outCert); outCert=NULL;
   BIO_free(outPriK); outPriK=NULL;
   BIO_free_all(mensaje); mensaje= NULL;
   EVP_PKEY_free(key); key = NULL;
   X509_free(x); x = NULL;

   /************ GUARDAMOS LA FIRMA EN BASE64 ***********/
   BIO *firma;
   firma = BIO_new(BIO_s_mem());
   if (!firma) {printf("Error creando el BIO de la firma\n");return 0;}

   int res;
   res = PEM_write_bio_PKCS7(firma, pk7);
   if(!firma){printf("No se pudo guardar la firma1\n");return 0;}
   if(!res){printf("No se pudo guardar la firma2\n");return 0;}

   /*********** VEO QUE LA FIRMA SEA CORRECTA **********/

   char buffer[4096];
   while(BIO_read(firma,buffer,4096)>0){
	printf(buffer); //veo que la salida sea correcta
   }

   /************************************************/

   printf("\n\t----- Yeah! :) ------\n\n");

   return 0;
}

Espero les sirva... Saludos.



Más información sobre la lista de distribución Programacion