Функция Typedef с указателем void *

Я пытаюсь реализовать функцию, определенную в библиотеке, но у меня возникают проблемы с ее использованием. Этот вопрос помог мне реализовать его, но я не мог использовать эту функцию.

Вот тип определения:

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 (документированные позже) могут быть переданы любой библиотечной функции, для которой требуется paillier_get_rand_t, или вы можете реализовать свою собственную. Если вы реализуете свою собственную такую ​​функцию, она должна заполнить случайные байты len в массиве buf. */

typedef void (*paillier_get_rand_t) ( void* buf, int len );

3 ответа

Решение

Я нашел решение. Прежде всего я импортирую библиотеку как 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);

Нет необходимости определять какие-либо дополнительные функции.

Я предполагаю немного здесь, потому что вы не показываете прототип всех функций (и их документацию), но вы почти наверняка захотите это:

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;
    }
}

Вы разыменовываете и вызываете значение get_rand_function, когда утверждаете следующее:

(*get_rand_funtion)(&buf, 4)

Поскольку объявленный тип возвращаемого значения void, компилятор интерпретирует результат выражения как void, который не является допустимым типом для параметра функции. Если вы хотите передать указатель на функцию paillier_keygen, тогда код @Cameron правильный. По крайней мере, в C99 и ранее вы не можете привязывать значения к указателю на функцию.

Другие вопросы по тегам