commit 09ff9f32d4b594224ba25171b996fd66875820de Author: cfif Date: Mon Jun 2 14:32:56 2025 +0300 Init diff --git a/Certs.c b/Certs.c new file mode 100644 index 0000000..e32bc83 --- /dev/null +++ b/Certs.c @@ -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); +} + diff --git a/Certs.h b/Certs.h new file mode 100644 index 0000000..9435e72 --- /dev/null +++ b/Certs.h @@ -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 diff --git a/CertsDel.c b/CertsDel.c new file mode 100644 index 0000000..0b85993 --- /dev/null +++ b/CertsDel.c @@ -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; +} \ No newline at end of file diff --git a/CertsGet.c b/CertsGet.c new file mode 100644 index 0000000..6dfc33e --- /dev/null +++ b/CertsGet.c @@ -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; +} \ No newline at end of file diff --git a/CertsSet.c b/CertsSet.c new file mode 100644 index 0000000..54e8e9d --- /dev/null +++ b/CertsSet.c @@ -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; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..0dd1901 --- /dev/null +++ b/modular.json @@ -0,0 +1,10 @@ +{ + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file