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;
}
J'appelle hasNext() dans la boucle while. – nolags
Vous avez deux itérateurs dans votre code 'Collection c = signers.getSigners(); Iterator it = c.iterator(); 'et' Iterator certIt = certCollection.iterator(); ' – gvmani
Ai-je besoin d'une boucle while ou if? – nolags