1

Ich versuche, Probe RSA/Dsa-Code mit Libtomcrypt ausführen.Laufzeitfehler: Segmentierung Fehler mit Libtommath und Libtomcrypt

Ich habe LibTomMath zuerst installiert als make install, als Ergebnis werden folgende Dateien erstellt.

/usr/lib/libtommath.a /usr/include/tommath.h

Danach installierte ich mit libtommath als externe Bibliothek libtomcrypt

CFLAGS="-DLTM_DESC -DUSE_LTM -I/usr/include" EXTRALIBS="/usr/lib/libtommath.a " make install 

Als Ergebnis folgende Datei erstellt

/usr/lib/libtomcrypt.a 

ich keine Fehler bekommen, während folgenden Befehl ausführen

CFLAGS="-DLTM_DESC -DUSE_LTM -I/usr/include" EXTRALIBS="/usr/lib/libtommath.a " make test 
mit erfolgreich zu kompilieren

Ich habe durch dieses Dokument libtomcrypt_installation und libtomcrypt_resolved gegangen

gcc -DLTM_DESC rsa_make_key_example.c -o rsa -ltomcrypt 
or 
gcc rsa_make_key_example.c -o rsa -ltomcrypt 

keine Kompilierungsfehler. Wenn ich jedoch versuche zu laufen, habe ich folgenden Fehler bekommen.

./rsa 

LTC_ARGCHK 'ltc_mp.name != NULL' failure on line 34 of file src/pk/rsa/rsa_make_key.c 
Aborted 

Hier ist meine Probe rsa Code

#include <tomcrypt.h> 
#include <stdio.h> 

int main(void) { 

# ifdef USE_LTM 
ltc_mp = ltm_desc; 
# elif defined (USE_TFM) 
ltc_mp = tfm_desc; 
# endif 


    rsa_key key; 

    int  err; 
    register_prng(&sprng_desc); 

    if ((err = rsa_make_key(NULL, find_prng("sprng"), 1024/8, 65537,&key)) != CRYPT_OK) { 
     printf("make_key error: %s\n", error_to_string(err)); 
     return -1; 
    } 
    /* use the key ... */ 
    return 0; 

} 

Hier ist meine Probe dsa Code

#include <tomcrypt.h> 
#include <stdio.h> 

int main(void) { 

# ifdef USE_LTM 
ltc_mp = ltm_desc; 
# elif defined (USE_TFM) 
ltc_mp = tfm_desc; 
# endif 


    int  err; 
    register_prng(&sprng_desc); 

    dsa_key key; 


    if ((err = dsa_make_key(NULL, find_prng("sprng"), 20, 128,&key)) != CRYPT_OK) { 
     printf("make_key error: %s\n", error_to_string(err)); 
     return -1; 
    } 
    /* use the key ... */ 
    return 0; 

} 

Hier ist, wie ich es erfolgreich kompiliert haben,

gcc dsa_make_key_example.c -o dsa -ltomcrypt 

Wenn ich versuche, den Code auszuführen, erhalte ich folgenden Fehler.

./dsa 
segmentation fault 

EDIT 1: ich weiter untersucht und fand den Grund für die Segmentierung Fehler

#ifdef LTC_MPI 
#include <stdarg.h> 

int ltc_init_multi(void **a, ...) 
{ 
... 
...  
if (mp_init(cur) != CRYPT_OK) ---> This line causes segmentation fault 

Wo bin ich Fehler zu machen? Wie kann dieses Problem gelöst werden, um diese Programme erfolgreich auszuführen?

Ich benutze Linux, Gcc. Jede Hilfe/Verbindung wird sehr geschätzt. Danke im Voraus.

+0

Versuchen Sie, '-DUUSE_TFM' zu Ihrem 'gcc' Befehl hinzuzufügen. – LPs

+0

wenn ich gcc -DUSE_TFM dsa_make_key_example.c-timcrypt -ltfm -o dsa verwende, gibt es Kompilierzeit Fehler. tfm_desc nicht deklariert. Dann rebuilt ich wieder libtomcrypt mit CFLAGS = "- DTFM_DESC -DUSE_TFM" EXTRALIBS = -ltfm machen -f makefile.shared installieren, immer noch bekomme ich den gleichen Fehler bei der Kompilierung mit -DUSE_TFM Option mit gcc. Ohne -DUSE_TFM, gcc dsa_make_key_example.c-timomcrypt -o dsa, kein Kompilierzeitfehler. – bholanath

+0

Kein Kompilierzeitfehler mit gcc -DLTM_LTM dsa_make_key_example.c -ltomcrypt -ltfm -o dsa, jedoch Laufzeitsegmentierungsfehler. – bholanath

Antwort

0

Es ist ein Jahr oder so seit dies gefragt wurde, aber ich habe eine Komponente einer Antwort und eine Abhilfe.

Der Grund mp_init schlägt fehl, dass der "math_descriptor" nicht initialisiert ist.mp_init ist ein definiert als

#define mp_init(a) ltc_mp.init(a) 

wo ltc_mp eine globale Struktur ist (vom Typ ltc_math_descriptor), die Zeiger auf die mathematischen Routinen hält.

Es gibt verschiedene Implementierungen der verfügbaren mathematischen Routinen, und ein Benutzer kann wählen, was er will. Aus irgendeinem Grund scheint es keine standardmäßige mathematische Implementierung für bestimmte Builds von libtomcrypt zu geben. Somit ist der init-Member von ltc_mp null und wir erhalten den SIGSEGV.

Hier ist eine manuelle Abhilfe:

Sie können Ihre gewünschte ltc_math_descriptor struct Verfügung, um Ihre main() Routine durch #define ing eines

  • LTM_DESC machen - integrierten mathematischen lib
  • TFM_DESC - - ein externes schnelles Mathe-Paket
  • GMP_DESC - vermutlich eine GNU MultiPrecision-Implementierung?

Bevor #include <tomcrypt.h> (oder mithilfe von -D in der Befehlszeile). Unabhängig davon, welche Sie sich entscheiden, ein entsprechendes Objekt deklariert werden:

extern const ltc_math_descriptor ltm_desc; 
extern const ltc_math_descriptor tfm_desc; 
extern const ltc_math_descriptor gmp_desc; 

, es zu benutzen, kopieren Sie sich manuell auf den globalen mathematischen Descriptor: zB in meinem Fall für die lokale Mathe imlpementation,

ltc_mp = ltm_desc; 

Jetzt funktioniert libtomcrypt.