Eu tenho o seguinte código python que cria um dado DER "x25519_pubic_der".
#!/usr/bin/python3
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
x25519_key = x25519.X25519PrivateKey.generate()
x25519_public_der = x25519_key.public_key().public_bytes(Encoding.DER,
PublicFormat.SubjectPublicKeyInfo)
Tento decodificar esse dado de volta aos bits binários originais usando o código C, mas não funciona. Abaixo está um programa de teste (assumindo que os dados foram transferidos corretamente, também o comprimento).
const unsigned char* ptr = x25519_public_der;
ASN1_OCTET_STRING* octet_string = d2i_ASN1_OCTET_STRING(NULL, &ptr, x25519_public_der_len);
if (!octet_string) {
fprintf(stderr, "Error decoding DER data to binary bytes\n");
return 1;
}
Suspeito que PublicFormat.SubjectPublicKeyInfo possa adicionar alguma codificação extra ou não estou usando a função d2i_ correta (?), apenas um palpite...
Basicamente x25519_public_der contém 44 bytes e quero restaurá-lo para 32 bytes usando programação C. Acho que esta questão pode ser relevante: como passo uma chave pública x25519 de 44 bytes criada pelo openssl para o CryptoKit que requer um comprimento de chave de 32 bytes , mas não tenho experiência suficiente para implementá-la em C.
Como a chave pública bruta está localizada no final da chave SPKI/DER X25519, os últimos 32 bytes podem simplesmente ser usados.
Uma abordagem mais geral é importar a chave SPKI/DER como
EVP_PKEY
e extrair a chave bruta comEVP_PKEY_get_raw_public_key
, por exemplo, como do OpenSSL v3.0 (por uma questão de simplicidade, sem tratamento de exceções):Para fins de integridade:
OSSL_DECODER_CTX_new_for_pkey()
pode ser usado para importar chaves públicas (5º parâmetro:OSSL_KEYMGMT_SELECT_PUBLIC_KEY
) e privadas (5º parâmetro:OSSL_KEYMGMT_SELECT_KEYPAIR
) de diferentes tipos (4º parâmetro, por exemplo,"X25519"
) e codificações (2º parâmetro, por exemplo,"PEM"
ou"DER"
).Para chaves privadas,
EVP_PKEY_get_raw_private_key()
deve ser usado para exportar a chave bruta.Dependendo
OSSL_DECODER_from_...
, diferentes fontes de dados podem ser escolhidas.