RAND_bytes не вызывается при установке RAND_set_rand_method ()? - PullRequest
0 голосов
/ 05 июля 2019

Несмотря на то, что мы установили currentMethod.bytes с локальной функцией для генерации случайных чисел, RAND_bytes не вызывается.После того, как мы установили RAND_set_rand_method(&cuurentMethod).

Здесь я прикрепил ссылку [https://github.com/openssl/openssl/blob/master/test/sm2_internal_test.c], которую я уже пробовал.

int main()
{
    unsigned char rand[16];
    int ret;
    RAND_METHOD *oldMethod,currentMethod,*temp;
    oldMethod = RAND_get_rand_method();/*getting default method*/
    currentMethod = *oldMethod;
    currentMethod.bytes = local_function_rand;

    if((ret = RAND_set_rand_method(&currentMethod))!= 1)
        return 0; 

   /* Now we are printing both address of local_function_method_rand() and 
   temp->bytes , those address are same after getting. */

   temp = RAND_get_rand_method();

   /* after we are comparing with RAND_SSLeay() function , to find default or not*/

   if((ret = RAND_bytes(rand,16)) != 1)
       return 0;
   return 1;
}

Ожидаемый результат - наша локальная функция должна вызываться.Кроме того, для вызова RAND_bytes() требуется ли установить режим fips в системе Linux?

1 Ответ

1 голос
/ 05 июля 2019

После очистки и минимизации вашей тестовой программы и заполнения недостающих частей:

#include <openssl/rand.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int local_function_rand(unsigned char *buf, int num) {
  printf("in local_function_rand(); requested %d bytes\n", num);
  memset(buf, 4, num); // RFC 1149.5 standard random number
  return 1;
}

int main(void) {
  unsigned char rand[16];
  RAND_METHOD currentMethod = {.bytes = local_function_rand};
  RAND_set_rand_method(&currentMethod);

  if (RAND_bytes(rand, sizeof rand) != 1) {
    return EXIT_FAILURE;
  }

  return 0;
}

и запуска ее (с OpenSSL 1.1.1):

$ gcc -Wall -Wextra rand.c -lcrypto
$ ./a.out
in local_function_rand(); requested 16 bytes

она работает какожидается;пользовательская функция вызывается RAND_bytes().Если вы получаете другие результаты из своего кода, возможно, проблема в битах, которые вы не включили в свой вопрос.

...