Статус: Новичок
Группы: Участники
Зарегистрирован: 08.11.2021(UTC) Сообщений: 1 Откуда: Москва
|
Здравствуйте! У меня вопрос по поводу создания PAdES подписи со штампом времени. В примерах samples-sources и на форуме нашёл только примеры кода для создания подписи без штампа времени, ниже представлен работающий код создания подписи PAdES-BES на itextpdf_patched-5.5.5-2. Как можно поправить этот код или нужно что-то другое использовать? Код:
KeyStore hdImageStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
hdImageStore.load(null, null);
PrivateKey privateKey = (PrivateKey) hdImageStore.getKey(alias, password.toCharArray());
PdfReader reader = new PdfReader(dataPDF);
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
PdfStamper stp = PdfStamper.createSignature(reader, signatureStream, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
Certificate[] chainArray = hdImageStore.getCertificateChain(alias);
sap.setCertificate(chainArray[0]);
PdfSignature dic = new PdfSignature(PdfName.ADOBE_CryptoProPDF, PdfName.ETSI_CADES_DETACHED);
dic.setReason(sap.getReason());
dic.setLocation(sap.getLocation());
dic.setSignatureCreator(sap.getSignatureCreator());
dic.setContact(sap.getContact());
dic.setDate(new PdfDate(sap.getSignDate())); // time-stamp will over-rule this
sap.setCryptoDictionary(dic);
int estimatedSize = 8192;
HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
exc.put(PdfName.CONTENTS, estimatedSize * 2 + 2);
sap.preClose(exc);
String pubKeyAlg = chainArray[0].getPublicKey().getAlgorithm();
String digestOid = AlgorithmUtility.keyAlgToDigestOid(pubKeyAlg);
InputStream data = sap.getRangeStream();
MessageDigest md = MessageDigest.getInstance(digestOid);
byte hash[] = DigestAlgorithms.digest(data, md);
String digestAlgorithmName = md.getAlgorithm();
PdfPKCS7 sgn = new PdfPKCS7(privateKey, chainArray, digestAlgorithmName, JCP.PROVIDER_NAME,
new BouncyCastleDigest(), false);
Calendar cal = Calendar.getInstance();
byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, cal,
null, null, MakeSignature.CryptoStandard.CADES);
sgn.update(sh, 0, sh.length);
byte[] encodedSig = sgn.getEncodedPKCS7(hash, cal, null, null, null,
MakeSignature.CryptoStandard.CADES);
if (estimatedSize < encodedSig.length) {
throw new IOException("Not enough space");
} // if
byte[] paddedSig = new byte[estimatedSize];
System.arraycopy(encodedSig, 0, paddedSig, 0, encodedSig.length);
PdfDictionary dic2 = new PdfDictionary();
dic2.put(PdfName.CONTENTS, new PdfString(paddedSig).setHexWriting(true));
sap.close(dic2);
stp.close();
reader.close();
return signatureStream.toByteArray();
|