Сообщение
  • Пожалуйста, прежде пройдите авторизацию

Подпись и проверка данных IolaCOM и IolaJCE
(1 чел.) (1) гость
  • Страница:
  • 1

ТЕМА: Подпись и проверка данных IolaCOM и IolaJCE

Подпись и проверка данных IolaCOM и IolaJCE 5 года, 5 мес. назад #869

  • Layko
  • Новый участник
  • Постов: 2
  • Репутация: 0
Добрый день!
Мы используем версию SDK, полученную 24.02.2014.
У нас стоит следующая задача: подписывать простые данные и проверять их.
Для подписи мы используем сертификат в формате .p12. Для проверки у нас будет доступен только открытый ключ (сертификат в формате .cer).

Пример кода:
 
var iolaCOMSign = new IolaCOM2();

IOLACOM_OPERFLAGS flagsSign = 0;
flagsSign |= IOLACOM_OPERFLAGS.CF_IN_BASE64;
flagsSign |= IOLACOM_OPERFLAGS.CF_OUT_BASE64;
flagsSign |= IOLACOM_OPERFLAGS.CF_IN2_BASE64;
flagsSign |= IOLACOM_OPERFLAGS.SF_DETACHED_DATA;
flagsSign |= IOLACOM_OPERFLAGS.CF_DRAFT_DATA;
            
            
iolaCOMSign.KeyType = (int)IOLACOM_STORETYPE.ST_IOLA_PKCS12;
iolaCOMSign.CertType = (int)IOLACOM_STORETYPE.ST_IOLA_PKCS12;
iolaCOMSign.CertPath = "C:\\";
iolaCOMSign.KeyPath = "C:\\";
iolaCOMSign.SetPIN("123456");


var signedData = iolaCOMSign.SignData2("GOSTKZ_ba22f3a484dfa4c1547bbfedc908cd175e1e593e", (int)(flagsSign), "Data to sign", "");


var iolaCOMVerify = new IolaCOM2();

IOLACOM_OPERFLAGS flagsVerify = 0;
flagsVerify |= IOLACOM_OPERFLAGS.CF_IN_BASE64;
flagsVerify |= IOLACOM_OPERFLAGS.CF_OUT_BASE64;
flagsVerify |= IOLACOM_OPERFLAGS.CF_IN2_BASE64;
flagsVerify |= IOLACOM_OPERFLAGS.SF_DETACHED_DATA;
flagsVerify |= IOLACOM_OPERFLAGS.CF_DRAFT_DATA;


iolaCOMVerify.CertType = (int)IOLACOM_STORETYPE.ST_IOLA_FILE;
iolaCOMVerify.KeyType = (int)IOLACOM_STORETYPE.ST_IOLA_FILE;
iolaCOMVerify.CertPath = "C:\\GOSTKZ_ba22f3a484dfa4c1547bbfedc908cd175e1e593e.cer";
iolaCOMVerify.KeyPath = "C:\\GOSTKZ_ba22f3a484dfa4c1547bbfedc908cd175e1e593e.cer";
iolaCOMVerify.SetPIN("");
            

var verifyResult = iolaCOMVerify.VerifyData2("GOSTKZ_ba22f3a484dfa4c1547bbfedc908cd175e1e593e", (int)(flagsVerify), "Data to sign", signedData);


На проверке подписанных данных вываливается ошибка: Verify signature - verifying signature error.
Метод GetLastErrorString() возвращает то же самое сообщение, код ошибки - 30.
Может есть какие-либо ошибки в коде?
В функции VerifyData2 указывал keyUID и не указывал, разницы никакой. Также поигрался с флагами для функции проверки - та же самая ошибка. Также указывал различные флаги. Подпись данных проходит только в случае если результат выполнения функции SignData2() будет содержать в себе сертификат, но для нас это не подходит.
Тем более, что данные, подписанные IolaCOM могут быть проверены на java-версии Iola. Для Java версии Iola реализована подпись и проверка данных и все работает отлично. Но подпись, сформированная на IolaCOM, не проходит проверку на java.

Сертифкаты использовались тестовые из последней версии SDK, которую получили от вас (приложил к письму)

Re: Подпись и проверка данных IolaCOM и IolaJCE 5 года, 5 мес. назад #874

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день.

Если у вас одна подпись, то можно не устанавливать значение SignerID. Тем более оно у вас не верное.
SignerID можно получить вызвав метод GetKeyUids. Пример на Delphi имеется в SDK.
Входные данные при подписывании у вас "Data to sign". Флаг CF_IN_BASE64 не устанавливаете. Его ставите, только если у вас входные данные в кодировке BASE64. Аналогично при проверке.
Модератор

Re: Подпись и проверка данных IolaCOM и IolaJCE 5 года, 5 мес. назад #875

  • Layko
  • Новый участник
  • Постов: 2
  • Репутация: 0
Применил ваши рекомендации, результат тот же самый.


            var iolaCOMSign = new IolaCOM2();

            IOLACOM_OPERFLAGS flagsSign = 0;
            flagsSign |= IOLACOM_OPERFLAGS.CF_DRAFT_DATA;
            
            
            iolaCOMSign.KeyType = (int)IOLACOM_STORETYPE.ST_IOLA_PKCS12;
            iolaCOMSign.CertType = (int)IOLACOM_STORETYPE.ST_IOLA_PKCS12;
            iolaCOMSign.CertPath = "C:\\";
            iolaCOMSign.KeyPath = "C:\\";
            iolaCOMSign.SetPIN("123456");


            var selectedKey = "";
            var keys = iolaCOMSign.GetKeyUids();
            if (keys.Length > 0)
            {
                var parsedKeys = keys.Split(new [] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries);

                if (parsedKeys.Length > 0)
                {
                    selectedKey = parsedKeys.FirstOrDefault();
                }
            }
                 

            if (string.IsNullOrEmpty(selectedKey))
            {
                return;
            }


            string dataToSign = "Data to sign";
            var signedData = iolaCOMSign.SignData2(selectedKey, (int)(flagsSign), dataToSign, null);



            var iolaCOMVerify = new IolaCOM2();

            var flagsVerify = IOLACOM_OPERFLAGS.CF_DRAFT_DATA;


            iolaCOMVerify.CertType = (int)IOLACOM_STORETYPE.ST_IOLA_FILE;
            iolaCOMVerify.KeyType = (int)IOLACOM_STORETYPE.ST_IOLA_PKCS12;
            iolaCOMVerify.CertPath = "C:\\GOSTKZ_ba22f3a484dfa4c1547bbfedc908cd175e1e593e.cer";
            iolaCOMVerify.KeyPath = "C:\\";
            

            try
            {
                var verifyResult = iolaCOMVerify.VerifyData2("", (int)(flagsVerify), dataToSign, signedData);
            }
            catch(Exception exception)
            {
                var errorMessage = iolaCOMVerify.GetLastErrorString();
                var errorCode = iolaCOMVerify.GetLastError();
            }
  • Страница:
  • 1
FaLang translation system by Faboba