Codifica dei dati firmati
I dati firmati sono costituiti da contenuto di qualsiasi tipo e hash crittografati del contenuto da zero o più firmatari. L'hash risultante può confermare che il messaggio originale non è stato modificato dopo la firma e che determinate persone o entità hanno firmato i dati.
La figura seguente illustra la procedura per la codifica di un messaggio firmato. L'elenco che segue la figura descrive i passaggi.
Un messaggio può avere più firmatari, algoritmi di hash e certificati. Mentre la figura mostra solo certificati, CRL e CRL possono usare lo stesso processo. Si adattano all'illustrazione ovunque vengano visualizzati i certificati.
Il processo generale per la codifica dei dati firmati è il seguente.
Per codificare i dati firmati
- I dati vengono creati (se necessario) e viene recuperato un puntatore.
- Viene aperto un archivio certificati contenente il certificato del firmatario.
- La chiave privata per il certificato viene recuperata. Esistono due proprietà che devono essere impostate sul certificato prima di usarle. Uno viene usato per collegare un certificato a un provider di servizi di configurazione specifico e, all'interno di tale CSP, a un determinato contenitore di chiavi private. L'altro viene usato per indicare quale algoritmo hash deve essere utilizzato quando viene chiamata un'operazione hash . Queste devono essere impostate una sola volta.
- La proprietà di un certificato determina l'algoritmo hash.
- Un hash dei dati viene creato inviando i dati tramite la funzione hash.
- La firma viene creata crittografando l'hash usando la chiave privata, ottenuta tramite una proprietà sul certificato.
- I dati seguenti sono inclusi nel messaggio firmato completato:
- Dati originali da firmare
- Algoritmi hash
- Le firme
- Strutture delle informazioni del firmatario, che includono l'identificatore del firmatario (autorità di certificazione e numero di serie)
- Certificati del firmatario (facoltativo)
Questa procedura illustra un caso semplice. I casi più complessi includono attributi autenticati inclusi nel messaggio. Quando il tipo di contenuto è qualcosa di diverso da una stringa BYTE o è presente almeno un attributo autenticato insieme a qualsiasi tipo di dati, sono necessari due attributi autenticati standard: il tipo di contenuto (dati) e l'hash del contenuto. In queste circostanze , CryptoAPI fornisce automaticamente questi due attributi obbligatori. Le funzioni di messaggio di basso livello eseguono l'hash degli attributi autenticati, crittografano l'hash con la chiave privata e lo forniscono come firma.
Usare le funzioni di messaggio di basso livello per eseguire le attività elencate, usando la procedura seguente.
Per codificare un messaggio firmato
Creare o recuperare il contenuto.
Ottenere un provider di crittografia.
Ottenere i certificati del firmatario.
Inizializzare la struttura CMSG_SIGNER_ENCODE_INFO .
Inizializzare la struttura CMSG_SIGNED_ENCODE_INFO .
Chiamare CryptMsgCalculateEncodedLength per ottenere le dimensioni del BLOB del messaggio codificato. Allocare memoria per tale memoria.
Chiamare CryptMsgOpenToEncode, passando CMSG_SIGNED per dwMsgType e un puntatore a CMSG_SIGNED_ENCODE_INFO per pvMsgEncodeInfo per ottenere un handle al messaggio aperto.
Chiamare CryptMsgUpdate, passando l'handle recuperato nel passaggio 7 e un puntatore ai dati da firmare e codificare. Questa funzione può essere chiamata tutte le volte necessario per completare il processo di codifica.
Chiamare CryptMsgGetParam, passando l'handle recuperato nel passaggio 7 e i tipi di parametro appropriati per accedere ai dati codificati desiderati. Ad esempio, passare CMSG_CONTENT_PARAM per ottenere un puntatore all'intero messaggio PKCS #7 .
Se il risultato di questa codifica deve essere usato come dati interni per un altro messaggio codificato, ad esempio un messaggio in busta, è necessario passare il parametro CMSG_BARE_CONTENT_PARAM. Per un esempio che mostra questo, vedere Codice alternativo per la codifica di un messaggio in busta.
Chiudere il messaggio chiamando CryptMsgClose.
Il risultato di questa procedura è un messaggio codificato che contiene i dati originali, l'hash crittografato di tali dati (firma) e le informazioni sul firmatario. È disponibile anche un puntatore al BLOB codificato desiderato.
Per informazioni dettagliate sulla codifica C, vedere Esempio di programma C: firma, codifica, decodifica e verifica di un messaggio.