added database

This commit is contained in:
wt committed 2025-08-22 17:46:38 +07:00
1 parent c4ea7a4293
commit 4f67cf11bd
30 files changed
+601 -267

No files matched your search

+26 -30
View File
@@ -21,7 +21,7 @@ static void base64_to_base64url(char *str) {
else if (*p == '/')
*p = '_';
}
remove_padding(str); // Удаляем паддинг
remove_padding(str); // Удаляем паддинг
}
// Преобразует Base64URL в Base64
@@ -57,28 +57,27 @@ char *jwt_base64url_encode(const unsigned char *input, const int length) {
BUF_MEM *bufferPtr;
BIO_get_mem_ptr(bio, &bufferPtr);
const auto result = (char *)malloc(bufferPtr->length + 1);
const auto result = (char *) malloc(bufferPtr->length + 1);
memcpy(result, bufferPtr->data, bufferPtr->length);
result[bufferPtr->length] = '\0';
BIO_free_all(bio);
base64_to_base64url(result); // Преобразование в Base64URL
base64_to_base64url(result); // Преобразование в Base64URL
return result;
}
// Base64URL декодирование
unsigned char *jwt_base64url_decode(const char *input, int input_len,
int *output_len) {
if (input_len == 0)
input_len = strlen(input);
if (input_len == 0) input_len = strlen(input);
// Создаем копию для преобразования
const auto input_copy = (char *)malloc(input_len + 1);
const auto input_copy = (char *) malloc(input_len + 1);
strncpy(input_copy, input, input_len);
input_copy[input_len] = '\0';
base64url_to_base64(input_copy); // Преобразование в Base64
base64url_to_base64(input_copy); // Преобразование в Base64
BIO *b64 = BIO_new(BIO_f_base64());
BIO *bio = BIO_new_mem_buf(input_copy, -1);
@@ -86,7 +85,7 @@ unsigned char *jwt_base64url_decode(const char *input, int input_len,
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
const auto buffer = (unsigned char *)malloc(input_len);
const auto buffer = (unsigned char *) malloc(input_len);
const int len = BIO_read(bio, buffer, input_len);
BIO_free_all(bio);
@@ -105,13 +104,13 @@ unsigned char *jwt_base64url_decode(const char *input, int input_len,
// Создание JWT токена
char *jwt_createJWT(const char *header_json, const char *payload_json,
const char *secret) {
char *encodedHeader = jwt_base64url_encode((const unsigned char *)header_json,
strlen(header_json));
char *encodedHeader = jwt_base64url_encode(
(const unsigned char *) header_json, strlen(header_json));
char *encodedPayload = jwt_base64url_encode(
(const unsigned char *)payload_json, strlen(payload_json));
(const unsigned char *) payload_json, strlen(payload_json));
char *unsignedToken =
(char *)malloc(strlen(encodedHeader) + strlen(encodedPayload) + 2);
(char *) malloc(strlen(encodedHeader) + strlen(encodedPayload) + 2);
sprintf(unsignedToken, "%s.%s", encodedHeader, encodedPayload);
unsigned int digest_len;
@@ -120,7 +119,7 @@ char *jwt_createJWT(const char *header_json, const char *payload_json,
char *encodedSignature = jwt_base64url_encode(digest, digest_len);
char *jwt =
(char *)malloc(strlen(unsignedToken) + strlen(encodedSignature) + 2);
(char *) malloc(strlen(unsignedToken) + strlen(encodedSignature) + 2);
sprintf(jwt, "%s.%s", unsignedToken, encodedSignature);
free(encodedHeader);
@@ -135,8 +134,8 @@ char *jwt_createJWT(const char *header_json, const char *payload_json,
// Генерация HMAC-SHA256
unsigned char *jwt_hmac_sha256(const char *key, int key_len, const char *data,
int data_len, unsigned int *digest_len) {
unsigned char *digest = (unsigned char *)malloc(EVP_MAX_MD_SIZE);
HMAC(EVP_sha256(), key, key_len, (const unsigned char *)data, data_len,
unsigned char *digest = (unsigned char *) malloc(EVP_MAX_MD_SIZE);
HMAC(EVP_sha256(), key, key_len, (const unsigned char *) data, data_len,
digest, digest_len);
return digest;
}
@@ -145,24 +144,23 @@ unsigned char *jwt_hmac_sha256(const char *key, int key_len, const char *data,
bool jwt_verifyJWT(const char *token, const char *secret) {
const char *dot1 = strchr(token, '.');
const char *dot2 = dot1 ? strchr(dot1 + 1, '.') : nullptr;
if (!dot1 || !dot2)
return false;
if (!dot1 || !dot2) return false;
size_t header_len = dot1 - token;
size_t payload_len = dot2 - dot1 - 1;
size_t sig_len = strlen(dot2 + 1);
char *header = (char *)malloc(header_len + 1);
char *header = (char *) malloc(header_len + 1);
strncpy(header, token, header_len);
header[header_len] = '\0';
char *payload = (char *)malloc(payload_len + 1);
char *payload = (char *) malloc(payload_len + 1);
strncpy(payload, dot1 + 1, payload_len);
payload[payload_len] = '\0';
char *signature = strndup(dot2 + 1, sig_len);
char *signing_input = (char *)malloc(header_len + payload_len + 2);
char *signing_input = (char *) malloc(header_len + payload_len + 2);
sprintf(signing_input, "%s.%s", header, payload);
int expected_sig_len;
@@ -183,7 +181,7 @@ bool jwt_verifyJWT(const char *token, const char *secret) {
int payload_bin_len;
unsigned char *payload_bin =
jwt_base64url_decode(payload, payload_len, &payload_bin_len);
char *payload_str = (char *)malloc(payload_bin_len + 1);
char *payload_str = (char *) malloc(payload_bin_len + 1);
memcpy(payload_str, payload_bin, payload_bin_len);
payload_str[payload_bin_len] = '\0';
@@ -192,7 +190,7 @@ bool jwt_verifyJWT(const char *token, const char *secret) {
cJSON *exp = cJSON_GetObjectItemCaseSensitive(json_payload, "exp");
if (cJSON_IsNumber(exp)) {
time_t now = time(nullptr);
if (now >= (time_t)exp->valuedouble) {
if (now >= (time_t) exp->valuedouble) {
exp_valid = false;
}
}
@@ -216,18 +214,17 @@ bool jwt_verifyJWT(const char *token, const char *secret) {
cJSON *jwt_get_payload(const char *token) {
const char *dot1 = strchr(token, '.');
const char *dot2 = dot1 ? strchr(dot1 + 1, '.') : nullptr;
if (!dot1 || !dot2)
return nullptr;
if (!dot1 || !dot2) return nullptr;
size_t payload_len = dot2 - dot1 - 1;
char *payload = (char *)malloc(payload_len + 1);
char *payload = (char *) malloc(payload_len + 1);
strncpy(payload, dot1 + 1, payload_len);
payload[payload_len] = '\0';
int payload_bin_len;
unsigned char *payload_bin =
jwt_base64url_decode(payload, payload_len, &payload_bin_len);
char *payload_str = (char *)malloc(payload_bin_len + 1);
char *payload_str = (char *) malloc(payload_bin_len + 1);
memcpy(payload_str, payload_bin, payload_bin_len);
payload_str[payload_bin_len] = '\0';
@@ -243,18 +240,17 @@ cJSON *jwt_get_payload(const char *token) {
// Получение header из токена
cJSON *jwt_get_header(const char *token) {
const char *dot1 = strchr(token, '.');
if (!dot1)
return nullptr;
if (!dot1) return nullptr;
size_t header_len = dot1 - token;
char *header = (char *)malloc(header_len + 1);
char *header = (char *) malloc(header_len + 1);
strncpy(header, token, header_len);
header[header_len] = '\0';
int header_bin_len;
unsigned char *header_bin =
jwt_base64url_decode(header, header_len, &header_bin_len);
char *header_str = (char *)malloc(header_bin_len + 1);
char *header_str = (char *) malloc(header_bin_len + 1);
memcpy(header_str, header_bin, header_bin_len);
header_str[header_bin_len] = '\0';