Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Runtime error : Segmentation fault with libtommath and libtomcrypt

I am trying to run sample rsa/dsa code using libtomcrypt.

I have installed LibTomMath first as make install, as a result following files are created.

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

After that I installed libtomcrypt with LibTomMath as external library

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

As a result following file is created

/usr/lib/libtomcrypt.a

I am not getting any error while running following command

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

I have gone through this document libtomcrypt_installation and libtomcrypt_resolved to successfully compile using

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

no compile error. However when I try to run, I got following error.

 ./rsa

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

Here is my sample 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;

} 

Here is my sample 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;

} 

Here is how I have compiled it successfully,

gcc dsa_make_key_example.c -o dsa -ltomcrypt 

When I try to run the code , I am getting following error .

./dsa
segmentation fault

EDIT 1: I investigated further and found the reason for segmentation fault

#ifdef LTC_MPI
#include <stdarg.h>

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

Where am I making mistakes ? How to resolve this problem to run these programs successfully?

I am using linux , gcc. Any help/link will be highly appreciated. Thanks in advance.

like image 596
bholanath Avatar asked Oct 20 '25 04:10

bholanath


1 Answers

It's been a year or so since this was asked, but I have some component of an answer, and a workaround.

The reason mp_init fails is that the "math_descriptor" is uninitialized. mp_init is a defined as

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

where ltc_mp is a global struct (of type ltc_math_descriptor) that holds pointers to the math routines.

There are several implementations of the math routines available, and a user can choose which they want. For whatever reason, there does not seem to be a default math implementation chosen for certain builds of libtomcrypt. Thus, the init member of ltc_mp is null, and we get the SIGSEGV.

Here is a manual workaround:

You can make your desired ltc_math_descriptor struct available to your main() routine by #defineing one of

  • LTM_DESC -- built-in math lib
  • TFM_DESC -- an external fast math package
  • GMP_DESC -- presumably a GNU MultiPrecision implementation?

Before #include <tomcrypt.h> (or by using -D on the command-line). Whichever you choose, a corresponding object will be declared:

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

To use it, manually copy it to the global math descriptor: E.g., in my case, for the local math imlpementation,

ltc_mp = ltm_desc;

Now libtomcrypt works.

like image 175
lockcmpxchg8b Avatar answered Oct 22 '25 05:10

lockcmpxchg8b



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!