Chiavi DSS
- Generazione e recupero di chiavi DSS
- Generazione di firme DSS
- Verifica di una firma DSS
- Esportazione di chiavi DSS
Generazione e recupero di chiavi DSS
Le chiavi DSS possono essere generate da una chiamata alla funzione CryptGenKey . La chiamata a CryptGenKey richiede che AT_SIGNATURE o CALG_DSS_SIGN essere passati nell'argomento Algid . Questa chiamata genererà i valori P (modulo primo), Q (primo), G (generatore), X (esponente segreto) e Y (chiave pubblica) da zero e li persistenti in un BLOB di chiavi nell'archiviazione locale.
Per generare una coppia di chiavi di firma DSS
- Chiamare la funzione CryptAcquireContext per ottenere un handle al provider di crittografia di Microsoft DSS.
- Chiamare CryptGenKey per generare le chiavi. È necessario passare AT_SIGNATURE o CALG_DSS_SIGN per l'argomento Algid e i 16 bit superiori dell'argomento dwFlags devono essere impostati sulla dimensione della chiave desiderata. Se i 16 bit superiori sono zero, verranno usate le dimensioni predefinite delle chiavi di 1.024 bit. Un handle HCRYPTKEY viene restituito nell'argomento hKey .
Per recuperare un puntatore alle chiavi di firma generate in precedenza
- Chiamare CryptAcquireContext per ottenere un handle al provider di crittografia Microsoft DSS.
- Chiamare la funzione CryptGetUserKey con l'argomento dwKeySpec impostato su AT_SIGNATURE o CALG_DSS_SIGN.
Per recuperare i valori P, Q e G
- Chiamare CryptAcquireContext per ottenere un handle al provider di crittografia Microsoft DSS.
- Chiamare CryptGetUserKey con l'argomento dwKeySpec impostato su AT_SIGNATURE o CALG_DSS_SIGN.
- Chiamare CryptGetKeyParam con l'argomento hKey impostato sul puntatore recuperato nel passaggio precedente. L'argomento dwParam deve essere impostato sul flag desiderato; KP_P, KP_Q o KP_G. Il valore viene restituito nell'argomento pbData e la lunghezza dei dati viene restituita nell'argomento pdwDataLen . Il valore viene restituito senza informazioni di intestazione e in formato little-endian .
Generazione di firme DSS
I dati da firmare devono prima essere hashati usando l'algoritmo SHA . Dopo aver eseguito l'hash dei dati, viene generata una firma DSS chiamando la funzione CryptSignHash .
Per generare una firma DSS
- Chiamare CryptAcquireContext per ottenere un handle al provider di crittografia Microsoft DSS.
- Chiamare CryptCreateHash con l'argomento Algid impostato su CALG_SHA per ottenere un handle in un oggetto hash SHA.
- Chiamare CryptHashData con l'argomento hHash impostato sull'handle recuperato nel passaggio precedente. In questo modo viene creato un hash dei dati e viene restituito un handle all'hash nell'argomento phHash della chiamata di funzione CryptCreateHash .
- Chiamare CryptSignHash con l'argomento hHash impostato sull'handle recuperato nel passaggio precedente. È possibile passare AT_SIGNATURE o CALG_DSS_SIGN nel parametro dwKeySpec . La firma viene restituita all'indirizzo fornito nell'argomento pbSignature e la lunghezza della firma viene restituita all'indirizzo fornito nell'argomento pdwSigLen . Un puntatore NULL può essere passato nell'argomento pbSignature e, in questo caso, la firma non viene generata, ma la lunghezza della firma viene restituita all'indirizzo fornito nel parametro pdwSigLen .
Verifica di una firma DSS
Per verificare una firma DSS, è necessario importare la chiave pubblica DSS del firmatario, i dati firmati devono essere hash e quindi la firma può essere verificata.
Per verificare una firma DSS
Chiamare CryptAcquireContext per ottenere un handle al provider di crittografia Microsoft DSS.
Chiamare CryptImportKey per importare la chiave pubblica DSS del firmatario.
Chiamare CryptCreateHash con l'argomento Algid impostato su CALG_SHA per ottenere un handle in un oggetto hash SHA.
Chiamare CryptHashData con l'argomento hHash impostato sull'handle recuperato nel passaggio precedente e con pbData che punta ai dati firmati. In questo modo viene creato un hash dei dati e viene restituito un handle all'hash nell'argomento phHash della chiamata di funzione CryptCreateHash .
Chiamare CryptVerifySignature con le impostazioni seguenti:
hHash è impostato sull'handle sull'hash eseguito nel passaggio precedente.
pbSignature punta alla firma da verificare.
dwSigLen è impostato sulla lunghezza della firma.
hPubKey è impostato sull'handle della chiave pubblica importata nel passaggio 2.
dwFlags è impostato su zero.
Esportazione di chiavi DSS
Quando si inviano dati firmati a un utente in cui la firma deve essere verificata dal destinatario, la chiave pubblica del firmatario deve essere fornita al destinatario e viene in genere inviata insieme ai dati firmati. Pertanto, è necessario poter esportare le chiavi DSS in un formato BLOB chiave .
Per esportare la chiave pubblica DSS
- Chiamare CryptAcquireContext per ottenere un handle al provider di crittografia Microsoft DSS.
- Chiamare CryptGetUserKey con l'argomento dwKeySpec impostato su AT_SIGNATURE o CALG_DSS_SIGN.
- Chiamare CryptExportKey con hKey impostato sull'handle recuperato nel passaggio precedente, dwBlobType impostato su PUBLICKEYBLOB e dwFlags impostato su zero. Il BLOB della chiave pubblica DSS viene restituito in pbData e la lunghezza del BLOB della chiave viene restituita in pdwDataLen. Un puntatore NULL può essere passato in pbData e, in questo caso, verrà restituito solo la lunghezza del BLOB della chiave DSS. Il BLOB restituito durante l'esecuzione della chiamata a CryptExportKey è nel formato descritto in BLOB chiave del provider DSS.
Per esportare la chiave privata DSS
- Seguire la stessa procedura dell'esportazione di una chiave pubblica DSS, ad eccezione del fatto che quando si effettua la chiamata a CryptExportKey, dwBlobType è impostato su PRIVATEKEYBLOB. Il BLOB restituito durante l'esecuzione della chiamata a CryptExportKey è nel formato descritto in BLOB chiave del provider DSS.