This commit is contained in:
cfif 2025-06-02 14:32:56 +03:00
commit 09ff9f32d4
6 changed files with 410 additions and 0 deletions

71
Certs.c Normal file
View File

@ -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);
}

35
Certs.h Normal file
View File

@ -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

48
CertsDel.c Normal file
View File

@ -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;
}

104
CertsGet.c Normal file
View File

@ -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;
}

142
CertsSet.c Normal file
View File

@ -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;
}

10
modular.json Normal file
View File

@ -0,0 +1,10 @@
{
"cmake": {
"inc_dirs": [
"./"
],
"srcs": [
"./**.c"
]
}
}