我试图使用libtomcrypt运行示例rsa/dsa代码。
我首先将LibTomMath安装为make ,因此创建了以下文件。
/usr/lib/libtommath.a /usr/include/tommath.h
之后,我用LibTomMath作为外部库安装了libtomcrypt。
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 testgcc -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编辑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,我在使用linux。任何帮助/链接都将不胜感激。提前谢谢。
发布于 2017-11-21 22:56:35
自从被问到这个问题已经过去了一年多了,但我有一个答案的一部分,还有一个解决办法。
mp_init失败的原因是"math_descriptor“未初始化。mp_init被定义为
#define mp_init(a) ltc_mp.init(a)其中ltc_mp是一个全局结构(类型为ltc_math_descriptor),它包含指向数学例程的指针。
有几个实现的数学例程可用,用户可以选择他们想要的。不管出于什么原因,似乎没有为特定构建的libtomcrypt选择默认的数学实现。因此,init成员的ltc_mp是空的,我们得到了SIGSEGV。
这里有一个手动解决方案:
方法之一的ltc_math_descriptor例程可以使所需的main()结构可用。
在#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;要使用它,请手动将其复制到全局数学描述符:例如,在我的示例中,用于本地数学执行,
ltc_mp = ltm_desc;现在地窖起作用了。
https://stackoverflow.com/questions/37955209
复制相似问题