Init
This commit is contained in:
commit
09ff9f32d4
|
|
@ -0,0 +1,71 @@
|
|||
//
|
||||
// Created by cfif on 04.06.2024.
|
||||
//
|
||||
#include "Certs.h"
|
||||
#include "string.h"
|
||||
#include "AtGsmSimComA7600_SSL_LOAD_CA.h"
|
||||
|
||||
const char file_ca[] = "ca.pem";
|
||||
const char file_crt[] = "crt.pem";
|
||||
const char file_key[] = "key.pem";
|
||||
|
||||
void XfcProtMethodsInit_Certs(tCerts *certs) {
|
||||
tIsFind check;
|
||||
memset(&check, 0, sizeof(check));
|
||||
|
||||
if (osMutexAcquire(certs->gsmAt->access, 15000) == osOK) {
|
||||
check = AtGsmSimComA7600_SSL_CHECK_CA(certs->gsmAt,
|
||||
file_ca, strlen(file_ca),
|
||||
file_crt, strlen(file_crt),
|
||||
file_key, strlen(file_key), 2000);
|
||||
|
||||
osMutexRelease(certs->gsmAt->access);
|
||||
}
|
||||
|
||||
if ((!check.isFind1) || (!check.isFind2) || (!check.isFind3)) {
|
||||
|
||||
if (!check.isFind1) {
|
||||
String64Copy(&certs->cacert, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->cacert, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
if (!check.isFind2) {
|
||||
String64Copy(&certs->clientcert, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->clientcert, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
if (!check.isFind3) {
|
||||
String64Copy(&certs->clientkey, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->clientkey, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
String64Copy(&certs->cacert, "Загружен", sizeof("Загружен") - 1);
|
||||
String64Copy(&certs->clientcert, "Загружен", sizeof("Загружен") - 1);
|
||||
String64Copy(&certs->clientkey, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void XfcProtMethodsAdd_Certs(tXfcProtTable *protTab, tCerts *certs, tAtCmd *gsmAt) {
|
||||
certs->gsmAt = gsmAt;
|
||||
|
||||
if (gsmAt == NULL) {
|
||||
String64Copy(&certs->cacert, "Интерфейс не инициализирован", sizeof("Интерфейс не инициализирован") - 1);
|
||||
String64Copy(&certs->clientcert, "Интерфейс не инициализирован", sizeof("Интерфейс не инициализирован") - 1);
|
||||
String64Copy(&certs->clientkey, "Интерфейс не инициализирован", sizeof("Интерфейс не инициализирован") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->cacert, "Инициализация", sizeof("Инициализация") - 1);
|
||||
String64Copy(&certs->clientcert, "Инициализация", sizeof("Инициализация") - 1);
|
||||
String64Copy(&certs->clientkey, "Инициализация", sizeof("Инициализация") - 1);
|
||||
}
|
||||
|
||||
XfcProtTable_AddStatic(protTab, "GET_CERTS", XfcProtMethod_CertsGet, certs);
|
||||
XfcProtTable_AddStatic(protTab, "SET_CERTS", XfcProtMethod_CertsSet, certs);
|
||||
XfcProtTable_AddStatic(protTab, "DEL_CERTS", XfcProtMethod_CertsDel, certs);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
//
|
||||
// Created by cfif on 04.06.2024.
|
||||
//
|
||||
|
||||
#ifndef SMART_COMPONENTS_CERTS_H
|
||||
#define SMART_COMPONENTS_CERTS_H
|
||||
|
||||
#include "XfcProtProcessorUtilDefines.h"
|
||||
#include "AtCmdBase.h"
|
||||
#include "BaseTypes.h"
|
||||
|
||||
extern const char file_ca[];
|
||||
extern const char file_crt[];
|
||||
extern const char file_key[];
|
||||
|
||||
typedef enum {
|
||||
CERT_CA,
|
||||
CERT_CLIENT,
|
||||
CERT_CLIENT_KEY
|
||||
} tCertsType;
|
||||
|
||||
typedef struct {
|
||||
tAtCmd *gsmAt;
|
||||
tString64 cacert;
|
||||
tString64 clientcert;
|
||||
tString64 clientkey;
|
||||
} tCerts;
|
||||
|
||||
void XfcProtMethodsInit_Certs(tCerts *certs);
|
||||
void XfcProtMethodsAdd_Certs(tXfcProtTable *protTab, tCerts *certs, tAtCmd *gsmAt);
|
||||
uint8_t XfcProtMethod_CertsGet(tXfcArray *request, tXfcArray *response, tCerts *certs);
|
||||
uint8_t XfcProtMethod_CertsSet(tXfcArray *request, tXfcArray *response, tCerts *certs);
|
||||
uint8_t XfcProtMethod_CertsDel(tXfcArray *request, tXfcArray *response, tCerts *certs);
|
||||
|
||||
#endif //SMART_COMPONENTS_CERTS_H
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
//
|
||||
// Created by cfif on 05.06.2024.
|
||||
//
|
||||
#include "Certs.h"
|
||||
#include "string.h"
|
||||
#include "AtGsmSimComA7600_SSL_LOAD_CA.h"
|
||||
|
||||
uint8_t XfcProtMethod_CertsDel(tXfcArray *request, tXfcArray *response, tCerts *certs) {
|
||||
|
||||
if (certs->gsmAt == NULL)
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
|
||||
|
||||
tIsFind check;
|
||||
memset(&check, 0, sizeof(check));
|
||||
|
||||
if (osMutexAcquire(certs->gsmAt->access, 5000) == osOK) {
|
||||
AtGsmSimComA7600_SSL_DEL_CA(certs->gsmAt,
|
||||
file_ca, strlen(file_ca),
|
||||
file_crt, strlen(file_crt),
|
||||
file_key, strlen(file_key));
|
||||
|
||||
check = AtGsmSimComA7600_SSL_CHECK_CA(certs->gsmAt,
|
||||
file_ca, strlen(file_ca),
|
||||
file_crt, strlen(file_crt),
|
||||
file_key, strlen(file_key), 2000);
|
||||
osMutexRelease(certs->gsmAt->access);
|
||||
}
|
||||
|
||||
if (!check.isFind1) {
|
||||
String64Copy(&certs->cacert, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->cacert, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
if (!check.isFind2) {
|
||||
String64Copy(&certs->clientcert, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->clientcert, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
if (!check.isFind3) {
|
||||
String64Copy(&certs->clientkey, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->clientkey, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
//
|
||||
// Created by cfif on 03.06.2024.
|
||||
//
|
||||
#include "Certs.h"
|
||||
#include "string.h"
|
||||
|
||||
uint8_t
|
||||
XfcProtMethod_CertsGetVar(tXfcArray *request, tXfcArray *response, tCerts *certs, char *paramValueID_text, uint8_t paramValueID_len) {
|
||||
|
||||
// Текстовый вид ID
|
||||
XFC_CMD_TX_ADD_RAW(paramValueID_len);
|
||||
XFC_CMD_TX_ADD_ARR(paramValueID_text, paramValueID_len);
|
||||
|
||||
if (memcmp(paramValueID_text, "CACERT", sizeof("CACERT") - 1) == 0) {
|
||||
uint16_t len = certs->cacert.length;
|
||||
// Размер данных
|
||||
XFC_CMD_TX_ADD_RAW(len);
|
||||
// Данные
|
||||
XFC_CMD_TX_ADD_ARR(certs->cacert.data, len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (memcmp(paramValueID_text, "CLIENTCERT", sizeof("CLIENTCERT") - 1) == 0) {
|
||||
uint16_t len = certs->clientcert.length;
|
||||
// Размер данных
|
||||
XFC_CMD_TX_ADD_RAW(len);
|
||||
// Данные
|
||||
XFC_CMD_TX_ADD_ARR(certs->clientcert.data, len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (memcmp(paramValueID_text, "CLIENTKEY", sizeof("CLIENTKEY") - 1) == 0) {
|
||||
uint16_t len = certs->clientkey.length;
|
||||
// Размер данных
|
||||
XFC_CMD_TX_ADD_RAW(len);
|
||||
// Данные
|
||||
XFC_CMD_TX_ADD_ARR(certs->clientkey.data, len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t XfcProtMethod_CertsGet(tXfcArray *request, tXfcArray *response, tCerts *certs) {
|
||||
|
||||
// Чтение всех параметров
|
||||
if (XfcArrayGetDataSize(request) == 0) {
|
||||
|
||||
uint16_t paramCount = 3;
|
||||
// Количество параметров
|
||||
XFC_CMD_TX_ADD_RAW(paramCount);
|
||||
|
||||
uint8_t paramValueID_len;
|
||||
char paramValueID_text[20];
|
||||
|
||||
paramValueID_len = sizeof("CACERT") - 1;
|
||||
paramValueID_text[0] = '\0';
|
||||
strcat(paramValueID_text, "CACERT");
|
||||
if (!XfcProtMethod_CertsGetVar(request, response, certs, paramValueID_text, paramValueID_len)) {
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
|
||||
}
|
||||
|
||||
paramValueID_len = sizeof("CLIENTCERT") - 1;
|
||||
paramValueID_text[0] = '\0';
|
||||
strcat(paramValueID_text, "CLIENTCERT");
|
||||
if (!XfcProtMethod_CertsGetVar(request, response, certs, paramValueID_text, paramValueID_len)) {
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
|
||||
}
|
||||
|
||||
paramValueID_len = sizeof("CLIENTKEY") - 1;
|
||||
paramValueID_text[0] = '\0';
|
||||
strcat(paramValueID_text, "CLIENTKEY");
|
||||
if (!XfcProtMethod_CertsGetVar(request, response, certs, paramValueID_text, paramValueID_len)) {
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
|
||||
}
|
||||
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
|
||||
}
|
||||
|
||||
// Чтение избранных параметров
|
||||
uint16_t paramCount;
|
||||
XFC_CMD_RX_GET_RAW(paramCount);
|
||||
|
||||
// Количество параметров
|
||||
XFC_CMD_TX_ADD_RAW(paramCount);
|
||||
|
||||
for (uint16_t count = 0; count < paramCount; ++count) {
|
||||
// Получение текстового id параметра
|
||||
uint8_t paramValueID_len;
|
||||
XFC_CMD_RX_GET_RAW(paramValueID_len);
|
||||
char paramValueID_text[paramValueID_len];
|
||||
XFC_CMD_RX_GET_ARR(paramValueID_text, paramValueID_len);
|
||||
|
||||
if (!XfcProtMethod_CertsGetVar(request, response, certs, paramValueID_text, paramValueID_len)) {
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
//
|
||||
// Created by cfif on 03.06.2024.
|
||||
//
|
||||
#include "Certs.h"
|
||||
#include "string.h"
|
||||
#include "AtGsmSimComA7600_SSL_LOAD_CA.h"
|
||||
|
||||
uint16_t XfcArrayGetBytesFrontToSend(tCerts *certs, tCertsType certsType, tXfcArray *array, uint16_t length) {
|
||||
|
||||
uint16_t available = XfcArrayGetDataSize(array);
|
||||
|
||||
uint16_t toGet = available > length ? length : available;
|
||||
|
||||
|
||||
if (certsType == CERT_CA) {
|
||||
if (osMutexAcquire(certs->gsmAt->access, 5000) == osOK) {
|
||||
|
||||
AtGsmSimComA7600_SSL_DEL_ONE_CA(certs->gsmAt, file_ca, strlen(file_ca));
|
||||
|
||||
AtGsmSimComA7600_SSL_LOAD_CA(certs->gsmAt,
|
||||
file_ca, strlen(file_ca),
|
||||
array->data + array->begin, toGet, 2000);
|
||||
osMutexRelease(certs->gsmAt->access);
|
||||
}
|
||||
}
|
||||
|
||||
if (certsType == CERT_CLIENT) {
|
||||
if (osMutexAcquire(certs->gsmAt->access, 5000) == osOK) {
|
||||
|
||||
AtGsmSimComA7600_SSL_DEL_ONE_CA(certs->gsmAt, file_crt, strlen(file_crt));
|
||||
|
||||
AtGsmSimComA7600_SSL_LOAD_CA(certs->gsmAt,
|
||||
file_crt, strlen(file_crt),
|
||||
array->data + array->begin, toGet, 2000);
|
||||
osMutexRelease(certs->gsmAt->access);
|
||||
}
|
||||
}
|
||||
|
||||
if (certsType == CERT_CLIENT_KEY) {
|
||||
if (osMutexAcquire(certs->gsmAt->access, 5000) == osOK) {
|
||||
|
||||
AtGsmSimComA7600_SSL_DEL_ONE_CA(certs->gsmAt, file_key, strlen(file_key));
|
||||
|
||||
AtGsmSimComA7600_SSL_LOAD_CA(certs->gsmAt,
|
||||
file_key, strlen(file_key),
|
||||
array->data + array->begin, toGet, 2000);
|
||||
osMutexRelease(certs->gsmAt->access);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
array->begin += toGet;
|
||||
|
||||
XfcArraySpaceInv(array);
|
||||
|
||||
return toGet;
|
||||
}
|
||||
|
||||
static uint8_t XfcProtMethod_CertsSetChange(tXfcArray *request, tXfcArray *response, tCerts *certs) {
|
||||
|
||||
if (certs->gsmAt == NULL)
|
||||
return 0;
|
||||
|
||||
// Запись избранных параметров
|
||||
uint16_t paramCount = 0;
|
||||
uint8_t paramValueID_len = 0;
|
||||
uint8_t paramValueID_text[64];
|
||||
|
||||
XFC_CMD_RX_GET_RAW(paramCount);
|
||||
|
||||
if (!paramCount) {
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
|
||||
}
|
||||
|
||||
for (uint16_t count = 0; count < paramCount; ++count) {
|
||||
|
||||
// Получение текстового id параметра
|
||||
XFC_CMD_RX_GET_RAW(paramValueID_len);
|
||||
XFC_CMD_RX_GET_ARR(paramValueID_text, paramValueID_len);
|
||||
|
||||
uint16_t dataLen;
|
||||
XFC_CMD_RX_GET_RAW(dataLen);
|
||||
|
||||
if (memcmp(paramValueID_text, "CACERT", sizeof("CACERT") - 1) == 0) {
|
||||
uint16_t countLen = XfcArrayGetBytesFrontToSend(certs, CERT_CA, request, dataLen);
|
||||
if (countLen != dataLen)
|
||||
return XFC_TRANSPORT_PROTOCOL_REQUEST_UNEXPECTEDLY_SHORT;
|
||||
}
|
||||
|
||||
if (memcmp(paramValueID_text, "CLIENTCERT", sizeof("CLIENTCERT") - 1) == 0) {
|
||||
uint16_t countLen = XfcArrayGetBytesFrontToSend(certs, CERT_CLIENT, request, dataLen);
|
||||
if (countLen != dataLen)
|
||||
return XFC_TRANSPORT_PROTOCOL_REQUEST_UNEXPECTEDLY_SHORT;
|
||||
}
|
||||
|
||||
if (memcmp(paramValueID_text, "CLIENTKEY", sizeof("CLIENTKEY") - 1) == 0) {
|
||||
uint16_t countLen = XfcArrayGetBytesFrontToSend(certs, CERT_CLIENT_KEY, request, dataLen);
|
||||
if (countLen != dataLen)
|
||||
return XFC_TRANSPORT_PROTOCOL_REQUEST_UNEXPECTEDLY_SHORT;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
|
||||
}
|
||||
|
||||
|
||||
uint8_t XfcProtMethod_CertsSet(tXfcArray *request, tXfcArray *response, tCerts *certs) {
|
||||
|
||||
uint8_t result = XfcProtMethod_CertsSetChange(request, response, certs);
|
||||
|
||||
tIsFind check;
|
||||
memset(&check, 0, sizeof(check));
|
||||
|
||||
if (osMutexAcquire(certs->gsmAt->access, 5000) == osOK) {
|
||||
check = AtGsmSimComA7600_SSL_CHECK_CA(certs->gsmAt,
|
||||
file_ca, strlen(file_ca),
|
||||
file_crt, strlen(file_crt),
|
||||
file_key, strlen(file_key), 2000);
|
||||
osMutexRelease(certs->gsmAt->access);
|
||||
}
|
||||
|
||||
if (!check.isFind1) {
|
||||
String64Copy(&certs->cacert, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->cacert, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
if (!check.isFind2) {
|
||||
String64Copy(&certs->clientcert, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->clientcert, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
if (!check.isFind3) {
|
||||
String64Copy(&certs->clientkey, "Не загружен", sizeof("Не загружен") - 1);
|
||||
} else {
|
||||
String64Copy(&certs->clientkey, "Загружен", sizeof("Загружен") - 1);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"cmake": {
|
||||
"inc_dirs": [
|
||||
"./"
|
||||
],
|
||||
"srcs": [
|
||||
"./**.c"
|
||||
]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue