feat: reflect code

This commit is contained in:
2023-10-31 07:25:00 +08:00
parent 1be37612fd
commit d9c8becff0

View File

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