feat: reflect code
This commit is contained in:
@@ -12,6 +12,7 @@ import me.hatter.tools.commons.security.cert.X509CertUtil;
|
|||||||
import me.hatter.tools.commons.security.key.KeyUtil;
|
import me.hatter.tools.commons.security.key.KeyUtil;
|
||||||
import me.hatter.tools.commons.string.StringUtil;
|
import me.hatter.tools.commons.string.StringUtil;
|
||||||
import org.bouncycastle.operator.ContentSigner;
|
import org.bouncycastle.operator.ContentSigner;
|
||||||
|
import org.bouncycastle.operator.OperatorCreationException;
|
||||||
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
|
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -26,6 +27,37 @@ public class SignPdfMain {
|
|||||||
if (signPdfArgs == null) {
|
if (signPdfArgs == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
checkSginPdfArgs(signPdfArgs);
|
||||||
|
|
||||||
|
final SignOptions signOptions = buildSignOptions(signPdfArgs);
|
||||||
|
|
||||||
|
final File inFile = new File(signPdfArgs.in);
|
||||||
|
final File outFile = new File(signPdfArgs.out);
|
||||||
|
|
||||||
|
checkFiles(inFile, outFile);
|
||||||
|
|
||||||
|
final List<X509Certificate> certs = X509CertUtil.parseX509CertificateList(
|
||||||
|
RFile.from(signPdfArgs.certs).string());
|
||||||
|
final X509Certificate[] certificateChain = certs.toArray(new X509Certificate[0]);
|
||||||
|
|
||||||
|
final ContentSigner contentSigner = buildContentSigner(signPdfArgs, certificateChain);
|
||||||
|
final CreateSignature signing = new CreateSignature(certificateChain, contentSigner, signOptions);
|
||||||
|
// signing.setExternalSigning(true);
|
||||||
|
|
||||||
|
final String tsaUrl = StringUtil.def(signOptions.getTsaUrl(), TSAClient.DEFAULT_TSA_URL);
|
||||||
|
signing.signDetached(inFile, outFile, tsaUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkFiles(File inFile, File outFile) {
|
||||||
|
if (!inFile.exists()) {
|
||||||
|
throw new RuntimeException("PDF file in not exists.");
|
||||||
|
}
|
||||||
|
if (outFile.exists()) {
|
||||||
|
throw new RuntimeException("PDF file out exists.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkSginPdfArgs(SignPdfArgs signPdfArgs) {
|
||||||
if (StringUtil.isEmpty(signPdfArgs.in) || StringUtil.isEmpty(signPdfArgs.out)) {
|
if (StringUtil.isEmpty(signPdfArgs.in) || StringUtil.isEmpty(signPdfArgs.out)) {
|
||||||
throw new RuntimeException("PDF file in/out cannot be empty.");
|
throw new RuntimeException("PDF file in/out cannot be empty.");
|
||||||
}
|
}
|
||||||
@@ -41,45 +73,37 @@ public class SignPdfMain {
|
|||||||
if (StringUtil.isNotEmpty(signPdfArgs.slot) && StringUtil.isEmpty(signPdfArgs.pin)) {
|
if (StringUtil.isNotEmpty(signPdfArgs.slot) && StringUtil.isEmpty(signPdfArgs.pin)) {
|
||||||
throw new RuntimeException("PIN cannot be empty");
|
throw new RuntimeException("PIN cannot be empty");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SignOptions buildSignOptions(SignPdfArgs signPdfArgs) {
|
||||||
final SignOptions signOptions = new SignOptions();
|
final SignOptions signOptions = new SignOptions();
|
||||||
signOptions.setName(signPdfArgs.name);
|
signOptions.setName(signPdfArgs.name);
|
||||||
signOptions.setLocation(signPdfArgs.location);
|
signOptions.setLocation(signPdfArgs.location);
|
||||||
signOptions.setReason(signPdfArgs.reason);
|
signOptions.setReason(signPdfArgs.reason);
|
||||||
signOptions.setContactInfo(signPdfArgs.contactInfo);
|
signOptions.setContactInfo(signPdfArgs.contactInfo);
|
||||||
|
return signOptions;
|
||||||
final File inFile = new File(signPdfArgs.in);
|
|
||||||
final File outFile = new File(signPdfArgs.out);
|
|
||||||
|
|
||||||
if (!inFile.exists()) {
|
|
||||||
throw new RuntimeException("PDF file in not exists.");
|
|
||||||
}
|
|
||||||
if (outFile.exists()) {
|
|
||||||
throw new RuntimeException("PDF file out exists.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<X509Certificate> certs = X509CertUtil.parseX509CertificateList(
|
private static ContentSigner buildContentSigner(SignPdfArgs signPdfArgs, X509Certificate[] certificateChain) throws OperatorCreationException {
|
||||||
RFile.from(signPdfArgs.certs).string());
|
|
||||||
final X509Certificate[] certificateChain = certs.toArray(new X509Certificate[0]);
|
|
||||||
|
|
||||||
final ContentSigner contentSigner;
|
|
||||||
if (StringUtil.isNotEmpty(signPdfArgs.key)) {
|
if (StringUtil.isNotEmpty(signPdfArgs.key)) {
|
||||||
final PrivateKey privateKey = KeyUtil.parsePrivateKeyPEM(
|
return buildPrivateKeyContentSigner(signPdfArgs, certificateChain);
|
||||||
RFile.from(signPdfArgs.key).string());
|
|
||||||
final String signatureAlgorithm = SigUtils.getSignatureAlgorithm(certificateChain[0]);
|
|
||||||
contentSigner = new JcaContentSignerBuilder(signatureAlgorithm).build(privateKey);
|
|
||||||
} else {
|
} else {
|
||||||
|
return buildPivContentSigner(signPdfArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ContentSigner buildPivContentSigner(SignPdfArgs signPdfArgs) {
|
||||||
final String cardCliCmd = CardCliUtil.getCardCliCmd();
|
final String cardCliCmd = CardCliUtil.getCardCliCmd();
|
||||||
final PivMeta signPivMeta = CardCliUtil.getPivPublicKey(signPdfArgs.slot);
|
final PivMeta signPivMeta = CardCliUtil.getPivPublicKey(signPdfArgs.slot);
|
||||||
final CardCliPivCustomerSigner cardCliPivCustomerSigner = new CardCliPivCustomerSigner(
|
final CardCliPivCustomerSigner cardCliPivCustomerSigner = new CardCliPivCustomerSigner(
|
||||||
signPdfArgs.pin, signPdfArgs.slot, signPivMeta.getAlgorithm(), cardCliCmd);
|
signPdfArgs.pin, signPdfArgs.slot, signPivMeta.getAlgorithm(), cardCliCmd);
|
||||||
contentSigner = cardCliPivCustomerSigner.getContentSigner();
|
return cardCliPivCustomerSigner.getContentSigner();
|
||||||
}
|
}
|
||||||
|
|
||||||
final CreateSignature signing = new CreateSignature(certificateChain, contentSigner, signOptions);
|
private static ContentSigner buildPrivateKeyContentSigner(SignPdfArgs signPdfArgs, X509Certificate[] certificateChain) throws OperatorCreationException {
|
||||||
// signing.setExternalSigning(true);
|
final PrivateKey privateKey = KeyUtil.parsePrivateKeyPEM(
|
||||||
|
RFile.from(signPdfArgs.key).string());
|
||||||
final String tsaUrl = StringUtil.def(signOptions.getTsaUrl(), TSAClient.DEFAULT_TSA_URL);
|
final String signatureAlgorithm = SigUtils.getSignatureAlgorithm(certificateChain[0]);
|
||||||
signing.signDetached(inFile, outFile, tsaUrl);
|
return new JcaContentSignerBuilder(signatureAlgorithm).build(privateKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user