added database
This commit is contained in:
1 parent
c4ea7a4293
commit
4f67cf11bd
30 files changed
+601
-267
No files matched your search
@@ -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';
|
||||
|
||||
|
||||
Reference in new issue
Block a user