Clipper On Line • Ver Tópico - Assinar documento com certificado .PFX

Assinar documento com certificado .PFX

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Assinar documento com certificado .PFX

Mensagempor Itamar M. Lins Jr. » 21 Set 2020 13:18

Ola!
/* By Diego F. */
HB_FUNC( HB_CMS_SIGNFILE_PFX )
{
   // HB_SignFile( Archivo a firmar, Archivo .pfx, clave, Archivo Firmado)
    BIO *in = NULL, *out = NULL;
    CMS_ContentInfo *cms = NULL;
   X509 *x509;
   EVP_PKEY *priKey;
   FILE *fp;
   PKCS12 *p12;
   STACK_OF(X509) *ca = NULL;
   OpenSSL_add_all_algorithms();
   OpenSSL_add_all_ciphers();
   int flags = CMS_PARTIAL;

    if ((fp = fopen(hb_parc(2), "rb")) == NULL) {
        hb_retni( 2 );
        return;
    }
    p12 = d2i_PKCS12_fp(fp, NULL);
    fclose(fp);
    if (!p12) {
        hb_retni( 3 );
        return;
    }
    if (!PKCS12_parse(p12, hb_parc(3), &priKey, &x509, &ca)) {
        hb_retni( 4 );
        return;
   }
    PKCS12_free(p12);   

//abre el archivo a firmar   
    in = BIO_new_file(hb_parc(1), "r");
    if (!in) {
      hb_retni(5); //error al crear objeto in
      return;      
   }

//crea el cms
    cms = CMS_sign(NULL, NULL, NULL, in, flags);
    if (!cms) {
      hb_retni(6); //error al crear objeto cms
      return;      
   }
   
   CMS_SignerInfo *si;
    si = CMS_add1_signer(cms, x509, priKey, EVP_sha1(), flags);
   if (!si) {
      hb_retni(8); //error al crear objeto cms
      return;      
   }

   if (!CMS_final(cms, in, NULL, flags)) {
      hb_retni(9); //error al crear objeto cms
      return;      
   }
   
   
   out = BIO_new_file(hb_parc(4), "wb");
    if (!out) {
      hb_retni(10); //error al abrir el archivo toSignFile
      return;      
   }
    BIO_reset(in);
   
   
   //if(!PEM_write_bio_CMS_stream(out,cms, in, flags)) {//lo graba en formato PEM
   //if (!SMIME_write_CMS(out, cms, in, flags)) { //lo graba en formato SMIME
   if (!i2d_CMS_bio_stream(out,cms, in, flags)) {//lo graba en formato DER
      hb_retni(11); //error al grabar el archivo toSignFile
      return;      
   }
    CMS_ContentInfo_free(cms);
   X509_free(x509);
    BIO_free(in);
    BIO_free(out);
   hb_retni( 1 );
   return;   
}


Peguei no forum Harbour users.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4626
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 254 vezes

Assinar documento com certificado .PFX

Mensagempor Itamar M. Lins Jr. » 21 Set 2020 13:24

Ola!
Mais outra que o Diego fez.

#include "hbssl.h"

#include <openssl/cms.h>

HB_FUNC( HB_CMS_SIGNFILE )
{
    BIO *in = NULL, *out = NULL, *archivo = NULL;
    CMS_ContentInfo *cms = NULL;
   X509 *x509;
   EVP_PKEY *priKey;
   OpenSSL_add_all_algorithms();
   OpenSSL_add_all_ciphers();
   int flags = CMS_PARTIAL;

//read the .crt file
    archivo = BIO_new_file(hb_parc(2), "r");
   if (!archivo) {
      hb_retni(2); // error opening .crt file
      return;      
   }
   x509 = PEM_read_bio_X509(archivo, NULL, NULL, NULL);
   BIO_reset(archivo);
   
   
//read the .key file
   archivo = BIO_new_file(hb_parc(3), "r");
   if (!archivo) {
      hb_retni(3);  // error opening key file
      return;
   }
    priKey = PEM_read_bio_PrivateKey(archivo,NULL, NULL, NULL);
   if(!priKey) {
      hb_retni(4); //error creating PrivateKey object
      return;
   }

   if (!X509_check_private_key(x509, priKey)) {
      hb_retni(5); //the Key does not correspond to the Certificate
      return;      
   }   
   
//open file to sign
    in = BIO_new_file(hb_parc(1), "r");
    if (!in) {
      hb_retni(6); //error opening file to sign
      return;      
   }

//create cms object
    cms = CMS_sign(NULL, NULL, NULL, in, flags);
    if (!cms) {
      hb_retni(7); //error creating cms object
      return;      
   }
   
   CMS_SignerInfo *si;
    si = CMS_add1_signer(cms, x509, priKey, EVP_sha1(), flags);
   if (!si) {
      hb_retni(8); //error asigning data to cms object
      return;      
   }

   if (!CMS_final(cms, in, NULL, flags)) {
      hb_retni(9); //error closing data structure of cms object
      return;      
   }

   
//create file signed
   out = BIO_new_file(hb_parc(4), "wb");
    if (!out) {
      hb_retni(10); //error creating out file
      return;      
   }
    BIO_reset(in);
   
   
   if (!i2d_CMS_bio_stream(out,cms, in, flags)) {//lo graba en formato DER
      hb_retni(11); //error generating final cms file
      return;      
   }

    CMS_ContentInfo_free(cms);
   X509_free(x509);
    BIO_free(in);
    BIO_free(out);
   BIO_free(archivo);   
   hb_retni( 1 );
   return;   
}



Exemplo de uso:
/*
   hbmk2 tip4.prg hbssl.hbc

*/
#require "hbssl"
#include "hbssl.ch"

Function main()
Local ERROR
setmode(25,80)
clear

/*RESULTADO
       1: Signing OK
       2: error opening .crt file
       3: error opening key file
       4: error creating PrivateKey object
       5: the Key does not correspond to the Certificate
       6: error opening file to sign
       7: error creating cms object
       8: error asigning data to cms object
       9: error closing data structure of cms object
      10: error creating out file
      11: error generating final cms file*/

ERROR:=HB_CMS_SignFile( "TRA.XML", "CERT.CRT", "CERT.KEY", "TRA.TMP")
if (ERROR!=1)
   ? ERROR
endif

return


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4626
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 254 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro