RSA не работает

Вопросы по работе с электронными ключами SenseLock из операционных систем с использованием различных компиляторов

RSA не работает

Сообщение swd » Вс, 27 апр 2014 13:28

Пробую использовать внутренние RSA функции.
со стороны ПО создана пара ключей.
приватный ключ храниться в ПО а публичный передается в SL для шифрования данных сеансового ключа.
Код: Выделить всё
   IO_PKT_t input;
   unsigned long err = S4_SUCCESS, Len, i;
   COS_RSA_PUBLIC_KEY cos_pubkey;
   R_RSA_PUBLIC_KEY rsa_pubkey;
   COS_RSA_PRIVATE_KEY cos_privkey;
   R_RSA_PRIVATE_KEY rsa_privkey;

   R_GenerateRsaKeys(&rsa_pubkey, &rsa_privkey);
   X_Pub2Cos(&cos_pubkey, &rsa_pubkey);
   X_Pri2Cos(&cos_privkey, &rsa_privkey);

   memcpy(input.buff, &cos_pubkey, sizeof(COS_RSA_PUBLIC_KEY));
   Len = sizeof(COS_RSA_PUBLIC_KEY);
   input.len = Len;
   input.tag = SL_C_OPEN_SESSION;
        err = S4ExecuteEx(sl_ctx, (char*)"1000", S4_VM_EXE, (BYTE*)&input, sizeof(IO_PKT_t)- sizeof(input.buff) + input.len, (BYTE*)&input, sizeof(IO_PKT_t), &Len);
        RSAPrivateDecrypt(key, (unsigned int*)&Len, input.buff, 128, &rsa_privkey);

файлы RSA пары прилагаю.
Со стороны SL софт выглядит следующим образом:
Код: Выделить всё
#include "ses_v3.h"
#include "lmru.h"
#include "crypt2.h" // Senselock external Cryptography functions

DEFINE_AT(LM_STATUS_t, lic_stat, 0x0400, RAM_EXT);
DEFINE_AT(BYTE, exch_key[8], 0x040B, RAM_EXT);
#define SL_C_OPEN_SESSION 1
#define SL_C_CLOSE_SESSION 2
#define RSA_SESSION_PUBKEY_FID 0xFF04
IO_PKT_t *input = (IO_PKT_t*)pbInBuff;

void main()
{
   BYTE err = SES_SUCCESS;
   HANDLE pubkey_handle;
   switch (input->cmd)
   {
   case SL_C_OPEN_SESSION:
      _mem_set(input->buff, 0x00, sizeof(exch_key));
      err = _create(RSA_SESSION_PUBKEY_FID, sizeof(COS_RSA_PUBLIC_KEY) , SES_FILE_TYPE_RSA_PUB, CREATE_OPEN_ALWAYS,  &pubkey_handle );
      if(err != SES_SUCCESS) break;
      _write(pubkey_handle, 0, sizeof(COS_RSA_PUBLIC_KEY), input->buff);
      _close(pubkey_handle);
      _mem_set(input->buff, 0x12, sizeof(exch_key));
      //_rand( sizeof(exch_key), input->buff);
      _mem_copy(exch_key, input->buff,  sizeof(exch_key));
      _rsa_enc(RSA_CALC_PKCS, RSA_SESSION_PUBKEY_FID, sizeof(exch_key), input->buff);
      input->len = 128;  // set buffer lenght equal to data encrypted
      break;
   case SL_C_CLOSE_SESSION:
      _mem_set(exch_key, 0, sizeof(exch_key));
      input->len = 0;
      break;
   }
   input->cmd = err;
   _set_response(sizeof(IO_PKT_t) - sizeof(input->buff) + input->len, input);
   _exit();
}

проект был настроен в соответствии с изложенными в руководстве рекомендациями, SES51L.lib подключена к проекту.
при выполнении модуля через тестовую утилиту
Код: Выделить всё
01886E80E1D6E4194BB8FE3A15935110ED3B0017A5679217572F341261C39F436795F5600B8162AD14140EABDAB92C40B0BDF5CEEFC55A43783D6A2366F66BD96227465E79F5E3BAAE61CD3DBB83DC8A77768F810405ABFC1EAA1AC84BD9056BCE625E3B2FF317D2A51F9AB9CDB55BE4122E3D0F822CEE73C59DAFAE177A568C95F0B36F650400010001

в ответ имеем
Код: Выделить всё
00801212121212121212FE3A15935110ED3B0017A5679217572F341261C39F436795F5600B8162AD14140EABDAB92C40B0BDF5CEEFC55A43783D6A2366F66BD96227465E79F5E3BAAE61CD3DBB83DC8A77768F810405ABFC1EAA1AC84BD9056BCE625E3B2FF317D2A51F9AB9CDB55BE4122E3D0F822CEE73C59DAFAE177A568C95F0

т. е. никаких изменений в буфере функция _rsa_enc не вызывает.
в соответствии с этим вопрос, что я упускаю ?
Вложения
rsa_keys.rar
(1.49 Кб) Скачиваний: 531
swd
 
Сообщения: 14
Зарегистрирован: Вт, 06 авг 2013 11:57

Re: RSA не работает

Сообщение hijaq » Вт, 29 апр 2014 21:12

Возможно я что-то не понимаю, но в чём смысл каждый раз при открытии сессии записывать публичный ключ в senselock? Было бы логичнее прописывать его один раз при программировании ключа для отдачи клиенту. Опять же, всегда стоит помнить, что ячейки памяти в EEPROM имеют хоть и большой, но ограниченный ресурс на запись (около 100k циклов). Пришлите мне на почту полностью рабочий пример пожалуйста того, что не работает.
hijaq
Site Admin
 
Сообщения: 213
Зарегистрирован: Пт, 06 апр 2007 14:50

Re: RSA не работает

Сообщение hijaq » Вт, 29 апр 2014 23:43

Код: Выделить всё
case SL_C_OPEN_SESSION:
      _mem_set(input->buff, 0x00, sizeof(exch_key));


Вот в этой строке вы затираете первые 8 байт публичного ключа перед его записью в файл. Сильно подозреваю, что в этом всё дело.
hijaq
Site Admin
 
Сообщения: 213
Зарегистрирован: Пт, 06 апр 2007 14:50


Вернуться в Использование SenseLock

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron