@@ -22,7 +22,7 @@ use crate::ffi::{
22
22
free_arc, str_from_cstring, to_arc_mut_ptr, try_clone_arc, try_from, try_mut_slice_int,
23
23
try_ref_from_ptr, try_slice, try_slice_int, try_str, Castable , OwnershipArc , OwnershipRef ,
24
24
} ;
25
- use crate :: x509:: { load_certs, OwnedX509 } ;
25
+ use crate :: x509:: { load_certs, OwnedX509 , OwnedX509Stack } ;
26
26
use crate :: ShutdownResult ;
27
27
28
28
/// Makes a entry function definition.
@@ -162,7 +162,7 @@ entry! {
162
162
pub fn _SSL_CTX_ctrl( ctx: * mut SSL_CTX , cmd: c_int, larg: c_long, parg: * mut c_void) -> c_long {
163
163
let ctx = try_clone_arc!( ctx) ;
164
164
165
- let result = if let Ok ( mut _inner ) = ctx. lock( ) {
165
+ let result = if let Ok ( mut inner ) = ctx. lock( ) {
166
166
match SslCtrl :: try_from( cmd) {
167
167
Ok ( SslCtrl :: Mode ) => {
168
168
log:: warn!( "unimplemented SSL_CTX_set_mode()" ) ;
@@ -180,6 +180,23 @@ entry! {
180
180
// not a defined operation in the OpenSSL API
181
181
0
182
182
}
183
+ Ok ( SslCtrl :: SetChain ) => {
184
+ let chain = if parg. is_null( ) {
185
+ // this is `SSL_CTX_clear_chain_certs`
186
+ vec![ ]
187
+ } else {
188
+ match larg {
189
+ // this is `SSL_CTX_set1_chain` (incs ref)
190
+ 1 => OwnedX509Stack :: new_copy( parg as * mut stack_st_X509) . to_rustls( ) ,
191
+ // this is `SSL_CTX_set0_chain` (retain ref)
192
+ _ => OwnedX509Stack :: new( parg as * mut stack_st_X509) . to_rustls( ) ,
193
+ }
194
+ } ;
195
+
196
+ inner. stage_certificate_chain( chain) ;
197
+ C_INT_SUCCESS as i64
198
+ }
199
+
183
200
Err ( ( ) ) => {
184
201
log:: warn!( "unimplemented _SSL_CTX_ctrl(..., {cmd}, {larg}, ...)" ) ;
185
202
0
@@ -574,6 +591,22 @@ entry! {
574
591
let hostname = try_str!( parg as * const c_char) ;
575
592
inner. set_sni_hostname( hostname) as c_long
576
593
}
594
+ Ok ( SslCtrl :: SetChain ) => {
595
+ let chain = if parg. is_null( ) {
596
+ // this is `SSL_clear_chain_certs`
597
+ vec![ ]
598
+ } else {
599
+ match larg {
600
+ // this is `SSL_set1_chain` (incs ref)
601
+ 1 => OwnedX509Stack :: new_copy( parg as * mut stack_st_X509) . to_rustls( ) ,
602
+ // this is `SSL_set0_chain` (retain ref)
603
+ _ => OwnedX509Stack :: new( parg as * mut stack_st_X509) . to_rustls( ) ,
604
+ }
605
+ } ;
606
+
607
+ inner. stage_certificate_chain( chain) ;
608
+ C_INT_SUCCESS as i64
609
+ }
577
610
Err ( ( ) ) => {
578
611
log:: warn!( "unimplemented _SSL_ctrl(..., {cmd}, {larg}, ...)" ) ;
579
612
0
@@ -1231,6 +1264,7 @@ num_enum! {
1231
1264
Mode = 33 ,
1232
1265
SetMsgCallbackArg = 16 ,
1233
1266
SetTlsExtHostname = 55 ,
1267
+ SetChain = 88 ,
1234
1268
SetMaxProtoVersion = 124 ,
1235
1269
}
1236
1270
}
0 commit comments