@@ -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,13 @@ 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 ) ] {
79
82
Ok ( openssl:: pkey:: PKey :: from_dh( dh) ?)
80
83
} else {
81
- if dh . prime_q ( ) . is_some ( ) {
84
+ if is_dhx {
82
85
Ok ( openssl:: pkey:: PKey :: from_dhx( dh) ?)
83
86
} else {
84
87
Ok ( openssl:: pkey:: PKey :: from_dh( dh) ?)
@@ -87,6 +90,17 @@ fn pkey_from_dh<T: openssl::pkey::HasParams>(
87
90
}
88
91
}
89
92
93
+ fn is_dhx ( id : openssl:: pkey:: Id ) -> bool {
94
+ cfg_if:: cfg_if! {
95
+ if #[ cfg( any( CRYPTOGRAPHY_IS_LIBRESSL , CRYPTOGRAPHY_IS_BORINGSSL ) ) ] {
96
+ let _ = is_dhx;
97
+ false
98
+ } else {
99
+ id == openssl:: pkey:: Id :: DHX
100
+ }
101
+ }
102
+ }
103
+
90
104
#[ pyo3:: pyfunction]
91
105
#[ pyo3( signature = ( data, backend=None ) ) ]
92
106
fn from_der_parameters (
@@ -105,6 +119,7 @@ fn from_der_parameters(
105
119
106
120
Ok ( DHParameters {
107
121
dh : openssl:: dh:: Dh :: from_pqg ( p, q, g) ?,
122
+ is_dhx : asn1_params. q . is_some ( ) ,
108
123
} )
109
124
}
110
125
@@ -214,14 +229,18 @@ impl DHPrivateKey {
214
229
let orig_dh = self . pkey . dh ( ) . unwrap ( ) ;
215
230
let dh = clone_dh ( & orig_dh) ?;
216
231
217
- let pkey = pkey_from_dh ( dh. set_public_key ( orig_dh. public_key ( ) . to_owned ( ) ?) ?) ?;
232
+ let pkey = pkey_from_dh (
233
+ dh. set_public_key ( orig_dh. public_key ( ) . to_owned ( ) ?) ?,
234
+ is_dhx ( self . pkey . id ( ) ) ,
235
+ ) ?;
218
236
219
237
Ok ( DHPublicKey { pkey } )
220
238
}
221
239
222
240
fn parameters ( & self ) -> CryptographyResult < DHParameters > {
223
241
Ok ( DHParameters {
224
242
dh : clone_dh ( & self . pkey . dh ( ) . unwrap ( ) ) ?,
243
+ is_dhx : is_dhx ( self . pkey . id ( ) ) ,
225
244
} )
226
245
}
227
246
@@ -280,6 +299,8 @@ impl DHPublicKey {
280
299
fn parameters ( & self ) -> CryptographyResult < DHParameters > {
281
300
Ok ( DHParameters {
282
301
dh : clone_dh ( & self . pkey . dh ( ) . unwrap ( ) ) ?,
302
+
303
+ is_dhx : is_dhx ( self . pkey . id ( ) ) ,
283
304
} )
284
305
}
285
306
@@ -322,7 +343,7 @@ impl DHParameters {
322
343
fn generate_private_key ( & self ) -> CryptographyResult < DHPrivateKey > {
323
344
let dh = clone_dh ( & self . dh ) ?. generate_key ( ) ?;
324
345
Ok ( DHPrivateKey {
325
- pkey : pkey_from_dh ( dh) ?,
346
+ pkey : pkey_from_dh ( dh, self . is_dhx ) ?,
326
347
} )
327
348
}
328
349
@@ -421,9 +442,11 @@ impl DHPrivateNumbers {
421
442
) -> CryptographyResult < DHPrivateKey > {
422
443
let _ = backend;
423
444
424
- let dh = dh_parameters_from_numbers ( py, self . public_numbers . get ( ) . parameter_numbers . get ( ) ) ?;
445
+ let public_numbers = self . public_numbers . get ( ) ;
446
+ let parameter_numbers = public_numbers. parameter_numbers . get ( ) ;
447
+ let dh = dh_parameters_from_numbers ( py, parameter_numbers) ?;
425
448
426
- let pub_key = utils:: py_int_to_bn ( py, self . public_numbers . get ( ) . y . bind ( py) ) ?;
449
+ let pub_key = utils:: py_int_to_bn ( py, public_numbers. y . bind ( py) ) ?;
427
450
let priv_key = utils:: py_int_to_bn ( py, self . x . bind ( py) ) ?;
428
451
429
452
let dh = dh. set_key ( pub_key, priv_key) ?;
@@ -435,7 +458,7 @@ impl DHPrivateNumbers {
435
458
) ) ;
436
459
}
437
460
438
- let pkey = pkey_from_dh ( dh) ?;
461
+ let pkey = pkey_from_dh ( dh, parameter_numbers . q . is_some ( ) ) ?;
439
462
Ok ( DHPrivateKey { pkey } )
440
463
}
441
464
@@ -474,11 +497,12 @@ impl DHPublicNumbers {
474
497
) -> CryptographyResult < DHPublicKey > {
475
498
let _ = backend;
476
499
477
- let dh = dh_parameters_from_numbers ( py, self . parameter_numbers . get ( ) ) ?;
500
+ let parameter_numbers = self . parameter_numbers . get ( ) ;
501
+ let dh = dh_parameters_from_numbers ( py, parameter_numbers) ?;
478
502
479
503
let pub_key = utils:: py_int_to_bn ( py, self . y . bind ( py) ) ?;
480
504
481
- let pkey = pkey_from_dh ( dh. set_public_key ( pub_key) ?) ?;
505
+ let pkey = pkey_from_dh ( dh. set_public_key ( pub_key) ?, parameter_numbers . q . is_some ( ) ) ?;
482
506
483
507
Ok ( DHPublicKey { pkey } )
484
508
}
@@ -535,7 +559,10 @@ impl DHParameterNumbers {
535
559
let _ = backend;
536
560
537
561
let dh = dh_parameters_from_numbers ( py, self ) ?;
538
- Ok ( DHParameters { dh } )
562
+ Ok ( DHParameters {
563
+ dh,
564
+ is_dhx : self . q . is_some ( ) ,
565
+ } )
539
566
}
540
567
541
568
fn __eq__ (
0 commit comments