Add plumbing to handle Q parameter in DH exchanges
authorSimo Sorce <simo@redhat.com>
Fri, 17 May 2019 18:05:37 +0000 (14:05 -0400)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Thu, 23 May 2019 09:35:12 +0000 (11:35 +0200)
Signed-off-by: Simo Sorce <simo@redhat.com>
12 files changed:
devel/libgnutls-latest-x86_64.abi
devel/symbols.last
doc/Makefile.am
doc/manpages/Makefile.am
doc/scripts/getfuncs-map.pl
lib/dh-primes.c
lib/dh.c
lib/gnutls_int.h
lib/includes/gnutls/gnutls.h.in
lib/libgnutls.map
lib/nettle/pk.c
tests/dh-compute.c

index 511f61d47b01c4f577cd9541b299bbd84dbba815..c431eba9b98f43201cdc434190d9d09778aaea3c 100644 (file)
     <elf-symbol name='gnutls_dh_params_import_dsa' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_dh_params_import_pkcs3' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_dh_params_import_raw2' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='gnutls_dh_params_import_raw3' version='GNUTLS_3_6_8' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_dh_params_import_raw' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_dh_params_init' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_dh_set_prime_bits' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_calloc' size='8' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_2048_group_generator' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_2048_group_prime' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='gnutls_ffdhe_2048_group_q' size='16' version='GNUTLS_3_6_8' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_2048_key_bits' size='4' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_3072_group_generator' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_3072_group_prime' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='gnutls_ffdhe_3072_group_q' size='16' version='GNUTLS_3_6_8' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_3072_key_bits' size='4' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_4096_group_generator' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_4096_group_prime' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='gnutls_ffdhe_4096_group_q' size='16' version='GNUTLS_3_6_8' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_4096_key_bits' size='4' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_6144_group_generator' size='16' version='GNUTLS_3_6_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_6144_group_prime' size='16' version='GNUTLS_3_6_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='gnutls_ffdhe_6144_group_q' size='16' version='GNUTLS_3_6_8' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_6144_key_bits' size='4' version='GNUTLS_3_6_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_8192_group_generator' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_8192_group_prime' size='16' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='gnutls_ffdhe_8192_group_q' size='16' version='GNUTLS_3_6_8' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_ffdhe_8192_key_bits' size='4' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_free' size='8' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='gnutls_malloc' size='8' version='GNUTLS_3_4' is-default-version='yes' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
       <parameter type-id='type-id-10' name='key_bits'/>
       <return type-id='type-id-22'/>
     </function-decl>
+    <function-decl name='gnutls_dh_params_import_raw3' mangled-name='gnutls_dh_params_import_raw3' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gnutls_dh_params_import_raw3@@GNUTLS_3_6_8'>
+      <parameter type-id='type-id-417' name='dh_params'/>
+      <parameter type-id='type-id-57' name='prime'/>
+      <parameter type-id='type-id-57' name='q'/>
+      <parameter type-id='type-id-57' name='generator'/>
+      <return type-id='type-id-22'/>
+    </function-decl>
     <function-decl name='gnutls_dh_params_import_dsa' mangled-name='gnutls_dh_params_import_dsa' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gnutls_dh_params_import_dsa@@GNUTLS_3_4'>
       <parameter type-id='type-id-417' name='dh_params'/>
       <parameter type-id='type-id-383' name='key'/>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='dh-primes.c' comp-dir-path='/home/nmavrogi/cvs/gnutls-nmav/lib' language='LANG_C99'>
     <var-decl name='gnutls_ffdhe_2048_group_prime' type-id='type-id-65' mangled-name='gnutls_ffdhe_2048_group_prime' visibility='default' elf-symbol-id='gnutls_ffdhe_2048_group_prime@@GNUTLS_3_4'/>
+    <var-decl name='gnutls_ffdhe_2048_group_q' type-id='type-id-65' mangled-name='gnutls_ffdhe_2048_group_q' visibility='default' elf-symbol-id='gnutls_ffdhe_2048_group_q@@GNUTLS_3_6_8'/>
     <var-decl name='gnutls_ffdhe_2048_group_generator' type-id='type-id-65' mangled-name='gnutls_ffdhe_2048_group_generator' visibility='default' elf-symbol-id='gnutls_ffdhe_2048_group_generator@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_2048_key_bits' type-id='type-id-66' mangled-name='gnutls_ffdhe_2048_key_bits' visibility='default' elf-symbol-id='gnutls_ffdhe_2048_key_bits@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_3072_group_generator' type-id='type-id-65' mangled-name='gnutls_ffdhe_3072_group_generator' visibility='default' elf-symbol-id='gnutls_ffdhe_3072_group_generator@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_3072_group_prime' type-id='type-id-65' mangled-name='gnutls_ffdhe_3072_group_prime' visibility='default' elf-symbol-id='gnutls_ffdhe_3072_group_prime@@GNUTLS_3_4'/>
+    <var-decl name='gnutls_ffdhe_3072_group_q' type-id='type-id-65' mangled-name='gnutls_ffdhe_3072_group_q' visibility='default' elf-symbol-id='gnutls_ffdhe_3072_group_q@@GNUTLS_3_6_8'/>
     <var-decl name='gnutls_ffdhe_3072_key_bits' type-id='type-id-66' mangled-name='gnutls_ffdhe_3072_key_bits' visibility='default' elf-symbol-id='gnutls_ffdhe_3072_key_bits@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_4096_group_generator' type-id='type-id-65' mangled-name='gnutls_ffdhe_4096_group_generator' visibility='default' elf-symbol-id='gnutls_ffdhe_4096_group_generator@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_4096_group_prime' type-id='type-id-65' mangled-name='gnutls_ffdhe_4096_group_prime' visibility='default' elf-symbol-id='gnutls_ffdhe_4096_group_prime@@GNUTLS_3_4'/>
+    <var-decl name='gnutls_ffdhe_4096_group_q' type-id='type-id-65' mangled-name='gnutls_ffdhe_4096_group_q' visibility='default' elf-symbol-id='gnutls_ffdhe_4096_group_q@@GNUTLS_3_6_8'/>
     <var-decl name='gnutls_ffdhe_4096_key_bits' type-id='type-id-66' mangled-name='gnutls_ffdhe_4096_key_bits' visibility='default' elf-symbol-id='gnutls_ffdhe_4096_key_bits@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_6144_group_prime' type-id='type-id-65' mangled-name='gnutls_ffdhe_6144_group_prime' visibility='default' elf-symbol-id='gnutls_ffdhe_6144_group_prime@@GNUTLS_3_6_4'/>
+    <var-decl name='gnutls_ffdhe_6144_group_q' type-id='type-id-65' mangled-name='gnutls_ffdhe_6144_group_q' visibility='default' elf-symbol-id='gnutls_ffdhe_6144_group_q@@GNUTLS_3_6_8'/>
     <var-decl name='gnutls_ffdhe_6144_group_generator' type-id='type-id-65' mangled-name='gnutls_ffdhe_6144_group_generator' visibility='default' elf-symbol-id='gnutls_ffdhe_6144_group_generator@@GNUTLS_3_6_4'/>
     <var-decl name='gnutls_ffdhe_6144_key_bits' type-id='type-id-66' mangled-name='gnutls_ffdhe_6144_key_bits' visibility='default' elf-symbol-id='gnutls_ffdhe_6144_key_bits@@GNUTLS_3_6_4'/>
     <var-decl name='gnutls_ffdhe_8192_group_generator' type-id='type-id-65' mangled-name='gnutls_ffdhe_8192_group_generator' visibility='default' elf-symbol-id='gnutls_ffdhe_8192_group_generator@@GNUTLS_3_4'/>
     <var-decl name='gnutls_ffdhe_8192_group_prime' type-id='type-id-65' mangled-name='gnutls_ffdhe_8192_group_prime' visibility='default' elf-symbol-id='gnutls_ffdhe_8192_group_prime@@GNUTLS_3_4'/>
+    <var-decl name='gnutls_ffdhe_8192_group_q' type-id='type-id-65' mangled-name='gnutls_ffdhe_8192_group_q' visibility='default' elf-symbol-id='gnutls_ffdhe_8192_group_q@@GNUTLS_3_6_8'/>
     <var-decl name='gnutls_ffdhe_8192_key_bits' type-id='type-id-66' mangled-name='gnutls_ffdhe_8192_key_bits' visibility='default' elf-symbol-id='gnutls_ffdhe_8192_key_bits@@GNUTLS_3_4'/>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='openpgp_compat.c' comp-dir-path='/home/nmavrogi/cvs/gnutls-nmav/lib' language='LANG_C99'>
