Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: giuian - Marzo 10, 2019, 10:07:30 am

Titolo: PKCS7 vuoto
Inserito da: giuian - Marzo 10, 2019, 10:07:30 am
Buongiorno,
sto cercando di estrarre il contenuto di un file p7m, non avendo trovato niente ho provato ad adattare una procedura delphi..
Ubuntu 64bit, lazarus 1.8.4 Openssl ver 1.0.1F.
Gli handler delle funzioni vengono caricati correttamente dalle librerie libcrypto.so e libssl.so

Funziona tutto, ma arrivati al punto dell'estrazione, nonostante il buffer sia riempito correttamente , il BIO  viene creato .... forse vuoto?

  // Read from stream
  if Stream.Read(Buffer[0], iDataLength) = iDataLength then begin
    // Create BIO from this memory
    fBIO := mFunctions.BIO_new_mem_buf(@Buffer), iDataLength);

    if fBIO <> nil then begin
      // Tries to read this as a .P7M file.
      fPKCS7 := mFunctions.d2i_PKCS7_bio(fBIO, nil);

Il puntatore punta ad un record PKCS7 vuoto ....

Qualcuno può aiutarmi??
Maledetta fattura elettronica....
Titolo: Re:PKCS7 vuoto
Inserito da: bonmario - Marzo 10, 2019, 12:56:55 pm
Ciao,
non ti so aiutare, ma ti posso dire una cosa: da tempo ho uno script Linux che mi permette di sproteggere i files p7m.
Questo script, a volte funziona, a volte no.
Non ho mai indagato a fondo, perché di solito quelli che non riesco a sproteggere con lo script li sproteggo direttamente online, ma mi sono fatto l'idea che ci siano diversi tipi di files .p7m, nonostante l'estensione sia la stessa.
Non vorrei che il file su cui stai testando il tuo programma sia uno di quelli da gestire in un altro modo.

Ciao, Mario
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 10, 2019, 11:35:12 pm
Si, esistono diverse codifiche, ma la procedura dovrebbe gestirle tutte.... Non l'ho provata su Windows con  Delphi ma immagino che funzioni.
Sono veramente in un vicolo cieco anche perché il mio livello è abbastanza basso. Ci vuole l'intervento di un guru!

Titolo: Re:PKCS7 vuoto
Inserito da: nomorelogic - Marzo 11, 2019, 01:27:12 am
ho visto che nei sorgenti fpc c'è una implemetazione openssl

https://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/packages/openssl/

dai un'occhiata se ti può essere utile in sostituzione della libreria Delphi
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 11, 2019, 06:45:40 am
Grazie, quella libreria è la stessa di Synapse. In realtà le funzioni vengono chiamate direttamente dalle librerie

 var
 HC: HMODULE;
 .............

 HC := LoadLibrary('libcrypto.so');
 BIO_new_mem_buf := GetProcAddress(HC, 'BIO_new_mem_buf');

 le funzioni vengono caricate e inizializzate correttamente.....

 Non so ... possibile che non ci abbia mai provato nessuno??
Titolo: Re:PKCS7 vuoto
Inserito da: Mimmo - Marzo 11, 2019, 08:30:07 am
Ciao,
premesso che non ne so niente e ti scrivo solo perchè una soluzione non è ancora apparsa all'orizzonte, a questo indirizzo c'è un esempio per Delphi:
http://www.csita.unige.it/software/free/delphiopenssl-spostato-al-DISI/example5.html
Lì utilizza in cascata 3 funzioni diverse: prima d2i_PKCS7_bio, poi se fallisce usa PEM_read_bio_PKCS7 e se fallisce anche questa usa SMIME_read_PKCS7. Forse il file è in qualche formato diverso da quello previsto?



Titolo: Re:PKCS7 vuoto
Inserito da: nomorelogic - Marzo 11, 2019, 10:20:35 am
Non so ... possibile che non ci abbia mai provato nessuno??

se non hai urgenza (= qualche giorno di pazienza) dovrei provare anche io, magari mettendo insieme le prove riusciamo a fare dei progressi
in alternativa puoi chiedere sul forum ufficiale, li sicuramente qualcuno dovrebbe rispondere
Titolo: Re:PKCS7 vuoto
Inserito da: Stilgar - Marzo 11, 2019, 10:51:17 am
La documentazione di riferimento dovrebbe essere questa.https://www.ietf.org/rfc/rfc2633.txt:)
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 11, 2019, 05:14:13 pm
Ciao,
premesso che non ne so niente e ti scrivo solo perchè una soluzione non è ancora apparsa all'orizzonte, a questo indirizzo c'è un esempio per Delphi:
http://www.csita.unige.it/software/free/delphiopenssl-spostato-al-DISI/example5.html
Lì utilizza in cascata 3 funzioni diverse: prima d2i_PKCS7_bio, poi se fallisce usa PEM_read_bio_PKCS7 e se fallisce anche questa usa SMIME_read_PKCS7. Forse il file è in qualche formato diverso da quello previsto?

