0

Je souhaite vérifier une signature créée avec la bibliothèque bouncycastle. C'est mon code pour vérifier l'objet cmssigneddata.Vérifiez que la signature avec bouncycastle a échoué avec NoSuchElementException

public static void verifySignature(CMSSignedData sigData){ 
    Store store = sigData.getCertificates(); 
      SignerInformationStore signers = sigData.getSignerInfos(); 

      Collection c = signers.getSigners(); 
      Iterator it = c.iterator(); 

      while (it.hasNext()) { 
       SignerInformation signer = (SignerInformation) it.next(); 

       Collection certCollection = store.getMatches(signer.getSID()); 
       Iterator certIt = certCollection.iterator(); 

       X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next(); 
       X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder); 

       if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert))) { 
        System.out.println("verified correct"); 
       } 
       System.out.println("not verified"); 
    } 

Je reçois l'exception Exception dans le thread "principal" java.util.NoSuchElementException à java.util.ArrayList $ Itr.next (ArrayList.java:854)

Quelle est la problème ici? On dirait que le problème est le ArrayList?

EDIT Inséré une boucle while pour certIt.next()

while (it.hasNext()) { 
      SignerInformation signer = (SignerInformation) it.next(); 

      Collection certCollection = store.getMatches(signer.getSID()); 
      Iterator certIt = certCollection.iterator(); 

      while (certIt.hasNext()) { 
       X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next(); 
       X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder); 

       if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert))) { 
        System.out.println("verified correct"); 
       } else { 
        System.out.println("not verified"); 
       } 
      } 

EDIT générer CMSSignedData

public static CMSSignedData sign() throws Exception { 
     byte[] file = fileChooser(); 
     store = KeyStore.getInstance(storeType); 
     FileInputStream in = new FileInputStream(new File(storePathKey)); 
     store.load(in, storePassword); 
     in.close(); 

     Key priv = store.getKey("Subject", storePassword); 
     System.out.println(priv.toString() + "priv string"); 
     X509Certificate cert = (X509Certificate) store.getCertificate("Subject"); 
     ContentSigner signer = new JcaContentSignerBuilder(sigAlgo).build((RSAPrivateKey) priv); 

     // Build cms (sign data) - Cryptographic Message Syntax 
     CMSTypedData data = new CMSProcessableByteArray(file); 
     CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 
     gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()) 
       .build(signer, cert)); 
     CMSSignedData sigData = gen.generate(data, true); 

     return sigData; 
    } 

Répondre

0

Iterator certIt = certCollection.iterator(); X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next(); Vous appelez suivant sans vérifier hasNext

+0

J'appelle hasNext() dans la boucle while. – nolags

+0

Vous avez deux itérateurs dans votre code 'Collection c = signers.getSigners(); Iterator it = c.iterator(); 'et' Iterator certIt = certCollection.iterator(); ' – gvmani

+0

Ai-je besoin d'une boucle while ou if? – nolags

0

Collection certCollection = store.getMatches(signer.getSID()); renvoie un Collection vide. C'est pourquoi vous ne pouvez pas itérer.

Etes-vous sûr que l'argument CMSSignedData sigData a été construit correctement? Essayez de voir ce que vous obtenez de store.getMatches(null);?

+0

Je reçois un tableau vide .. ajouté ma construction sigData ci-dessus. – nolags