Introduzione

1.1          Cos’è un eToken USB

L’eToken è il primo strumento USB per la sicurezza ed integrità dei dati e delle reti in ambiente Internet. Basandosi sulla facilità d'uso e sulla estrema funzionalità fornita dalle porte Universal Serial Bus (USB), eToken non richiede alcuna ulteriore apparecchiatura per il suo utilizzo.

VANTAGGI  permette alle aziende di eliminare costi, massimizzare la facilità d'uso senza minimamente ridurre la sicurezza.

L’eToken si basa sulla pionieristica tecnologia della Aladdin, sviluppata fin dal 1988 per la protezione del sw per PC e MAC con chiavi USB, che ha permesso di usare con successo milioni di porte USB in PC, laptop, palmtop.

L’eToken crittografa informazioni e custodisce chiavi private, password e certificati di firme digitali in un dispositivo USB della dimensione di una chiave di casa.

 

 

 

 

1.1.1        eToken R2

 

 

 

 

 

²  Comprende il protocollo per l’autenticazione DESX a 120 bits.

²  Combina grande sicurezza e semplice implementazione per autenticazione utente, access control, confidenzialità e integrità dei dati.

²  Memorizza e cifra credenziali quali chiavi private, password, certificati digitali, (memoria 16 K o 32 K).

²  Economico e facile da usare.

 


DESX (DES eXtended) è un algoritmo di cifratura che estende il DES a una chiave di 120 bits aggiungendo due operazioni complesse che incrementano sicurezza ed efficienza. Decifrare un messaggio cifrato con il DESX significa trovare la giusta informazione in 2118 operazioni. E' stato provato che ciò è matematicamente difficile.

 

Operating systems

Windows 98, Windows NT4.0, Windows 2000, Windows ME

Certifications & standards

PKCS#11 v2.01, CAPI (Microsoft Crypto API), Siemens/Infinion APDU commands PC/SC, X.509v3 certificates, SSLv3, IPSec/IKE PRO

Models (by memory size)

16 k & 32k

On board security algorithms / processors

DES-X 120-bit *

Chip security level

Secured and encrypted EEPROM memory chip

Dimensions

47 x 16 x 8 mm (1.85 x 0.63 x 0.31 inches)

Weight

5g

Power dissipation

120mW

Operating temperature

0 C to 70 C (32 F to 158 F)

Storage temperature

-40 C to 85 C (-40 F to 185 F)

Humidity rating

0-100% without condensation

Water resistance certification

IP X8 IEC 529

Connector

USB type A (Universal Serial Bus)

Casing

Hard molded plastic, tamper evident

Memory data retention

At least 10 years

Memory cell rewrites

At least 100,000

 

 

 

 

1.1.2        eToken PRO

 

²  Comprende un chip crittografico RSA in grado di generare la coppia di chiavi simmetriche; il chip Siemens SLE66C, è certificato ITSEC E4.

 

²  Tiene traccia delle manomissioni ed è resistente all’acqua.

 

²  Fornito di memoria a 16K o 32 K.

 

 

Operating systems

Windows 98, Windows NT4.0, Windows 2000, Windows ME

Certifications & standards

PKCS#11 v2.01, CAPI (Microsoft Crypto API), Siemens/Infinion APDU commands PC/SC, X.509v3 certificates, SSLv3, IPSec/IKE PRO

Models (by memory size)

16 k & 32k

On board security algorithms / processors

RSA 1024-bit, DES, 3DES (Triple DES) , SHA1, (MD5 - optional)

Smartcard chip security level

Smartcard chip security level ITSEC LE4 Smart card security certification (infinion).

Speed

RSA 1024 Bit signature approx. 1.0 sec RSA 1024 Bit key generation approx.25 sec

Dimensions

47 x 16 x 8 mm (1.85 x 0.63 x 0.31 inches)

ISO specification support

Support for ISO 7816 1-4 specifications.

Weight

5g

Power dissipation

120mW

Operating temperature

0 C to 70 C (32 F to 158 F)

Storage temperature

-40 C to 85 C (-40 F to 185 F)

Humidity rating

0-100% without condensation

Water resistance certification

IP X8 IEC 529

Connector

USB type A (Universal Serial Bus)

Casing

Hard molded plastic, tamper evident

Memory data retention

At least 10 years

Memory cell rewrites

At least 100,000

 

 

 

 

 

1.2          A cosa serve un eToken USB

L’eToken offre soluzioni per :

²  Autenticazione utenti

²  Web Access Control

²  Applicazioni PKI portabili e salvataggio certificati digitali

²  Sicurezza per accesso remoto

 

 

 

 

 

 

 

² Autenticazione utenti

        É finito il tempo degli accessi "password based" che minano la sicurezza aziendale: diversi tools di eToken Enterprise permettono, tramite eToken, un logon sicuro alla rete basato su un doppio fattore di autenticazione. eToken fornisce sia autenticazione dell'utente sul server Web, sia autenticazione del server Web, cioè l'utente può verificare che il sito Web a cui sta accedendo è veramente quello a cui vuole accedere.

² Web Access Control

        eToken offre un'elevata sicurezza hardware alle società che effettuano transazioni finanziarie, legali o commerciali tramite Internet e la cui integrità deve essere garantita.

² Applicazioni PKI

         La ditta eToken Enterprise offre la possibilità agli utenti di applicazioni PKI, di salvare a bordo di eToken le credenziali private, di creare un ambiente applicativo sicuro e di facilitarne notevolmente l'utilizzo.

        L'uso più sicuro dell'autenticazione consiste nell'includere con ogni messaggio firmato il certificato digitale. Chi riceve il messaggio verifica il certificato utilizzando la chiave pubblica della Certificate Authority (CA). Se la chiave pubblica del mittente è legittima, il ricevente verifica la firma del messaggio. Firme digitali create con chiavi private sono verificate con il certificato digitale che contiene la chiave pubblica.

 

 

 

 

 

² Sicurezza per accesso remoto

 

 

 

 

 

 

 

 

 

eToken Enterprise offre soluzioni "out of the box" per la protezione di Intranet ed Extranet.

 

eToken Enterprise permette di eseguire un logon sicuro alla VPN di SecuRemote di Checkpoint.

 

SecuRemote e SecureClient estendono la sicurezza al desktop e laptop.

 

Con SecuRemote e SecureClient i dati sono criptati prima che essi lascino il computer del client.

 

 

 

 

Programmazione in Visual Basic e Vbscript

 

2.1       Descrizione funzioni

Quelle che vedremo sono alcune delle funzioni della CryptoAPI usate con l’eToken USB. Infatti le CriptoAPI sono un’interfaccia di programmazione che fornisce servizi per autenticazione, codifica e crittografia nelle applicazioni basate su Win32.

I concetti su cui si basano le CryptoAPI  sono:

²    Cryptographic Service Provider  CSP

²    Contesto  Crittografico

 

Un CSP  è un modulo indipendente che esegue le operazioni crittografiche come ad esempio creare e distruggere le chiavi. Le CriptoApi permettono di richiamare vari tipi di CSP: in tal modo il programmatore può sfruttare le funzionalità dei vari providers usando la stessa interfaccia.Cryptographic Service Provider (CSP).

Il CSP fornisce una strada sicura per multiple applicazioni per l'accesso a servizi crittografici e di firma.

Per esempio alcuni CSP richiedono un PIN (Personal Identific Number) prima che una firma digitale è generata dall’user,  mentre alcuni richiedono una smart card.

Un Contesto Crittografico è un contenitore di chiavi (tutti i sistemi di crittografia sono basati sul concetto di chiavi, simmetriche o asimmetriche); un contenitore può essere usato sia per contenere la coppia chiave pubblica/chiave privata sia per contenere la sola chiave pubblica.

                           

Siccome tutte le applicazioni usano chiavi, prima di usare una delle funzioni della CryptoAPI bisogna acquisire un contesto crittografico.

 

 

 

 

 

2.1.1           CryptAcquireContext

È la prima operazione da fare. Se non si specifica niente, viene usato il contesto di default.

Questa funzione acquisisce un handle di un particolare contenitore di chiavi all’interno di un particolare CSP; restituisce l’handle che può essere usato per chiamare il CSP selezionato.

 

Nella libreria wincrypt.h sono definiti i seguenti tipi di dati:

 

²  HCRYPTPROV è il puntatore al CSP

typedef unsigned long HCRYPTPROV;

 

²    HCRYPTKEY è usato per rappresentare un puntatore alle chiavi crittografiche per indicare al modulo CSP quali chiavi vengono usate per eseguire una particolare operazione. Il CSP non permette all’utente l’accesso diretto alle chiavi ma solo tramite questi puntatori

typedef unsigned long HCRYPTKEY;

 

²  HCRYPTHASH è il puntatore all’oggetto hash per indicare al modulo CSP quale oggetto       viene usato per l’esecuzione di una particolare operazione. Il CSP non permette l’accesso diretto all’hash, bisogna usare questi puntatori

typedef unsigned long HCRYPTHASH;

I parametri che la funzione CryptAcquireContext prende sono:

²  phProv   indirizzo della copia dell’handle del CSP;

²  pszContainer   è il nome del contenitore delle chiavi. Il nome è indipendente dal metodo usato per la memorizzazione delle chiavi. Questo parametro ha valore NULL se si usa il nome di default;

²  pszProvider   specifica il servizio crittografico usato. Se il parametro è NULL, si userà il provider di default ;

²  dwProvType   specifica i tipi di provider. I possibili valori sono:

o       PROV_RSA_FULL

o       PROV_RSA_SIG

o       PROV_DSS

o       PROV_DSS_DH

o       PROV_SSL

²  dwFlags   questo parametro normalmente è settato a zero ma alcune applicazioni setteranno uno o più dei seguenti flags:

o      CRYPT_VERIFY_CONTEXT  Se settato allora l’applicazione non avrà accesso alle chiavi private e il parametro pszContainer deve essere settato a NULL.

