Firma embedded di un file pdf secondo lo standard PAdES-BES. Questa funzione va usata per realizzare firme legali a Norme di legge dal 30 giugno 2011.
definizione C:
int WINAPI dmtSigningPdfFileWithCadesAttributes(
HDMTOBJ hDmt,
CHAR *szFileName,
CHAR *szAlgHash = szOID_NIST_sha256, // Algoritmo di Hash
CHAR *szPin = "", // Pin della smart-card
BOOL fAddDsiTimeRef = FALSE, // Usa il riferimento temporale di dataflex
CHAR *szSigningTime = "", // Valore di un riferimento temporale proprio da includere
CHAR *szSigningTimeFormat = "", // Formattazione del riferimento temporale proprio
BOOL fAddSignatureTimeStamp = FALSE,
DATI_SERVER_TIMESTAMP *pDatiServerTimeStamp = NULL
);
hDmt - Handle dell'oggetto DiMaTek
szFileName- File pdf da firmare
szAlgHash - Identificativo dell'algoritmo di hash da utilizzare [vedi Algoritmi di hash e di cifratura]
szPin - Pin della smart-card
fAddDsiTimeRef - Se true Usa il riferimento temporale di dataflex
szSigningTimeFormat - Formattazione del riferimento temporale proprio
fAddSignatureTimeStamp - se true aggiunge una marca temporale contestualmente alla firma
pDatiServerTimeStamp - Struttura contenente le informazioni del Server di Marcatura temporale da utilizzare da generare e inserire contestualmente alla firma. Questi dati sono utilizzati solo se fAddSignatureTimeStamp è true
DMT_OK in caso di successo, altrimenti un codice di errore
Note:
con il flag fAddSignatureTimeStamp si abilita la funzionalità di poter aggiungere il TimeStampToken all'elenco di attributi non autenticati della firma. Ttale attributo viene letto correttamente da Adobe Pdf Reader identificando l'ente autenticatore del token (Infocert, Postecom, Aruba, ecc...).ù
Se il flag è impostato a TRUE durante la fase di firma verrà richiesto il TimeStamp al server indicato tra i parametri della struttura DATI_SERVER_TIMESTAMP a seconda del server interpellato verranno letti alcuni parametri.
Ad esempio per richiedere il TimeStamp ad un server di PosteCom hai bisogno di leggere un certificato di autenticazione e la relativa password per poter aprire il file .p12 da cui leggere il certificato di autenticazione, per Infocert hai bisogno di leggere i parametri szUsername o szPassword, per un server free hai solo bisogno di leggere i parametri szAlgHash e szHttpServerUrl
Esempio in C:
// ============================================================================
int FirmaFilePdf_CADES(char *FileDaFirmare, char *Pin)
{
int ret;
// Creo l'oggetto Dimatek
HDMTOBJ hDmt = dmtCreate(
0,
"MY",
PKCS11_DLL,
CRYPTO_PROVIDER_TYPE,
PKCS11_LOW_LEVEL_ENABLED);
if (hDmt < 0)
goto end;
ret = dmtLoadCertificate(hDmt,"Franco Spinella",FALSE);
if (ret != DMT_OK)
return ret;
ret = dmtSetDefaultCertificate(
hDmt,
0,
FALSE);
if (ret != DMT_OK)
return ret;
DATI_SERVER_TIMESTAMP DatiServerTimeStamp;
memset((PVOID)&DatiServerTimeStamp, 0, sizeof(DATI_SERVER_TIMESTAMP));
//SERVER FREE
//DatiServerTimeStamp.TipoServerTimeStamp = SERVER_FREE;
//DatiServerTimeStamp.szAlgHash = szOID_OIWSEC_sha1;
//DatiServerTimeStamp.szHttpServerUrl = "http://www.edelweb.fr/cgi-bin/service-tsp";
//DatiServerTimeStamp.szUsername = NULL;
//DatiServerTimeStamp.szPassword = NULL;
//SERVER INFOCERT
//DatiServerTimeStamp.TipoServerTimeStamp = SERVER_INFOCERT;
//DatiServerTimeStamp.szAlgHash = szOID_OIWSEC_sha1;
//DatiServerTimeStamp.szHttpServerUrl = "https://marte.infocert.it/cdie/DtsService";
//DatiServerTimeStamp.szUsername = "franco-s@dataflex.net";
//DatiServerTimeStamp.szPassword = "dataflex92";
//SERVER ARUBA
//DatiServerTimeStamp.TipoServerTimeStamp = SERVER_ARUBA;
//DatiServerTimeStamp.szAlgHash = szOID_NIST_sha256;
//DatiServerTimeStamp.szHttpServerUrl = "https://servizi.arubapec.it/tsa/ngrequest.php";
//DatiServerTimeStamp.szUsername = "test.fidatek";
//DatiServerTimeStamp.szPassword = "12345";
//SERVER POSTECOM
DatiServerTimeStamp.TipoServerTimeStamp = SERVER_POSTECOM;
DatiServerTimeStamp.szAlgHash = szOID_OIWSEC_sha1;
DatiServerTimeStamp.szHttpServerUrl = "https://62.241.224.224/servletN_TSS/TSReqServlet";
DatiServerTimeStamp.szCertificateFile = "C:\\Alessio\\dimatek4src\\Test\\Spinella_test.p12";
DatiServerTimeStamp.szCertificatePassword = "Spinella1,";
DatiServerTimeStamp.szUsername = NULL;
DatiServerTimeStamp.szPassword = NULL;
ret = dmtSigningPdfFileWithCadesAttributes(
hDmt,
FileDaFirmare,
"2.16.840.1.101.3.4.2.1", // szOID_NIST_sha256 - Algoritmo di Hash
Pin, // Pin della smart-card
FALSE, // Aggiungi il TimeStamp
"", // Time-Stamp da aggiungere
"", // Formato del Time-Stamp
FALSE,
&DatiServerTimeStamp
);
if (ret != DMT_OK)
goto end;
end:
if ((ret == DMT_OK) && (hDmt > 0))
MessageBox(NULL, "Funzione eseguita con successo", "DimatecTest", MB_OK);
else if (ret == -1)
dmtGetLastError(true);
else
{
char ErrorBuffer[200];
if (hDmt < 0)
sprintf(ErrorBuffer, "Funzione eseguita con ERRORE: %i", hDmt);
else
sprintf(ErrorBuffer, "Funzione eseguita con ERRORE: %i", ret);
MessageBox(NULL, ErrorBuffer, "DimatecTest", MB_OK);
}
if (hDmt > 0)
dmtRelease(hDmt);
return ret;
}