我正在尝试实现库中定义的函数,但我在使用它时遇到了问题。 This问题帮助我实现它,但我无法使用该功能。
这是typedef:
typedef void (*paillier_get_rand_t) ( void* buf, int len );
以下是我如何实施它:
void get_rand(void* buf, int len) {
buf = (void *)rand(); // I don't know if it works but isn't the problem
}
这里我是如何创建指向函数的指针并调用它。
int modulus = 4;
void* buf;
paillier_pubkey_t* pub;
paillier_prvkey_t* prv;
paillier_keygen(modulus, &pub, &prv, &get_rand);
问题1)我如何发送参数buf和len? 问题2)现在错误是不同的:
reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))' undefined
函数paillier_keygen
用于生成算法的相应密钥,函数get_rand
用于获取概率算法所需的随机性。
我实现了这个typedef,因为我需要这样做才能使用lib。
编辑:
我找到了一个已经定义的函数,我可以使用名为paillier_get_rand_devurandom
。
/ * 这些函数可以传递给paillier_keygen和 paillier_enc用于提供随机数的来源。该 首先从/ dev / random读取字节。在Linux上,这个设备 专门返回从环境噪声中收集的熵 因此,当有足够的时候经常阻塞。第二 从/ dev / urandom返回字节。在Linux上,此设备也会返回 环境噪声,但用伪随机数增加它 发电机在没有足够的时候可用。后者可能是 更好的选择,除非你有特别的理由相信它 不足。 * /
void paillier_get_rand_devurandom( void* buf, int len );
如果我像以前一样使用
paillier_keygen(modulus, &pub, &prv, paillier_get_rand_devurandom(buf, 4));
我得到error: invalid use of void expression
如果我这样使用:
paillier_keygen(modulus, &pub, &prv, &paillier_get_rand_devurandom);
我明白了:
undefined reference to `paillier_get_rand_devurandom(void*, int)'
undefined reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))'
包含图书馆。在这里,我添加了有关签名的更多信息:
/ * 使用随机性生成长度模数比特的密钥对 提供了get_rand函数。将为每个人分配空间 键,给定的指针将设置为指向新的 paillier_pubkey_t和paillier_prvkey_t结构。功能 paillier_get_rand_devrandom和paillier_get_rand_devurandom可能是 作为最后的论点传递。 * /
void paillier_keygen( int modulusbits,
paillier_pubkey_t** pub, paillier_prvkey_t** prv, paillier_get_rand_t get_rand );
/ * 这是用于获取的回调函数的类型 概率算法所需的随机性。功能 paillier_get_rand_devrandom和paillier_get_rand_devurandom (稍后记录)可以传递给任何需要a的库函数 paillier_get_rand_t,或者您可以实现自己的。如果你实施 你自己的这个功能,它应该填写" len"中的随机字节 阵列" buf"。 * /
typedef void (*paillier_get_rand_t) ( void* buf, int len );
答案 0 :(得分:2)
我在这里猜一点,因为你没有显示所有功能的原型(及其文档),但你几乎肯定想要这样:
paillier_pubkey_t* pub;
paillier_prvkey_t* prv;
paillier_keygen(modulus, &pub, &prv, &get_rand);
使用get_rand可能会执行以下操作:
void get_rand(void* buf, int len)
{
char* bytes = (char*)buf;
for (int i = 0; i != len; ++i) {
bytes[i] = rand() & 0xff;
}
}
答案 1 :(得分:2)
我找到了解决方案。首先,我像extern一样导入库,因为paillier.h是用C编写的,而我是用C ++编写的。
就像这样:
use #include <gmp.h>
extern "C"{
#include "paillier.h"
}
之后我还编译了-lpaillier
和-lgmp
。
最终的代码是:
paillier_pubkey_t* pub;
paillier_prvkey_t* prv;
paillier_keygen(1024, &pub, &prv, paillier_get_rand_devurandom);
无需定义任何其他功能。
答案 2 :(得分:1)
当您声明以下内容时,您正在取消引用并调用get_rand_function的值:
(*get_rand_funtion)(&buf, 4)
由于声明的返回类型为void,因此编译器会将表达式的结果解释为void,这不是函数参数的有效类型。如果您希望传递一个指向函数paillier_keygen的指针,那么@Cameron代码是正确的。至少在C99及更早版本中,您可能无法将值绑定到函数指针。