package es.uji.security.crypto.cms;
import java.io.ByteArrayInputStream;
import java.security.KeyStoreException;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.cert.CertStore;
import java.security.cert.Certificate;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.CMSSignedGenerator;
import es.uji.security.crypto.ISignFormatProvider;
import es.uji.security.crypto.SignatureOptions;
import es.uji.security.crypto.SignatureResult;
import es.uji.security.crypto.cms.bc.MyCMSSignedDataGenerator;
import es.uji.security.crypto.config.OS;
import es.uji.security.util.i18n.LabelManager;
public class CMSSignatureFactory implements ISignFormatProvider
{
private Logger log = Logger.getLogger(CMSSignatureFactory.class);
public SignatureResult formatSignature(SignatureOptions signatureOptions)
throws KeyStoreException, Exception
{
byte[] data = OS.inputStreamToByteArray(signatureOptions.getDataToSign());
X509Certificate certificate = signatureOptions.getCertificate();
PrivateKey privateKey = signatureOptions.getPrivateKey();
Provider provider = signatureOptions.getProvider();
MyCMSSignedDataGenerator gen = new MyCMSSignedDataGenerator();
SignatureResult signatureResult = new SignatureResult();
if (certificate == null)
{
signatureResult.setValid(false);
signatureResult.addError(LabelManager.get("ERROR_CMS_NOCERT"));
return signatureResult;
}
if (privateKey == null)
{
signatureResult.setValid(false);
signatureResult.addError(LabelManager.get("ERROR_CMS_NOKEY"));
return signatureResult;
}
gen.addSigner(privateKey, (X509Certificate) certificate, CMSSignedGenerator.DIGEST_SHA1);
CMSProcessableByteArray cmsProcessableByteArray = new CMSProcessableByteArray(data);
List<Certificate> certList = new ArrayList<Certificate>();
// TODO: Add the intermediate CAs if we have them
certList.add(certificate);
CertStore certst = CertStore.getInstance("Collection", new CollectionCertStoreParameters(
certList));
gen.addCertificatesAndCRLs(certst);
if (signatureOptions.isHash())
{
gen.setHash(data);
}
CMSSignedData cmsSignedData = gen.generate(cmsProcessableByteArray, provider);
if (data != null)
{
signatureResult.setValid(true);
signatureResult.setSignatureData(new ByteArrayInputStream(cmsSignedData.getEncoded()));
return signatureResult;
}
else
{
signatureResult.setValid(false);
signatureResult.addError(LabelManager.get("ERROR_CMS_SIGNATURE"));
return signatureResult;
}
}
}