• Non ci sono risultati.

in sezione 3.2), ed `e stato loro sottoposto il codice, chiedendo se effettivamente

rispondeva alle loro esigenze, se ne erano emerse di nuove o se comunque avevano

altre richieste da effettuare a SecurityFramework.

Quello che `e emerso da questa verifica `e che le funzionalit`a gi`a implementate

erano proprio quelle necessarie ai plugin; tuttavia, `e emersa la necessit`a di

ag-giungere due metodi per quanto riguarda l’algoritmo RSA, che si occupassero di

generare una chiave pubblica o privata a partire da modulo e esponente. Il plugin

Mulo, infatti, sfrutta al proprio interno questo tipo di generazione delle chiavi, e

quindi era necessario fornire metodi per gestire anche questa esigenza.

L’implementazione di quanto richiesto `e stata, pur nella sua semplicit`a, pi`u

complessa di quella del resto della libreria. Infatti, non `e possibile generare un

oggetto di tipo PublicKey o PrivateKey partendo da moldulo e esplonente,

al-meno non in maniera diretta. E’ necessario generare prima un oggetto di tipo

RSAPublicKeySpec o RSAPrivateKeySpec con il modulo e l’esponente assegnati,

dopodich`e usare un KeyFactory che provvede a convertirli in chiavi pubbliche e

private, come richiesto.

3.7 Documentazione

A contorno del codice, va sempre fornita una adeguata documentazione. Questa

necessit`a `e particolarmente sentita per librerie, come quella in questione, che

do-vranno essere poi riutilizzate da un numero piuttosto cospicuo di persone. Una

documentazione non adeguata pu`o facilmente portare a un uso improprio delle

funzionalit`a, oppure a un abbandono della libreria per una implementazione

na-tiva dei metodi, che, come gi`a riportato nella sezione 3.1, `e proprio quello che si

vuole evitare.

Per soddisfare queste esigenze, oltre alla normale documentazione JavaDoc,

che `e standard nel progetto PariPari, `e stata prodotta una pagina web inserita

nel progetto wiki di PariPari, che illustra l’uso dei metodi forniti da

SecurityFra-mework riportandone le interfacce e facendo alcuni semplici esempi.

Capitolo 4

Conclusioni

In questo lavoro `e stato descritta l’attivit`a reingegnerizzazione e sviluppo svolta

sulla libreria SecurityFramework. Il compito svolto non pu`o che essere

conside-rato positivo. Infatti, oltre a aver incontconside-rato molti strumenti nuovi per la mia

esperienza sullo sviluppo di codice (l’uso di Eclipse come ambiente di sviluppo,

o JUnit per il testing) e l’esperienza di lavorare con un team di sviluppo, che

hanno sicuramente favorito una crescita personale, il risultato della

reingegneriz-zazione `e sicuramente soddisfacente: si `e prodotta una libreria ben documentata,

semplice da leggere e da utilizzare, che risponde ai requisiti richiesti nella quasi

totalit`a.

Le tecniche crittografiche con cui sono entrato in contatto e che ho iniziato

a conoscere sono di vitale importanza in molti ambiti in quanto l’esigenza di

te-nere segrete le comunicazioni su un canale pubblico `e sempre esistita, ben prima

dell’avvento dell’infomatica. In particolare, per quanto riguarda le comunicazioni

sulla Rete, `e indispensabile poter proteggere dati riservati come il contenuto del

traffico che si invia, oppure avere la certezza dell’identit`a del proprio interlocutore

tramite tecniche di firma digitale. Da queste considerazioni emerge ancora una

volta l’utilit`a di avere un’unica libreria condivisa in un progetto ampio e

multi-funzionale come PariPari. Gli algoritmi crittografici implementati, infatti, sono

indispensabili per garantire le funzionalit`a appena descritte: l’hashing per quanto

riguarda le firme digitali e l’integrit`a dei dati (nonch`e altri utilizzi, non meno

im-4. CONCLUSIONI

portanti, negli algoritmi quali Kademlia o le reti ED2K/BitTorrent), mentre la

crittografia simmetrica e asimmetrica per la riservatezza dei dati inviati.

Il processo di sviluppo e revisione del SecurityFramework probabilmente non

termina con questa tesi: infatti, pi`u il progetto PariPari evolver`a e diventer`a pi`u

complesso e articolato, pi`u `e probabile che siano necessarie nuove funzionalit`a

e modifiche a quelle gi`a implementate; tuttavia il codice di partenza che verr`a

trovato da un futuro sviluppatore render`a il suo compito pi`u agevole, avendo gi`a

una buona linea guida da seguire.

Un’altra nota positiva incontrata durante lo svolgimento del lavoro appena

documentato `e stata la collaborazione e la disponibilit`a dei (seppur pochi)

Pa-riParisti (come amiamo definirci all’interno del progetto) con cui sono venuto

in contatto. Nonostante le mie difficiolt`a iniziali nell’uso degli strumenti e nelle

prime fasi di revisione e stesura del codice, sono sempre stato facilitato dal loro

supporto e non mi sono quasi mai trovato in difficolt`a. Di sicuro il progetto

PariPari rappresenta un cospicuo investimento a livello di tempo ed energie,

tut-tavia ribadisco come il fare esperienza, spesso per la prima volta, con il lavoro di

squadra sia estremamente positivo e avvicini a ci`o che ci aspetter`a un domani nel

mondo del lavoro.

Appendice A

Codice sorgente di

SecurityFramework

A.1 HashStandards.java

∗/ package S e c u r i t y ; /∗ ∗

∗ @author Fabio Dominio − P a r i P a r i Group ∗ @ v e r s i o n 0.0.1 < br><br>

∗ This c l a s s p r o v i d e s h a s h i n g s t a n d a r d a l g o r i t h m names and d i g e s t s i z e s .

∗ ∗/

public enum HashStandards {

MD5{ public S t r i n g g e t A l g o r i t h m ( ) { return ”MD5” ; } public short d i g e s t S i z e ( ) { return 1 2 8 ; } } ,

SHA1{ public S t r i n g g e t A l g o r i t h m ( ) { return ”SHA−1” ; } public short d i g e s t S i z e ( ) { return 1 6 0 ; } } ,

A. CODICE SORGENTE DI SECURITYFRAMEWORK

SHA256{ public S t r i n g g e t A l g o r i t h m ( ) { return ”SHA−256” ; } public short d i g e s t S i z e ( ) { return 2 5 6 ; } } ,

SHA384{ public S t r i n g g e t A l g o r i t h m ( ) { return ”SHA−384” ; } public short d i g e s t S i z e ( ) { return 3 8 4 ; } } ,

SHA512{ public S t r i n g g e t A l g o r i t h m ( ) { return ”SHA−512” ; } public short d i g e s t S i z e ( ) { return 5 1 2 ; } } ;

/∗ ∗ ∗ Method t h a t r e t u r n s d i g e s t e r s t a n d a r d a l g o r i t h m name ∗ @return d i g e s t e r a l g o r i t h m name ∗/ public abstract S t r i n g g e t A l g o r i t h m ( ) ; /∗ ∗ ∗ Method t h a t r e t u r n s d i g e s t e r s t a n d a r d a l g o r i t h m d i g e s t s i z e [ b i t ] ∗ @return d i g e s t e r a l g o r i t h m d i g e s t s i z e ∗/

public abstract short d i g e s t S i z e ( ) ;

}

A.2 ParipariSecurity.java

package S e c u r i t y ; import j a v a . i o . I n p u t S t r e a m ; import j a v a . i o . OutputStream ; import j a v a . math . B i g I n t e g e r ; import j a v a . s e c u r i t y . G e n e r a l S e c u r i t y E x c e p t i o n ; import j a v a . s e c u r i t y . I n v a l i d K e y E x c e p t i o n ; import j a v a . s e c u r i t y . KeyFactory ; import j a v a . s e c u r i t y . KeyPair ; import j a v a . s e c u r i t y . M e s s a g e D i g e s t ; import j a v a . s e c u r i t y . NoSuchAlgorithmException ;

A.2 PARIPARISECURITY.JAVA

import j a v a . s e c u r i t y . P r i v a t e K e y ; import j a v a . s e c u r i t y . PublicKey ; import j a v a . s e c u r i t y . s p e c . RSAPrivateKeySpec ; import j a v a . s e c u r i t y . s p e c . RSAPublicKeySpec ; import j a v a x . c r y p t o . C i p h e r ; import j a v a x . c r y p t o . C i p h e r I n p u t S t r e a m ; import j a v a x . c r y p t o . CipherOutputStream ; import j a v a x . c r y p t o . KeyGenerator ; import j a v a x . c r y p t o . S e c r e t K e y ; import o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . JDKKeyPairGenerator ; import o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . JDKMessageDigest ; /∗ ∗ ∗ ∗ @author Paolo M a r c h e z z o l o ∗ @ v e r s i o n 0 . 1 ∗ <br><br> ∗ This c l a s s p r o v i d e s an easy−to−u s e i m p l e m e n t a t i o n o f :

∗ < l i >message d i g e s t − h a s h i n g a l g o r i t h m s (MD4, MD5 and SHA−X p r o v i d e d ) , ∗ < l i >k e y g e n e r a t i o n , e n c r y p t i o n and d e c r y p t i o n u s i n g RC4 a l g o r i t h m , ∗ < l i >k e y p a i r g e n e r a t i o n , e n c r y p t i o n and d e c r y p t i o n o f m e s s a g e s u s i n g RSA a l g o r i t h m . ∗/ public c l a s s P a r i p a r i S e c u r i t y { /∗ ∗ ∗ C a l c u l a t e s t h e hash code o f an a r r a y o f b y t e s . ∗ @param i n The a r r a y t o be p r o c e s s e d . ∗ @param a l g o r i t h m :< u l > ∗ < l i >MD5 (128 b i t −−> 16 b y t e hash ) ;</ l i > ∗ < l i >SHA−1 (160 b i t −−> 20 b y t e hash ) ;</ l i > ∗ < l i >SHA−256 (256 b i t −−> 32 b y t e hash ) ;</ l i > ∗ < l i >SHA−384 (384 b i t −−> 48 b y t e hash ) ;</ l i > ∗ < l i >SHA−512 (512 b i t −−> 64 b y t e hash ) ;</ l i ></u l >

A. CODICE SORGENTE DI SECURITYFRAMEWORK

∗ @return The hash code r e q u i r e d or <code>n u l l </code> i f an e x c e p t i o n i s thrown . ∗ @throws N o S u c h A l g o r i t h m E x c e p t i o n i f t h e a l g o r i t h m p a s s e d i s i n v a l i d . ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n i f you p a s s e d a n u l l a l g o r i t h m o r i n p u t a r r a y . ∗/

public s t a t i c byte [ ] getHash ( byte [ ] i n , HashStandards a l g o r i t h m ) throws NoSuchAlgorithmException { i f ( a l g o r i t h m == n u l l | | i n == n u l l ) { throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : N u l l i n p u t o r n u l l a l g o r i t h m ” ) ; } return M e s s a g e D i g e s t . g e t I n s t a n c e ( a l g o r i t h m . g e t A l g o r i t h m ( ) ) . d i g e s t ( i n ) ; } /∗ ∗ ∗ C a l c u l a t e s t h e message d i g e s t o f t h e a r r a y i n i n p u t u s i n g SHA−1 a l g o r i t h m . ∗ @param i n The a r r a y t o be p r o c e s s e d ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n i f you p a s s e d a n u l l i n p u t a r r a y . ∗/

public s t a t i c byte [ ] getSHA1Hash ( byte [ ] i n ) {

try {

return getHash ( i n , HashStandards . SHA1) ; }

catch ( NoSuchAlgorithmException e ) {

//we don ’ t t h r o w a n y t h i n g h e r e b e c a u s e we know t h a t t h e p a s s e d a l g o r i t h m IS v a l i d

// s o t h i s c a t c h b l o c k s h o u l d n e v e r b e e x e c u t e d .

A.2 PARIPARISECURITY.JAVA

( ? t h i s s h o u l d n e v e r happen ) ”+e . g e t M e s s a g e ( ) ) ; return n u l l ; } } /∗ ∗ ∗ C a l c u l a t e s t h e message d i g e s t o f t h e a r r a y i n i n p u t u s i n g MD5 a l g o r i t h m . ∗ @param i n The a r r a y t o be p r o c e s s e d ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n i f you p a s s e d a n u l l i n p u t a r r a y . ∗/

public s t a t i c byte [ ] getMD5Hash ( byte [ ] i n ) { try {

return getHash ( i n , HashStandards .MD5) ; }

catch ( NoSuchAlgorithmException e ) {

//we don ’ t t h r o w a n y t h i n g h e r e b e c a u s e we know t h a t t h e p a s s e d a l g o r i t h m IS v a l i d // s o t h i s c a t c h b l o c k s h o u l d n e v e r b e e x e c u t e d . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] Unsupported A l g o r i t h m ( ? t h i s s h o u l d n e v e r happen ) ”+e . g e t M e s s a g e ( ) ) ; return n u l l ; } } /∗ ∗ ∗ C a l c u l a t e s t h e message d i g e s t o f t h e a r r a y i n i n p u t u s i n g MD4 a l g o r i t h m .< br> ∗ B o u n c y C a s t l e i m p l e m e n t a t i o n o f MD4 a l g o r i t h m i s u s e d h e r e b e c a u s e Java l a c k s an i m p l e m e n t a t i o n o f s u c h a l g o r i t h m . ∗ @param i n The a r r a y t o be p r o c e s s e d . ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n i f you p a s s e d a n u l l i n p u t a r r a y . ∗/

A. CODICE SORGENTE DI SECURITYFRAMEWORK

public s t a t i c byte [ ] getMD4Hash ( byte [ ] i n ) { i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : N u l l i n p u t o r n u l l a l g o r i t h m ” ) ;

}

JDKMessageDigest .MD4 m e s s a g e d i g e s t = new JDKMessageDigest .MD4( ) ; return m e s s a g e d i g e s t . d i g e s t ( i n ) ; } /∗ ∗ ∗ G e n e r a t e s a k e y p a i r ( p u b l i c k e y and p r i v a t e k e y ) f o r t h e RSA a l g o r i t h m . ∗ @param k e y s i z e The k e y s i z e . ∗ @return A KeyPair o b j e c t c o n t a i n i n g t h e p a i r g e n e r a t e d . ∗/

public s t a t i c KeyPair generateRSAKeys ( i n t k e y s i z e ) { i f ( k e y s i z e <=0) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot g e n e r a t e a z e r o − l e n g t h key ” ) ;

}

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( k e y s i z e ) ;

return keygen . genKeyPair ( ) ; }

public s t a t i c PublicKey generateRSAPublicKey ( B i g I n t e g e r mod , B i g I n t e g e r exp ) {

i f (mod==n u l l | | exp==n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot g e n e r a t e k e y s w i t h a n u l l modulus o r e x p o n e n t ” ) ;

}

try {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

A.2 PARIPARISECURITY.JAVA

KeyFactory k f = KeyFactory . g e t I n s t a n c e ( ”RSA” ) ;

RSAPublicKeySpec s p e c = new RSAPublicKeySpec (mod , exp ) ; return k f . g e n e r a t e P u b l i c ( s p e c ) ; } catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; }

}

public s t a t i c P r i v a t e K e y generateRSAPrivateKey ( B i g I n t e g e r mod , B i g I n t e g e r exp ) {

i f (mod==n u l l | | exp==n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot g e n e r a t e k e y s w i t h a n u l l modulus o r e x p o n e n t ” ) ;

}

try {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

KeyFactory k f = KeyFactory . g e t I n s t a n c e ( ”RSA” ) ;

RSAPrivateKeySpec s p e c = new RSAPrivateKeySpec (mod , exp ) ; return k f . g e n e r a t e P r i v a t e ( s p e c ) ; } catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

return n u l l ; } } /∗ ∗ ∗ E n c r y p t s a b l o c k o f d a t a u s i n g RSA a l g o r i t h m . ∗ @param i n The d a t a t o be e n c r y p t e d ∗ @param pk The p u b l i c k e y

∗ @return The e n c r y p t e d d a t a r e q u i r e d , or <code>n u l l </code> i f an e x c e p t i o n i s thrown .

∗ @throws I n v a l i d K e y E x c e p t i o n I f t h e k e y i s n o t v a l i d ∗/

public s t a t i c byte [ ] encryptRSA ( byte [ ] i n , PublicKey pk ) throws I n v a l i d K e y E x c e p t i o n {

i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t a n u l l b l o c k ” ) ;

}

i f ( pk == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t w i t h a n u l l key ” ) ; } try { j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, pk ) ; return c i p h e r . d o F i n a l ( i n ) ; } catch ( I n v a l i d K e y E x c e p t i o n e ) {

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ;

}

catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) {

// u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . .

A.2 PARIPARISECURITY.JAVA

System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; } } /∗ ∗ D e c r y p t s a b l o c k o f d a t a u s i n g RSA a l g o r i t h m . ∗ @param i n The d a t a t o be d e c r y p t e d ∗ @param pk The p r i v a t e k e y

∗ @return The p l a i n d a t a r e s u l t i n g from t h e d e c r y p t i o n , or <code> n u l l </code> i f an e x c e p t i o n i s thrown .

∗ @throws I n v a l i d K e y E x c e p t i o n I f t h e k e y i s n o t v a l i d ∗/

public s t a t i c byte [ ] decryptRSA ( byte [ ] i n , P r i v a t e K e y pk ) throws I n v a l i d K e y E x c e p t i o n {

i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t a n u l l b l o c k ” ) ;

}

i f ( pk == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t w i t h a n u l l key ” ) ; } try { j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, pk ) ; return c i p h e r . d o F i n a l ( i n ) ; } catch ( I n v a l i d K e y E x c e p t i o n e ) {

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ;

}

catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) {

A. CODICE SORGENTE DI SECURITYFRAMEWORK

System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; } } /∗ ∗ ∗ Returns a C i p h e r I n p u t S t r e a m t h a t i s t h e RSA e n c r y p t i o n o f t h e g i v e n I n p u t S t r e a m . ∗ @param i n The I n p u t S t r e a m t o be e n c r y p t e d .

∗ @param pk The P u b l i c K e y u s e d f o r t h e RSA e n c r y p t i o n . ∗ @throws I n v a l i d K e y E x c e p t i o n I f t h e k e y i s n o t v a l i d ∗/

public s t a t i c C i p h e r I n p u t S t r e a m encryptInputStreamRSA ( I n p u t S t r e a m i n , PublicKey pk ) throws I n v a l i d K e y E x c e p t i o n {

i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t a n u l l s t r e a m ” ) ;

}

i f ( pk == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t w i t h a n u l l key ” ) ; } try { j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, pk ) ; return new C i p h e r I n p u t S t r e a m ( i n , c i p h e r ) ; } catch ( I n v a l i d K e y E x c e p t i o n e ) {

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ;

A.2 PARIPARISECURITY.JAVA

catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) {

// u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . .

System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; } } /∗ ∗ ∗ Returns a C i p h e r I n p u t S t r e a m t h a t i s t h e RSA d e c r y p t i o n o f t h e g i v e n I n p u t S t r e a m . ∗ @param i n The I n p u t S t r e a m t o be d e c r y p t e d .

∗ @param pk The P r i v a t e K e y u s e d f o r t h e RSA d e c r y p t i o n . ∗ @throws I n v a l i d K e y E x c e p t i o n I f t h e k e y i s n o t v a l i d ∗/

public s t a t i c C i p h e r I n p u t S t r e a m decryptInputStreamRSA ( I n p u t S t r e a m i n , P r i v a t e K e y pk ) throws I n v a l i d K e y E x c e p t i o n {

i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot d e c r y p t a n u l l s t r e a m ” ) ;

}

i f ( pk == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot d e c r y p t w i t h a n u l l key ” ) ; } try { j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, pk ) ; return new C i p h e r I n p u t S t r e a m ( i n , c i p h e r ) ; } catch ( I n v a l i d K e y E x c e p t i o n e ) {

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

} catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; }

}

/∗ ∗

∗ Returns a CipherOutputStream t h a t i s t h e RSA e n c r y p t i o n o f t h e g i v e n OutputStream .

∗ @param i n The OutputStream t o be e n c r y p t e d .

∗ @param pk The P u b l i c K e y u s e d f o r t h e RSA e n c r y p t i o n . ∗ @throws I n v a l i d K e y E x c e p t i o n I f t h e k e y i s n o t v a l i d ∗/

public s t a t i c CipherOutputStream encryptOutputStreamRSA (

OutputStream out , PublicKey pk ) throws I n v a l i d K e y E x c e p t i o n { i f ( o u t == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t a n u l l s t r e a m ” ) ;

}

i f ( pk == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t w i t h a n u l l key ” ) ; } try { j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, pk ) ;

return new CipherOutputStream ( out , c i p h e r ) ; }

catch ( I n v a l i d K e y E x c e p t i o n e ) {

A.2 PARIPARISECURITY.JAVA

” ) ; } catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; }

}

/∗ ∗

∗ Returns a CipherOutputStream t h a t i s t h e RSA d e c r y p t i o n o f t h e g i v e n OutputStream .

∗ @param i n The OutputStream t o be d e c r y p t e d .

∗ @param pk The P r i v a t e K e y u s e d f o r t h e RSA d e c r y p t i o n . ∗ @throws I n v a l i d K e y E x c e p t i o n I f t h e k e y i s n o t v a l i d ∗/

public s t a t i c CipherOutputStream decryptOutputStreamRSA (

OutputStream out , P r i v a t e K e y pk ) throws I n v a l i d K e y E x c e p t i o n { i f ( o u t == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot d e c r y p t a n u l l s t r e a m ” ) ;

}

i f ( pk == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot d e c r y p t w i t h a n u l l key ” ) ; } try { j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, pk ) ;

return new CipherOutputStream ( out , c i p h e r ) ; }

A. CODICE SORGENTE DI SECURITYFRAMEWORK

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ; } catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; } } /∗ ∗ ∗ G e n e r a t e s a S e c r e t K e y t o be u s e d i n an RC4 e n c r y p t i o n a l g o r i t h m ∗ @param k e y s i z e The k e y s i z e ∗/ public s t a t i c S e c r e t K e y generateRC4Key ( i n t k e y s i z e ) { i f ( k e y s i z e == 0 )

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : Cannot g e n e r a t e a z e r o −l e n g t h key . ” ) ;

try {

KeyGenerator keygen = KeyGenerator . g e t I n s t a n c e ( ”ARCFOUR” ) ; keygen . i n i t ( k e y s i z e ) ; return keygen . g e n e r a t e K e y ( ) ; } catch ( NoSuchAlgorithmException e ) { System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] Unsupported A l g o r i t h m ( ? t h i s s h o u l d n e v e r happen ) ”+e . g e t M e s s a g e ( ) ) ; return n u l l ; } } /∗ ∗ ∗ E n c r y p t s t h e b l o c k w i t h t h e g i v e n key , u s i n g RC4 a l g o r i t h m . ∗ @param i n t h e b l o c k

A.2 PARIPARISECURITY.JAVA

∗ @param k t h e k e y

∗ @throws I n v a l i d K e y E x c e p t i o n i f t h e k e y i s i n v a l i d ∗/

public s t a t i c byte [ ] encryptRC4 ( byte [ ] i n , S e c r e t K e y k ) throws I n v a l i d K e y E x c e p t i o n {

i f ( k == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t w i t h a n u l l key ” ) ;

}

i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot e n c r y p t a n u l l b l o c k ” ) ; } try { C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”ARCFOUR” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, k ) ; return c i p h e r . d o F i n a l ( i n ) ; } catch ( I n v a l i d K e y E x c e p t i o n e ) {

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ; } catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; } } /∗ ∗ ∗ D e c r y p t s t h e b l o c k w i t h t h e g i v e n key , u s i n g RC4 a l g o r i t h m . ∗ @param i n t h e b l o c k ∗ @param k t h e k e y

A. CODICE SORGENTE DI SECURITYFRAMEWORK

∗ @throws I n v a l i d K e y E x c e p t i o n i f t h e k e y i s i n v a l i d ∗/

public s t a t i c byte [ ] decryptRC4 ( byte [ ] i n , S e c r e t K e y k ) throws I n v a l i d K e y E x c e p t i o n {

i f ( k == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot d e c r y p t w i t h a n u l l key ” ) ;

}

i f ( i n == n u l l ) {

throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” Cannot d e c r y p t a n u l l b l o c k ” ) ; } try { C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”ARCFOUR” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, k ) ; return c i p h e r . d o F i n a l ( i n ) ; } catch ( I n v a l i d K e y E x c e p t i o n e ) {

throw new I n v a l i d K e y E x c e p t i o n ( ” [ P a r i p a r i S e c u r i t y ] : I n v a l i d key ” ) ; } catch ( G e n e r a l S e c u r i t y E x c e p t i o n e ) { // u n s u p p o r t e d a l g o r i t h m o r bad p a d d i n g // t h i s s h o u l d n o t happen . . . System . o ut . p r i n t l n ( ” [ P a r i p a r i S e c u r i t y ] : Unsupported a l g o r i t h m o r bad padding ”+e . g e t M e s s a g e ( ) ) ;

return n u l l ; } } }

A.3 ParipariSecurityTest.java

package S e c u r i t y ;

A.3 PARIPARISECURITYTEST.JAVA

import S e c u r i t y . P a r i p a r i S e c u r i t y ; import S e c u r i t y . HashStandards ; import j a v a . i o . ByteArrayInputStream ; import j a v a . i o . ByteArrayOutputStream ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . i o . I n p u t S t r e a m ; import j a v a . i o . OutputStream ; import j a v a . s e c u r i t y . G e n e r a l S e c u r i t y E x c e p t i o n ; import j a v a . s e c u r i t y . I n v a l i d K e y E x c e p t i o n ; import j a v a . s e c u r i t y . KeyFactory ; import j a v a . s e c u r i t y . KeyPair ; import j a v a . s e c u r i t y . K e y P a i r G e n e r a t o r ; import j a v a . s e c u r i t y . M e s s a g e D i g e s t ; import j a v a . s e c u r i t y . NoSuchAlgorithmException ; import j a v a . s e c u r i t y . N o S u c h P r o v i d e r E x c e p t i o n ; import j a v a . s e c u r i t y . P r i v a t e K e y ; import j a v a . s e c u r i t y . PublicKey ; import j a v a . s e c u r i t y . SecureRandom ; import j a v a . s e c u r i t y . s p e c . I n v a l i d K e y S p e c E x c e p t i o n ; import j a v a . s e c u r i t y . s p e c . RSAPrivateKeySpec ; import j a v a . s e c u r i t y . s p e c . RSAPublicKeySpec ; import j a v a . u t i l . A r r a y s ; import j a v a x . c r y p t o . C i p h e r ; import j a v a x . c r y p t o . C i p h e r I n p u t S t r e a m ; import j a v a x . c r y p t o . CipherOutputStream ; import j a v a x . c r y p t o . KeyGenerator ; import j a v a x . c r y p t o . NoSuchPaddingException ; import j a v a x . c r y p t o . S e c r e t K e y ; import o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . JDKKeyPairGenerator ; import o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . JDKMessageDigest ; import o r g . j u n i t . ∗ ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

import s t a t i c o r g . j u n i t . A s s e r t . ∗ ; /∗ ∗ ∗ This c l a s s p r o v i d e s t e s t s f o r t h e methods i n P a r i p a r i S e c u r i t y ∗ @author Paolo M a r c h e z z o l o ∗ ∗/ // t h i s i s n o t c o m p l e t e d y e t public c l a s s P a r i p a r i S e c u r i t y T e s t {

private f i n a l i n t RSA TEST KEYSIZE = 3 8 4 ; private f i n a l i n t RC4 TEST KEYSIZE = 1 2 8 ; private f i n a l i n t TEST ARRAYLENGTH = 2 0 ;

@Before

public void setUp ( ) {

}

/∗ ∗

∗ Method f o r t e s t i n g n u l l b y t e b l o c k hash ; must r e t u r n n u l l ∗ b e c a u s e we p a s s a n u l l b l o c k

∗/ @Test

public void t e s t H a s h N u l l I n p u t ( ) throws NoSuchAlgorithmException {

byte [ ] temp = n u l l ;

P a r i p a r i S e c u r i t y . getHash ( temp , HashStandards .MD5) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ; }

/∗ ∗

∗ Method f o r t e s t i n g b y t e b l o c k hash ; must r e t u r n n u l l ∗ b e c a u s e we p a s s a n u l l a l g o r i t h m

A.3 PARIPARISECURITYTEST.JAVA

@Test

public void t e s t H a s h N u l l A l g o r i t h m ( ) throws NoSuchAlgorithmException {

// g e n e r a t i n g a random b y t e [ 2 0 ] t o b e p r o c e s s e d SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

HashStandards temp = n u l l ;

P a r i p a r i S e c u r i t y . getHash ( b l o c k , temp ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ; }

/∗ ∗

∗ Method t o t e s t t h e c o r r e c t g e n e r a t i o n o f h a s h e s ∗/

@Test

public void t e s t C o r r e c t H a s h ( ) throws NoSuchAlgorithmException { // g e n e r a t i n g a random b y t e [ 2 0 ] t o b e p r o c e s s e d

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ; // r e t r i e v i n g MD5 Hash and t e s t i n g i t s c o r r e c t n e s s byte [ ] c o r r e c t H a s h = M e s s a g e D i g e s t . g e t I n s t a n c e ( ”MD5” ) . d i g e s t ( b l o c k ) ; byte [ ] r e t r i e v e d H a s h = P a r i p a r i S e c u r i t y . getMD5Hash ( b l o c k ) ; a s s e r t T r u e ( ”Must r e t u r n t h e c o r r e c t hash ” , A r r a y s . e q u a l s ( c o r r e c t H a s h , r e t r i e v e d H a s h ) ) ; // r e t r i e v i n g MD4 Hash and t e s t i n g i t s c o r r e c t n e s s

JDKMessageDigest .MD4 m e s s a g e d i g e s t = new JDKMessageDigest .MD4( ) ; c o r r e c t H a s h = m e s s a g e d i g e s t . d i g e s t ( b l o c k ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

a s s e r t T r u e ( ”Must r e t u r n t h e c o r r e c t hash ” , A r r a y s . e q u a l s ( c o r r e c t H a s h , r e t r i e v e d H a s h ) ) ;

// r e t r i e v i n g SHA1 Hash and t e s t i n g i t s c o r r e c t n e s s

c o r r e c t H a s h = M e s s a g e D i g e s t . g e t I n s t a n c e ( ”SHA−1” ) . d i g e s t ( b l o c k ) ; r e t r i e v e d H a s h = P a r i p a r i S e c u r i t y . getSHA1Hash ( b l o c k ) ;

a s s e r t T r u e ( ”Must r e t u r n t h e c o r r e c t hash ” , A r r a y s . e q u a l s ( c o r r e c t H a s h , r e t r i e v e d H a s h ) ) ;

// r e t r i e v i n g SHA256 Hash and t e s t i n g i t s c o r r e c t n e s s

c o r r e c t H a s h = M e s s a g e D i g e s t . g e t I n s t a n c e ( ”SHA−256” ) . d i g e s t ( b l o c k ) ; r e t r i e v e d H a s h = P a r i p a r i S e c u r i t y . getHash ( b l o c k , HashStandards . SHA256 ) ; a s s e r t T r u e ( ”Must r e t u r n t h e c o r r e c t hash ” , A r r a y s . e q u a l s ( c o r r e c t H a s h , r e t r i e v e d H a s h ) ) ;

// r e t r i e v i n g SHA384 Hash and t e s t i n g i t s c o r r e c t n e s s

c o r r e c t H a s h = M e s s a g e D i g e s t . g e t I n s t a n c e ( ”SHA−384” ) . d i g e s t ( b l o c k ) ; r e t r i e v e d H a s h = P a r i p a r i S e c u r i t y . getHash ( b l o c k , HashStandards . SHA384 ) ; a s s e r t T r u e ( ”Must r e t u r n t h e c o r r e c t hash ” , A r r a y s . e q u a l s ( c o r r e c t H a s h , r e t r i e v e d H a s h ) ) ;

// r e t r i e v i n g SHA512 Hash and t e s t i n g i t s c o r r e c t n e s s

c o r r e c t H a s h = M e s s a g e D i g e s t . g e t I n s t a n c e ( ”SHA−512” ) . d i g e s t ( b l o c k ) ; r e t r i e v e d H a s h = P a r i p a r i S e c u r i t y . getHash ( b l o c k , HashStandards . SHA512 ) ; a s s e r t T r u e ( ”Must r e t u r n t h e c o r r e c t hash ” , A r r a y s . e q u a l s ( c o r r e c t H a s h , r e t r i e v e d H a s h ) ) ; } /∗ ∗

A.3 PARIPARISECURITYTEST.JAVA

∗ T e s t i n g t h e c o n s i s t e n c y o f h a s h e s : two d i f f e r e n t b l o c k s must h a v e ∗ d i f f e r e n t h a s h e s . ∗/ @Test

public void t e s t H a s h C o n s i s t e n c y ( ) throws NoSuchAlgorithmException { // g e n e r a t i n g a random b y t e [ 2 0 ] t o b e p r o c e s s e d ; t h e f i r s t b y t e

i s f o r c e d t o 0

// s o we can a l t e r t h e a r r a y a f t e r w a r d s SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k 1 = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k 1 ) ;

b l o c k 1 [ 0 ] = 0 ;

// g e n e r a t i n g a s e c o n d random b y t e [TEST ARRAYLENGTH ] ; t h i s time , t h e f i r s t b y t e i s s e t t o 1

byte [ ] b l o c k 2 = new byte [TEST ARRAYLENGTH ] ;

System . a r r a y c o p y ( b l o c k 1 , 0 , b l o c k 2 , 0 , b l o c k 1 . l e n g t h ) ; b l o c k 2 [ 0 ] = 1 ;

// r e t r i e v i n g MD5 h a s h e s o f t h e two a r r a y s ; t h e y must b e d i f f e r e n t

byte [ ] hash1 = P a r i p a r i S e c u r i t y . getMD5Hash ( b l o c k 1 ) ; byte [ ] hash2 = P a r i p a r i S e c u r i t y . getMD5Hash ( b l o c k 2 ) ;

a s s e r t F a l s e ( ” D i f f e r e n t i n p u t s must r e s u l t i n d i f f e r e n t h a s h e s ” , A r r a y s . e q u a l s ( b l o c k 1 , b l o c k 2 ) ) ; // r e t r i e v i n g MD4 h a s h e s o f t h e two a r r a y s ; t h e y must b e d i f f e r e n t hash1 = P a r i p a r i S e c u r i t y . getMD4Hash ( b l o c k 1 ) ; hash2 = P a r i p a r i S e c u r i t y . getMD4Hash ( b l o c k 2 ) ; a s s e r t F a l s e ( ” D i f f e r e n t i n p u t s must r e s u l t i n d i f f e r e n t h a s h e s ” , A r r a y s . e q u a l s ( b l o c k 1 , b l o c k 2 ) ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

// r e t r i e v i n g SHA1 h a s h e s o f t h e two a r r a y s ; t h e y must b e d i f f e r e n t

hash1 = P a r i p a r i S e c u r i t y . getSHA1Hash ( b l o c k 1 ) ; hash2 = P a r i p a r i S e c u r i t y . getSHA1Hash ( b l o c k 2 ) ;

a s s e r t F a l s e ( ” D i f f e r e n t i n p u t s must r e s u l t i n d i f f e r e n t h a s h e s ” , A r r a y s . e q u a l s ( b l o c k 1 , b l o c k 2 ) ) ;

// r e t r i e v i n g SHA256 h a s h e s o f t h e two a r r a y s ; t h e y must b e d i f f e r e n t

hash1 = P a r i p a r i S e c u r i t y . getHash ( b l o c k 1 , HashStandards . SHA256 ) ; hash2 = P a r i p a r i S e c u r i t y . getHash ( b l o c k 2 , HashStandards . SHA256 ) ; a s s e r t F a l s e ( ” D i f f e r e n t i n p u t s must r e s u l t i n d i f f e r e n t h a s h e s ” ,

A r r a y s . e q u a l s ( b l o c k 1 , b l o c k 2 ) ) ;

// r e t r i e v i n g SHA384 h a s h e s o f t h e two a r r a y s ; t h e y must b e d i f f e r e n t

hash1 = P a r i p a r i S e c u r i t y . getHash ( b l o c k 1 , HashStandards . SHA384 ) ; hash2 = P a r i p a r i S e c u r i t y . getHash ( b l o c k 2 , HashStandards . SHA384 ) ; a s s e r t F a l s e ( ” D i f f e r e n t i n p u t s must r e s u l t i n d i f f e r e n t h a s h e s ” ,

A r r a y s . e q u a l s ( b l o c k 1 , b l o c k 2 ) ) ;

// r e t r i e v i n g SHA512 h a s h e s o f t h e two a r r a y s ; t h e y must b e d i f f e r e n t

hash1 = P a r i p a r i S e c u r i t y . getHash ( b l o c k 1 , HashStandards . SHA512 ) ; hash2 = P a r i p a r i S e c u r i t y . getHash ( b l o c k 2 , HashStandards . SHA512 ) ; a s s e r t F a l s e ( ” D i f f e r e n t i n p u t s must r e s u l t i n d i f f e r e n t h a s h e s ” ,

A r r a y s . e q u a l s ( b l o c k 1 , b l o c k 2 ) ) ;

} /∗ ∗

∗ Trying t o g e n e r a t e a RSA k e y w i t h 0 l e n g t h s h o u l d throw an e x c e p t i o n

∗/

@Test

A.3 PARIPARISECURITYTEST.JAVA

KeyPair p = P a r i p a r i S e c u r i t y . generateRSAKeys ( 0 ) ; f a i l ( ” F a i l t o throw an e x c e p t i o n when t r y i n g t o g e n e r a t e z e r o − l e n g t h k e y s ” ) ; } /∗ ∗ ∗ Trying t o g e n e r a t e a k e y p a i r w i t h a v a l i d k e y l e n g t h . ∗ S h o u l d r e t u r n a n o t n u l l v a l u e . ∗/ @Test

public void testRSAnotNullKey ( ) {

a s s e r t N o t N u l l ( ”Must r e t u r n a n o t n u l l key ” , P a r i p a r i S e c u r i t y . generateRSAKeys ( RSA TEST KEYSIZE ) ) ;

}

/∗ ∗

∗ Trying t o g e n e r a t e a RSA k e y w i t h n u l l modulus s h o u l d throw an e x c e p t i o n

∗/

@Test

public void testRSAnullModPublicKey ( ) throws

I n v a l i d K e y S p e c E x c e p t i o n , NoSuchAlgorithmException {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

RSAPublicKeySpec s p e c = KeyFactory . g e t I n s t a n c e ( ”RSA” ) . getKeySpec ( p . g e t P u b l i c ( ) , RSAPublicKeySpec . c l a s s ) ;

PublicKey x = P a r i p a r i S e c u r i t y . generateRSAPublicKey ( null , s p e c . g e t P u b l i c E x p o n e n t ( ) ) ;

f a i l ( ” F a i l t o throw an e x c e p t i o n when t r y i n g t o g e n e r a t e key w i t h n u l l modulus ” ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

}

/∗ ∗

∗ Trying t o g e n e r a t e a RSA k e y w i t h n u l l e x p o n e n t s h o u l d throw an e x c e p t i o n

∗/

@Test

public void t e s t R S A n u l l E x p P u b l i c K e y ( ) throws

I n v a l i d K e y S p e c E x c e p t i o n , NoSuchAlgorithmException {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

RSAPublicKeySpec s p e c = KeyFactory . g e t I n s t a n c e ( ”RSA” ) . getKeySpec ( p . g e t P u b l i c ( ) , RSAPublicKeySpec . c l a s s ) ;

PublicKey x = P a r i p a r i S e c u r i t y . generateRSAPublicKey ( s p e c . getModulus ( ) , n u l l ) ;

f a i l ( ” F a i l t o throw an e x c e p t i o n when t r y i n g t o g e n e r a t e key w i t h n u l l e x p o n e n t ” ) ;

}

/∗ ∗

∗ Trying t o g e n e r a t e a k e y w i t h a v a l i d modulus and e x p o n e n t . ∗ S h o u l d r e t u r n a n o t n u l l v a l u e .

∗/ @Test

public void t e s t R S A n o t N u l l P u b l i c K e y ( ) throws

I n v a l i d K e y S p e c E x c e p t i o n , NoSuchAlgorithmException {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

A.3 PARIPARISECURITYTEST.JAVA

keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ; KeyPair p = keygen . genKeyPair ( ) ;

RSAPublicKeySpec s p e c = KeyFactory . g e t I n s t a n c e ( ”RSA” ) . getKeySpec ( p . g e t P u b l i c ( ) , RSAPublicKeySpec . c l a s s ) ; a s s e r t N o t N u l l ( ”Must r e t u r n a n o t n u l l key ” , P a r i p a r i S e c u r i t y . generateRSAPublicKey ( s p e c . getModulus ( ) , s p e c . g e t P u b l i c E x p o n e n t ( ) ) ) ; } /∗ ∗

∗ Trying t o g e n e r a t e a RSA k e y w i t h n u l l modulus s h o u l d throw an e x c e p t i o n

∗/

@Test

public void testRSAnullModPrivateKey ( ) throws

I n v a l i d K e y S p e c E x c e p t i o n , NoSuchAlgorithmException {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

RSAPrivateKeySpec s p e c = KeyFactory . g e t I n s t a n c e ( ”RSA” ) . getKeySpec ( p . g e t P r i v a t e ( ) , RSAPrivateKeySpec . c l a s s ) ;

P r i v a t e K e y x = P a r i p a r i S e c u r i t y . generateRSAPrivateKey ( null , s p e c . g e t P r i v a t e E x p o n e n t ( ) ) ;

f a i l ( ” F a i l t o throw an e x c e p t i o n when t r y i n g t o g e n e r a t e key w i t h n u l l modulus ” ) ;

}

/∗ ∗

∗ Trying t o g e n e r a t e a RSA k e y w i t h n u l l e x p o n e n t s h o u l d throw an e x c e p t i o n

A. CODICE SORGENTE DI SECURITYFRAMEWORK

∗/

@Test

public void t e s t R S A n u l l E x p P r i v a t e K e y ( ) throws

I n v a l i d K e y S p e c E x c e p t i o n , NoSuchAlgorithmException {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

RSAPrivateKeySpec s p e c = KeyFactory . g e t I n s t a n c e ( ”RSA” ) . getKeySpec ( p . g e t P r i v a t e ( ) , RSAPrivateKeySpec . c l a s s ) ; P r i v a t e K e y x = P a r i p a r i S e c u r i t y . generateRSAPrivateKey ( s p e c .

getModulus ( ) , n u l l ) ;

f a i l ( ” F a i l t o throw an e x c e p t i o n when t r y i n g t o g e n e r a t e key w i t h n u l l e x p o n e n t ” ) ;

}

/∗ ∗

∗ Trying t o g e n e r a t e a k e y w i t h a v a l i d modulus and e x p o n e n t . ∗ S h o u l d r e t u r n a n o t n u l l v a l u e .

∗/ @Test

public void t e s t R S A n o t N u l l P r i v a t e K e y ( ) throws

I n v a l i d K e y S p e c E x c e p t i o n , NoSuchAlgorithmException {

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

RSAPrivateKeySpec s p e c = KeyFactory . g e t I n s t a n c e ( ”RSA” ) . getKeySpec ( p . g e t P r i v a t e ( ) , RSAPrivateKeySpec . c l a s s ) ;

A.3 PARIPARISECURITYTEST.JAVA

a s s e r t N o t N u l l ( ”Must r e t u r n a n o t n u l l key ” , P a r i p a r i S e c u r i t y . generateRSAPublicKey ( s p e c . getModulus ( ) , s p e c . g e t P r i v a t e E x p o n e n t ( ) ) ) ; } /∗ ∗ ∗ T e s t i n g t h e e n c r y p t i o n o f a b l o c k w i t h a n u l l k e y ; ∗ must r e t u r n n u l l . ∗/ @Test

public void t e s t R S A e n c r y p t N u l l K e y ( ) throws I n v a l i d K e y E x c e p t i o n { // g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

P a r i p a r i S e c u r i t y . encryptRSA ( b l o c k , n u l l ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l key ” ) ; } /∗ ∗ ∗ T e s t i n g t h e e n c r y p t i o n o f a n u l l b l o c k ; must r e t u r n n u l l . ∗ @throws N o S u c h A l g o r i t h m E x c e p t i o n ∗/ @Test

public void t e s t R S A e n c r y p t N u l l ( ) throws NoSuchAlgorithmException , I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

P a r i p a r i S e c u r i t y . encryptRSA ( null , p . g e t P u b l i c ( ) ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

} /∗ ∗ ∗ T e s t i n g t h e c o r r e c t e n c r y p t i o n o f t h e b l o c k ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗ @throws N o S u c h A l g o r i t h m E x c e p t i o n ∗/ @Test

public void t e s t R S A e n c r y p t ( ) throws NoSuchAlgorithmException , G e n e r a l S e c u r i t y E x c e p t i o n {

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

// e n c r y p t i n g t h e b l o c k byte [ ] e n c r y p t e d = P a r i p a r i S e c u r i t y . encryptRSA ( b l o c k , p . g e t P u b l i c ( ) ) ; // d e c r y p t i n g j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, p . g e t P r i v a t e ( ) ) ; byte [ ] d e c r y p t e d = c i p h e r . d o F i n a l ( e n c r y p t e d ) ;

a s s e r t T r u e ( ” De cr ypte d b l o c k must be e q u a l t o t h e i n i t i a l one ” , A r r a y s . e q u a l s ( d e c r y p t e d , b l o c k ) ) ;

A.3 PARIPARISECURITYTEST.JAVA

/∗ ∗ ∗ T e s t i n g t h e d e c r y p t i o n o f a b l o c k w i t h a n u l l k e y ; ∗ must r e t u r n n u l l . ∗/ @Test

public void t e s t R S A d e c r y p t N u l l K e y ( ) throws I n v a l i d K e y E x c e p t i o n { // g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

P a r i p a r i S e c u r i t y . decryptRSA ( b l o c k , n u l l ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l key ” ) ; }

/∗ ∗

∗ T e s t i n g t h e d e c r y p t i o n o f a n u l l b l o c k ; must r e t u r n n u l l . ∗/

@Test

public void t e s t R S A d e c r y p t N u l l ( ) throws G e n e r a l S e c u r i t y E x c e p t i o n { // g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

P a r i p a r i S e c u r i t y . decryptRSA ( null , p . g e t P r i v a t e ( ) ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ;

}

/∗ ∗

∗ T e s t i n g t h e c o r r e c t d e c r y p t i o n o f t h e b l o c k ∗ @throws I n v a l i d K e y E x c e p t i o n

A. CODICE SORGENTE DI SECURITYFRAMEWORK

∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗/

@Test

public void t e s t R S A d e c r y p t ( ) throws I n v a l i d K e y E x c e p t i o n , G e n e r a l S e c u r i t y E x c e p t i o n {

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

// e n c r y p t i n g t h e b l o c k j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, p . g e t P u b l i c ( ) ) ; byte [ ] e n c r y p t e d = c i p h e r . d o F i n a l ( b l o c k ) ; // d e c r y p t i n g byte [ ] d e c r y p t e d = P a r i p a r i S e c u r i t y . decryptRSA ( e n c r y p t e d , p . g e t P r i v a t e ( ) ) ;

a s s e r t T r u e ( ” De cr ypte d b l o c k must be e q u a l t o t h e i n i t i a l one ” , A r r a y s . e q u a l s ( d e c r y p t e d , b l o c k ) ) ; } /∗ ∗ ∗ T e s t i n g t h e e n c r y p t i o n o f a stream w i t h a n u l l k e y ; must r e t u r n n u l l . ∗/ @Test

A.3 PARIPARISECURITYTEST.JAVA

public void t e s t R S A e n c r y p t I n p u t S t r e a m N u l l K e y ( ) throws I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

I n p u t S t r e a m s t r e a m = new ByteArrayInputStream ( b l o c k ) ;

P a r i p a r i S e c u r i t y . encryptInputStreamRSA ( stream , n u l l ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d on a n u l l key ” ) ; }

/∗ ∗

∗ T e s t i n g t h e e n c r y p t i o n o f a n u l l stream ; must r e t u r n n u l l . ∗/

@Test

public void t e s t R S A e n c r y p t I n p u t S t r e a m N u l l ( ) throws I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

P a r i p a r i S e c u r i t y . encryptInputStreamRSA ( null , p . g e t P u b l i c ( ) ) ; f a i l ( ” Should throw an e x c e p t i o n when c a l l e d on a n u l l s t r e a m ” ) ; } /∗ ∗ ∗ T e s t i n g t h e c o r r e c t e n c r y p t i o n o f t h e stream by encryptInputStreamRSA ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗ @throws I O E x c e p t i o n ∗ ∗/ @Test

A. CODICE SORGENTE DI SECURITYFRAMEWORK

public void t e s t R S A e n c r y p t I n p u t S t r e a m ( ) throws G e n e r a l S e c u r i t y E x c e p t i o n , I O E x c e p t i o n { // t o b e c h e c k e d

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// g e n e r a t i n g t h e s t r e a m t o b e t e s t e d

byte [ ] b l o c k c o p y = new byte [TEST ARRAYLENGTH ] ;

System . a r r a y c o p y ( b l o c k , 0 , b l o c k c o p y , 0 , b l o c k . l e n g t h ) ; C i p h e r I n p u t S t r e a m e n c r y p t S t r e a m = P a r i p a r i S e c u r i t y .

encryptInputStreamRSA (new ByteArrayInputStream ( b l o c k ) , p . g e t P u b l i c ( ) ) ; // g e n e r a t i n g t h e d e c r y p t s t r e a m j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, p . g e t P r i v a t e ( ) ) ; C i p h e r I n p u t S t r e a m d e c r y p t S t r e a m = new C i p h e r I n p u t S t r e a m ( e n c r y p t S t r e a m , c i p h e r ) ; // v e r i f y i n g t h a t t h e d e c r y p t e d s t r e a m i s e q u a l t o t h e o r i g i n a l one i n t c o u n t = 0 ; byte c u r r e n t = 0 ; while ( d e c r y p t S t r e a m . a v a i l a b l e ( ) >0) {

A.3 PARIPARISECURITYTEST.JAVA

c u r r e n t = ( byte ) d e c r y p t S t r e a m . r e a d ( ) ; // ????

a s s e r t E q u a l s ( ” De cry pte d s t r e a m must be e q u a l t o t h e o r i g i n a l one ” , c u r r e n t , b l o c k c o p y [ c o u n t ] ) ; c o u n t++; } } /∗ ∗ ∗ T e s t i n g t h e d e c r y p t i o n o f a stream w i t h a n u l l k e y ; must r e t u r n n u l l . ∗/ @Test

public void t e s t R S A d e c r y p t I n p u t S t r e a m N u l l K e y ( ) throws I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

I n p u t S t r e a m s t r e a m = new ByteArrayInputStream ( b l o c k ) ;

P a r i p a r i S e c u r i t y . decryptInputStreamRSA ( stream , n u l l ) ; f a i l ( ” Should r e t u r n n u l l when c a l l e d on a n u l l key ” ) ; }

/∗ ∗

∗ T e s t i n g t h e d e c r y p t i o n o f a n u l l stream ; must r e t u r n n u l l . ∗/

@Test

public void t e s t R S A d e c r y p t I n p u t S t r e a m N u l l ( ) throws I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

KeyPair p = keygen . genKeyPair ( ) ;

P a r i p a r i S e c u r i t y . decryptInputStreamRSA ( null , p . g e t P r i v a t e ( ) ) ; f a i l ( ” Should r e t u r n n u l l when c a l l e d on a n u l l s t r e a m ” ) ; } /∗ ∗ ∗ T e s t i n g t h e c o r r e c t d e c r y p t i o n o f t h e stream by d ec r yp t In p ut S tr e am R SA ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗ @throws I O E x c e p t i o n ∗ ∗/ @Test

public void t e s t R S A d e c r y p t I n p u t S t r e a m ( ) throws G e n e r a l S e c u r i t y E x c e p t i o n , I O E x c e p t i o n { // t o b e c h e c k e d

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// g e n e r a t i n g t h e s t r e a m t o b e t e s t e d

byte [ ] b l o c k c o p y = new byte [TEST ARRAYLENGTH ] ;

System . a r r a y c o p y ( b l o c k , 0 , b l o c k c o p y , 0 , b l o c k . l e n g t h ) ;

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

A.3 PARIPARISECURITYTEST.JAVA

c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, p . g e t P u b l i c ( ) ) ; C i p h e r I n p u t S t r e a m e n c r y p t S t r e a m = new C i p h e r I n p u t S t r e a m (new ByteArrayInputStream ( b l o c k ) , c i p h e r ) ; // g e n e r a t i n g t h e d e c r y p t s t r e a m C i p h e r I n p u t S t r e a m d e c r y p t S t r e a m = P a r i p a r i S e c u r i t y . decryptInputStreamRSA ( e n c r y p t S t r e a m , p . g e t P r i v a t e ( ) ) ; // v e r i f y i n g t h a t t h e d e c r y p t e d s t r e a m i s e q u a l t o t h e o r i g i n a l one i n t c o u n t = 0 ; byte c u r r e n t = 0 ; while ( d e c r y p t S t r e a m . a v a i l a b l e ( ) >0) { c u r r e n t = ( byte ) d e c r y p t S t r e a m . r e a d ( ) ; // ?????

a s s e r t E q u a l s ( ” De cry pte d s t r e a m must be e q u a l t o t h e o r i g i n a l one ” , c u r r e n t , b l o c k c o p y [ c o u n t ] ) ; c o u n t++; } } /∗ ∗ ∗ T e s t i n g t h e e n c r y p t i o n o f a stream w i t h a n u l l k e y ; must r e t u r n n u l l . ∗/ @Test

public void testRSAencryptOutputStreamNullKey ( ) throws I n v a l i d K e y E x c e p t i o n {

OutputStream s t r e a m = new ByteArrayOutputStream ( ) ;

P a r i p a r i S e c u r i t y . encryptOutputStreamRSA ( stream , n u l l ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l key ” ) ; }

A. CODICE SORGENTE DI SECURITYFRAMEWORK

/∗ ∗

∗ T e s t i n g t h e e n c r y p t i o n o f a n u l l stream ; must r e t u r n n u l l . ∗/

@Test

public void t e s t R S A e n c r y p t O u t p u t S t r e a m N u l l ( ) throws I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

P a r i p a r i S e c u r i t y . encryptOutputStreamRSA ( null , p . g e t P u b l i c ( ) ) ; f a i l ( ” Should throw an e x c e p t i o n when c a l l e d on a n u l l b l o c k ” ) ; } /∗ ∗ ∗ T e s t i n g t h e c o r r e c t e n c r y p t i o n o f t h e stream by encryptOutputStreamRSA ∗ ∗/ @Test

public void testRSAencryptOutputStream ( ) throws I n v a l i d K e y E x c e p t i o n , NoSuchAlgorithmException ,

N o S u c h P r o v i d e r E x c e p t i o n , NoSuchPaddingException , I O E x c e p t i o n { // g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

A.3 PARIPARISECURITYTEST.JAVA

// c r e a t i n g t h e o u t p u t s t r e a m

ByteArrayOutputStream r e s u l t = new ByteArrayOutputStream ( ) ;

// d e c r y p t i n g t h e s t r e a m

j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ;

C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .DECRYPT MODE, p . g e t P r i v a t e ( ) ) ;

CipherOutputStream d e c r y p t e d S t r e a m = new CipherOutputStream ( r e s u l t , c i p h e r ) ; // e n c r y p t i n g i t ( when we c a l l w r i t e , t h e d a t a i s f i r s t e n c r y p t e d // by encryptOutputStreamRSA , t h e n d e c r y p t e d by t h e C i p h e r O u t p u t S t r e a m // and e v e n t u a l l y w r i t t e n on t h e ByteArrayOutputStream ) CipherOutputStream t o E n c r y p t = P a r i p a r i S e c u r i t y . encryptOutputStreamRSA ( d e c r y p t e d S t r e a m , p . g e t P u b l i c ( ) ) ; // v e r i f y i n g t h a t t h e d e c r y p t e d s t r e a m i s e q u a l t o t h e o r i g i n a l one f o r ( byte b : b l o c k ) { t o E n c r y p t . w r i t e ( b ) ; } t o E n c r y p t . c l o s e ( ) ; //<−−we need t o c l o s e t h e s t r e a m f o r i t t o p r o p e r l y f l u s h

a s s e r t T r u e ( ” De cry pte d s t r e a m must be e q u a l t o t h e o r i g i n a l one ” , A r r a y s . e q u a l s ( r e s u l t . t o B y t e A r r a y ( ) , b l o c k ) ) ;

}

/∗ ∗

∗ T e s t i n g t h e e n c r y p t i o n o f a stream w i t h a n u l l k e y ; must r e t u r n n u l l .

A. CODICE SORGENTE DI SECURITYFRAMEWORK

∗/ @Test

public void testRSAdecryptOutputStreamNullKey ( ) throws I n v a l i d K e y E x c e p t i o n {

OutputStream s t r e a m = new ByteArrayOutputStream ( ) ;

P a r i p a r i S e c u r i t y . decryptOutputStreamRSA ( stream , n u l l ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l key ” ) ;

}

/∗ ∗

∗ T e s t i n g t h e e n c r y p t i o n o f a n u l l stream ; must r e t u r n n u l l . ∗/

@Test

public void t e s t R S A d e c r y p t O u t p u t S t r e a m N u l l ( ) throws I n v a l i d K e y E x c e p t i o n {

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

P a r i p a r i S e c u r i t y . decryptOutputStreamRSA ( null , p . g e t P r i v a t e ( ) ) ; f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ; } /∗ ∗ ∗ T e s t i n g t h e c o r r e c t d e c r y p t i o n o f t h e stream by decryptOutputStreamRSA ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗ @throws I O E x c e p t i o n ∗ ∗/ @Test

A.3 PARIPARISECURITYTEST.JAVA

public void testRSAdecryptOutputStream ( ) throws G e n e r a l S e c u r i t y E x c e p t i o n , I O E x c e p t i o n {

// g e n e r a t i n g k e y s

JDKKeyPairGenerator . RSA keygen = new JDKKeyPairGenerator . RSA( ) ; keygen . i n i t i a l i z e ( RSA TEST KEYSIZE ) ;

KeyPair p = keygen . genKeyPair ( ) ;

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// c r e a t i n g t h e o u t p u t s t r e a m

ByteArrayOutputStream r e s u l t = new ByteArrayOutputStream ( ) ;

// d e c r y p t i n g t h e s t r e a m CipherOutputStream d e c r y p t e d S t r e a m = P a r i p a r i S e c u r i t y . decryptOutputStreamRSA ( r e s u l t , p . g e t P r i v a t e ( ) ) ; // e n c r y p t i n g i t ( when we c a l l w r i t e , t h e d a t a i s f i r s t e n c r y p t e d // by t h e CipherOutputStream , t h e n d e c r y p t e d by decryptOutputStreamRSA // and e v e n t u a l l y w r i t t e n on t h e ByteArrayOutputStream ) j a v a . s e c u r i t y . S e c u r i t y . a d d P r o v i d e r (new o r g . b o u n c y c a s t l e . j c e . p r o v i d e r . B o u n c y C a s t l e P r o v i d e r ( ) ) ; C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”RSA” , ”BC” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, p . g e t P u b l i c ( ) ) ; CipherOutputStream t o E n c r y p t = new CipherOutputStream (

d e c r y p t e d S t r e a m , c i p h e r ) ; // v e r i f y i n g t h a t t h e d e c r y p t e d s t r e a m i s e q u a l t o t h e o r i g i n a l one f o r ( byte b : b l o c k ) { t o E n c r y p t . w r i t e ( b ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

}

t o E n c r y p t . c l o s e ( ) ; //<−−we need t o c l o s e t h e s t r e a m f o r i t t o p r o p e r l y f l u s h

a s s e r t T r u e ( ” De cr ypte d s t r e a m must be e q u a l t o t h e o r i g i n a l one ” , A r r a y s . e q u a l s ( r e s u l t . t o B y t e A r r a y ( ) , b l o c k ) ) ; } /∗ ∗ ∗ Trying t o g e n e r a t e a RC4 k e y w i t h 0 l e n g t h s h o u l d throw an e x c e p t i o n ∗/ @Test

public void testRC4zeroLengthKey ( ) {

S e c r e t K e y p = P a r i p a r i S e c u r i t y . generateRC4Key ( 0 ) ; f a i l ( ” F a i l t o throw an e x c e p t i o n when t r y i n g t o g e n e r a t e z e r o − l e n g t h k e y s ” ) ; } /∗ ∗ ∗ Trying t o g e n e r a t e a k e y w i t h a v a l i d k e y l e n g t h . ∗ S h o u l d r e t u r n a n o t n u l l v a l u e . ∗/ @Test

public void testRC4notNullKey ( ) {

a s s e r t N o t N u l l ( ”Must r e t u r n a n o t n u l l key ” , P a r i p a r i S e c u r i t y . generateRC4Key ( RC4 TEST KEYSIZE ) ) ;

}

/∗ ∗

∗ T e s t i n g t h e e n c r y p t i o n o f a b l o c k w i t h a n u l l k e y ; ∗ must r e t u r n n u l l .

A.3 PARIPARISECURITYTEST.JAVA

∗/ @Test

public void t e s t R C 4 e n c r y p t N u l l K e y ( ) throws I n v a l i d K e y E x c e p t i o n { // g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

P a r i p a r i S e c u r i t y . encryptRC4 ( b l o c k , n u l l ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l key ” ) ; } /∗ ∗ ∗ T e s t i n g t h e e n c r y p t i o n o f a n u l l b l o c k ; must r e t u r n n u l l . ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗/ @Test

public void t e s t R C 4 e n c r y p t N u l l ( ) throws G e n e r a l S e c u r i t y E x c e p t i o n { // g e n e r a t i n g k e y s

KeyGenerator k = KeyGenerator . g e t I n s t a n c e ( ”ARCFOUR” ) ; k . i n i t ( RC4 TEST KEYSIZE ) ;

S e c r e t K e y key = k . g e n e r a t e K e y ( ) ;

P a r i p a r i S e c u r i t y . encryptRC4 ( null , key ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ; } /∗ ∗ ∗ T e s t i n g t h e c o r r e c t e n c r y p t i o n o f t h e b l o c k ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗/ @Test

A. CODICE SORGENTE DI SECURITYFRAMEWORK

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// g e n e r a t i n g k e y

KeyGenerator k = KeyGenerator . g e t I n s t a n c e ( ”ARCFOUR” ) ; k . i n i t ( RC4 TEST KEYSIZE ) ;

S e c r e t K e y key = k . g e n e r a t e K e y ( ) ;

// e n c r y p t i n g t h e b l o c k

byte [ ] e n c r y p t e d = P a r i p a r i S e c u r i t y . encryptRC4 ( b l o c k , key ) ;

// d e c r y p t i n g

C i p h e r c = C i p h e r . g e t I n s t a n c e ( ”ARCFOUR” ) ; c . i n i t ( C i p h e r .DECRYPT MODE, key ) ;

byte [ ] d e c r y p t e d = c . d o F i n a l ( e n c r y p t e d ) ;

a s s e r t T r u e ( ” De cr ypte d b l o c k must be e q u a l t o t h e i n i t i a l one ” , A r r a y s . e q u a l s ( d e c r y p t e d , b l o c k ) ) ; } /∗ ∗ ∗ T e s t i n g t h e d e c r y p t i o n o f a b l o c k w i t h a n u l l k e y ; ∗ must r e t u r n n u l l . ∗/ @Test

public void t e s t R C 4 d e c r y p t N u l l K e y ( ) throws I n v a l i d K e y E x c e p t i o n { // g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

A.3 PARIPARISECURITYTEST.JAVA

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l key ” ) ; } /∗ ∗ ∗ T e s t i n g t h e d e c r y p t i o n o f a n u l l b l o c k ; must r e t u r n n u l l . ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗/ @Test

public void t e s t R C 4 d e c r y p t N u l l ( ) throws G e n e r a l S e c u r i t y E x c e p t i o n { // g e n e r a t i n g k e y s

KeyGenerator k = KeyGenerator . g e t I n s t a n c e ( ”ARCFOUR” ) ; k . i n i t ( RC4 TEST KEYSIZE ) ;

S e c r e t K e y key = k . g e n e r a t e K e y ( ) ;

P a r i p a r i S e c u r i t y . decryptRC4 ( null , key ) ;

f a i l ( ” Should throw an e x c e p t i o n when c a l l e d w i t h a n u l l b l o c k ” ) ; } /∗ ∗ ∗ T e s t i n g t h e c o r r e c t d e c r y p t i o n o f t h e b l o c k ∗ @throws G e n e r a l S e c u r i t y E x c e p t i o n ∗ @throws N o S u c h A l g o r i t h m E x c e p t i o n ∗/ @Test

public void t e s t R C 4 d e c r y p t ( ) throws NoSuchAlgorithmException , G e n e r a l S e c u r i t y E x c e p t i o n {

// g e n e r a t i n g a random i n p u t

SecureRandom random = new SecureRandom ( ) ; random . s e t S e e d ( System . c u r r e n t T i m e M i l l i s ( ) ) ; byte [ ] b l o c k = new byte [TEST ARRAYLENGTH ] ; random . n e x t B y t e s ( b l o c k ) ;

// g e n e r a t i n g k e y

KeyGenerator k = KeyGenerator . g e t I n s t a n c e ( ”ARCFOUR” ) ; k . i n i t ( RC4 TEST KEYSIZE ) ;

A. CODICE SORGENTE DI SECURITYFRAMEWORK

S e c r e t K e y key = k . g e n e r a t e K e y ( ) ;

// e n c r y p t i n g t h e b l o c k

C i p h e r c i p h e r = C i p h e r . g e t I n s t a n c e ( ”ARCFOUR” ) ; c i p h e r . i n i t ( C i p h e r .ENCRYPT MODE, key ) ;

byte [ ] e n c r y p t e d = c i p h e r . d o F i n a l ( b l o c k ) ;

// d e c r y p t i n g

byte [ ] d e c r y p t e d = P a r i p a r i S e c u r i t y . decryptRC4 ( e n c r y p t e d , key ) ;

a s s e r t T r u e ( ” De cr ypte d b l o c k must be e q u a l t o t h e i n i t i a l one ” , A r r a y s . e q u a l s ( d e c r y p t e d , b l o c k ) ) ;

}

Bibliografia

[1] Paolo Bertasi. Progettazione e realizzazione in Java di una rete peer to peer

anonima e multifunzionale. Dipartimento di Ingegneria dell’Informazione,

Universit`a di Padova, 2004.

[2] Andrew S. Tanenbaum. Reti di Calcolatori. Pearson Paravia Bruno

Mondadori, 2003.

Documenti correlati