2010-02-08 4 views
0

J'écris une application qui signe et enveloppe les données en utilisant BouncyCastle.Le hachage CMSSignedDataStreamGenerator ne correspond pas

J'ai besoin de signer des fichiers volumineux donc au lieu d'utiliser le CMSSignedDataGenerator (qui fonctionne très bien pour les petits fichiers) j'ai choisi d'utiliser CMSSignedDataStreamGenerator. Les fichiers signés sont générés mais le hachage SHA1 ne correspond pas au fichier d'origine. Pourriez-vous m'aider?

Here`s du code:

try { 

     int buff = 16384; 
     byte[] buffer = new byte[buff]; 
     int unitsize = 0; 
     long read = 0; 
     long offset = file.length(); 
     FileInputStream is = new FileInputStream(file); 
     FileOutputStream bOut = new FileOutputStream("teste.p7s"); 
     Certificate cert = keyStore.getCertificate(alias); 
     PrivateKey key = (PrivateKey) keyStore.getKey(alias, null); 
     Certificate[] chain = keyStore.getCertificateChain(alias); 
     CertStore certStore = CertStore.getInstance("Collection",new CollectionCertStoreParameters(Arrays.asList(chain))); 
     CMSSignedDataStreamGenerator gen = new CMSSignedDataStreamGenerator(); 
     gen.addSigner(key, (X509Certificate) cert, CMSSignedDataGenerator.DIGEST_SHA1, "SunPKCS11-iKey2032"); 
     gen.addCertificatesAndCRLs(certStore); 
     OutputStream sigOut = gen.open(bOut,true); 

     while (read < offset) { 
      unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read)); 
      is.read(buffer, 0, unitsize); 
      sigOut.write(buffer); 
      read += unitsize; 
     } 
     sigOut.close(); 
     bOut.close(); 
     is.close(); 

Je ne sais pas ce que je fais mal.

+0

Réglage tampon 1 semble fonctionner. Je pense qu'il traitait les 0 ou les nulls dans la dernière itération de tampon. Y a-t-il un autre moyen de le réparer? – Paulo

Répondre

1

Un problème possible est la ligne

is.read(buffer, 0, unitsize); 

FileInputStream.read n'est garanti à lire entre 1 et unitsize octets.

Essayez d'écrire

int actuallyRead = is.read(buffer, 0, unitsize); 
sigOut.write(buffer, 0, actuallyRead); 
read += actuallyRead; 
2

Je suis d'accord avec Rasmus Faber, la boucle de lecture/écriture est douteux.

Remplacer ceci:

while (read < offset) { 
    unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read)); 
    is.read(buffer, 0, unitsize); 
    sigOut.write(buffer); 
    read += unitsize; 
} 

avec:

org.bouncycastle.util.io.Streams.pipeAll(is, sigOut); 
Questions connexes