Decodifica Firma CADES - BES zucchetti

Ciao,

con la libreria attualmente in uso sul mio software non mi è possibile decodificare il formato CADES-bes generato dalla firma di Zucchetti,
quindi non mi è possibile aprire i file p7m delle fatture fornitori.
Qualcuno ha affrontato il problema?

Sembrerebbe un problema simile a quello che mi è stato segnalato da chi usa il software di Aruba: se la fattura è firmata da firma non Aruba per loro la firma non è valida.
Workaround: scarica un qualsiasi software per la firma digitale che non sia di Aruba (FirmaOk! di Poste, Dike di infocert, […] ce n’è a bizeffe), sfirma il p7m ed apri l’xml.

Grazie Federico ma non è un problema di client che mi permetta di aprire dei p7m, quello è abbastanza semplice, ma quella di integrare una libreria (ora usiamo bouncycastle) dove sia possibile decodare il p7m si zucchetti che pare sia encodato in modo non standard.

non è sufficiente prelevare la parte compresa tra i tag dell’xml ed escludere il testo non stampabile in modo da ottenere un xml pulito?

Il formato CAdES, basato su CMS, basato su PKCS#7, basato su ASN.1 è un formato abbastanza complicato che offre parecchia flessibilità. In particolare non è detto che il file firmato sia in unico blocco. Escludendo i caratteri non stampabili (sequenze utf8 non valide) forse ottieni il file pulito, ma solo se hai la fortuna che i dati dei header che non fanno parte del file generino sequenze utf8 non valide o caratteri unicode sballati. Ho visto fatture elettroniche (in particolare quelle firmate da Infocert) dove il file era spezzato in blocchi da 1000 byte e in quel caso te la cavi, ma io personalmente non mi fiderei che funzioni sempre.
Se l’unica cosa di cui avete bisogno è estrarre il file xml liscio dal file .p7m (senza nessuna verifica sulla validità della firma), potete anche farlo da soli, seguendo le specifiche del formato.
Vi consiglio di partire da qui: A Layman's Guide to a Subset of ASN.1, BER, and DER e poi usare gli RFC per avere gli identificatori necessari. Se riuscite a farvi un programmino che stampa la struttura del file p7m, diventa abbastanza facile identificare ed estrarre il file xml.

1 Mi Piace

Nel dubbio ho fatto dei test si estrazione del p7m Zucchetti e funziona: BC 1.8.4 C#.

ClaudioP, avresti cortesemente un esempio di codice per estrazione p7m tramite BouncyCastle?

Grazie.

Certo, qui il codice è anche più completo (verifica base64)

   static void Main(string[] args)
    {
        string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\";
        Console.WriteLine("Path: " + path);
        Stopwatch sw = new Stopwatch();
        sw.Start();
        DirectoryInfo dir = new DirectoryInfo(Path.GetDirectoryName(path));
        FileInfo[] xmltoprocess = dir.GetFiles();

            foreach (FileInfo file in xmltoprocess)
            {
                XmlDocument doc = new XmlDocument();
                if (file.Extension.ToLower() == ".p7m")
                {
                     bool Isbase64 = TryGetFromBase64String(File.ReadAllText(path + file.Name));
                     CmsSignedData signedFile;
                     if (Isbase64)
                        {
                            byte[] filep7mbase64 = Convert.FromBase64String(File.ReadAllText(path + file.Name));
                            signedFile = new CmsSignedData(filep7mbase64);
                        } else
                        {
                        using (FileStream filep7m = new FileStream(path + file.Name, FileMode.Open)) { 
                            signedFile = new CmsSignedData(filep7m);
                        }
                    }
                     using (var memStream = new MemoryStream())
                    {
                        signedFile.SignedContent.Write(memStream);
                        memStream.Seek(0, SeekOrigin.Begin);
                        doc.Load(memStream);
                    }
                    doc.Save(path + file.Name.Split('.')[0] + ".xml");
                }
            }
        sw.Stop();
        Console.WriteLine("tempo: " + sw.Elapsed);
        Console.ReadKey();
    }

    public static bool TryGetFromBase64String(string input)
    {
        byte[] output = null;
        try
        {
            output = Convert.FromBase64String(input);
            return true;
        }
        catch (FormatException)
        {
            return false;
        }
    }
}

Stay Tuned :partying_face:: https://forum.italia.it/t/decodifica-firma-cades-bes-php

Ti ringrazio molto per il codice. Ciao.