Si l'avevo visto ... ma se il test di codifica fallisce il puntatore è nil .... invece nel mio caso il puntatore punta ad un record PKCS7 vuoto. In generale i PKCS7 delle fatture dovrebbero essere DER, quindi buona la prima (d2i_PKCS7_bio). Deve essere una sciocchezza ne sono sicuro....
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 11, 2019, 05:17:44 pm
Non so ... possibile che non ci abbia mai provato nessuno??

se non hai urgenza (= qualche giorno di pazienza) dovrei provare anche io, magari mettendo insieme le prove riusciamo a fare dei progressi
in alternativa puoi chiedere sul forum ufficiale, li sicuramente qualcuno dovrebbe rispondere

Oramai ci sto sbattendo da un pò e mi sono quasi rassegnato .... quindi non ho molte alternative all'aspettare!!  ;D ;D

La documentazione di riferimento dovrebbe essere questa.https://www.ietf.org/rfc/rfc2633.txt:)
Grazie, la documentazione è sempre utile, ma in questo caso sono delle funzioni inserite in una procedura funzionante su altri sistemi (Delphi + Windows). Le funzioni Openssl dovrebbero essere uguali..... Mah


In realtà credo che più che un problema Delphi/Lazarus sia un problema Windows/Linux ....
Per Openssl su windows c'è libeay32.dll ... su Linux i compiti sono divisi fra libssl.so e libcrypto.so

A prescindere da questo, nel momento in cui le funzioni vengono caricate correttamente dalle librerie visto che openssl è uno standard le funzioni dovrebbero funzionare ugualmente.
Titolo: Re:PKCS7 vuoto
Inserito da: Stilgar - Marzo 11, 2019, 05:57:52 pm
Hai provato... Molto stupidamente ad aprire col notepad il file p7m?
Se non devi controllare i certificati... 😜
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 11, 2019, 06:31:12 pm
Hai provato... Molto stupidamente ad aprire col notepad il file p7m?
Se non devi controllare i certificati... 😜

Ti diro di più ... ho tagliato il file cercando gli header <xml .... ma il file risultante è sporcato da caratteri strani... credo siano ascii sotto a 10....
Titolo: Re:PKCS7 vuoto
Inserito da: Stilgar - Marzo 11, 2019, 06:39:38 pm
Allora il trucco ignorante lo conosci 😂😂😂
Cmq. Se puoi processare i singoli caratteri poi per bonificare il testo prima di leggerlo come xml dovresti poter avere un'approssimazione del giro corretto.

😉
Titolo: Re:PKCS7 vuoto
Inserito da: Stilgar - Marzo 11, 2019, 08:19:08 pm
Dubbio. Togli la coda del file o dai tutto in pasto al parser?
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 12, 2019, 07:17:31 am
Allora il trucco ignorante lo conosci 😂😂😂


Ad ignoranza me la cavo bene ....  :D :D




Dubbio. Togli la coda del file o dai tutto in pasto al parser?


     FPos := Pos('<?xml version', S.DataString);
     LPos := Pos(':FatturaElettronica>', S.DataString)+20;
     Count := Lpos - FPos;
     xmlstringa := MidStr(s.DataString, FPos, Count);     

  ogni tanto trovo         Co‚èdiceArticolo><Descrizione>     

    no riesco a filtrarli tutti ....
Titolo: Re:PKCS7 vuoto
Inserito da: xinyiman - Marzo 12, 2019, 08:31:08 am
Domanda stupida stupida, se pensi che il problema sia tra windows/linux. Hai provato a vedere su linux cosa leggi? Trovi anche li i caratteri strani? Che encoding ha il file su linux? Con che encoding apri il file su windows?
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 12, 2019, 06:32:49 pm
Ho solo Linux.... Sono Windows free da parecchio.
Ma non mi riferivo alla soluzione ignorante....  Mi riferivo ad Openssl
Titolo: Re:PKCS7 vuoto
Inserito da: giuian - Marzo 13, 2019, 08:42:25 am
La soluzione ignorante funziona ... almeno con i file che ho provato io.
Se qualcuno vuole provare o apportare migliorie...
Questa è versione per riga di comando.

