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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline rgavrilov  
#1 Оставлено : 6 февраля 2015 г. 12:12:10(UTC)
rgavrilov

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

Группы: Участники
Зарегистрирован: 06.02.2015(UTC)
Сообщений: 2
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Добрый день!

Стоит задача в добавлении даты в формате FILETIME в подпись PKCS#7 как authenticated attribyte OID 1.2.643.5.1.5.2.3.1.

Форимрую подпись в CMS формате. Код взят из примеров JCP с небольшими доработками:
Цитата:

public static byte[] createCMS(byte[] buffer, byte[] sign, Certificate cert, boolean detached, byte[] unsignedAttr) throws Exception {
final ContentInfo all = new ContentInfo();
all.contentType = new Asn1ObjectIdentifier(new OID(CMStools.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(CMStools.DIGEST_OID).value);
a.parameters = new Asn1Null();
cms.digestAlgorithms.elements[0] = a;
if (detached)
cms.encapContentInfo = new EncapsulatedContentInfo(new Asn1ObjectIdentifier(new OID(CMStools.STR_CMS_OID_DATA).value), null);
else
cms.encapContentInfo = new EncapsulatedContentInfo(new Asn1ObjectIdentifier(new OID(CMStools.STR_CMS_OID_DATA).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(CMStools.DIGEST_OID).value);
cms.signerInfos.elements[0].digestAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[0].signatureAlgorithm = new SignatureAlgorithmIdentifier(new OID(CMStools.SIGN_OID).value);
cms.signerInfos.elements[0].signatureAlgorithm.parameters = new Asn1Null();

// добавление не подписываемого атрибута OID 1.2.643.5.1.5.2.3.1 в подпись.
if (unsignedAttr != null){
cms.signerInfos.elements[0].unsignedAttrs = new ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.UnsignedAttributes();
cms.signerInfos.elements[0].unsignedAttrs.elements = new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Attribute[1];
cms.signerInfos.elements[0].unsignedAttrs.elements[0] = new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Attribute();
cms.signerInfos.elements[0].unsignedAttrs.elements[0].type = new Asn1ObjectIdentifier(new OID("1.2.643.5.1.5.2.3.1").value);
cms.signerInfos.elements[0].unsignedAttrs.elements[0].values = new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Attribute_values();
cms.signerInfos.elements[0].unsignedAttrs.elements[0].values.elements = new Asn1OctetString[1];
cms.signerInfos.elements[0].unsignedAttrs.elements[0].values.elements[0] = new Asn1OctetString(unsignedAttr);
}

cms.signerInfos.elements[0].signature = new SignatureValue(sign);
// encode
final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
all.encode(asnBuf, true);
return asnBuf.getMsgCopy();
}


Значение параметра unsignedAttr содержит результат работы stringFileTimeToBytes. Функция преобразовывает дату в формат FILETIME и фозвращает массив байт(массив байт от лонга).
Цитата:
Получение byte[] из даты
public static byte[] stringFileTimeToBytes(String dateString, String dateFormat) throws ParseException{
DateFormat format = new SimpleDateFormat(dateFormat);
Date date = format.parse(dateString);
long fileTime = om.sun.jna.platform.win32.WinBase.FILETIME.dateToFileTime(date);
System.out.println(fileTime);
ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE);
buffer.putLong(0, fileTime);
return buffer.array();
}


Подпись формируется коррекно и проходит валидацию на портале ГосУслуг https://www.gosuslugi.ru/pgu/eds/ как отсоединенная ЭП в формате PKCS#7. Но наличие дополнительного атрибута OID 1.2.643.5.1.5.2.3.1. не распознается проверяющей строной(стронним контрагентом).

Подскажите пожалуйста:
1. Корректно ли я преобразую дату в формат FILETIME?
2. Корректно ли я добавляю атрибут OID 1.2.643.5.1.5.2.3.1 и его значение в подпись?
3. Если ли у кого-нибудь рабочий пример добавления не подписываемого атрибута в подпись PKCS#7?
4. Как проверить, что атрибут добавлен и в каком формате?

На данный момент я нахожусь в тупике. Буду очень благодарен за помощь.


Online Евгений Афанасьев  
#2 Оставлено : 6 февраля 2015 г. 13:24:30(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Посмотрите пример CMSSign в CMS_samples в samples-sources.jar, в нем есть формирование CMS с атрибутами, правда, подписанными, но разобраться можно. Дата записывается несколько иначе (выдержка):
Код:

cms.signerInfos.elements[i].signedAttrs.elements[k] =
new Attribute(new OID("1.2.840.113549.1.9.5").value,
new Attribute_values(1));

final Time time = new Time();

final Asn1UTCTime UTCTime = new Asn1UTCTime();
//текущая дата с календаря
UTCTime.setTime(Calendar.getInstance());
time.set_utcTime(UTCTime);

cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = time.getElement();


Производится помещение даты (время подписи) в подписанные атрибуты.
Проверить, думаю, можно с помощью csptest.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
rgavrilov оставлено 10.02.2015(UTC)
Offline rgavrilov  
#3 Оставлено : 10 февраля 2015 г. 10:14:55(UTC)
rgavrilov

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

Группы: Участники
Зарегистрирован: 06.02.2015(UTC)
Сообщений: 2
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Добрый день!

Спасибо за помощь. Атрибут распознается.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.