/// <summary> /// Firma del file /// </summary> /// <param name="SubjectCN">Subject Common Name</param> /// <param name="pathFile">file da firmare</param> /// <param name="lastError">ultimo errore nella funzionalità</param> /// <param name="pin">pin smartcard/usb (opzionale). Se non fornito comparirà una finestra di dialogo del sistema operativo Windows per indicare il pin</param> /// <param name="csp">provider csp (opzionale). Se non indicato verrà selezionato automaticamente. Utilizzare questo parametro per indicarne uno specifico. Utilizzare il metodo CSPs per visualizza i csp presenti nel sistema</param> /// <returns>firma avvenuta con successo</returns> public static bool Firma(string SubjectCN, string pathFile, ref string lastError, string pin = null, string csp = null) { bool success = false; try { if (Utilities.glob.UnlockStatus == 0) { lastError = "Licenza bloccata"; return(success); } Chilkat.Crypt2 crypt = new Chilkat.Crypt2(); // Utilizza il certificato su una smartcard o su USB. Chilkat.Cert cert = new Chilkat.Cert(); // cryptographic service provider if (!string.IsNullOrWhiteSpace(csp)) { success = cert.LoadFromSmartcard(csp); if (success != true) { lastError = cert.LastErrorText; return(success); } } // Passa il Subject CN del certificato al metodo LoadByCommonName. success = cert.LoadByCommonName(SubjectCN); if (success != true) { lastError = cert.LastErrorText; return(success); } // Fornire il PIN della smartcard. // Se il pin non è fornito esplicitamente qui, // Se non fornito dovrebbe comparire una finestra di dialogo del sistema operativo Windows per indicare il pin if (!string.IsNullOrWhiteSpace(pin)) { cert.SmartCardPin = pin; } // Fornisce il certificato per firmarlo success = crypt.SetSigningCert(cert); if (success != true) { lastError = crypt.LastErrorText; return(success); } // Indica l'algoritmo da utilizzare crypt.HashAlgorithm = "sha256"; // Specifico gli attributi firmati per essere inclusi. // (Questo è quello che fa un CAdES-BES compliant.) Chilkat.JsonObject jsonSignedAttrs = new Chilkat.JsonObject(); jsonSignedAttrs.UpdateInt("contentType", 1); jsonSignedAttrs.UpdateInt("signingTime", 1); jsonSignedAttrs.UpdateInt("messageDigest", 1); jsonSignedAttrs.UpdateInt("signingCertificateV2", 1); crypt.SigningAttributes = jsonSignedAttrs.Emit(); string sigFile = $"{pathFile}.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.p7m)}"; // Creo una firma CAdES-BES, che contiene i dati originali success = crypt.CreateP7M(pathFile, sigFile); if (!success) { lastError = crypt.LastErrorText; return(success); } success = true; } catch { throw; } return(success); }