Comprendre l'initialisation du moteur dans OpenSSL
Je vais essayer de mettre en place un test de base de l'algorithme HMAC-SHA-256 de hachage, mais je vais avoir des problèmes avec le moteur de l'installation. Idéalement, je voudrais configurer uniquement l'algorithme HMAC-SHA-algorithme, mais jusqu'à présent, je n'ai même pas eu le cas général où la charge de tous les algorithmes de travail. Actuellement, je reçois des erreurs de segmentation sur la ligne où j'essaie de définir la valeur par défaut digère.
Aussi, je suis régulièrement Java gars, alors n'hésitez pas à signaler toute erreur dans le code.
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
unsigned char* key = (unsigned char*) "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b";
unsigned char* data = (unsigned char*) "4869205468657265";
unsigned char* expected = (unsigned char*) "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7";
unsigned char* result;
HMAC_CTX* ctx;
ENGINE* e;
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
ENGINE_set_default_digests(e);
HMAC_CTX_init(ctx);
HMAC_Init_ex(ctx, key, 40, EVP_sha256(), e);
result = HMAC(NULL, NULL, 40, data, 16, NULL, NULL);
HMAC_CTX_cleanup(ctx);
ENGINE_finish(e);
ENGINE_free(e);
if (strcmp((char*) result, (char*) expected) == 0) {
printf("Test ok\n");
} else {
printf("Got %s instead of %s\n", result, expected);
}
}
EDIT: Le programme a évolué à la suite, mais je suis toujours segfaulting à HMAC_Init_ex
:
unsigned char* key = (unsigned char*) "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b";
unsigned char* data = (unsigned char*) "4869205468657265";
unsigned char* expected = (unsigned char*) "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7";
unsigned char* result;
unsigned int result_len = 64;
HMAC_CTX ctx;
ENGINE* e;
result = (unsigned char*) malloc(sizeof(char) * result_len);
e = (ENGINE*) ENGINE_new();
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
ENGINE_set_default_digests(e);
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, 16, EVP_sha256(), e);
HMAC_Update(&ctx, data, 40);
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);
ENGINE_finish(e);
ENGINE_free(e);
source d'informationauteur Fylke
Vous devez vous connecter pour publier un commentaire.
Le problème avec votre suggestion est, comme Martin l'a dit, que vous avez besoin de l'initialiser le MOTEUR. Le problème avec votre code a été modifié de ce que vous faisiez ENGINE_new, qui est de vous obtenir un tout nouveau MOTEUR de votre propre, vous devez alors fournir avec des méthodes de chiffrement, recueil des méthodes, etc. En fait, pour ce que vous voulez (et ce que tout le monde ou presque veut), tout en ignorant complètement tous les MOTEUR de choses est le bon choix.
Certains filiale de problèmes:
Le code suivant compile, travaille et réussit le test. C'est un peu différent de l'exemple de code que vous avez trouvé (car il utilise toujours l'individu HMAC_* fonctions utiles si vous voulez faire votre hachage peu à peu à l'aide de HMAC_Update):
Évidemment, ce n'est pas la réponse à votre question initiale sur la façon d'initialiser les Moteurs, mais il n'y a vraiment pas de bonne réponse à cela sans avoir plus de contexte, lequel s'avère ne pas être pertinents à votre situation...
D'accord, il s'avère que vous n'avez pas à utiliser un moteur mais j'avais mal compris exactement comment ne pas utiliser explicitement un moteur. J'ai aussi mal compris comment formater correctement les vecteurs de test. En fin de compte j'ai regardé hmactest.c, qui est assez bien fait tout ce que je veux faire, je ne comprenais pas le code.
La solution finale à ce que j'essayais de faire ressemble à ceci:
Mais depuis que je posais des questions à propos de quelque chose de totalement différent, je ne suis pas sûr de savoir quoi faire avec la question d'origine. Des Suggestions?
Il semble que rien n'est de l'allocation d'un moteur, de sorte que la première utilisation de
e
est segfaulting. Je pense que vous devez appelerENGINE *ENGINE_new(void)
premier.(Notez que j'ai utilisé OpenSSL, mais je n'ai pas utilisé le
ENGINE
fonctions avant.)Mise à jour: je ne suis pas vraiment heureux avec ma propre réponse (j'ai dû dash off pour le thé, avant). Afin de poursuivre mes notes sont:
J'ai eu un peu d'un coup d'oeil à la (longue) page de man pour la
ENGINE
fonctions, et je ne suis pas sûr que l'appelENGINE_new
est suffisant.Je n'avais pas remarqué que les appels à la
HMAC_CTX_*
fonctions prenaient un pointeur non initialisé, plutôt que d'un pointeur alloué à la structure.HMAC_CTX_init
vais essayer d'écrire à la mémoire pointée par sonctx
paramètre, ce qui permettra d'erreur de segmentation. Vous devez déclarer et utiliserctx
comme ceci:De cette façon, vous êtes l'allocation de la structure sur la pile, puis en passant un pointeur.
La
HMAC
fonction ne prend pas un pointeur vers unCTX
à tous, donc à part globale ou locale de thread de stockage, je ne suis pas sûr de ce que c'est la connexion à laCTX
est. Je pense que vous pouvez ignorer que, en appelantHMAC_Update
une ou plusieurs fois, suivi parHMAC_Final
pour obtenir le résultat. Vous auriez besoin d'allouer de l'espace pour cette raison, donc, quelque chose comme ce qui suit serait travailler pour que: