首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时错误:用libtommath和libtomcrypt分割错误

运行时错误:用libtommath和libtomcrypt分割错误
EN

Stack Overflow用户
提问于 2016-06-21 21:52:36
回答 1查看 1.7K关注 0票数 3

我试图使用libtomcrypt运行示例rsa/dsa代码。

我首先将LibTomMath安装为make ,因此创建了以下文件。

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

之后,我用LibTomMath作为外部库安装了libtomcrypt。

代码语言:javascript
复制
CFLAGS="-DLTM_DESC -DUSE_LTM -I/usr/include" EXTRALIBS="/usr/lib/libtommath.a " make install

因此,创建了以下文件

代码语言:javascript
复制
/usr/lib/libtomcrypt.a

运行以下命令时没有收到任何错误

代码语言:javascript
复制
CFLAGS="-DLTM_DESC -DUSE_LTM -I/usr/include" EXTRALIBS="/usr/lib/libtommath.a " make test

我已经通过这个文档安装已解决成功地编译了

代码语言:javascript
复制
gcc -DLTM_DESC rsa_make_key_example.c -o rsa -ltomcrypt 
or
gcc rsa_make_key_example.c -o rsa -ltomcrypt 

没有编译错误。然而,当我试图运行时,我得到了以下错误.

代码语言:javascript
复制
 ./rsa

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

这里是我的示例rsa代码

代码语言:javascript
复制
#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代码样本

代码语言:javascript
复制
#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;

} 

以下是我如何成功地编译它,

代码语言:javascript
复制
gcc dsa_make_key_example.c -o dsa -ltomcrypt 

当我试图运行代码时,我会得到以下错误。

代码语言:javascript
复制
./dsa
segmentation fault

编辑1:我进一步调查并发现了分割错误的原因

代码语言:javascript
复制
#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。任何帮助/链接都将不胜感激。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-11-21 22:56:35

自从被问到这个问题已经过去了一年多了,但我有一个答案的一部分,还有一个解决办法。

mp_init失败的原因是"math_descriptor“未初始化。mp_init被定义为

代码语言:javascript
复制
#define mp_init(a) ltc_mp.init(a)

其中ltc_mp是一个全局结构(类型为ltc_math_descriptor),它包含指向数学例程的指针。

有几个实现的数学例程可用,用户可以选择他们想要的。不管出于什么原因,似乎没有为特定构建的libtomcrypt选择默认的数学实现。因此,init成员的ltc_mp是空的,我们得到了SIGSEGV。

这里有一个手动解决方案:

方法之一的ltc_math_descriptor例程可以使所需的main()结构可用。

  • LTM_DESC -内置的数学库
  • TFM_DESC --一个外部快速数学软件包
  • GMP_DESC --想必是一个GNU MultiPrecision实现?

#include <tomcrypt.h>之前(或者在命令行上使用-D )。无论您选择哪一个,都会声明一个相应的对象:

代码语言:javascript
复制
extern const ltc_math_descriptor ltm_desc;
extern const ltc_math_descriptor tfm_desc;
extern const ltc_math_descriptor gmp_desc;

要使用它,请手动将其复制到全局数学描述符:例如,在我的示例中,用于本地数学执行,

代码语言:javascript
复制
ltc_mp = ltm_desc;

现在地窖起作用了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37955209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档