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