Newsgroup: it.comp.sicurezza.crittografia
Titolo: cryptoki.dll e .NET

Buon giorno.
Spero di non aver sbagliato NG dal momento che il mio quesito è legato
alla programmazione... in tal caso chiedo venia e vi chiedo
gentilmente, se ne siete a conoscenza, di indicarmene uno più idoneo.
Ho sviluppato un sw in C che, appoggiandosi alla libreria cryptoki.dll
fornita da Eracom firma un array di byte con una chiave privata RSA. DI
seguito un estratto del codice:
   CK_MECHANISM signMech = {CKM_RSA_PKCS, NULL, 0};
   rv = C_SignInit(hSession, &signMech, hKey);
   rv = C_Sign(hSession, Data, DataLen, *ppSignature, pSignatureLen);
ovviamente ppSignature è stato allocato correttamente in precedenza
(da una chiamata ulteriore a C_Sign) e Data è il valore hash SHA1 del
buffer che voglio firmare.
A questo punto se eseguo un Verify con la funzione C_Verify tutto
funziona correttamente.
Fin qui, sembra che tutto funzioni...
Il mio problema è che vorrei eseguire la verifica non dal software C
(usando la cryptoki.dll, ma da C# su piattaforma .NET 1.1).
Per questo fine ho estratto la chiave pubblica e la ho importata in un
oggetto RSACryptoServiceProvider come di seguito:
   RSACryptoServiceProvider CSO = new RSACryptoServiceProvider();
   byte[] data = ...;
   Parametri.Exponent = (byte[])esponente;
   Parametri.Modulus = (byte[])modulo;
   CSO.ImportParameters(Parametri);
   res = CSO.VerifyData(data, "SHA1", signature);
la variabile booleana res vale false :(
Sono certo di aver importato correttamente la chiave pubblica e la
firma... a questo punto il mio dubbio è che il .NET utilizzi un
mechanism differente da quello utilizzato nelle cryptoki oppure che il
formato dei dati di input non siano coerenti con quello della funzione
C_Sign della Cryptoki.
Qualcuno di voi ha esperienza di tale problematica e sa darmi una
risposta?
Grazie per l'attenzione.

 (usando la cryptoki.dll, ma da C# su piattaforma .NET 1.1).
Se da C ti funziona tutto direi che le chiamate alla libreria PKCS#11
sono corrette.
Se da C# non riesci a farle funzionare temo sia più un problema di
capire come chiamare una DLL "C" da un programma C# "managed"...
Su questo non ti so aiutare.
Puoi provare con più successo su microsoft.public.it.dotnet.csharp o
altri gruppi più inerenti...
(non c'è niente su C# sotto it.*? pare di no...)
    Lapo

 Su questo non ti so aiutare.
Ti ringrazio innanzitutto per la risposta.
Dal programma C# "managed" riesco a firmare e verificare tramite le
chiamate al codice C.
Il mio problema è che il verify non volevo farlo tramite le chiamate
al codice C (il che significherebbe fare accessi alla Smart Card), ma
tramite le CryptoApi del C# dopo l'import della chiave pubblica (per
questioni di performance dal momento che devo eseguire dei verify in
continuazione).
Risultato: il verify eseguito con le classi C# e la chiave pubblica
importata fallisce. Riesco a fare il verify solo tramite le chiamate
"managed" al codice C.
La mia ipotesi è che il C# usa un mechanism differente o vuole i dati
in un formato diverso.

Crumiro ha scritto:

tutto dipende dal contenuto del campo data (byte[] data = ...) che usi
in C#
Quando da cryptoki usi C_Sign con CKM_RSA_PKCS stai firmando
esattamente il contenuto della variabile Data. Quindi se stai apponendo
una firma digitale presumibilmente sarà l'hash di un documento. Anzi
sarà il DigestInfo in formato ASN1 DER encoded contente le
informazioni circa l'algoritmo di hash (MD5/SHA1) e l'hash vera e
propria. Questo formato corrisponde a quello che
RSACryptoServiceProvider si aspetta nella funzione VerifyData, ossia il
contenuto della variabile data.
In altre parole C_Sign con CKM_RSA_PKCS firma anche se Data non è il
DigestInfo mentre RSACryptoServiceProvider.VerifyData vuole
necessariamente un DigestInfo altrimenti non verifica
Spero di essere stato abbastanza chiaro. Altrimenti non esitare a
contattarmi.
Ciao,
Ugo Chirico
http://www.ugosweb.com