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