1

libtomcrypt를 사용하여 샘플 rsa/dsa 코드를 실행하려고합니다.런타임 오류 : libtommath 및 libtomcrypt로 인한 세그먼트 오류

LibTomMath를 먼저 설치하면 make install이 설치되어 결과적으로 다음 파일이 생성됩니다.

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

는 그 후 나는 다음과 같은 명령을 실행하는 동안 내가 어떤 오류가 발생하고 있지 않다

/usr/lib/libtomcrypt.a 

만든 다음 파일을 결과적으로 외부 라이브러리

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

로 LibTomMath와 libtomcrypt 설치

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

나는 성공적

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

에는 컴파일 오류을 사용하지 않고 컴파일이 문서 libtomcrypt_installationlibtomcrypt_resolved를 통과했다. 그러나 달리려고하면 다음과 같은 오류가 발생합니다. 여기

./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 

편집 1 : 내가 더 조사하고 세그먼트 오류

#ifdef LTC_MPI 
#include <stdarg.h> 

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

내가 만드는 중이라서 실수에 대한 이유를 발견 ? 이러한 프로그램을 성공적으로 실행하기 위해이 문제를 해결하는 방법은 무엇입니까?

저는 gcc를 사용하고 있습니다. 어떤 도움/링크도 높이 평가 될 것입니다. 미리 감사드립니다.

+0

'-DUSE_TFM'을 gcc 명령에 추가하십시오. – LPs

+0

gcc -DUSE_TFM dsa_make_key_example.c -ltomcrypt -ltfm -o dsa를 사용하면 컴파일 타임 오류가 발생합니다. tfm_desc이 선언되지 않았습니다. 그런 다음 CFLAGS = "- DTFM_DESC -DUSE_TFM"EXTRALIBS = -ltfm make -f makefile.shared를 사용하여 libtomcrypt를 다시 빌드합니다. gcc에서 -DUSE_TFM 옵션과 동일한 컴파일 타임 오류가 발생합니다. 그러나 -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

이 질문 이후로 1 년이 지났지 만 답변과 해결 방법의 일부 구성 요소가 있습니다.

이유는 mp_init이 실패하는 이유는 "math_descriptor"가 초기화되지 않기 때문입니다.mp_init

ltc_mp는 수학 루틴 포인터를 보유하고있다 ( ltc_math_descriptor 형의) 글로벌 구조체이다
#define mp_init(a) ltc_mp.init(a) 

로 정의된다.

사용할 수있는 수학 루틴은 여러 가지로 구현되어 있으며 사용자가 원하는 것을 선택할 수 있습니다. 어떤 이유로 든 libtomcrypt의 특정 빌드에 대해 선택된 기본 수학 구현이없는 것 같습니다. 따라서 구성원 인 ltc_mp은 null이며 SIGSEGV를 얻습니다.

여기

수동 해결 방법입니다 :

당신은 LTM_DESC

  • 중 하나 보내고 #define하여 main() 루틴을 사용할 수 원하는 ltc_math_descriptor 구조체를 만들 수 있습니다 - 내장 수학
  • TFM_DESC lib에는 - - 외부 빠른 수학 패키지
  • 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가 작동합니다.