index 7449e9acc7d8734894f59495519867490c99e3b2..9c6c93a26e5698dcc922c0cbb28858031e5879b3 100644 (file)
@@ -175,6 +175,7 @@ gnutls_dh_params_generate2@GNUTLS_3_4
 gnutls_dh_params_import_dsa@GNUTLS_3_4
 gnutls_dh_params_import_pkcs3@GNUTLS_3_4
 gnutls_dh_params_import_raw2@GNUTLS_3_4
+gnutls_dh_params_import_raw3@GNUTLS_3_6_8
 gnutls_dh_params_import_raw@GNUTLS_3_4
 gnutls_dh_params_init@GNUTLS_3_4
 gnutls_dh_set_prime_bits@GNUTLS_3_4
@@ -212,18 +213,23 @@ gnutls_ext_register@GNUTLS_3_4
 gnutls_ext_set_data@GNUTLS_3_4
 gnutls_ffdhe_2048_group_generator@GNUTLS_3_4
 gnutls_ffdhe_2048_group_prime@GNUTLS_3_4
+gnutls_ffdhe_2048_group_q@GNUTLS_3_6_8
 gnutls_ffdhe_2048_key_bits@GNUTLS_3_4
 gnutls_ffdhe_3072_group_generator@GNUTLS_3_4
 gnutls_ffdhe_3072_group_prime@GNUTLS_3_4
+gnutls_ffdhe_3072_group_q@GNUTLS_3_6_8
 gnutls_ffdhe_3072_key_bits@GNUTLS_3_4
 gnutls_ffdhe_4096_group_generator@GNUTLS_3_4
 gnutls_ffdhe_4096_group_prime@GNUTLS_3_4
+gnutls_ffdhe_4096_group_q@GNUTLS_3_6_8
 gnutls_ffdhe_4096_key_bits@GNUTLS_3_4
 gnutls_ffdhe_6144_group_generator@GNUTLS_3_6_4
 gnutls_ffdhe_6144_group_prime@GNUTLS_3_6_4
+gnutls_ffdhe_6144_group_q@GNUTLS_3_6_8
 gnutls_ffdhe_6144_key_bits@GNUTLS_3_6_4
 gnutls_ffdhe_8192_group_generator@GNUTLS_3_4
 gnutls_ffdhe_8192_group_prime@GNUTLS_3_4
+gnutls_ffdhe_8192_group_q@GNUTLS_3_6_8
 gnutls_ffdhe_8192_key_bits@GNUTLS_3_4
 gnutls_fingerprint@GNUTLS_3_4
 gnutls_fips140_mode_enabled@GNUTLS_3_4
index bba2c52c97dd6645c5428345ea440cd26af4a74b..c2318897d05f629c435d71f0bbd7e2e87f892c63 100644 (file)
@@ -951,6 +951,8 @@ FUNCS += functions/gnutls_dh_params_import_raw
 FUNCS += functions/gnutls_dh_params_import_raw.short
 FUNCS += functions/gnutls_dh_params_import_raw2
 FUNCS += functions/gnutls_dh_params_import_raw2.short
+FUNCS += functions/gnutls_dh_params_import_raw3
+FUNCS += functions/gnutls_dh_params_import_raw3.short
 FUNCS += functions/gnutls_dh_params_init
 FUNCS += functions/gnutls_dh_params_init.short
 FUNCS += functions/gnutls_dh_set_prime_bits
index 503b2c14bcf0ac9d85179578458c2e34918e7c33..9beee8606043bbaac415ae66e0f223112a6c32ac 100644 (file)
@@ -277,6 +277,7 @@ APIMANS += gnutls_dh_params_import_dsa.3
 APIMANS += gnutls_dh_params_import_pkcs3.3
 APIMANS += gnutls_dh_params_import_raw.3
 APIMANS += gnutls_dh_params_import_raw2.3
+APIMANS += gnutls_dh_params_import_raw3.3
 APIMANS += gnutls_dh_params_init.3
 APIMANS += gnutls_dh_set_prime_bits.3
 APIMANS += gnutls_digest_get_id.3
