со стороны ПО создана пара ключей.
приватный ключ храниться в ПО а публичный передается в 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 не вызывает.
в соответствии с этим вопрос, что я упускаю ?