@@ -25,6 +25,8 @@ pub(crate) struct DHPublicKey {
25
25
#[ pyo3:: pyclass( frozen, module = "cryptography.hazmat.bindings._rust.openssl.dh" ) ]
26
26
struct DHParameters {
27
27
dh : openssl:: dh:: Dh < openssl:: pkey:: Params > ,
28
+
29
+ is_dhx : bool ,
28
30
}
29
31
30
32
#[ pyo3:: pyfunction]
@@ -51,7 +53,7 @@ fn generate_parameters(
51
53
52
54
let dh = openssl:: dh:: Dh :: generate_params ( key_size, generator)
53
55
. map_err ( |_| pyo3:: exceptions:: PyValueError :: new_err ( "Unable to generate DH parameters" ) ) ?;
54
- Ok ( DHParameters { dh } )
56
+ Ok ( DHParameters { dh, is_dhx : false } )
55
57
}
56
58
57
59
pub ( crate ) fn private_key_from_pkey (
@@ -73,12 +75,14 @@ pub(crate) fn public_key_from_pkey(
73
75
#[ cfg( not( CRYPTOGRAPHY_IS_BORINGSSL ) ) ]
74
76
fn pkey_from_dh < T : openssl:: pkey:: HasParams > (
75
77
dh : openssl:: dh:: Dh < T > ,
78
+ is_dhx : bool ,
76
79
) -> CryptographyResult < openssl:: pkey:: PKey < T > > {
77
80
cfg_if:: cfg_if! {
78
81
if #[ cfg( CRYPTOGRAPHY_IS_LIBRESSL ) ] {
82
+ let _ = is_dhx;
79
83
Ok ( openssl:: pkey:: PKey :: from_dh( dh) ?)
80
84
} else {
81
- if dh . prime_q ( ) . is_some ( ) {
85
+ if is_dhx {
82
86
Ok ( openssl:: pkey:: PKey :: from_dhx( dh) ?)
83
87
} else {
84
88
Ok ( openssl:: pkey:: PKey :: from_dh( dh) ?)
@@ -87,6 +91,17 @@ fn pkey_from_dh<T: openssl::pkey::HasParams>(
87
91
}
88
92
}
89
93
94
+ fn is_dhx ( id : openssl:: pkey:: Id ) -> bool {
95
+ cfg_if:: cfg_if! {
96
+ if #[ cfg( any( CRYPTOGRAPHY_IS_LIBRESSL , CRYPTOGRAPHY_IS_BORINGSSL ) ) ] {
97
+ let _ = id;
98
+ false
99
+ } else {
100
+ id == openssl:: pkey:: Id :: DHX
101
+ }
102
+ }
103
+ }
104
+
90
105
#[ pyo3:: pyfunction]
91
106
#[ pyo3( signature = ( data, backend=None ) ) ]
92
107
fn from_der_parameters (
@@ -105,6 +120,7 @@ fn from_der_parameters(
105
120
106
121
Ok ( DHParameters {
107
122
dh : openssl:: dh:: Dh :: from_pqg ( p, q, g) ?,
123
+ is_dhx : asn1_params. q . is_some ( ) ,
108
124
} )
109
125
}
110
126
@@ -214,14 +230,18 @@ impl DHPrivateKey {
214
230
let orig_dh = self . pkey . dh ( ) . unwrap ( ) ;
215
231
let dh = clone_dh ( & orig_dh) ?;
216
232
217
- let pkey = pkey_from_dh ( dh. set_public_key ( orig_dh. public_key ( ) . to_owned ( ) ?) ?) ?;
233
+ let pkey = pkey_from_dh (
234
+ dh. set_public_key ( orig_dh. public_key ( ) . to_owned ( ) ?) ?,
235
+ is_dhx ( self . pkey . id ( ) ) ,
236
+ ) ?;
218
237
219
238
Ok ( DHPublicKey { pkey } )
220
239
}
221
240
222
241
fn parameters ( & self ) -> CryptographyResult < DHParameters > {
223
242
Ok ( DHParameters {
224
243
dh : clone_dh ( & self . pkey . dh ( ) . unwrap ( ) ) ?,
244
+ is_dhx : is_dhx ( self . pkey . id ( ) ) ,
225
245
} )
226
246
}
227
247
@@ -280,6 +300,8 @@ impl DHPublicKey {
280
300
fn parameters ( & self ) -> CryptographyResult < DHParameters > {
281
301
Ok ( DHParameters {
282
302
dh : clone_dh ( & self . pkey . dh ( ) . unwrap ( ) ) ?,
303
+
304
+ is_dhx : is_dhx ( self . pkey . id ( ) ) ,
283
305
} )
284
306
}
285
307
@@ -322,7 +344,7 @@ impl DHParameters {
322
344
fn generate_private_key ( & self ) -> CryptographyResult < DHPrivateKey > {
323
345
let dh = clone_dh ( & self . dh ) ?. generate_key ( ) ?;
324
346
Ok ( DHPrivateKey {
325
- pkey : pkey_from_dh ( dh) ?,
347
+ pkey : pkey_from_dh ( dh, self . is_dhx ) ?,
326
348
} )
327
349
}
328
350
@@ -421,9 +443,11 @@ impl DHPrivateNumbers {
421
443
) -> CryptographyResult < DHPrivateKey > {
422
444
let _ = backend;
423
445
424
- let dh = dh_parameters_from_numbers ( py, self . public_numbers . get ( ) . parameter_numbers . get ( ) ) ?;
446
+ let public_numbers = self . public_numbers . get ( ) ;
447
+ let parameter_numbers = public_numbers. parameter_numbers . get ( ) ;
448
+ let dh = dh_parameters_from_numbers ( py, parameter_numbers) ?;
425
449
426
- let pub_key = utils:: py_int_to_bn ( py, self . public_numbers . get ( ) . y . bind ( py) ) ?;
450
+ let pub_key = utils:: py_int_to_bn ( py, public_numbers. y . bind ( py) ) ?;
427
451
let priv_key = utils:: py_int_to_bn ( py, self . x . bind ( py) ) ?;
428
452
429
453
let dh = dh. set_key ( pub_key, priv_key) ?;
@@ -435,7 +459,7 @@ impl DHPrivateNumbers {
435
459
) ) ;
436
460
}
437
461
438
- let pkey = pkey_from_dh ( dh) ?;
462
+ let pkey = pkey_from_dh ( dh, parameter_numbers . q . is_some ( ) ) ?;
439
463
Ok ( DHPrivateKey { pkey } )
440
464
}
441
465
@@ -474,11 +498,12 @@ impl DHPublicNumbers {
474
498
) -> CryptographyResult < DHPublicKey > {
475
499
let _ = backend;
476
500
477
- let dh = dh_parameters_from_numbers ( py, self . parameter_numbers . get ( ) ) ?;
501
+ let parameter_numbers = self . parameter_numbers . get ( ) ;
502
+ let dh = dh_parameters_from_numbers ( py, parameter_numbers) ?;
478
503
479
504
let pub_key = utils:: py_int_to_bn ( py, self . y . bind ( py) ) ?;
480
505
481
- let pkey = pkey_from_dh ( dh. set_public_key ( pub_key) ?) ?;
506
+ let pkey = pkey_from_dh ( dh. set_public_key ( pub_key) ?, parameter_numbers . q . is_some ( ) ) ?;
482
507
483
508
Ok ( DHPublicKey { pkey } )
484
509
}
@@ -535,7 +560,10 @@ impl DHParameterNumbers {
535
560
let _ = backend;
536
561
537
562
let dh = dh_parameters_from_numbers ( py, self ) ?;
538
- Ok ( DHParameters { dh } )
563
+ Ok ( DHParameters {
564
+ dh,
565
+ is_dhx : self . q . is_some ( ) ,
566
+ } )
539
567
}
540
568
541
569
fn __eq__ (
0 commit comments