in jsign-core/src/main/java/net/jsign/AuthenticodeSigner.java [399:444]
private AuthenticodeSignedDataGenerator createSignedDataGenerator() throws CMSException, OperatorCreationException, CertificateEncodingException {
// create content signer
final String sigAlg;
if (signatureAlgorithm == null) {
sigAlg = digestAlgorithm + "with" + privateKey.getAlgorithm();
} else {
sigAlg = signatureAlgorithm;
}
JcaContentSignerBuilder contentSignerBuilder = new JcaContentSignerBuilder(sigAlg);
if (signatureProvider != null) {
contentSignerBuilder.setProvider(signatureProvider);
}
ContentSigner shaSigner = contentSignerBuilder.build(privateKey);
DigestCalculatorProvider digestCalculatorProvider = new AuthenticodeDigestCalculatorProvider();
// prepare the authenticated attributes
CMSAttributeTableGenerator attributeTableGenerator = new DefaultSignedAttributeTableGenerator(createAuthenticatedAttributes());
attributeTableGenerator = new FilteredAttributeTableGenerator(attributeTableGenerator, CMSAttributes.signingTime, CMSAttributes.cmsAlgorithmProtect);
// fetch the signing certificate
X509CertificateHolder certificate = new JcaX509CertificateHolder((X509Certificate) chain[0]);
// prepare the signerInfo with the extra authenticated attributes
SignerInfoGeneratorBuilder signerInfoGeneratorBuilder = new SignerInfoGeneratorBuilder(digestCalculatorProvider, new DefaultCMSSignatureEncryptionAlgorithmFinder(){
@Override
public AlgorithmIdentifier findEncryptionAlgorithm(final AlgorithmIdentifier signatureAlgorithm) {
//enforce "RSA" instead of "shaXXXRSA" for digest signature to be more like signtool
if (signatureAlgorithm.getAlgorithm().equals(PKCSObjectIdentifiers.sha256WithRSAEncryption) ||
signatureAlgorithm.getAlgorithm().equals(PKCSObjectIdentifiers.sha384WithRSAEncryption) ||
signatureAlgorithm.getAlgorithm().equals(PKCSObjectIdentifiers.sha512WithRSAEncryption)) {
return new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE);
} else {
return super.findEncryptionAlgorithm(signatureAlgorithm);
}
}
});
signerInfoGeneratorBuilder.setSignedAttributeGenerator(attributeTableGenerator);
SignerInfoGenerator signerInfoGenerator = signerInfoGeneratorBuilder.build(shaSigner, certificate);
AuthenticodeSignedDataGenerator generator = new AuthenticodeSignedDataGenerator();
generator.addCertificates(new JcaCertStore(removeRoot(chain)));
generator.addSignerInfoGenerator(signerInfoGenerator);
return generator;
}