2012-11-22 12 views
5

Possiedo un X509CertificateObject, un RSAPublicKey corrispondente e sono riuscito a creare un array di byte contenente un certificato digitale valido per alcuni oggetti messaggio anche come array di byte.Converti messaggio e firma nell'oggetto BouncyCastle CMSSignedData

Sfortunatamente il sistema su cui sto lavorando accetta solo oggetti CMSSignedData come input. Come si convertono i blocchi di base in un oggetto CMSSignedData valido?

Background: sto sperimentando con Java Bouncy Castle RSA blind signature secondo this example (digest è SHA512) e ho bisogno di alimentare il risultato nell'elaborazione della firma standard.

risposta

0

In primo luogo, probabilmente vorrai firmare i tuoi dati con una chiave privata. L'idea è che la firma dovrebbe essere qualcosa che solo tu puoi creare. Uno si ottiene che il resto dovrebbe essere come segue:


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);