Какие проверки следует выполнять при создании ключей соглашения о ключе Диффи-Хеллмана из фиксированных значений p и g с использованием OpenSSL1.1.0g?

Здравствуйте, я пытаюсь создать ключи Диффи-Хеллмана, используя исправления параметров p и g с помощью этого фрагмента кода на основе этого ответа:

#include <openssl/dh.h>
#include <openssl/bn.h>

int generateKeys(DH *encryptionInfo) {
 int codes;
 BIGNUM *two = BN_new(), *p=NULL;

 puts("Select fixed p and g parameters\n");

 if(two == NULL) {
   return -1;
 };
 
 if(p=NULL){
    BN_free(two);
    return -1;
 }

 BN_set_word(two,2);
 if( 1 != DH_set0_pqg (encryptionInfo, get_rfc3526_prime_2048(p), NULL, two)) return -1;

//  if(1 != DH_generate_parameters_ex(encryptionInfo, 2048, DH_GENERATOR_2, NULL)) return -1;
 puts("Checking for codes\n");
 if(1 != DH_check(encryptionInfo, &codes)) return -1;
 printf("Codes values %d\n", codes);
 switch(codes){
    case DH_CHECK_P_NOT_PRIME:
      puts("DH_CHECK_P_NOT_PRIME\n");
      break;
    case DH_CHECK_P_NOT_SAFE_PRIME:
      puts("DH_CHECK_P_NOT_SAFE_PRIME\n");
      break;
    case DH_UNABLE_TO_CHECK_GENERATOR:
      puts("DH_UNABLE_TO_CHECK_GENERATOR\n");
      break;
    case DH_NOT_SUITABLE_GENERATOR:
      puts("DH_NOT_SUITABLE_GENERATOR\n");
      break;
    case DH_CHECK_Q_NOT_PRIME:
      puts("DH_CHECK_Q_NOT_PRIME\n");
      break;
    case DH_CHECK_INVALID_Q_VALUE:
      puts("DH_CHECK_INVALID_Q_VALUE\n");
      break;
    case DH_CHECK_INVALID_J_VALUE:
      puts("DH_CHECK_INVALID_J_VALUE\n");
      break;
 }
 if(codes != 0) return -1;
 puts("Generating Keys \n");
 if(1 != DH_generate_key(encryptionInfo)) return -1;
  
 BN_free(two);
 BN_free(p);
 return 0;
}

Но когда я пытаюсь запустить этот фрагмент кода, я получаю следующую ошибку:

Коды значений 8

DH_NOT_SUITABLE_GENERATOR

Опуская проверку DH_check, похоже, работает:

#include <openssl/dh.h>
#include <openssl/bn.h>

int generateKeys(DH *encryptionInfo) {
 int codes;
 BIGNUM *two = BN_new(), *p=NULL;

 puts("Select fixed p and g parameters\n");

 if(two == NULL) {
   return -1;
 };
 
 if(p=NULL){
    BN_free(two);
    return -1;
 }

 BN_set_word(two,2);
 if( 1 != DH_set0_pqg (encryptionInfo, get_rfc3526_prime_2048(p), NULL, two)) return -1;

//  if(1 != DH_generate_parameters_ex(encryptionInfo, 2048, DH_GENERATOR_2, NULL)) return -1;
 puts("Checking for codes\n");
 puts("Generating Keys \n");
 if(1 != DH_generate_key(encryptionInfo)) return -1;
  
 BN_free(two);
 BN_free(p);
 return 0;
}

Но я не уверен, должен ли я это делать, каков рекомендуемый способ в моем случае? Какие проверки необходимы в моем случае?


person Dimitrios Desyllas    schedule 06.02.2019    source источник
comment
Во-первых, коды — это маска, которая может содержать несколько битов. Во-вторых, почему 2 является подходящим значением для g?   -  person stark    schedule 06.02.2019
comment
Потому что так говорит rfc   -  person Dimitrios Desyllas    schedule 07.02.2019
comment
github.com/openssl/openssl/blob/master/crypto/ dh/dh_check.c Похоже, ошибка p % 24 == 11 (строка 148)   -  person stark    schedule 07.02.2019
comment
Итак, как я могу это решить?   -  person Dimitrios Desyllas    schedule 07.02.2019