Hello,
It is not working for me.
I will give detail information.
public byte[] sign(String message, PrivateKey[] keys, Certificate[] certs) throws Exception {
byte[] data = message.getBytes();
//create CMS
final ContentInfo all = new ContentInfo();
all.contentType = new Asn1ObjectIdentifier(
new OID(STR_CMS_OID_SIGNED).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(digestOid).value);
a.parameters = new Asn1Null();
cms.digestAlgorithms.elements[0] = a;
cms.encapContentInfo =
new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
new OID(STR_CMS_OID_DATA).value),
new Asn1OctetString(data));
// certificates
final int nCerts = certs.length;
cms.certificates = new CertificateSet(nCerts);
cms.certificates.elements = new CertificateChoices[nCerts];
for (int i = 0; i < cms.certificates.elements.length; i++) {
final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate certificate =
new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
final Asn1BerDecodeBuffer decodeBuffer =
new Asn1BerDecodeBuffer(certs[i].getEncoded());
certificate.decode(decodeBuffer);
cms.certificates.elements[i] = new CertificateChoices();
cms.certificates.elements[i].set_certificate(certificate);
} // for
// Signature.getInstance
final Signature signature = Signature.getInstance(signAlgorithm, "JCP");
byte[] sign;
// signer infos
final int nSign = keys.length;
cms.signerInfos = new SignerInfos(nSign);
for (int i = 0; i < cms.signerInfos.elements.length; i++) {
signature.initSign(keys[i]);
signature.update(data);
sign = signature.sign();
cms.signerInfos.elements[i] = new SignerInfo();
cms.signerInfos.elements[i].version = new CMSVersion(1);
cms.signerInfos.elements[i].sid = new SignerIdentifier();
final byte[] encodedName = ((X509Certificate) certs[i])
.getIssuerX500Principal().getEncoded();
final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
final Name name = new Name();
name.decode(nameBuf);
final CertificateSerialNumber num = new CertificateSerialNumber(
((X509Certificate) certs[i]).getSerialNumber());
cms.signerInfos.elements[i].sid.set_issuerAndSerialNumber(
new IssuerAndSerialNumber(name, num));
cms.signerInfos.elements[i].digestAlgorithm =
new DigestAlgorithmIdentifier(new OID(digestOid).value);
cms.signerInfos.elements[i].digestAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[i].signatureAlgorithm =
new SignatureAlgorithmIdentifier(new OID(signOid).value);
cms.signerInfos.elements[i].signatureAlgorithm.parameters =
new Asn1Null();
cms.signerInfos.elements[i].signature = new SignatureValue(sign);
}
// encode
final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
all.encode(asnBuf, true);
return asnBuf.getMsgCopy();
}
sample data:
message =
ИНН ,Причина вывода,Дата из оборота,Тип первичного документа,Номер документа,Дата первичного ,Наименование первичного документа,Регистрационный ККТ,Версия
123,"Продажа, дистанционный",,,,,,,
Параметры товаров,,,,,,,
КИ,Цена за единицу,Дата из оборота,Номер документа,первичного документа,Наименование документа,
123,00.00,,,,,
Отредактировано пользователем 29 июля 2020 г. 13:28:40(UTC)
| Причина: Не указана