o      CRYPT_NEW_KEYSET  Se settato allora un nuovo contenitore di chiavi sarà creato con il nome specificato da pszContainer. Se pszcontainer vale NULL allora il contenitore di chiavi creato avrà il nome di default.

o      CRYPT_MACHINE_KEYSET  Per default le chiavi sono memorizzate nella porzione del registro Hkey_Current_User.Questo flag può essere combinato con tutti gli altri flag indicando che la locazione per la chiave è Hkey_Local_Machine.

o      CRYPT_DELETE_KEYSET  Se settato allora il contenitore di chiavi   specificato dalla funzione pszContainer è cancellato.

La funzione CryptAcquireContext restituisce

        TRUE   se ha successo

        FALSE altrimenti.

Eventuali errori possono essere ritrovati grazie alla funzione GetLastError. Questa funzione non prende parametri e restituisce il codice dell’ultimo errore.

 

 

 

 

2.1.2       CryptGetProvParam

Questa funzione recupera i parametri che controllano le operazioni di un CSP.

 

 

 

Vediamo che la funzione prende come parametri:

²  hProv   gestisce il CSP al quale si riferiscono i parametri;

²  dwParam   è il numero del parametro;

²  pbData   è il puntatore ad un buffer che riceve i dati del parametro specificato. La forma di questi dati cambia a seconda del numero di parametro scelto;

²  pcbData   è il puntatore ad una variabile che specifica la lunghezza in bytes del buffer puntato da pbData. Quando la funzione termina, la variabile puntata dal parametro pcbData contiene il numero di bytes memorizzati nel buffer. Nota che quando i dati vengono processati e memorizzati nel buffer, le applicazioni hanno la necessità di utilizzare l’attuale dimensione dei dati ritornati, l’attuale dimensione può essere leggermente più piccola rispetto alla dimensione del buffer specificato sull’input. (sull’input, le dimensioni dei buffer sono abbastanza grandi per poter inserire nel buffer la maggior quantità possibile di dati in output.) sull’output, la variabile puntata da questo puntatore è aggiornata per riflettersi nell’attuale dimensione dei dati copiati nel buffer;

²  dwFlags   valori dei flags. A seconda del numero del parametro specificato possono essere settati diversi flags.

 

Il numero del parametro contenuto in dwParam può essere settato con uno dei seguenti valori:

²  PP_CONTAINER   nome del contenitore della chiave. Quando questo parametro è specificato, la funzione riempie il buffer puntato da pbData con il nome del contenitore della chiave corrente;

²  PP_ENUMALGS   informazioni sull’algoritmo. Quando questo parametro è specificato, la funzione riempie il buffer puntato da pbData con le informazioni su uno degli algoritmi supportati dal CSP;

²  PP_IMPTYPE   tipi di CSP implementati: CRYP_IMPL_HARDWARE, CRYPT_IMPL_SOFTWARE, CRYPT_IMPL_MIXED, CRYPT_IMPL_UNKNOWN;

²  PP_NAME   nome del CSP. Quando questo parametro è specificato, la funzione riempie il buffer puntato da pbData con il nome del CSP;

²  PP_VERSION   numero della versione del CSP. Il buffer puntato da pbData conterrà un valore DWORD che indica il numero di versione del CSP.

 

Il seguente frammetno di codice indica il formato dei dati che la funzione ritorna nel buffer pbData

²  aiAlgid   è l’identificatore dell’algoritmo. Questo è il valore che viene passato alle funzioni CryptGenKey o CryptCreateHash per specificare che verrà usato quel particolare algoritmo.

²  dwBits   il numero di bits nella chiave usata nell’algoritmo.

²  dwNameLen   il numero di caratteri nel nome dell’algoritmo, incluso lo zero terminante.

²  szName   lo zero terminante il nome dell’algoritmo.

 

La funzione CryptGetProvParam restituisce

        TRUE   se ha successo

        FALSE altrimenti.

Per ottenere maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la funzione GetLastError

I seguenti sono i codici di errori che si verificano più di frequente:

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido

²  ERROR_MORE_DATA   il buffer specificato dal parametro pbData non è abbastanza grande per contenere I dati ritornati dalla funzione. In questo caso, la dimensione in bytes del buffer necessaria  per contenere i dati viene memorizzata nella variabile puntata da pcbData

²  ERROR_NO_MORE_ITEMS   è stata raggiunta la fine della lista delle enumerazioni e non è stato posto nessun dato valido nel buffer pbData. L’errore è ritornato solo quando il valore del parametro dwParam è PP_ENUMALGS

²  NTE_BAD_FLAGS   il parametro dwFlags è diverso da zero

²  NTE_BAD_TYPE   il parametro dwParam specifica un numero di parametro sconosciuto

²  NTE_BAD_UID   il contesto CSP specificato da hProv è non valido.

Nota:  i codici di errore con prefisso NTE sono generati dal particolare CSP           che si utilizza.

 

 

 

 

2.1.3           CryptCreateHash

