Статус: Новичок
Группы: Участники
Зарегистрирован: 02.02.2011(UTC) Сообщений: 6 Откуда: СПб
|
Мой рецепт без правки iText: main: Код:
PrivateKey key = (PrivateKey) ks.getKey(_alias, pw);
PdfReader reader = new PdfReader(_pdfFile.getCanonicalPath());
File temp = File.createTempFile("signed", ".pdf");
FileOutputStream fout = new FileOutputStream(temp);
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
// Подготовка ПДФ документа
PdfSignatureAppearance sap = stp.getSignatureAppearance();
// sap.setVisibleSignature(new Rectangle(72, 732, 144, 780), 1, null);
sap.setSignDate(new GregorianCalendar());
sap.setCrypto(null, ks.getCertificateChain(_alias), null, null);
sap.setAcro6Layers(true);
sap.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);
PdfSignature dic;
dic = new PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
dic.setDate(new PdfDate(sap.getSignDate()));
dic.setName(PdfPKCS7.getSubjectFields(xcert).getField("CN"));
sap.setCryptoDictionary(dic);
int csize = 4000;
HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
exc.put(PdfName.CONTENTS, new Integer(csize * 2 + 2));
sap.preClose(exc);
// подписание
byte[] data = CMSSign(IOUtils.toByteArray(sap.getRangeStream()), key, xcert, true);
byte[] outc = new byte[csize];
PdfDictionary dic2 = new PdfDictionary();
System.arraycopy(data, 0, outc, 0, data.length);
dic2.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true));
sap.close(dic2);
fout.close();
result = IOUtils.toByteArray(new FileInputStream(temp));
temp.delete();
CMSSign: Код:
public static byte[] CMSSign(byte[] data, PrivateKey key, Certificate cert,
boolean detached)
throws Exception {
// sign
final Signature signature =
Signature.getInstance(JCP.GOST_EL_SIGN_NAME);
signature.initSign(key);
signature.update(data);
final byte[] sign = signature.sign();
// create cms format
return createCMS(data, sign, cert, detached);
}
createCMS: Код:
public static byte[] createCMS(byte[] buffer, byte[] sign, Certificate cert,
boolean detached)
throws Exception {
final ContentInfo all = new ContentInfo();
all.contentType = new Asn1ObjectIdentifier(
new OID("1.2.840.113549.1.7.2").value);
final SignedData cms = new SignedData();
all.content = cms;
cms.version = new CMSVersion(1);
// digest
cms.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(
new OID(JCP.GOST_DIGEST_OID).value);
a.parameters = new Asn1Null();
cms.digestAlgorithms.elements[0] = a;
if (detached) {
cms.encapContentInfo = new EncapsulatedContentInfo(
new Asn1ObjectIdentifier(
new OID("1.2.840.113549.1.7.1").value), null);
} else {
cms.encapContentInfo =
new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
new OID("1.2.840.113549.1.7.1").value),
new Asn1OctetString(buffer));
}
// certificate
cms.certificates = new CertificateSet(1);
final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate certificate =
new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
final Asn1BerDecodeBuffer decodeBuffer =
new Asn1BerDecodeBuffer(cert.getEncoded());
certificate.decode(decodeBuffer);
cms.certificates.elements = new CertificateChoices[1];
cms.certificates.elements[0] = new CertificateChoices();
cms.certificates.elements[0].set_certificate(certificate);
// signer info
cms.signerInfos = new SignerInfos(1);
cms.signerInfos.elements[0] = new SignerInfo();
cms.signerInfos.elements[0].version = new CMSVersion(1);
cms.signerInfos.elements[0].sid = new SignerIdentifier();
final byte[] encodedName = ((X509Certificate) cert).getIssuerX500Principal().getEncoded();
final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
final Name name = new Name();
name.decode(nameBuf);
final CertificateSerialNumber num = new CertificateSerialNumber(
((X509Certificate) cert).getSerialNumber());
cms.signerInfos.elements[0].sid.set_issuerAndSerialNumber(
new IssuerAndSerialNumber(name, num));
cms.signerInfos.elements[0].digestAlgorithm =
new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value);
cms.signerInfos.elements[0].digestAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[0].signatureAlgorithm =
new SignatureAlgorithmIdentifier(new OID(JCP.GOST_EL_KEY_OID).value);
cms.signerInfos.elements[0].signatureAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[0].signature = new SignatureValue(sign);
// encode
final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
all.encode(asnBuf, true);
return asnBuf.getMsgCopy();
}
|