package es.uji.security.crypto.raw;
import java.io.ByteArrayInputStream;
import java.security.KeyStoreException;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.Signature;
import java.security.cert.X509Certificate;
import org.apache.log4j.Logger;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import es.uji.security.crypto.ISignFormatProvider;
import es.uji.security.crypto.SignatureOptions;
import es.uji.security.crypto.SignatureResult;
import es.uji.security.crypto.config.OS;
import es.uji.security.util.i18n.LabelManager;
public class RawSignatureFactory implements ISignFormatProvider
{
private Logger log = Logger.getLogger(RawSignatureFactory.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();
log.info("Init SHA1withRSA signature");
Signature rsa = Signature.getInstance("SHA1withRSA", provider);
SignatureResult signatureResult = new SignatureResult();
if (certificate == null)
{
signatureResult.setValid(false);
signatureResult.addError(LabelManager.get("ERR_RAW_NOCERT"));
log.error(LabelManager.get("ERR_RAW_NOCERT"));
return signatureResult;
}
if (privateKey == null)
{
signatureResult.setValid(false);
signatureResult.addError(LabelManager.get("ERR_RAW_NOKEY"));
log.error(LabelManager.get("ERR_RAW_NOCERT"));
return signatureResult;
}
rsa.initSign(privateKey);
rsa.update(data);
byte[] res = rsa.sign();
// Verification
log.info("Trying to verify signed data");
Signature rsa_vfy = Signature.getInstance("SHA1withRSA", new BouncyCastleProvider());
rsa_vfy.initVerify(certificate.getPublicKey());
rsa_vfy.update(data);
if (res == null)
{
signatureResult.setValid(false);
signatureResult.addError(LabelManager.get("ERROR_RAW_SIGNATURE"));
log.info(LabelManager.get("ERROR_RAW_SIGNATURE"));
}
else
{
signatureResult.setValid(true);
signatureResult.setSignatureData(new ByteArrayInputStream(res));
log.info("Signature verified");
}
return signatureResult;
}
}