Questa funzione è usata per inizializzare l’hashing di un flusso di dati. Essa ritorna al chiamante un handle ad un oggetto hash CSP. Questo handle può anche essere usato in una successiva chiamata alla funzione CryptHashSessionKey per flussi hash di dati e chiavi di sessioni.

I parametri di questa funzione sono:

²  hProv   handle al CSP ottenuto chiamando la funzione CryptAcquireContext;

²  Algid   è l’identificatore dell’algoritmo di hashing. I valori validi per questo parametro variano a seconda del CSP che si andrà ad utilizzare;

²  hKey   se l’algoritmo per l’hashing utilizza una chiave, questa deve essere passata come parametro alla funzione. Se l’algoritmo non richiede una chiave allora questo parametro deve essere zero;

²  dwFlags   è il valore del flag. Questo è un parametro riservato per usi futuri e dovrebbe sempre essere zero;

²  phHash   è l’indirizzo al quale la funzione copia il riferimento a un nuovo oggetto hash creato.

 

La funzione CryptCreateHash restituisce

        TRUE   se ha successo

        FALSE altrimenti.

Per ottenere maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la funzione GetLastError

I seguenti sono i codici di errori che si verificano più di frequente:

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)

²  ERROR_NOT_ENOUGH_MEMORY   il sistema operativo lavora in uno spazio di memoria che non è  il suo;

²  NTE_BAD_ALGID   il parametro Algid specifica un algoritmo che il CSP utilizzato non supporta;

²  NTE_BAD_FLAGS   il parametro dwFlags è diverso da zero

²  NTE_BAD_KEY   un algoritmo su chiave hash è specificato dai parametri Algid e hKey che sono entrambi zero o specificano un handle non valido;

²  NTE_NO_MEMORY   il CSP lavora in uno spazio di memoria non suo.

 

 

 

 

2.1.4           CryptGenKey

Questa funzione genera chiavi crittografiche random per usarle con il modulo CSP. Viene ritornato un handle della chiave che può essere utilizzato per altre funzioni CryptoAPI che lo richiedono.

I parametri di questa funzione sono:

²  hProv   handle ottenuto chiamando la funzione CryptAcquireContext;

²  Algid   è l’identificatore dell’algoritmo con il quale la chiave che si sta generando dovrà essere usata. I valori validi per questo parametro variano a seconda del CSP che si andrà ad utilizzare;

²  dwFlags   indica il tipo di chiave che si va a generare. Il valore può essere zero oppure si possono settare uno o più flags, in XOR, dei seguenti flags:

o      CRYPT_EXPORTABLE   se questo flag è settato, la chiave può essere trasferita fuori dal CSP in una chiave blob. Poiché le chiavi di sessioni devono generalmente essere esportabili, questo flag dovrebbe di solito essere settato si creano le chiavi. Se il flag non è settato, allora la chiave non potrà essere esportata. Per le chiavi di sessione, questo significa che la chiave sarà disponibile solo all’interno della sessione corrente e solo l’applicazione che l’ha creata, potrà utilizzarla. Per la coppia di chavi pubblica/privata, questo significa che la chiave privata non può essere trasportata. Questo flag si applica solo alla chiave di sessione e ai blobs di chiavi private; no si applica alle chiavi pubbliche in quanto sono sempre esportabili.

o      CRYPT_CREATE_SALT   se questo flag è settato, allora la chiave sarà automaticamente assegnata ad un valore salt random. Se questo flag non è settato, alla chiave sarà dato un valore salt pari a zero

o      CRYPT_NO_SALT   specifica che nessun valore salt viene allocate per una chiave simmetrica a 40 bits

o      CRYPT_USER_PROTECTED   se questo flag è settato, sarà notificato all’utente  attraverso un dialog-box o altro metodo che sono state tentate certe azioni usando questa chiave. Il comportamento è specificato dal CSP in uso

o      CRYPT_PREGEN   specifica una generazioni di chiavi iniziali con l’uso di Diffide-Hellman o DSS.

²  phKey   è l’indirizzo al quale la funzione copia l’handle della chiave che si sta generando.

(il blob è un’area di memoria che contiene la chiave pubblica o privata)

La funzione CryptGenKey restituisce

        TRUE   se ha successo

        FALSE altrimenti.

Per ottenere maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la funzione GetLastError

I seguenti sono i codici di errori che si verificano più di frequente:

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)

²  NTE_BAD_ALGID   il parametro Algid specifica un algoritmo che questo CSP non supporta;

²  NTE_BAD_FLAGS   il parametro dwFlags contiene un valore non valido;

²  NTE_BAD_UID   il parametro hProv non contiene un contesto handle valido;

²  NTE_FAIL   la funzione fallisce in modo inaspettato.

 

 

 

 

2.1.5           CryptHashSessionKey

La funzione CryptHashSessionKey è usata per computare l’hash crittografico su una chiave.

I parametri di questa funzione sono:

²  hHash   indica un handle ad un oggetto hash;

²  hKey   handle all’oggetto key di cui si vuole fare l’hash;

