Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий Троицкий  
#1 Оставлено : 8 ноября 2021 г. 16:52:36(UTC)
Дмитрий Троицкий

Статус: Новичок

Группы: Участники
Зарегистрирован: 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();
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.