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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline compmaniak  
#1 Оставлено : 11 января 2013 г. 16:31:59(UTC)
compmaniak

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

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

Добрый день!

Есть функция на java, которая подписывает сообщение и выдает подпись в формате PKCS#7 detached. Обратить внимание здесь стоит на задание параметров ContentInfo (all) и Signed Data (cms).

Код:

public static List<byte[]> signByteArray(byte[] data) throws Exception {
    final String STR_CMS_OID_SIGNED = "1.2.840.113549.1.9.3";
    final String STR_CMS_OID_DATA = "1.2.840.113549.1.7.1";

    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(4);
    cms.digestAlgorithms = new DigestAlgorithmIdentifiers(new DigestAlgorithmIdentifier[]{new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value)});
    cms.encapContentInfo = new EncapsulatedContentInfo(
            new Asn1ObjectIdentifier(
                    new OID(STR_CMS_OID_DATA).value),
            null);
    X509Certificate cert = getCertificate();

    cms.certificates = new CertificateSet(1);
    cms.certificates.elements = new CertificateChoices[1];
    cms.certificates.elements[0] = new CertificateChoices();
    cms.certificates.elements[0].set_certificate(convertToAsn1Certificate(cert));

    byte[] sign;
    java.security.Signature signature = java.security.Signature.getInstance(JCP.GOST_EL_SIGN_NAME);
    signature.initSign(getPrivateKey());

    signature.update(data);
    sign = signature.sign();

    cms.signerInfos = new SignerInfos(1);
    cms.signerInfos.elements[0] = new SignerInfo();
    cms.signerInfos.elements[0].version = new CMSVersion(1); //because of issuerAndSerialNumber. More: rfc.3852, p.13.
    cms.signerInfos.elements[0].sid = new SignerIdentifier();
    final byte[] encodedName = cert.getIssuerX500Principal().getEncoded();
    final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
    final Name name = new Name();
    name.decode(nameBuf);

    final CertificateSerialNumber num = new CertificateSerialNumber(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_SIGN_OID).value);
    cms.signerInfos.elements[0].signatureAlgorithm.parameters = new Asn1Null();

    cms.signerInfos.elements[0].signature = new SignatureValue(sign);
    final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
    all.encode(asnBuf, true);
    List<byte[]> r= new LinkedList<byte[]>();
    r.add(data);
    r.add(asnBuf.getMsgCopy());
    return r;
}

На данный момент подписывание сообщения на javascript сделано на основе примера из документации (с небольшими изменениями).

Код:
function SignCreate(certSubjectName, dataToSign) {
    var oStore = CreateObject("CAPICOM.Store");
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
    CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

    var oCertificates = oStore.Certificates.Find(
    CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
    if (oCertificates.Count == 0) {
        alert("Certificate not found");
        return;
    }
    var oCertificate = oCertificates.Item(1);

    var oSigner = CreateObject("CAdESCOM.CPSigner");
    oSigner.Certificate = oCertificate;
    oSigner.TSAAddress = "http://cryptopro.ru/tsp/";
    
    var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
    oSignedData.Content = dataToSign;
    try {
        var sSignedMessage = oSignedData.SignCades(oSigner, CADES_BES, true);
    } catch (err) {
        alert("Failed to create signature. Error: " + GetErrorMessage(err));
        return;
    }

    oStore.Close();

    return sSignedMessage;
}


Таким образом при подписывании одинаковых данных одним и тем же сертификатом на сервере и в браузере получаются разные по формату подписи. Подскажите, как через CryptoPro browser plugin при подписывании задать параметры, аналогичные java-коду, а именно

all.contentType = new Asn1ObjectIdentifier(new OID(STR_CMS_OID_SIGNED ).value);
...
cms.version = new CMSVersion(4);
...
cms.encapContentInfo = new EncapsulatedContentInfo(new Asn1ObjectIdentifier(new OID(STR_CMS_OID_DATA).value),null);

Насколько я понимаю, копать нужно в сторону установки AuthenticatedAttributes2 и UnauthenticatedAttributes у объекта CPSigner, но на данный момент не получается разобраться, как с ними работать.

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