²  dwFlags   valori flag. Questo parametro è riservato ad usi futuri e dovrebbe sempre essere settato a zero.

Se la funzione ha successo, viene ritornato TRUE; in caso contrario il valore booleano ritornato da CryptHashSessionKey è FALSE.

Anche in questo caso, per ottenere maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la funzione GetLastError

I seguenti sono i codici di errori che si verificano più di frequente:

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)

²  NTE_BAD_ALGID   l’handle hHash specifica un algoritmo che il CSP in uso non supporta;

²  NTE_BAD_FLAGS   il parametro dwFlags non è zero;

²  NTE_BAD_HASH   l’oggetto hash specificato dal parametro hHash è non valido;

²  NTE_BAD_HASH_STATE   si è cercato di aggiungere dati all’oggetto hash che è già terminato;

²  NTE_KEY   è stato usato un algoritmo per fare l’hash di una chiave ma la chiave di sessione non è più valida. Questo errore sarà generato se la chiave di sessione viene distrutta prima di aver completato le operazioni;

²  NTE_BAD_UID   il contesto CSP che è stato specificato alla creazione dell’oggetto hash, non può essere trovato;

²  NTE_FAIL   la funzione fallisce in modo inaspettato.

 

 

 

 

2.1.6           CryptDestroyHash

La funzione distrugge l’oggetto hash. Dopo che è stato strutto, non può più essere usato.

Tutti gli oggetti hash dovrebbero essere distrutti con la funzione CryptDestroyHash quando l’applicazione termina di usarli.

L’unico parametro di questa funzione è

²  hHash   è l’handle dell’oggetto hash che deve essere distrutto.

 

La funzione CryptDestroyHash restituisce

        TRUE nel caso in cui ha successo

        FALSE altrimenti.

Per avere informazioni sull’errore verificatosi, possiamo utilizzare anche in questo caso la funzione GetLastError

Gli errori che si verificano più di frequente sono:

²  ERROR_BUSY   l’oggetto hash specificato dal parametro hHash è correntemente utilizzato da un altro processo;

²  ERROR_INVALID_HANDLE   il parametro hHash specifica un handle non valido;

²  ERROR_INVALID_PARAMETER   il parametro hHash contiene un valore non valido;

²  NTE_BAD_ALGID   l’handle hHash specifica un algoritmo che questo CSP  non supporta;

²  NTE_BAD_HASH   l’oggetto hash specificato dal parametro hHash è non valido;

²  NTE_BAD_UID   il contesto CSP che è stato specificato alla creazione dell’oggetto hash, non può essere trovato.

 

Quando un oggetto hash viene distrutto, la memoria del CSP viene liberata.

Dovrebbe esserci una corrispondenza uno-a-uno  tra le chiamate a CryptCreateHash e CryptDestroyHash.

 

 

 

 

2.1.7           CryptDestroyKey

Questa funzione rilascia l’handle della chiave; una volta rilasciato, l’handle non è più valido è non può più essere usato per altre operazioni.

Se l’handle si riferisce ad una chiave di sessione o ad una chiave pubblica che era stata importata nel CSP, questa funzione distruggerà la chiave e libererà la memoria occupata dalla chiave stessa.

Anche in questo caso abbiamo un solo parametro

²  hKey   è l’handle della chiave che verrà distrutta.

 

Se la funzione CryptDestroyKey fallisce, per poter avere informazioni sull’errore verificatosi la funzione da chiamare è GetLastError

Gli errori più frequenti sono:

²  ERROR_INVALID_HANDLE   il parametro hKey specifica un handle non valido;

²  ERROR_INVALID_PARAMETER   il parametro hKey contiene un valore non valido;

²  NTE_BAD_KEY   il parametro hKey non contiene un handle valido per la chiave;

²  NTE_BAD_UID   il contesto CSP che è stato specificato alla creazione della chiave, non può essere trovato.

 

Le chiavi occupano spazio di memoria sia nel sistema operativo che nel CSP. Alcuni CSP sono implementati in hardware con una risorsa memoria molto limitata. Per questo motivo, è importante che l’applicazione distrugga tutte le chiavi usando la funzione CryptDestroyKey una volta terminato di usarle.

 

 

 

 

2.1.8           CryptEncrypt

Questa funzione è usata per cifrare i dati. L’algoritmo usato per questo scopo, è indicato dalla chiave contenuta nel modulo CSP il cui riferimento è indicato dal parametro hKey.

I parametri che questa funzione richiede sono:

²  hKey   handle alla chiave da usare per la cifratura. Un’applicazione ottiene questo handle chiamando la funzione CryptGenKey;

²  hHash   è un handle all’oggetto hash. Questo parametro è usato solo se vengono computati contemporaneamente sia l’hash dei dati che la cifratura. Se non viene fatto l’hash, questo parametro deve essere zero;

²  Final   è un valore booleano che specifica se si sta cifrando l’ultimo blocco di una serie. Dovrebbe essere posto a TRUE se è l’ultimo o l’unico blocco e a FALSE altrimenti;

