2012-11-22 9 views
5

Ich habe ein X509CertificateObject, ein passender RSAPublicKey und geschafft, ein Byte-Array zu erstellen, das ein gültiges digitales Zertifikat für einige Nachrichtenobjekte auch als Byte-Array enthält.Convert Nachricht und Unterschrift zu BouncyCastle CMSSignedData Objekt

Leider akzeptiert das System, auf dem ich baue, nur CMSSignedData Objekte als Eingabe. Wie konvertiere ich meine grundlegenden Bausteine ​​in solch ein gültiges CMSSignedData Objekt?

Hintergrund: Ich experimentiere mit Java Bouncy Castle RSA Blindsignaturen nach this example (Digest ist SHA512) und muss das Ergebnis in die Standard-Signaturverarbeitung einspeisen.

Antwort

0

Zuerst werden Sie wahrscheinlich Ihre Daten mit einem privaten Schlüssel signieren wollen. Die Idee ist, dass die Signatur etwas sein sollte, das nur Sie selbst erstellen können. Man bekommt, dass der Rest wie folgt sein sollte:


X509Certificate signingCertificate = getSigningCertificate(); 
//The chain of certificates that issued your signing certificate and so on 
Collection&ltX509Certificate> certificateChain = getCertificateChain(); 
PrivateKey pk = getPrivateKey(); 
byte[] message = "SomeMessage".getBytes(); 

CMSSignedDataGenerator generator = new CMSSignedDataGenerator(); 
certificateChain.add(signingCertificate); 
generator.addCertificates(new CollectionStore(certificateChain)); 

JcaDigestCalculatorProviderBuilder jcaDigestProvider = new JcaDigestCalculatorProviderBuilder(); 
jcaDigestProvider.setProvider(new BouncyCastleProvider()); 
JcaSignerInfoGeneratorBuilder singerInfoGenerator = new JcaSignerInfoGeneratorBuilder(jcaDigestProvider.build()); 

AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA"); 
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId); 
AsymmetricKeyParameter privateKeyParam = PrivateKeyFactory.createKey(pk.getEncoded()); 
ContentSigner cs = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(privateKeyParam); 

SignerInfoGenerator sig = singerInfoGenerator.build(cs, signingCertificate); 
generator.addSignerInfoGenerator(sig); 

CMSSignedData data = generator.generate(new CMSProcessableByteArray(message), true);