1

Я пытаюсь запустить образец кода rsa/dsa с помощью libtomcrypt.Ошибка выполнения: ошибка сегментации с libtommath и libtomcrypt

Я установил LibTomMath сначала как make install, в результате создаются следующие файлы.

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

После этого я установил libtomcrypt с LibTomMath в качестве внешней библиотеки

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

В результате следующий файл создается

/usr/lib/libtomcrypt.a 

Я не получаю сообщение об ошибке во время выполнения следующей команды

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

Я прошел через этот документ libtomcrypt_installation и libtomcrypt_resolved для успешной компиляции не используя

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

нет ошибки компиляции. Однако, когда я пытаюсь запустить, я получил следующую ошибку.

./rsa 

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

Вот мой пример кода RSA

#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; 

} 

Вот мой пример кода DSA

#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; 

} 

Вот как я скомпилировал его успешно,

gcc dsa_make_key_example.c -o dsa -ltomcrypt 

Когда я пытаюсь запустить код, я получаю следующую ошибку.

./dsa 
segmentation fault 

EDIT 1: я исследовал дальше и нашел причину ошибки сегментации

#ifdef LTC_MPI 
#include <stdarg.h> 

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

Где я делать ошибки? Как решить эту проблему для успешного запуска этих программ?

Я использую linux, gcc. Любая помощь/ссылка будут высоко оценены. Заранее спасибо.

+0

Попробуйте добавить '-DUSE_TFM' в команду' gcc'. – LPs

+0

, когда я использую gcc -DUSE_TFM dsa_make_key_example.c -ltomcrypt -ltfm -o dsa, он дает ошибку времени компиляции. tfm_desc не объявлен. Затем я снова перестраиваю libtomcrypt с помощью CFLAGS = "- DTFM_DESC -DUSE_TFM" EXTRALIBS = -ltfm make -f makefile.shared install, но я получаю такую ​​же ошибку времени компиляции с параметром -DUSE_TFM с gcc. Однако без -DUSE_TFM, gcc dsa_make_key_example.c -ltomcrypt -o dsa, нет ошибки времени компиляции. – bholanath

+0

Ошибка компиляции с gcc -DLTM_LTM dsa_make_key_example.c -ltomcrypt -ltfm -o dsa, однако ошибка сегментации во время выполнения. – bholanath

ответ

0

Прошло около года, так как это было задано, но у меня есть часть ответа и обходной путь.

Причина ошибки mp_init заключается в том, что «math_descriptor» неинициализирован.mp_init является определяется как

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

где ltc_mp глобальная структура (типа ltc_math_descriptor), который содержит указатели на математические процедуры.

Существует несколько реализаций доступных подпрограмм математики, и пользователь может выбрать, что они хотят. По какой-то причине, по-видимому, для некоторых сборников libtomcrypt не выбрана математическая реализация по умолчанию. Таким образом, член initltc_mp является нулевым, и мы получаем SIGSEGV.

Вот ручной обходной путь:

Вы можете сделать свою желаемую ltc_math_descriptor-структуру доступной для вашей main() рутины #define ING один из

  • LTM_DESC - встроенный в математике Lib
  • TFM_DESC - - внешний быстрый математический пакет
  • GMP_DESC - предположительно реализация GNU MultiPrecision?

До #include <tomcrypt.h> (или с использованием -D в командной строке). Какой бы вы ни выбрали, соответствующий объект будет объявлен:

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

Чтобы использовать его, вручную скопировать его в мировой математике дескриптора: Например, в моем случае, для местной математики imlpementation,

ltc_mp = ltm_desc; 

Теперь работает libtomcrypt.