²  dwFlags   valori dei flags. A seconda del numero del parametro specificato possono essere settati diversi flags.

²  pbData   è il buffer che contiene i dati da cifrare. Dopo che è stata eseguita la cifratura, i dati cifrati, vanno a sostituire i dati in chiaro nello stesso buffer. La dimensione di questo buffer è specificata in cbBuffer. Il numero di bytes di dati che sono stati cifrati, è specificato da pcbData;

²  pcbData   è l’indirizzo della lunghezza dei dati. Prima di chiamare questa funzione, il chiamante dovrà settare questo parametro con il numero di bytes da cifrare. Questo indirizzo conterrà il numero di bytes di dati cifrati. Se il buffer specificato da pbData non è abbastanza grande da contenere i dati, la funzione ritorna un errore ERROR_MORE_DATA e memorizza la dimensione richiesta, in bytes, del buffer nella variabile puntata da pcbData. Se pbData è NULL allora non è ritornato nessun errore e la funzione memorizza la dimensione dei dati, in bytes, nella variabile puntata da pcbData. Questo permette ad un’applicazione di determinare la corretta misura del buffer senza ambiguità;

²  cbBuffer   è il numero di bytes nel buffer pbData. Dipende dall’algoritmo usato, il testo cifrato potrebbe essere leggermente più grande dell’originario testo in chiaro. In questo caso, il buffer pbData dovrà essere ridimensionato.

Prima di chiamare CryptEncrypt, l’applicazione dovrebbe ottenere un handleper l’oggetto hash chiamando la funzione CryptCreateHash.

Quando dobbiamo cifrare grosse quantità di dati, lo si può fare dividendo i dati in sezioni. Questo viene fatto chiamando la funzione CryptEncrypt ripetutamente. Il parametro Final verrà settato a TRUE solo quando si cifra l’ultimo blocco quindi con l’ultima chiamata a CryptEncrypt in modo da terminare il processo di cifratura.

Se la funzione ha successo, il valore di ritorno è TRUE; se fallisce ritorna FALSE. Per sapere quale errore si è verificato, basta chiamare la funzione GetLastError

Gli errori che più frequentemente si verificano per questo tipo di funzione sono i seguenti:

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)

²  NTE_BAD_ALGID   la chiave di sessione hKey specifica un algoritmo che il CSP in uso non supporta;

²  NTE_BAD_DATA   i dati da cifrare non sono validi;

²  NTE_BAD_FLAGS   il parametro dwFlags non è zero;

²  NTE_BAD_HASH   il parametro hHash contiene un handle non valido;

²  NTE_BAD_HASH_STATE   si è cercato di aggiungere dati all’oggetto hash che è già terminato;

²  NTE_BAD_KEY   il parametro hKey non contiene un handle valido per la chiave;

²  NTE_BAD_LEN   la dimensione del buffer di output è troppo piccola per contenere i dati cifrati che la funzione ha generato;

²  NTE_BAD_UID   il contesto CSP che è stato specificato alla creazione della chiave, non può essere trovato;

²  NTE_DOUBLE_ENCRYPT   l’applicazione ha tentato di cifrare gli stessi dati due volte;

²  NTE_FAIL   la funzione fallisce in modo inaspettato;

²  NTE_NO_MEMORY   il CSP lavoro in uno spazio di memoria non suo.

 

 

 

 

2.1.9           CryptDecrypt

Tale funzione è utilizzata per decifrare i dati precedentemente cifrati con l’uso della funzione CryptEncrypt.

I parametri di questa funzione sono:

²  hKey   handle alla chiave da usare per la decifratura. Un’applicazione ottiene questo handle chiamando la funzione CryptGenKey. Questa chiave specifica l’algoritmo di decifratura che si andrà ad utilizzare;

²  hHash   è un handle all’oggetto hash. Questo parametro è usato solo se vengono computati l’hash di dati. Se non viene fatto l’hash, questo parametro deve essere zero;

²  Final   è un valore booleano che specifica se si sta decifrando l’ultimo blocco di una serie. Dovrebbe essere posto a TRUE se è l’ultimo o l’unico blocco e a FALSE altrimenti;

²  dwFlags   valori dei flags. Questo parametro è utilizzato per usi futuri e dovrebbe sempre essere posto a zero;

²  pbData   è il buffer che contiene i dati da decifrare. Dopo che è stata eseguita la decifratura, il testo in chiaro verrà memorizzato nello stesso buffer. Il numero di bytes di dati che sono stati decifrati, è specificato da pcbData;

²  pcbData   è l’indirizzo della lunghezza dei dati. Prima di chiamare questa funzione, il chiamante dovrà settare questo parametro con il numero di bytes da cifrare. Questo indirizzo conterrà il numero di bytes di dati cifrati. Se il buffer specificato da pbData non è abbastanza grande da contenere i dati, la funzione ritorna un errore ERROR_MORE_DATA e memorizza la dimensione richiesta, in bytes, del buffer nella variabile puntata da pcbData. Se pbData è NULL allora non è ritornato nessun errore e la funzione memorizza la dimensione dei dati, in bytes, nella variabile puntata da pcbData. Questo permette ad un’applicazione di determinare la corretta misura del buffer senza ambiguità.

 

