J'essaie de calculer la clé publique à partir d'un secret donné par openssl. Je reçois cette erreur:Erreur openssl définition incomplète de type 'struct ec_key_st'
main.c:27: error: incomplete definition of type 'struct ec_key_st'
printf("d: %s\n", BN_bn2hex(eckey->priv_key));
~~~~~^
Voici mon code:
#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/bn.h>
#include <openssl/obj_mac.h>
int main()
{
BN_CTX *ctx = BN_CTX_new();
EC_KEY *eckey = EC_KEY_new();
EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp256k1);
EC_KEY_set_group(eckey, group);
BIGNUM *prv = BN_new();
BN_hex2bn(&prv, "b14fac12b3fa7dd6f2562a18d554fcd6818137ebb7e0d119ab0776d6407664f9");
EC_KEY_set_private_key(eckey, prv);
EC_POINT *Q = EC_POINT_new(group);
EC_POINT_mul(group, Q, prv, NULL, NULL, ctx);
EC_KEY_set_public_key(eckey, Q);
if (EC_KEY_check_key(eckey))
printf("Key succesfully checked.\n");
printf("d: %s\n", BN_bn2hex(eckey->priv_key));
printf("X: %s\n", BN_bn2hex(&eckey->pub_key->X));
printf("Y: %s\n", BN_bn2hex(&eckey->pub_key->Y));
EC_GROUP_free (group); group = NULL;
EC_KEY_free (eckey); eckey = NULL;
return 0;
}
Quel est le problème avec le code ci-dessus? Si j'enlève les lignes printf, ça fonctionne bien. J'apprécierais que quelqu'un m'aide à me débarrasser de cette erreur.
Cette n'est pas la bonne façon de faire les choses. "ec_lcl.h" est un fichier d'en-tête interne qui ne fait pas partie de l'API publique. L'accès direct aux composants internes de la structure est susceptible de passer d'une version d'OpenSSL à une autre. Il existe des fonctions API publiques pour accéder à ces éléments, qui devraient être utilisées à la place. Voir la réponse de @bartonjs –
Est-ce vraiment "pas la bonne façon"? "pas correct" techniquement? socialement? Pourquoi? parce que d'autres personnes de l'ocd pourraient avoir mal à leurs sentiments? OpenSSL est une bibliothèque open source. Donc, si certaines personnes peuvent lire et comprendre ses internes, ils devraient avoir le droit de les utiliser comme ils l'entendent, du moins tant qu'ils ne s'attendent pas à ce que leur code fonctionne avec les changements futurs de cette bibliothèque. – hutheano
En utilisant ec_lcl.h vous devenez vulnérable aux problèmes où un champ est ajouté ou supprimé à une structure dans la prochaine mise à jour. Votre code pense qu'il est au décalage 16, son code pense qu'il est au décalage 24, et maintenant vous travaillez avec un champ autre que vous pensiez. Bien que cela soit vrai dans les en-têtes publics, aussi, un changement de structure publique brise tout le monde (leur bug) et un changement vers un privé ne vous casse que (votre bug). Donc, oui, c'est définitivement "pas la bonne façon". – bartonjs