Mbedtls_rsa_rsassa_pkcs1_v15_sign Stack PulflowC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Mbedtls_rsa_rsassa_pkcs1_v15_sign Stack Pulflow

Сообщение Anonymous »

Я любитель, и это мое первое погружение в мир C ++ и встроенных систем. Я немного борюсь с Mbedtls. Это включает в себя SHA256 хэширование некоторых кодируемых объектов JSON BASE64 (header.claim), а затем RSASSA-PKCS1-V1_5-SIGN, подписывая это. Насколько я понимаю, я могу проанализировать закрытый ключ с помощью mbedtls_pk_parse_key, а затем использовать этот mbedtls_pk_context с mbedtls_rsa_rsassa_pkcs1_v15_sign, чтобы подписать хэш. MBEDTLS_RSA_RSASSA_PKCS1_V15_SIGN правильно, поскольку результирующая подпись BASE64 вытекает в качестве следующего в консоли. В то время как кодированные объекты JSON читаются. < /P>
encodedHeader: ewoJImFsZyI6CSJSUzI1NiIsCgkidHlwIjoJIkpXVCIKfQ==
encodedSignature: ������������������������������������������������������...
< /code>
Кроме того, по мере возвращения этот метод я получаю переполнение стека, которое я не уверен, откуда он поступает. < /p>
***ERROR*** A stack overflow in task main has been detected.

Backtrace:0x40081c0a:0x3ffb82700x40085a4d:0x3ffb8290 0x40088716:0x3ffb82b0 0x4008748f:0x3ffb8330 0x40085b4c:0x3ffb8350 0x40085afe:0x00000000 |
Вот мой код, любая справка была бы очень оценена. < /p>
// Encode Header
unsigned char encodedHeader[92];
size_t encodedHeaderSize;
const unsigned char* headerRecast = reinterpret_cast(cJSON_Print((const cJSON*) fHeader.toJSON()));
mbedtls_base64_encode(encodedHeader, 92, &encodedHeaderSize, headerRecast, strlen((const char *) headerRecast));
ESP_LOGI("encodedHeader", "%s", encodedHeader);

// Encode Claim
unsigned char encodedClaim[400];
size_t encodedClaimSize;
const unsigned char* claimRecast = reinterpret_cast(cJSON_Print((const cJSON*) fClaim.toJSON()));
mbedtls_base64_encode(encodedClaim, 400, &encodedClaimSize, claimRecast, strlen((const char *) claimRecast));
ESP_LOGI("encodedClaim", "%s", encodedClaim);

// Concat the header and claim together
std::string headerStr((const char*) encodedHeader);
std::string claimStr((const char*) encodedClaim);
std::string auth = headerStr + "." + claimStr;

// Hash the header.claim
const unsigned char* resultRecast = reinterpret_cast(auth.c_str());
mbedtls_sha256_context shaContext;
unsigned char outHash[32];
mbedtls_sha256_init(&shaContext);
mbedtls_sha256_starts(&shaContext, 0);
mbedtls_sha256_update(&shaContext, resultRecast, strlen((const char *) resultRecast));
mbedtls_sha256_finish(&shaContext, outHash);
mbedtls_sha256_free(&shaContext);
ESP_LOGI("outHash", "%s", outHash);

std::string shaStr;
for (int i=0; i
Если это помогает понять мою цель, вот доказательство концепции, которое я сделал в Python < /p>
import requests
from Crypto.Signature import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256
from base64 import urlsafe_b64encode, urlsafe_b64decode
import json
import time

now = int(time.time())
header = {"alg": "RS256", "typ": "JWT"}
claim = {
"iss": "something",
"scope": "something",
"aud": "https://oauth2.googleapis.com/token",
"exp": now + 3600,
"iat": now
}

key = "{}.{}".format(urlsafe_b64encode(json.dumps(header).encode()).decode(), urlsafe_b64encode(json.dumps(claim).encode()).decode())

with open('key.json', 'r') as f:
creds = json.load(f)

keyPub = RSA.importKey(creds.get('private_key'))
h = SHA256.new(key.encode())
signer = PKCS1_v1_5.new(keyPub)
signature = signer.sign(h)

key = "{}.{}".format(key, urlsafe_b64encode(signature).decode())
print(key)


Подробнее здесь: https://stackoverflow.com/questions/717 ... k-overflow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»