Anche in questo caso, se bisogna decifrare una grande quantità di dati si può operare per blocchi come avviene per la cifratura con la funzione CryptEncrypt.

Gli errori che più di frequente si verificano per la funzione CryptDecrypt sono:

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)

²  NTE_BAD_ALGID   la chiave di sessione hKey specifica un algoritmo che il CSP in uso non supporta;

²  NTE_BAD_DATA   i dati da decifrare non sono validi;

²  NTE_BAD_FLAGS   il parametro dwFlags non è zero;

²  NTE_BAD_HASH   il parametro hHash contiene un handle non valido;

²  NTE_BAD_KEY   il parametro hKey non contiene un handle valido per la chiave;

²  NTE_BAD_LEN   la dimensione del buffer di output è troppo piccola per contenere il testo in chiaro che la funzione ha generato;

²  NTE_BAD_UID   il contesto CSP che è stato specificato alla creazione della chiave, non può essere trovato;

²  NTE_DOUBLE_ENCRYPT   l’applicazione ha tentato di decifrare gli stessi dati due volte;

²  NTE_FAIL   la funzione fallisce in modo inaspettato.

2.1.10           CryptReleaseContext

Una volta completate tutte le operazioni bisogna rilasciare il contesto acquisito con la funzione CryptAcquireContext e questo lo si può fare con la funzione CryptReleaseContext.

Questa funzione infatti, è utilizzata per il rilascio di un handle e di un contenitore di chiavi. Dopo che questa funzione è stata chiamata, l’handle CSP specificato dal parametro hProv non sarà più valido. Né il contenitore delle chiavi né alcuna coppia di chiavi sono distrutti da questa funzione.

I parametri usati in questa funzione sono:

²  hProv   handle all’applicazione CSP. Questo handle è ottenuto chiamando la funzione CryptAcquireContext;

²  dwFlags   valori del flag. Questo parametro è riservato per usi futuri e dovrebbe sempre essere zero.

 

Se la funzione ha successo il valore ritornato è TRUE.

In caso contrario la funzione ritorna FALSE e gli errori che più comunemente vengono fatti sono:

²  ERROR_BUSY   il contesto CSP specificato da hProv è correntemente utilizzato da un altro processo;

²  ERROR_INVALID_HANDLE   uno dei parametri specifica un handle non valido

²  ERROR_INVALID_PARAMETER   uno dei parametri contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)

²  NTE_BAD_FLAGS   il parametro dwFlags non è zero;

²  NTE_BAD_HASH   il parametro hHash contiene un handle non valido;

²  NTE_BAD_UID   il parametro hProv non contiene un contesto handle valido.

Dopo che questa funzione è stata chiamata, la sessione terminata, e tutte le chiavi di sessioni esistenti e gli oggetti hash  creati usando l’handle hProv diventano non validi. In pratica, tutti questi oggetti dovrebbero essere distrutti  con CryptDestroyKey e CryptDestroyHash prima che venga chiamata la funzione CryptReleaseContext.

 

 

 

 

2.2       Esempio applicativo

 

Applichiamo ora le funzioni analizzate all’eToken PRO USB della Aladdin.

 

 

 

 

 

2.3       Esempi in VBscript

È anche utile permettere alle applicazioni di accedere all’eToken tramite un ambiente di scripting. Molte delle API sono librerie C/C++ che sono molto difficili da usare per questi ambienti.

eTocx sono state create per risolvere questo problema.

I requisiti delle eTocx sono:

²  offrono un semplice, potente API per accedere agli eToken da ambienti basati su Web;

²  supportano entrambi i tipi di eToken: etoken PRO(OS4) e eToken R2;

²  supportano più eToken e le smart card in lettura.

 

eTocx è un controllo automatico Active-X) tutte le interfacce sono specificatamente designate per incontrare i criteri di automazione così da poter essere usato per una ampia varietà di linguaggi di scripting.

Gli esempi riguardano il linguaggio di scripting VBscript.

Prenderemo in esame

²  la configurazione dell’eToken PRO;

²  la configurazione della password per l’eToken PRO;

²  la manipolazione dei file binari.

 

 

 

 

                           CONFIGURAZIONE DELL’eToken PRO

 

Si può vedere che dalla riga 9 alla riga 43 viene indicato il linguaggio di scripting usato.

Tralasciamo ciò che riguarda l’HTML e passiamo al linguaggio di nostro interesse.

Nelle righe 11 e 12 vengono dichiarate due variabili token e conf . La parola chiave Dim sta per dimensione. Quando si dichiara una variabile, la quantità riservata dipende dal tipo di dati. Nel nostro caso non è specificato alcun tipo ciò significa che le variabili assumono il tipo di default cioè variant. Un variant contenente

o     stringhe occupa 22 bytes+1 byte per ogni carattere nella stringa;