index 6804e821735b775360da5c73b6725e2c1fe29a48..3c75d1af82505cb14eea8892e61edde1fd1e2e2b 100755 (executable)
@@ -36,18 +36,23 @@ my %known_false_positives = (
        'gnutls_srp_8192_group_prime' => 1,
        'gnutls_ffdhe_2048_group_generator' => 1,
        'gnutls_ffdhe_2048_group_prime' => 1,
+       'gnutls_ffdhe_2048_group_q' => 1,
        'gnutls_ffdhe_2048_key_bits' => 1,
        'gnutls_ffdhe_3072_group_generator' => 1,
        'gnutls_ffdhe_3072_group_prime' => 1,
+       'gnutls_ffdhe_3072_group_q' => 1,
        'gnutls_ffdhe_3072_key_bits' => 1,
        'gnutls_ffdhe_4096_group_generator' => 1,
        'gnutls_ffdhe_4096_group_prime' => 1,
+       'gnutls_ffdhe_4096_group_q' => 1,
        'gnutls_ffdhe_4096_key_bits' => 1,
        'gnutls_ffdhe_6144_group_generator' => 1,
        'gnutls_ffdhe_6144_group_prime' => 1,
+       'gnutls_ffdhe_6144_group_q' => 1,
        'gnutls_ffdhe_6144_key_bits' => 1,
        'gnutls_ffdhe_8192_group_generator' => 1,
        'gnutls_ffdhe_8192_group_prime' => 1,
+       'gnutls_ffdhe_8192_group_q' => 1,
        'gnutls_ffdhe_8192_key_bits' => 1,
        'gnutls_transport_set_int' => 1,
        'gnutls_strdup' => 1,
index 37370bdb12cfe96ca9cef387eae0f9a109573fbd..d785584d0fac7bb16f09fa7a29574fa089ea21fe 100644 (file)
@@ -27,6 +27,8 @@
 
 #include "dh.h"
 
+static const unsigned char ffdhe_generator = 0x02;
+
 static const unsigned char ffdhe_params_2048[] = {
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
        0xFF, 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 
@@ -67,12 +69,52 @@ static const unsigned char ffdhe_params_2048[] = {
        0xFF, 0xFF, 0xFF, 0xFF
 };
 
+static const unsigned char ffdhe_q_2048[] = {
+       0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D,
+       0xA5, 0x4D, 0x57, 0xEE, 0x2B, 0x10, 0x13,
+       0x9E, 0x9E, 0x78, 0xEC, 0x5C, 0xE2, 0xC1,
+       0xE7, 0x16, 0x9B, 0x4A, 0xD4, 0xF0, 0x9B,
+       0x20, 0x8A, 0x32, 0x19, 0xFD, 0xE6, 0x49,
+       0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C, 0xBE,
+       0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
+       0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30,
+       0xBD, 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE,
+       0xB2, 0xB0, 0x92, 0x19, 0xFA, 0x8F, 0xAF,
+       0x83, 0x37, 0x68, 0x42, 0xB1, 0xB2, 0xAA,
+       0x9E, 0xF6, 0x8D, 0x79, 0xDA, 0xAB, 0x89,
+       0xAF, 0x3F, 0xAB, 0xE4, 0x9A, 0xCC, 0x27,
+       0x86, 0x38, 0x70, 0x73, 0x45, 0xBB, 0xF1,
+       0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
+       0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3,
+       0x9A, 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D,
+       0x3C, 0xBD, 0x5E, 0x05, 0x58, 0xC1, 0x59,
+       0x92, 0x7D, 0xB0, 0xE8, 0x84, 0x54, 0xA5,
+       0xD9, 0x64, 0x71, 0xFD, 0xDC, 0xB5, 0x6D,
+       0x5B, 0xB0, 0x6B, 0xFA, 0x34, 0x0E, 0xA7,
+       0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA, 0x57,
+       0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
+       0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36,
+       0xB8, 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB,
+       0xF1, 0x76, 0x60, 0x1A, 0x02, 0x66, 0x94,
+       0x1A, 0x17, 0xB0, 0xC8, 0xB9, 0x7F, 0x4E,
+       0x74, 0xC2, 0xC1, 0xFF, 0xC7, 0x27, 0x89,
+       0x19, 0x77, 0x79, 0x40, 0xC1, 0xE1, 0xFF,
+       0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9, 0x9D,
+       0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
+       0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41,
+       0xD9, 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9,
+       0x77, 0xFD, 0x44, 0x35, 0xA1, 0x1C, 0x30,
+       0x94, 0x2E, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF
+};
+
 const gnutls_datum_t gnutls_ffdhe_2048_group_prime = {
        (void *) ffdhe_params_2048, sizeof(ffdhe_params_2048)
 };
-
-static const unsigned char ffdhe_generator = 0x02;
-
+const gnutls_datum_t gnutls_ffdhe_2048_group_q = {
+       (void *) ffdhe_q_2048, sizeof(ffdhe_q_2048)
+};
 const gnutls_datum_t gnutls_ffdhe_2048_group_generator = {
        (void *) &ffdhe_generator, sizeof(ffdhe_generator)
 };
@@ -136,13 +178,73 @@ static const unsigned char ffdhe_params_3072[] = {
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
 };
 
-const gnutls_datum_t gnutls_ffdhe_3072_group_generator = {
-       (void *) &ffdhe_generator, sizeof(ffdhe_generator)
+static const unsigned char ffdhe_q_3072[] = {
+       0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D,
+       0xA5, 0x4D, 0x57, 0xEE, 0x2B, 0x10, 0x13,
+       0x9E, 0x9E, 0x78, 0xEC, 0x5C, 0xE2, 0xC1,
+       0xE7, 0x16, 0x9B, 0x4A, 0xD4, 0xF0, 0x9B,
+       0x20, 0x8A, 0x32, 0x19, 0xFD, 0xE6, 0x49,
+       0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C, 0xBE,
+       0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
+       0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30,
+       0xBD, 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE,
+       0xB2, 0xB0, 0x92, 0x19, 0xFA, 0x8F, 0xAF,
+       0x83, 0x37, 0x68, 0x42, 0xB1, 0xB2, 0xAA,
+       0x9E, 0xF6, 0x8D, 0x79, 0xDA, 0xAB, 0x89,
+       0xAF, 0x3F, 0xAB, 0xE4, 0x9A, 0xCC, 0x27,
+       0x86, 0x38, 0x70, 0x73, 0x45, 0xBB, 0xF1,
+       0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
+       0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3,
+       0x9A, 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D,
+       0x3C, 0xBD, 0x5E, 0x05, 0x58, 0xC1, 0x59,
+       0x92, 0x7D, 0xB0, 0xE8, 0x84, 0x54, 0xA5,
+       0xD9, 0x64, 0x71, 0xFD, 0xDC, 0xB5, 0x6D,
+       0x5B, 0xB0, 0x6B, 0xFA, 0x34, 0x0E, 0xA7,
+       0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA, 0x57,
+       0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
+       0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36,
+       0xB8, 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB,
+       0xF1, 0x76, 0x60, 0x1A, 0x02, 0x66, 0x94,
+       0x1A, 0x17, 0xB0, 0xC8, 0xB9, 0x7F, 0x4E,
+       0x74, 0xC2, 0xC1, 0xFF, 0xC7, 0x27, 0x89,
+       0x19, 0x77, 0x79, 0x40, 0xC1, 0xE1, 0xFF,
+       0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9, 0x9D,
+       0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
+       0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41,
+       0xD9, 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9,
+       0x77, 0xFD, 0x44, 0x35, 0xA1, 0x1C, 0x30,
+       0x8F, 0xE7, 0xEE, 0x6F, 0x1A, 0xAD, 0x9D,
+       0xB2, 0x8C, 0x81, 0xAD, 0xDE, 0x1A, 0x7A,
+       0x6F, 0x7C, 0xCE, 0x01, 0x1C, 0x30, 0xDA,
+       0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83, 0xBD,
+       0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
+       0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C,
+       0x8E, 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89,
+       0xC9, 0x38, 0x5A, 0x09, 0x86, 0x49, 0xDE,
+       0x21, 0xBC, 0xA2, 0x7A, 0x7E, 0xA2, 0x29,
+       0x71, 0x6B, 0xA6, 0xE9, 0xB2, 0x79, 0x71,
+       0x0F, 0x38, 0xFA, 0xA5, 0xFF, 0xAE, 0x57,
+       0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F, 0x74,
+       0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
+       0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5,
+       0x6D, 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2,
+       0x24, 0x27, 0x05, 0x5E, 0x68, 0x35, 0xFD,
+       0x29, 0xEE, 0xF7, 0x9E, 0x0D, 0x90, 0x77,
+       0x1F, 0xEA, 0xCE, 0xBE, 0x12, 0xF2, 0x0E,
+       0x95, 0xB3, 0x63, 0x17, 0x1B, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
 };
 
 const gnutls_datum_t gnutls_ffdhe_3072_group_prime = {
        (void *) ffdhe_params_3072, sizeof(ffdhe_params_3072)
 };
+const gnutls_datum_t gnutls_ffdhe_3072_group_q = {
+       (void *) ffdhe_q_3072, sizeof(ffdhe_q_3072)
+};
+const gnutls_datum_t gnutls_ffdhe_3072_group_generator = {
+       (void *) &ffdhe_generator, sizeof(ffdhe_generator)
+};
 const unsigned int gnutls_ffdhe_3072_key_bits = 276;
 
 static const unsigned char ffdhe_params_4096[] = {
@@ -222,13 +324,92 @@ static const unsigned char ffdhe_params_4096[] = {
        0xFF
 };
 
-const gnutls_datum_t gnutls_ffdhe_4096_group_generator = {
-       (void *) &ffdhe_generator, sizeof(ffdhe_generator)
+static const unsigned char ffdhe_q_4096[] = {
+       0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D,
+       0xA5, 0x4D, 0x57, 0xEE, 0x2B, 0x10, 0x13,
+       0x9E, 0x9E, 0x78, 0xEC, 0x5C, 0xE2, 0xC1,
+       0xE7, 0x16, 0x9B, 0x4A, 0xD4, 0xF0, 0x9B,
+       0x20, 0x8A, 0x32, 0x19, 0xFD, 0xE6, 0x49,
+       0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C, 0xBE,
+       0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
+       0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30,
+       0xBD, 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE,
+       0xB2, 0xB0, 0x92, 0x19, 0xFA, 0x8F, 0xAF,
+       0x83, 0x37, 0x68, 0x42, 0xB1, 0xB2, 0xAA,
+       0x9E, 0xF6, 0x8D, 0x79, 0xDA, 0xAB, 0x89,
+       0xAF, 0x3F, 0xAB, 0xE4, 0x9A, 0xCC, 0x27,
+       0x86, 0x38, 0x70, 0x73, 0x45, 0xBB, 0xF1,
+       0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
+       0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3,
+       0x9A, 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D,
+       0x3C, 0xBD, 0x5E, 0x05, 0x58, 0xC1, 0x59,
+       0x92, 0x7D, 0xB0, 0xE8, 0x84, 0x54, 0xA5,
+       0xD9, 0x64, 0x71, 0xFD, 0xDC, 0xB5, 0x6D,
+       0x5B, 0xB0, 0x6B, 0xFA, 0x34, 0x0E, 0xA7,
+       0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA, 0x57,
+       0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
+       0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36,
+       0xB8, 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB,
+       0xF1, 0x76, 0x60, 0x1A, 0x02, 0x66, 0x94,
+       0x1A, 0x17, 0xB0, 0xC8, 0xB9, 0x7F, 0x4E,
+       0x74, 0xC2, 0xC1, 0xFF, 0xC7, 0x27, 0x89,
+       0x19, 0x77, 0x79, 0x40, 0xC1, 0xE1, 0xFF,
+       0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9, 0x9D,
+       0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
+       0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41,
+       0xD9, 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9,
+       0x77, 0xFD, 0x44, 0x35, 0xA1, 0x1C, 0x30,
+       0x8F, 0xE7, 0xEE, 0x6F, 0x1A, 0xAD, 0x9D,
+       0xB2, 0x8C, 0x81, 0xAD, 0xDE, 0x1A, 0x7A,
+       0x6F, 0x7C, 0xCE, 0x01, 0x1C, 0x30, 0xDA,
+       0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83, 0xBD,
+       0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
+       0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C,
+       0x8E, 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89,
+       0xC9, 0x38, 0x5A, 0x09, 0x86, 0x49, 0xDE,
+       0x21, 0xBC, 0xA2, 0x7A, 0x7E, 0xA2, 0x29,
+       0x71, 0x6B, 0xA6, 0xE9, 0xB2, 0x79, 0x71,
+       0x0F, 0x38, 0xFA, 0xA5, 0xFF, 0xAE, 0x57,
+       0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F, 0x74,
+       0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
+       0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5,
+       0x6D, 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2,
+       0x24, 0x27, 0x05, 0x5E, 0x68, 0x35, 0xFD,
+       0x29, 0xEE, 0xF7, 0x9E, 0x0D, 0x90, 0x77,
+       0x1F, 0xEA, 0xCE, 0xBE, 0x12, 0xF2, 0x0E,
+       0x95, 0xB3, 0x4F, 0x0F, 0x78, 0xB7, 0x37,
+       0xA9, 0x61, 0x8B, 0x26, 0xFA, 0x7D, 0xBC,
+       0x98, 0x74, 0xF2, 0x72, 0xC4, 0x2B, 0xDB,
+       0x56, 0x3E, 0xAF, 0xA1, 0x6B, 0x4F, 0xB6,
+       0x8C, 0x3B, 0xB1, 0xE7, 0x8E, 0xAA, 0x81,
+       0xA0, 0x02, 0x43, 0xFA, 0xAD, 0xD2, 0xBF,
+       0x18, 0xE6, 0x3D, 0x38, 0x9A, 0xE4, 0x43,
+       0x77, 0xDA, 0x18, 0xC5, 0x76, 0xB5, 0x0F,
+       0x00, 0x96, 0xCF, 0x34, 0x19, 0x54, 0x83,
+       0xB0, 0x05, 0x48, 0xC0, 0x98, 0x62, 0x36,
+       0xE3, 0xBC, 0x7C, 0xB8, 0xD6, 0x80, 0x1C,
+       0x04, 0x94, 0xCC, 0xD1, 0x99, 0xE5, 0xC5,
+       0xBD, 0x0D, 0x0E, 0xDC, 0x9E, 0xB8, 0xA0,
+       0x00, 0x1E, 0x15, 0x27, 0x67, 0x54, 0xFC,
+       0xC6, 0x85, 0x66, 0x05, 0x41, 0x48, 0xE6,
+       0xE7, 0x64, 0xBE, 0xE7, 0xC7, 0x64, 0xDA,
+       0xAD, 0x3F, 0xC4, 0x52, 0x35, 0xA6, 0xDA,
+       0xD4, 0x28, 0xFA, 0x20, 0xC1, 0x70, 0xE3,
+       0x45, 0x00, 0x3F, 0x2F, 0x32, 0xAF, 0xB5,
+       0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF
 };
 
 const gnutls_datum_t gnutls_ffdhe_4096_group_prime = {
        (void *) ffdhe_params_4096, sizeof(ffdhe_params_4096)
 };
+const gnutls_datum_t gnutls_ffdhe_4096_group_q = {
+       (void *) ffdhe_q_4096, sizeof(ffdhe_q_4096)
+};
+const gnutls_datum_t gnutls_ffdhe_4096_group_generator = {
+       (void *) &ffdhe_generator, sizeof(ffdhe_generator)
+};
 const unsigned int gnutls_ffdhe_4096_key_bits = 336;
 
 static const unsigned char ffdhe_params_6144[] = {
@@ -344,10 +525,125 @@ static const unsigned char ffdhe_params_6144[] = {
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF
 };
 
+static const unsigned char ffdhe_q_6144[] = {
+       0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D,
+       0xA5, 0x4D, 0x57, 0xEE, 0x2B, 0x10, 0x13,
+       0x9E, 0x9E, 0x78, 0xEC, 0x5C, 0xE2, 0xC1,
+       0xE7, 0x16, 0x9B, 0x4A, 0xD4, 0xF0, 0x9B,
+       0x20, 0x8A, 0x32, 0x19, 0xFD, 0xE6, 0x49,
+       0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C, 0xBE,
+       0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
+       0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30,
+       0xBD, 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE,
+       0xB2, 0xB0, 0x92, 0x19, 0xFA, 0x8F, 0xAF,
+       0x83, 0x37, 0x68, 0x42, 0xB1, 0xB2, 0xAA,
+       0x9E, 0xF6, 0x8D, 0x79, 0xDA, 0xAB, 0x89,
+       0xAF, 0x3F, 0xAB, 0xE4, 0x9A, 0xCC, 0x27,
+       0x86, 0x38, 0x70, 0x73, 0x45, 0xBB, 0xF1,
+       0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
+       0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3,
+       0x9A, 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D,
+       0x3C, 0xBD, 0x5E, 0x05, 0x58, 0xC1, 0x59,
+       0x92, 0x7D, 0xB0, 0xE8, 0x84, 0x54, 0xA5,
+       0xD9, 0x64, 0x71, 0xFD, 0xDC, 0xB5, 0x6D,
+       0x5B, 0xB0, 0x6B, 0xFA, 0x34, 0x0E, 0xA7,
+       0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA, 0x57,
+       0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
+       0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36,
+       0xB8, 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB,
+       0xF1, 0x76, 0x60, 0x1A, 0x02, 0x66, 0x94,
+       0x1A, 0x17, 0xB0, 0xC8, 0xB9, 0x7F, 0x4E,
+       0x74, 0xC2, 0xC1, 0xFF, 0xC7, 0x27, 0x89,
+       0x19, 0x77, 0x79, 0x40, 0xC1, 0xE1, 0xFF,
+       0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9, 0x9D,
+       0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
+       0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41,
+       0xD9, 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9,
+       0x77, 0xFD, 0x44, 0x35, 0xA1, 0x1C, 0x30,
+       0x8F, 0xE7, 0xEE, 0x6F, 0x1A, 0xAD, 0x9D,
+       0xB2, 0x8C, 0x81, 0xAD, 0xDE, 0x1A, 0x7A,
+       0x6F, 0x7C, 0xCE, 0x01, 0x1C, 0x30, 0xDA,
+       0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83, 0xBD,
+       0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
+       0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C,
+       0x8E, 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89,
+       0xC9, 0x38, 0x5A, 0x09, 0x86, 0x49, 0xDE,
+       0x21, 0xBC, 0xA2, 0x7A, 0x7E, 0xA2, 0x29,
+       0x71, 0x6B, 0xA6, 0xE9, 0xB2, 0x79, 0x71,
+       0x0F, 0x38, 0xFA, 0xA5, 0xFF, 0xAE, 0x57,
+       0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F, 0x74,
+       0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
+       0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5,
+       0x6D, 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2,
+       0x24, 0x27, 0x05, 0x5E, 0x68, 0x35, 0xFD,
+       0x29, 0xEE, 0xF7, 0x9E, 0x0D, 0x90, 0x77,
+       0x1F, 0xEA, 0xCE, 0xBE, 0x12, 0xF2, 0x0E,
+       0x95, 0xB3, 0x4F, 0x0F, 0x78, 0xB7, 0x37,
+       0xA9, 0x61, 0x8B, 0x26, 0xFA, 0x7D, 0xBC,
+       0x98, 0x74, 0xF2, 0x72, 0xC4, 0x2B, 0xDB,
+       0x56, 0x3E, 0xAF, 0xA1, 0x6B, 0x4F, 0xB6,
+       0x8C, 0x3B, 0xB1, 0xE7, 0x8E, 0xAA, 0x81,
+       0xA0, 0x02, 0x43, 0xFA, 0xAD, 0xD2, 0xBF,
+       0x18, 0xE6, 0x3D, 0x38, 0x9A, 0xE4, 0x43,
+       0x77, 0xDA, 0x18, 0xC5, 0x76, 0xB5, 0x0F,
+       0x00, 0x96, 0xCF, 0x34, 0x19, 0x54, 0x83,
+       0xB0, 0x05, 0x48, 0xC0, 0x98, 0x62, 0x36,
+       0xE3, 0xBC, 0x7C, 0xB8, 0xD6, 0x80, 0x1C,
+       0x04, 0x94, 0xCC, 0xD1, 0x99, 0xE5, 0xC5,
+       0xBD, 0x0D, 0x0E, 0xDC, 0x9E, 0xB8, 0xA0,
+       0x00, 0x1E, 0x15, 0x27, 0x67, 0x54, 0xFC,
+       0xC6, 0x85, 0x66, 0x05, 0x41, 0x48, 0xE6,
+       0xE7, 0x64, 0xBE, 0xE7, 0xC7, 0x64, 0xDA,
+       0xAD, 0x3F, 0xC4, 0x52, 0x35, 0xA6, 0xDA,
+       0xD4, 0x28, 0xFA, 0x20, 0xC1, 0x70, 0xE3,
+       0x45, 0x00, 0x3F, 0x2F, 0x06, 0xEC, 0x81,
+       0x05, 0xFE, 0xB2, 0x5B, 0x22, 0x81, 0xB6,
+       0x3D, 0x27, 0x33, 0xBE, 0x96, 0x1C, 0x29,
+       0x95, 0x1D, 0x11, 0xDD, 0x22, 0x21, 0x65,
+       0x7A, 0x9F, 0x53, 0x1D, 0xDA, 0x2A, 0x19,
+       0x4D, 0xBB, 0x12, 0x64, 0x48, 0xBD, 0xEE,
+       0xB2, 0x58, 0xE0, 0x7E, 0xA6, 0x59, 0xC7,
+       0x46, 0x19, 0xA6, 0x38, 0x0E, 0x1D, 0x66,
+       0xD6, 0x83, 0x2B, 0xFE, 0x67, 0xF6, 0x38,
+       0xCD, 0x8F, 0xAE, 0x1F, 0x27, 0x23, 0x02,
+       0x0F, 0x9C, 0x40, 0xA3, 0xFD, 0xA6, 0x7E,
+       0xDA, 0x3B, 0xD2, 0x92, 0x38, 0xFB, 0xD4,
+       0xD4, 0xB4, 0x88, 0x5C, 0x2A, 0x99, 0x17,
+       0x6D, 0xB1, 0xA0, 0x6C, 0x50, 0x07, 0x78,
+       0x49, 0x1A, 0x82, 0x88, 0xF1, 0x85, 0x5F,
+       0x60, 0xFF, 0xFC, 0xF1, 0xD1, 0x37, 0x3F,
+       0xD9, 0x4F, 0xC6, 0x0C, 0x18, 0x11, 0xE1,
+       0xAC, 0x3F, 0x1C, 0x6D, 0x00, 0x3B, 0xEC,
+       0xDA, 0x3B, 0x1F, 0x27, 0x25, 0xCA, 0x59,
+       0x5D, 0xE0, 0xCA, 0x63, 0x32, 0x8F, 0x3B,
+       0xE5, 0x7C, 0xC9, 0x77, 0x55, 0x60, 0x11,
+       0x95, 0x14, 0x0D, 0xFB, 0x59, 0xD3, 0x9C,
+       0xE0, 0x91, 0x30, 0x8B, 0x41, 0x05, 0x74,
+       0x6D, 0xAC, 0x23, 0xD3, 0x3E, 0x5F, 0x7C,
+       0xE4, 0x84, 0x8D, 0xA3, 0x16, 0xA9, 0xC6,
+       0x6B, 0x95, 0x81, 0xBA, 0x35, 0x73, 0xBF,
+       0xAF, 0x31, 0x14, 0x96, 0x18, 0x8A, 0xB1,
+       0x54, 0x23, 0x28, 0x2E, 0xE4, 0x16, 0xDC,
+       0x2A, 0x19, 0xC5, 0x72, 0x4F, 0xA9, 0x1A,
+       0xE4, 0xAD, 0xC8, 0x8B, 0xC6, 0x67, 0x96,
+       0xEA, 0xE5, 0x67, 0x7A, 0x01, 0xF6, 0x4E,
+       0x8C, 0x08, 0x63, 0x13, 0x95, 0x82, 0x2D,
+       0x9D, 0xB8, 0xFC, 0xEE, 0x35, 0xC0, 0x6B,
+       0x1F, 0xEE, 0xA5, 0x47, 0x4D, 0x6D, 0x8F,
+       0x34, 0xB1, 0x53, 0x4A, 0x93, 0x6A, 0x18,
+       0xB0, 0xE0, 0xD2, 0x0E, 0xAB, 0x86, 0xBC,
+       0x9C, 0x6D, 0x6A, 0x52, 0x07, 0x19, 0x4E,
+       0x68, 0x72, 0x07, 0x32, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
 const gnutls_datum_t gnutls_ffdhe_6144_group_prime = {
        (void *) ffdhe_params_6144, sizeof(ffdhe_params_6144)
 };
-
+const gnutls_datum_t gnutls_ffdhe_6144_group_q = {
+       (void *) ffdhe_q_6144, sizeof(ffdhe_q_6144)
+};
 const gnutls_datum_t gnutls_ffdhe_6144_group_generator = {
        (void *) &ffdhe_generator, sizeof(ffdhe_generator)
 };
@@ -503,13 +799,165 @@ static const unsigned char ffdhe_params_8192[] = {
        0xFF, 0xFF
 };
 
-const gnutls_datum_t gnutls_ffdhe_8192_group_generator = {
-       (void *) &ffdhe_generator, sizeof(ffdhe_generator)
+static const unsigned char ffdhe_q_8192[] = {
+       0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D,
+       0xA5, 0x4D, 0x57, 0xEE, 0x2B, 0x10, 0x13,
+       0x9E, 0x9E, 0x78, 0xEC, 0x5C, 0xE2, 0xC1,
+       0xE7, 0x16, 0x9B, 0x4A, 0xD4, 0xF0, 0x9B,
+       0x20, 0x8A, 0x32, 0x19, 0xFD, 0xE6, 0x49,
+       0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C, 0xBE,
+       0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
+       0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30,
+       0xBD, 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE,
+       0xB2, 0xB0, 0x92, 0x19, 0xFA, 0x8F, 0xAF,
+       0x83, 0x37, 0x68, 0x42, 0xB1, 0xB2, 0xAA,
+       0x9E, 0xF6, 0x8D, 0x79, 0xDA, 0xAB, 0x89,
+       0xAF, 0x3F, 0xAB, 0xE4, 0x9A, 0xCC, 0x27,
+       0x86, 0x38, 0x70, 0x73, 0x45, 0xBB, 0xF1,
+       0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
+       0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3,
+       0x9A, 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D,
+       0x3C, 0xBD, 0x5E, 0x05, 0x58, 0xC1, 0x59,
+       0x92, 0x7D, 0xB0, 0xE8, 0x84, 0x54, 0xA5,
+       0xD9, 0x64, 0x71, 0xFD, 0xDC, 0xB5, 0x6D,
+       0x5B, 0xB0, 0x6B, 0xFA, 0x34, 0x0E, 0xA7,
+       0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA, 0x57,
+       0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
+       0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36,
+       0xB8, 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB,
+       0xF1, 0x76, 0x60, 0x1A, 0x02, 0x66, 0x94,
+       0x1A, 0x17, 0xB0, 0xC8, 0xB9, 0x7F, 0x4E,
+       0x74, 0xC2, 0xC1, 0xFF, 0xC7, 0x27, 0x89,
+       0x19, 0x77, 0x79, 0x40, 0xC1, 0xE1, 0xFF,
+       0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9, 0x9D,
+       0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
+       0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41,
+       0xD9, 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9,
+       0x77, 0xFD, 0x44, 0x35, 0xA1, 0x1C, 0x30,
+       0x8F, 0xE7, 0xEE, 0x6F, 0x1A, 0xAD, 0x9D,
+       0xB2, 0x8C, 0x81, 0xAD, 0xDE, 0x1A, 0x7A,
+       0x6F, 0x7C, 0xCE, 0x01, 0x1C, 0x30, 0xDA,
+       0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83, 0xBD,
+       0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
+       0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C,
+       0x8E, 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89,
+       0xC9, 0x38, 0x5A, 0x09, 0x86, 0x49, 0xDE,
+       0x21, 0xBC, 0xA2, 0x7A, 0x7E, 0xA2, 0x29,
+       0x71, 0x6B, 0xA6, 0xE9, 0xB2, 0x79, 0x71,
+       0x0F, 0x38, 0xFA, 0xA5, 0xFF, 0xAE, 0x57,
+       0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F, 0x74,
+       0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
+       0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5,
+       0x6D, 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2,
+       0x24, 0x27, 0x05, 0x5E, 0x68, 0x35, 0xFD,
+       0x29, 0xEE, 0xF7, 0x9E, 0x0D, 0x90, 0x77,
+       0x1F, 0xEA, 0xCE, 0xBE, 0x12, 0xF2, 0x0E,
+       0x95, 0xB3, 0x4F, 0x0F, 0x78, 0xB7, 0x37,
+       0xA9, 0x61, 0x8B, 0x26, 0xFA, 0x7D, 0xBC,
+       0x98, 0x74, 0xF2, 0x72, 0xC4, 0x2B, 0xDB,
+       0x56, 0x3E, 0xAF, 0xA1, 0x6B, 0x4F, 0xB6,
+       0x8C, 0x3B, 0xB1, 0xE7, 0x8E, 0xAA, 0x81,
+       0xA0, 0x02, 0x43, 0xFA, 0xAD, 0xD2, 0xBF,
+       0x18, 0xE6, 0x3D, 0x38, 0x9A, 0xE4, 0x43,
+       0x77, 0xDA, 0x18, 0xC5, 0x76, 0xB5, 0x0F,
+       0x00, 0x96, 0xCF, 0x34, 0x19, 0x54, 0x83,
+       0xB0, 0x05, 0x48, 0xC0, 0x98, 0x62, 0x36,
+       0xE3, 0xBC, 0x7C, 0xB8, 0xD6, 0x80, 0x1C,
+       0x04, 0x94, 0xCC, 0xD1, 0x99, 0xE5, 0xC5,
+       0xBD, 0x0D, 0x0E, 0xDC, 0x9E, 0xB8, 0xA0,
+       0x00, 0x1E, 0x15, 0x27, 0x67, 0x54, 0xFC,
+       0xC6, 0x85, 0x66, 0x05, 0x41, 0x48, 0xE6,
+       0xE7, 0x64, 0xBE, 0xE7, 0xC7, 0x64, 0xDA,
+       0xAD, 0x3F, 0xC4, 0x52, 0x35, 0xA6, 0xDA,
+       0xD4, 0x28, 0xFA, 0x20, 0xC1, 0x70, 0xE3,
+       0x45, 0x00, 0x3F, 0x2F, 0x06, 0xEC, 0x81,
+       0x05, 0xFE, 0xB2, 0x5B, 0x22, 0x81, 0xB6,
+       0x3D, 0x27, 0x33, 0xBE, 0x96, 0x1C, 0x29,
+       0x95, 0x1D, 0x11, 0xDD, 0x22, 0x21, 0x65,
+       0x7A, 0x9F, 0x53, 0x1D, 0xDA, 0x2A, 0x19,
+       0x4D, 0xBB, 0x12, 0x64, 0x48, 0xBD, 0xEE,
+       0xB2, 0x58, 0xE0, 0x7E, 0xA6, 0x59, 0xC7,
+       0x46, 0x19, 0xA6, 0x38, 0x0E, 0x1D, 0x66,
+       0xD6, 0x83, 0x2B, 0xFE, 0x67, 0xF6, 0x38,
+       0xCD, 0x8F, 0xAE, 0x1F, 0x27, 0x23, 0x02,
+       0x0F, 0x9C, 0x40, 0xA3, 0xFD, 0xA6, 0x7E,
+       0xDA, 0x3B, 0xD2, 0x92, 0x38, 0xFB, 0xD4,
+       0xD4, 0xB4, 0x88, 0x5C, 0x2A, 0x99, 0x17,
+       0x6D, 0xB1, 0xA0, 0x6C, 0x50, 0x07, 0x78,
+       0x49, 0x1A, 0x82, 0x88, 0xF1, 0x85, 0x5F,
+       0x60, 0xFF, 0xFC, 0xF1, 0xD1, 0x37, 0x3F,
+       0xD9, 0x4F, 0xC6, 0x0C, 0x18, 0x11, 0xE1,
+       0xAC, 0x3F, 0x1C, 0x6D, 0x00, 0x3B, 0xEC,
+       0xDA, 0x3B, 0x1F, 0x27, 0x25, 0xCA, 0x59,
+       0x5D, 0xE0, 0xCA, 0x63, 0x32, 0x8F, 0x3B,
+       0xE5, 0x7C, 0xC9, 0x77, 0x55, 0x60, 0x11,
+       0x95, 0x14, 0x0D, 0xFB, 0x59, 0xD3, 0x9C,
+       0xE0, 0x91, 0x30, 0x8B, 0x41, 0x05, 0x74,
+       0x6D, 0xAC, 0x23, 0xD3, 0x3E, 0x5F, 0x7C,
+       0xE4, 0x84, 0x8D, 0xA3, 0x16, 0xA9, 0xC6,
+       0x6B, 0x95, 0x81, 0xBA, 0x35, 0x73, 0xBF,
+       0xAF, 0x31, 0x14, 0x96, 0x18, 0x8A, 0xB1,
+       0x54, 0x23, 0x28, 0x2E, 0xE4, 0x16, 0xDC,
+       0x2A, 0x19, 0xC5, 0x72, 0x4F, 0xA9, 0x1A,
+       0xE4, 0xAD, 0xC8, 0x8B, 0xC6, 0x67, 0x96,
+       0xEA, 0xE5, 0x67, 0x7A, 0x01, 0xF6, 0x4E,
+       0x8C, 0x08, 0x63, 0x13, 0x95, 0x82, 0x2D,
+       0x9D, 0xB8, 0xFC, 0xEE, 0x35, 0xC0, 0x6B,
+       0x1F, 0xEE, 0xA5, 0x47, 0x4D, 0x6D, 0x8F,
+       0x34, 0xB1, 0x53, 0x4A, 0x93, 0x6A, 0x18,
+       0xB0, 0xE0, 0xD2, 0x0E, 0xAB, 0x86, 0xBC,
+       0x9C, 0x6D, 0x6A, 0x52, 0x07, 0x19, 0x4E,
+       0x67, 0xFA, 0x35, 0x55, 0x1B, 0x56, 0x80,
+       0x26, 0x7B, 0x00, 0x64, 0x1C, 0x0F, 0x21,
+       0x2D, 0x18, 0xEC, 0xA8, 0xD7, 0x32, 0x7E,
+       0xD9, 0x1F, 0xE7, 0x64, 0xA8, 0x4E, 0xA1,
+       0xB4, 0x3F, 0xF5, 0xB4, 0xF6, 0xE8, 0xE6,
+       0x2F, 0x05, 0xC6, 0x61, 0xDE, 0xFB, 0x25,
+       0x88, 0x77, 0xC3, 0x5B, 0x18, 0xA1, 0x51,
+       0xD5, 0xC4, 0x14, 0xAA, 0xAD, 0x97, 0xBA,
+       0x3E, 0x49, 0x93, 0x32, 0xE5, 0x96, 0x07,
+       0x8E, 0x60, 0x0D, 0xEB, 0x81, 0x14, 0x9C,
+       0x44, 0x1C, 0xE9, 0x57, 0x82, 0xF2, 0x2A,
+       0x28, 0x25, 0x63, 0xC5, 0xBA, 0xC1, 0x41,
+       0x14, 0x23, 0x60, 0x5D, 0x1A, 0xE1, 0xAF,
+       0xAE, 0x2C, 0x8B, 0x06, 0x60, 0x23, 0x7E,
+       0xC1, 0x28, 0xAA, 0x0F, 0xE3, 0x46, 0x4E,
+       0x43, 0x58, 0x11, 0x5D, 0xB8, 0x4C, 0xC3,
+       0xB5, 0x23, 0x07, 0x3A, 0x28, 0xD4, 0x54,
+       0x98, 0x84, 0xB8, 0x1F, 0xF7, 0x0E, 0x10,
+       0xBF, 0x36, 0x1C, 0x13, 0x72, 0x96, 0x28,
+       0xD5, 0x34, 0x8F, 0x07, 0x21, 0x1E, 0x7E,
+       0x4C, 0xF4, 0xF1, 0x8B, 0x28, 0x60, 0x90,
+       0xBD, 0xB1, 0x24, 0x0B, 0x66, 0xD6, 0xCD,
+       0x4A, 0xFC, 0xEA, 0xDC, 0x00, 0xCA, 0x44,
+       0x6C, 0xE0, 0x50, 0x50, 0xFF, 0x18, 0x3A,
+       0xD2, 0xBB, 0xF1, 0x18, 0xC1, 0xFC, 0x0E,
+       0xA5, 0x1F, 0x97, 0xD2, 0x2B, 0x8F, 0x7E,
+       0x46, 0x70, 0x5D, 0x45, 0x27, 0xF4, 0x5B,
+       0x42, 0xAE, 0xFF, 0x39, 0x58, 0x53, 0x37,
+       0x6F, 0x69, 0x7D, 0xD5, 0xFD, 0xF2, 0xC5,
+       0x18, 0x7D, 0x7D, 0x5F, 0x0E, 0x2E, 0xB8,
+       0xD4, 0x3F, 0x17, 0xBA, 0x0F, 0x7C, 0x60,
+       0xFF, 0x43, 0x7F, 0x53, 0x5D, 0xFE, 0xF2,
+       0x98, 0x33, 0xBF, 0x86, 0xCB, 0xE8, 0x8E,
+       0xA4, 0xFB, 0xD4, 0x22, 0x1E, 0x84, 0x11,
+       0x72, 0x83, 0x54, 0xFA, 0x30, 0xA7, 0x00,
+       0x8F, 0x15, 0x4A, 0x41, 0xC7, 0xFC, 0x46,
+       0x6B, 0x46, 0x45, 0xDB, 0xE2, 0xE3, 0x21,
+       0x26, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF
 };
 
 const gnutls_datum_t gnutls_ffdhe_8192_group_prime = {
        (void *) ffdhe_params_8192, sizeof(ffdhe_params_8192)
 };
+const gnutls_datum_t gnutls_ffdhe_8192_group_q = {
+       (void *) ffdhe_q_8192, sizeof(ffdhe_q_8192)
+};
+const gnutls_datum_t gnutls_ffdhe_8192_group_generator = {
+       (void *) &ffdhe_generator, sizeof(ffdhe_generator)
+};
 const unsigned int gnutls_ffdhe_8192_key_bits = 512;
 
 #endif
index ccf342bf4c50baae9b6914281abc68cb7ad57447..06bc2e1be4af35a3c08ef5e20d677f90b7e501c7 100644 (file)
--- a/lib/dh.c
+++ b/lib/dh.c
@@ -224,25 +224,14 @@ int
 gnutls_dh_params_import_dsa(gnutls_dh_params_t dh_params, gnutls_x509_privkey_t key)
 {
        gnutls_datum_t p, g, q;
-       bigint_t tmp_q;
        int ret;
 
        ret = gnutls_x509_privkey_export_dsa_raw(key, &p, &q, &g, NULL, NULL);
        if (ret < 0)
                return gnutls_assert_val(ret);
 
-       ret = _gnutls_mpi_init_scan_nz(&tmp_q, q.data, q.size);
-       if (ret < 0) {
-               gnutls_assert();
-               ret = GNUTLS_E_MPI_SCAN_FAILED;
-               goto cleanup;
-       }
+       ret = gnutls_dh_params_import_raw3(dh_params, &p, &q, &g);
 
-       ret = gnutls_dh_params_import_raw2(dh_params, &p, &g, _gnutls_mpi_get_nbits(tmp_q));
-
-       _gnutls_mpi_release(&tmp_q);
-
- cleanup:
        gnutls_free(p.data);
        gnutls_free(g.data);
        gnutls_free(q.data);
@@ -295,6 +284,64 @@ gnutls_dh_params_import_raw2(gnutls_dh_params_t dh_params,
        return 0;
 }
 
+/**
+ * gnutls_dh_params_import_raw3:
+ * @dh_params: The parameters
+ * @prime: holds the new prime
+ * @q: holds the subgroup if available, otherwise NULL
+ * @generator: holds the new generator
+ *
+ * This function will replace the pair of prime and generator for use
+ * in the Diffie-Hellman key exchange.  The new parameters should be
+ * stored in the appropriate gnutls_datum.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned,
+ *   otherwise a negative error code is returned.
+ **/
+int
+gnutls_dh_params_import_raw3(gnutls_dh_params_t dh_params,
+                            const gnutls_datum_t * prime,
+                            const gnutls_datum_t * q,
+                            const gnutls_datum_t * generator)
+{
+       bigint_t tmp_p, tmp_g, tmp_q = NULL;
+
+       if (_gnutls_mpi_init_scan_nz(&tmp_p, prime->data, prime->size)) {
+               gnutls_assert();
+               return GNUTLS_E_MPI_SCAN_FAILED;
+       }
+
+       if (_gnutls_mpi_init_scan_nz(&tmp_g, generator->data,
+                                    generator->size)) {
+               _gnutls_mpi_release(&tmp_p);
+               gnutls_assert();
+               return GNUTLS_E_MPI_SCAN_FAILED;
+       }
+
+       if (q) {
+               if (_gnutls_mpi_init_scan_nz(&tmp_q, q->data, q->size)) {
+                       _gnutls_mpi_release(&tmp_p);
+                       _gnutls_mpi_release(&tmp_g);
+                       gnutls_assert();
+                       return GNUTLS_E_MPI_SCAN_FAILED;
+               }
+       } else if (_gnutls_fips_mode_enabled()) {
+               /* Mandatory in FIPS mode */
+               gnutls_assert();
+               return GNUTLS_E_DH_PRIME_UNACCEPTABLE;
+       }
+
+       /* store the generated values
+        */
+       dh_params->params[0] = tmp_p;
+       dh_params->params[1] = tmp_g;
+       dh_params->params[2] = tmp_q;
+       if (tmp_q)
+               dh_params->q_bits = _gnutls_mpi_get_nbits(tmp_q);
+
+       return 0;
+}
+
 /**
  * gnutls_dh_params_init:
  * @dh_params: The parameters
@@ -330,6 +377,7 @@ void gnutls_dh_params_deinit(gnutls_dh_params_t dh_params)
 
        _gnutls_mpi_release(&dh_params->params[0]);
        _gnutls_mpi_release(&dh_params->params[1]);
+       _gnutls_mpi_release(&dh_params->params[2]);
 
        gnutls_free(dh_params);
 
@@ -353,6 +401,8 @@ int gnutls_dh_params_cpy(gnutls_dh_params_t dst, gnutls_dh_params_t src)
 
        dst->params[0] = _gnutls_mpi_copy(src->params[0]);
        dst->params[1] = _gnutls_mpi_copy(src->params[1]);
+       if (src->params[2])
+               dst->params[2] = _gnutls_mpi_copy(src->params[2]);
        dst->q_bits = src->q_bits;
 
        if (dst->params[0] == NULL || dst->params[1] == NULL)
index 63dfaa61c8e3fa259c8c4e46b65dfa52d7bedaae..177a8be01891b66862b6ba068fb3cfb687e5b39e 100644 (file)
@@ -1007,9 +1007,9 @@ struct gnutls_priority_st {
 /* DH and RSA parameters types.
  */
 typedef struct gnutls_dh_params_int {
-       /* [0] is the prime, [1] is the generator.
+       /* [0] is the prime, [1] is the generator, [2] is Q if available.
         */
-       bigint_t params[2];
+       bigint_t params[3];
        int q_bits;             /* length of q in bits. If zero then length is unknown.
                                 */
 } dh_params_st;
index 87ce08823b1c47737ad1a473f54543d26b616bdf..1555ab3338d4841db4ac2de1f999d961a539e9be 100644 (file)
@@ -2241,6 +2241,10 @@ int gnutls_dh_params_import_raw2(gnutls_dh_params_t dh_params,
                                 const gnutls_datum_t * prime,
                                 const gnutls_datum_t * generator,
                                 unsigned key_bits);
+int gnutls_dh_params_import_raw3(gnutls_dh_params_t dh_params,
+                                const gnutls_datum_t * prime,
+                                const gnutls_datum_t * q,
+                                const gnutls_datum_t * generator);
 int gnutls_dh_params_import_pkcs3(gnutls_dh_params_t params,
                                  const gnutls_datum_t * pkcs3_params,
                                  gnutls_x509_crt_fmt_t format);
@@ -2413,22 +2417,27 @@ extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_1024_group_generator;
  */
 
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_8192_group_prime;
+extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_8192_group_q;
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_8192_group_generator;
 extern _SYM_EXPORT const unsigned int gnutls_ffdhe_8192_key_bits;
 
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_6144_group_prime;
+extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_6144_group_q;
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_6144_group_generator;
 extern _SYM_EXPORT const unsigned int gnutls_ffdhe_6144_key_bits;
 
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_4096_group_prime;
+extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_4096_group_q;
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_4096_group_generator;
 extern _SYM_EXPORT const unsigned int gnutls_ffdhe_4096_key_bits;
 
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_3072_group_prime;
+extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_3072_group_q;
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_3072_group_generator;
 extern _SYM_EXPORT const unsigned int gnutls_ffdhe_3072_key_bits;
 
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_2048_group_prime;
+extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_2048_group_q;
 extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_2048_group_generator;
 extern _SYM_EXPORT const unsigned int gnutls_ffdhe_2048_key_bits;
 
index 2ed202e279048573fb6c230077e1863a43a38230..f200c841d77c25e70bbfb2e3e0757506efb4220e 100644 (file)
@@ -1278,6 +1278,12 @@ GNUTLS_3_6_8
  global:
        gnutls_prf_early;
        gnutls_record_set_max_recv_size;
+       gnutls_dh_params_import_raw3;
+       gnutls_ffdhe_2048_group_q;
+       gnutls_ffdhe_3072_group_q;
+       gnutls_ffdhe_4096_group_q;
+       gnutls_ffdhe_6144_group_q;
+       gnutls_ffdhe_8192_group_q;
 } GNUTLS_3_6_6;
 
 GNUTLS_FIPS140_3_4 {
index 1874bca54f5dce8b71903b6d177766e71a6f32e5..6bb2cef87790dc99ce92c72efca16c92e11afc14 100644 (file)
@@ -1550,6 +1550,8 @@ int _gnutls_dh_compute_key(gnutls_dh_params_t dh_params,
 
        priv.params[DH_P] = _gnutls_mpi_copy(dh_params->params[0]);
        priv.params[DH_G] = _gnutls_mpi_copy(dh_params->params[1]);
+       if (dh_params->params[2])
+               priv.params[DH_Q] = _gnutls_mpi_copy(dh_params->params[2]);
 
        if (_gnutls_mpi_init_scan_nz
                    (&priv.params[DH_X], priv_key->data,
@@ -1559,7 +1561,7 @@ int _gnutls_dh_compute_key(gnutls_dh_params_t dh_params,
                goto cleanup;
        }
 
-       priv.params_nr = 3; /* include empty q */
+       priv.params_nr = 3; /* include, possibly empty, q */
        priv.algo = GNUTLS_PK_DH;
 
        Z->data = NULL;
index 173729312efe51d43d693f150f912c61d8bd195c..217b23b762230b4ad622ca8feed2fe7c4ab6cc74 100644 (file)
@@ -41,8 +41,8 @@ int _gnutls_dh_compute_key(gnutls_dh_params_t dh_params,
                           const gnutls_datum_t *pub_key,
                           const gnutls_datum_t *peer_key, gnutls_datum_t *Z);
 
-static void params(gnutls_dh_params_t *dh_params, unsigned int key_bits,
-                  const gnutls_datum_t *p, const gnutls_datum_t *g)
+static void params(gnutls_dh_params_t *dh_params, const gnutls_datum_t *p,
+                  const gnutls_datum_t *q, const gnutls_datum_t *g)
 {
        int ret;
 
@@ -50,7 +50,7 @@ static void params(gnutls_dh_params_t *dh_params, unsigned int key_bits,
        if (ret != 0)
                fail("error\n");
 
-       ret = gnutls_dh_params_import_raw2(*dh_params, p, g, key_bits);
+       ret = gnutls_dh_params_import_raw3(*dh_params, p, q, g);
        if (ret != 0)
                fail("error\n");
 }
@@ -65,32 +65,33 @@ static void genkey(gnutls_dh_params_t *dh_params,
                fail("error\n");
 }
 
-static void compute_key(gnutls_dh_params_t *dh_params,
+static void compute_key(const char *name, gnutls_dh_params_t *dh_params,
                        gnutls_datum_t *priv_key, gnutls_datum_t *pub_key,
                        const gnutls_datum_t *peer_key, int expect_error,
                        gnutls_datum_t *result, bool expect_success)
 {
-       gnutls_datum_t Z;
+       gnutls_datum_t Z = { 0 };
        bool success;
        int ret;
 
        ret = _gnutls_dh_compute_key(*dh_params, priv_key, pub_key,
                                     peer_key, &Z);
        if (expect_error != ret)
-               fail("error (%d)\n", ret);
+               fail("%s: error %d (expected %d)\n", name, ret, expect_error);
 
        if (result) {
                success = (Z.size != result->size &&
                           memcmp(Z.data, result->data, Z.size));
                if (success != expect_success)
-                       fail("error\n");
+                       fail("%s: failed to match result\n", name);
        }
        gnutls_free(Z.data);
 }
 
 struct dh_test_data {
-       const unsigned int key_size;
+       const char *name;
        const gnutls_datum_t prime;
+       const gnutls_datum_t q;
        const gnutls_datum_t generator;
        const gnutls_datum_t peer_key;
        int expected_error;
@@ -100,45 +101,60 @@ void doit(void)
 {
        struct dh_test_data test_data[] = {
                {
-                        /* y == 0 */
-                       gnutls_ffdhe_2048_key_bits,
+                       "[y == 0]",
                        gnutls_ffdhe_2048_group_prime,
+                       gnutls_ffdhe_2048_group_q,
                        gnutls_ffdhe_2048_group_generator,
                        { (void *)"\x00", 1 },
                        GNUTLS_E_MPI_SCAN_FAILED
                },
                {
-                        /* y < 2 */
-                       gnutls_ffdhe_2048_key_bits,
+                       "[y < 2]",
                        gnutls_ffdhe_2048_group_prime,
+                       gnutls_ffdhe_2048_group_q,
                        gnutls_ffdhe_2048_group_generator,
                        { (void *)"\x01", 1 },
                        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER
                },
                {
-                        /* y > p - 2 */
-                       gnutls_ffdhe_2048_key_bits,
+                       "[y > p - 2]",
                        gnutls_ffdhe_2048_group_prime,
+                       gnutls_ffdhe_2048_group_q,
                        gnutls_ffdhe_2048_group_generator,
                        gnutls_ffdhe_2048_group_prime,
                        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER
                },
-               { 0 }
+               {
+                       "[y ^ q mod p == 1]",
+                       gnutls_ffdhe_2048_group_prime,
+                       gnutls_ffdhe_2048_group_q,
+                       gnutls_ffdhe_2048_group_generator,
+                       gnutls_ffdhe_2048_group_q,
+                       GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER
+               },
+               {
+                       "Legal Input",
+                       gnutls_ffdhe_2048_group_prime,
+                       gnutls_ffdhe_2048_group_q,
+                       gnutls_ffdhe_2048_group_generator,
+                       { (void *)"\x02", 1 },
+                       0
+               },
+               { NULL }
        };
 
-       for (int i = 0; test_data[i].key_size != 0; i++) {
+       for (int i = 0; test_data[i].name != NULL; i++) {
                gnutls_datum_t priv_key, pub_key;
                gnutls_dh_params_t dh_params;
 
-               params(&dh_params, test_data[i].key_size,
-                      &test_data[i].prime, &test_data[i].generator);
+               params(&dh_params, &test_data[i].prime, &test_data[i].q,
+                      &test_data[i].generator);
 
                genkey(&dh_params, &priv_key, &pub_key);
 
-               compute_key(&dh_params, &priv_key, &pub_key,
-                           &test_data[i].peer_key,
-                           test_data[i].expected_error,
-                           NULL, 0);
+               compute_key(test_data[i].name, &dh_params, &priv_key,
+                           &pub_key, &test_data[i].peer_key,
+                           test_data[i].expected_error, NULL, 0);
 
                gnutls_dh_params_deinit(dh_params);
                gnutls_free(priv_key.data);