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