o     numeri occupa 16 bytes di memoria.

Nella riga 13 viene usata l’istruzione On error …. Si deve inserire questa istruzione all’inizio di qualsiasi routine in cui si possono verificare degli errori. Nel nostro caso viene utilizzata l’opzione Resume Next di gestione degli errori che fa in modo che l’esecuzione salti alla riga che ha causato l’errore e prosegua con la successiva riga di codice.

Alla riga 14 viene fatto un assegnamento con l’istruzione set in quanto trattasi di una variabile oggetto. Viene avviata l’applicazione creando l’oggetto eToken PRO. A questo punto è possibile fare riferimento all’oggetto utilizzando la variabile token definita precedentemente. Questa variabile potrà poi essere usata per accedere alle proprietà e ai metodi del nuovo oggetto eToken PRO.

Bisogna dire a questo punto che, prima di chiamare i metodi per accedere all’eToken, bisogna usare il metodo attach(). Una volta finito di accedere all’eToken, bisogna chiamare il metodo detach(). Per evitare che altre applicazioni accedano all’eToken mentre ci si sta lavorando, bisogna chiamare il metodo lock() e rilasciarlo, una volta finito di usarlo, chiamando unlock(). Quindi la sequenza di operazioni da effettuare è

Con la riga 16 viene attaccato l’oggetto token alla portaUSB. Nella riga 19 l’oggetto token viene bloccato con lock(). Con il metodo unlock() chiamato alla riga 30, viene rilasciata la risorsa eToken e alla riga 33 viene rilasciata completamente con l’uso del metodo detach(). La sequenza è stata rispettata.

Passiamo ora a vedere ciò che succede dal momento in cui viene chiamato attach() fino a quando l’oggetto token è rilasciato.

Alla riga 22 viene assegnato all’oggetto conf la configurazione dell’eToken. Una volta fatta questa operazione, è possibile conoscere alcune proprietà dell’eToken come

²  il numero che identifica univocamente l’eToken usando il metodo tokenID dell’oggetto conf (riga 25);

²  il colore dell’eToken con il metodo color (riga 27).

Nella parte di codice che va dalla riga 35 alla riga 39 vengono gestiti eventuali errori.

Con le righe 40 e 41 le variabili conf e token vengono impostate a Nothing. Questo significa che il riferimento all’oggetto termina e le risorse del sistema vengono liberate.

 

 

 

 

                           MODIFICA DELLA PASSWORD

Alle righe 11 e 12 vengono dichiarate le variabili ba e token. A queste variabili vengono assegnati, rispettivamente alle righe 14 e 15, un oggetto eToken PRO e un byte di array con il metodo CreateObject.

Viene effettuata la sequenza di operazioni indicata precedentemente e all’interno viene fatto il login e il logout con la password. Alla riga 23 viene inserita la password 1234567890 e viene effettuato il login (riga 24) con questa password.

È anche possibile cambiare password con il metodo changePassword. Nel nostro esempio viene cambiata la password 1234567890 con 1111 alla riga 28 e viene fatto il login con la nuova password.

Una volta terminate le operazioni che riguardano la password per l’eToken  bisogna fare il logout come in riga 40.

Una volta terminato il tutto troviamo le funzioni unlock() seguita da detach().

Le righe 48-52 gestiscono l’errore eventualmente verificatosi.

 

                           MANIPOLAZIONE FILE BINARI

 

Con questo programma è possibile verificare l’esistenza di un file, creare un file, cancellare, creare una directory, scrivere/leggere da un file. Il codice è il seguente

Questa è la parte di HTML con l’indicazione del linguaggio di script utilizzato.

Vediamo nel particolare il contenuto di questo blocco

 

Dalla linea 4 alla linea 7 viene definita la funzione printarray il cui scopo è quello di stampare l’array che prende come argomento.

Troviamo la definizione di un’altra funzione nelle linee 8-13. Questa funzione, tramite un ciclo for, stampa il contenuto dell’array preso come parametro, trasformandolo in una stringa di caratteri con l’utilizzo della funzione Chr() della linea 11.

Nelle successive tre righe vengono dichiarate le variabili ba, token e dataRead.

Vengono chiamati i metodi attach(), loch() e poi viene fatto il login con la password 1234567890.

Si può verificare se esiste un certo file nell’eToken. Questo viene fatto alla riga 31. nel nostro esempio, se questo particolare file esiste viene cancellato con il metodo del alla riga  33.

Oltre alla possibilità di cancellare un file, possiamo anche creare un file e questo viene fatto, nel nostro codice, alla linea 37. viene creato un file binario con il nome indicato tra virgolette.

Oltre a creare un file, si può anche creare una directory come avviene alla riga 41.

Alla riga 48 si effettua una scrittura nel file binario indicato dalla variabile ba. E alla riga 49.a viene effettuata una lettura e si assegna il contenuto alla variabile readData dichiarata all’inizio.

E ancora una volta troviamo il logout, il metodo unloch() e detach().

La parte di codice per la gestione dell’errore è la seguente