Codice: [Seleziona]
program estraip7m;

{$mode objfpc}{$H+}
uses
   Classes, FileUtil, Strutils, SysUtils,DOM, XMLRead, base64;
var
  vstrm : TFilestream;
  S : Tstringstream;
  fPos,Lpos,count :integer;
  xmlfile,p7mfiltrato : Utf8string;
  j: integer;
  Str : string;
  XML : TXMLDocument;

begin

   vstrm := TFileStream.Create(ParamStr(1), fmOpenRead);

   // Apre p7m
   if ExtractfileExt(ParamStr(1)) = '.p7m' then
   begin
     vstrm.Position:= 0;
     S := TStringStream.Create('');
     S.Size := vstrm.Size;
     S.CopyFrom(vstrm, vstrm.Size);
     S.Position := 0;
     vstrm.Free;
     p7mfiltrato := '';
      // filtra caratteri speciali
     for j := 1 to Length(s.datastring) do
     if not ((s.datastring[j] in [#1..#12,#14..#30]) or (s.datastring[j] > char(127))) then
        p7mfiltrato := p7mfiltrato+s.datastring[j];


     // Ricerca tag xml per estrazione
     FPos := Pos('<?xml version', p7mfiltrato);
     LPos := Pos(':FatturaElettronica>', p7mfiltrato)+20;
     Count := Lpos - FPos;
     xmlfile:= MidStr(p7mfiltrato, FPos, Count);
     S.Free;
     // Salva xml
     S := Tstringstream.Create(xmlfile);
     vstrm := TFileStream.Create(StringReplace(ParamStr(1),'.xml.p7m','.xml',[rfReplaceAll]), fmCreate);
     vstrm.CopyFrom(S,S.Size);
     // Legge XML per attachment pdf
     S.Position:= 0;
     ReadXMLFile(XML, S);
     s.free;
     // Se esiste allegato e se PDF estrai e salva
     if  (XML.DocumentElement.GetElementsByTagName('Attachment').Count > 0) and (XML.DocumentElement.GetElementsByTagName('FormatoAttachment').item[0].LastChild.TextContent = 'PDF')  then
     begin
       writeln('Estrazione pdf');
       vstrm.Free;
       vstrm := TFileStream.Create(StringReplace(ParamStr(1),'.xml.p7m','.pdf',[rfReplaceAll]), fmOpenWrite or fmCreate);
       vstrm.Position := 0;
       Str := DecodeStringBase64(XML.DocumentElement.GetElementsByTagName('Attachment').Item[0].LastChild.TextContent);
       vstrm.Write(Pointer(Str)^, Length(Str) div SizeOf(Char));
     end;
   end
   else
    writeln('Tipo di File non supportato');

   vstrm.Free;
end.   
Titolo: Re:PKCS7 vuoto
Inserito da: bonmario - Marzo 13, 2019, 07:37:13 pm
Purtroppo il tuo codice è "personalizzato" sui p7m della fattura elettronica.
L'ho comunque salvato, appena riesco, vedo se riesco ad adattarlo ai p7m che scarico dal sito del mio comune.

Ciao, Mario
Titolo: Re:PKCS7 vuoto
Inserito da: Stilgar - Marzo 13, 2019, 07:54:20 pm
Ciao Mario.Il sito del tuo comune, usa per caso Halley come fornitore?Se sì mi puoi dare il numero cliente?
Dovresti trovare qualche cosa del tipoc028049
(ed eventualmente sac???.halleysac.it se il comune ha pagato poco per masherare il server halley :) )Altrimenti se mi passi il link del comune, anche come messaggio privato, posso vedere di aiutarti a sbustare il documento :)
Stilgar

Titolo: Re:PKCS7 vuoto
Inserito da: bonmario - Marzo 13, 2019, 08:08:46 pm
Non lo so ... tra l'altro ora sono su Linux e, non so perché, ma non mi fa fare ricerche all'interno di quel file ...
In ogni caso, è un atto pubblico, quindi c'è niente di male nel pubblicare il link ...

Eccolo:
http://casellelurani.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap/-/papca/display/4605089?p_auth=42wyi8Yz&p_p_state=pop_up

Una volta aperto, sulla destra c'è un solo documento che ha 2 icone sotto la colonna "Scarica". Se clicchi sulla prima icona, ti scarica il file p7m, se clicchi sulla seconda, ti scarica il suo equivalente pdf non firmato.

Grazie, Mario