@@ -24,11 +24,8 @@ use crate::front::{
24
24
} ;
25
25
use crate :: key_id_managers:: on_disk_manager:: { OnDiskKeyIDManagerBuilder , DEFAULT_MAPPINGS_PATH } ;
26
26
use crate :: key_id_managers:: { KeyIdManagerConfig , KeyIdManagerType , ManageKeyIDs } ;
27
- use crate :: providers:: {
28
- core_provider:: CoreProviderBuilder , mbed_provider:: MbedProviderBuilder ,
29
- pkcs11_provider:: Pkcs11ProviderBuilder , Provide , ProviderConfig , ProviderType ,
30
- } ;
31
- use log:: { info, LevelFilter } ;
27
+ use crate :: providers:: { core_provider:: CoreProviderBuilder , Provide , ProviderConfig } ;
28
+ use log:: { error, LevelFilter } ;
32
29
use parsec_interface:: operations_protobuf:: ProtobufConverter ;
33
30
use parsec_interface:: requests:: AuthType ;
34
31
use parsec_interface:: requests:: { BodyType , ProviderID } ;
@@ -40,6 +37,15 @@ use std::sync::RwLock;
40
37
use std:: time:: Duration ;
41
38
use threadpool:: { Builder as ThreadPoolBuilder , ThreadPool } ;
42
39
40
+ #[ cfg( feature = "mbed-crypto-provider" ) ]
41
+ use crate :: providers:: mbed_provider:: MbedProviderBuilder ;
42
+ #[ cfg( feature = "pkcs11-provider" ) ]
43
+ use crate :: providers:: pkcs11_provider:: Pkcs11ProviderBuilder ;
44
+ #[ cfg( not( all( feature = "mbed-crypto-provider" , feature = "pkcs11-provider" ) ) ) ]
45
+ use log:: warn;
46
+ #[ cfg( any( feature = "mbed-crypto-provider" , feature = "pkcs11-provider" ) ) ]
47
+ use { crate :: providers:: ProviderType , log:: info} ;
48
+
43
49
const VERSION_MINOR : u8 = 0 ;
44
50
const VERSION_MAJOR : u8 = 1 ;
45
51
@@ -65,11 +71,16 @@ pub struct ServiceConfig {
65
71
pub struct ServiceBuilder ;
66
72
67
73
impl ServiceBuilder {
68
- pub fn build_service ( config : & ServiceConfig ) -> FrontEndHandler {
74
+ pub fn build_service ( config : & ServiceConfig ) -> Option < FrontEndHandler > {
69
75
let key_id_managers = build_key_id_managers ( & config. key_manager ) ;
70
76
71
77
let providers = build_providers ( & config. provider , key_id_managers) ;
72
78
79
+ if providers. is_empty ( ) {
80
+ error ! ( "Parsec needs at least one provider to start. No valid provider could be created from the configuration." ) ;
81
+ return None ;
82
+ }
83
+
73
84
let backend_handlers = build_backend_handlers ( providers) ;
74
85
75
86
let dispatcher = DispatcherBuilder :: new ( )
@@ -78,10 +89,12 @@ impl ServiceBuilder {
78
89
79
90
let simple_authenticator = Box :: from ( SimpleAuthenticator { } ) ;
80
91
81
- FrontEndHandlerBuilder :: new ( )
82
- . with_dispatcher ( dispatcher)
83
- . with_authenticator ( AuthType :: Simple , simple_authenticator)
84
- . build ( )
92
+ Some (
93
+ FrontEndHandlerBuilder :: new ( )
94
+ . with_dispatcher ( dispatcher)
95
+ . with_authenticator ( AuthType :: Simple , simple_authenticator)
96
+ . build ( ) ,
97
+ )
85
98
}
86
99
87
100
pub fn start_listener ( config : & ListenerConfig ) -> Box < dyn Listen > {
@@ -145,36 +158,41 @@ fn build_providers(
145
158
) -> HashMap < ProviderID , Provider > {
146
159
let mut map = HashMap :: new ( ) ;
147
160
for config in configs {
148
- let key_id_manager = key_id_managers
149
- . get ( & config . key_id_manager )
150
- . unwrap_or_else ( || {
151
- panic ! (
161
+ let key_id_manager = match key_id_managers. get ( & config . key_id_manager ) {
162
+ Some ( key_id_manager) => key_id_manager ,
163
+ None => {
164
+ error ! (
152
165
"Key ID manager with specified name was not found ({})" ,
153
166
config. key_id_manager
154
- )
155
- } ) ;
156
- map. insert (
157
- config. provider_type . to_provider_id ( ) ,
158
- get_provider ( config, key_id_manager. clone ( ) ) ,
159
- ) ;
167
+ ) ;
168
+ continue ;
169
+ }
170
+ } ;
171
+ let provider = match get_provider ( config, key_id_manager. clone ( ) ) {
172
+ Some ( provider) => provider,
173
+ None => continue ,
174
+ } ;
175
+ map. insert ( config. provider_type . to_provider_id ( ) , provider) ;
160
176
}
161
177
162
178
map
163
179
}
164
180
165
- fn get_provider ( config : & ProviderConfig , key_id_manager : KeyIdManager ) -> Provider {
181
+ fn get_provider ( config : & ProviderConfig , key_id_manager : KeyIdManager ) -> Option < Provider > {
166
182
match config. provider_type {
183
+ #[ cfg( feature = "mbed-crypto-provider" ) ]
167
184
ProviderType :: MbedProvider => {
168
185
info ! ( "Creating a Mbed Crypto Provider." ) ;
169
- Box :: from (
186
+ Some ( Box :: from (
170
187
MbedProviderBuilder :: new ( )
171
188
. with_key_id_store ( key_id_manager)
172
189
. build ( ) ,
173
- )
190
+ ) )
174
191
}
192
+ #[ cfg( feature = "pkcs11-provider" ) ]
175
193
ProviderType :: Pkcs11Provider => {
176
194
info ! ( "Creating a PKCS 11 Provider." ) ;
177
- Box :: from (
195
+ Some ( Box :: from (
178
196
Pkcs11ProviderBuilder :: new ( )
179
197
. with_key_id_store ( key_id_manager)
180
198
. with_pkcs11_library_path ( config. library_path . clone ( ) . expect (
@@ -185,7 +203,15 @@ fn get_provider(config: &ProviderConfig, key_id_manager: KeyIdManager) -> Provid
185
203
) )
186
204
. with_user_pin ( config. user_pin . clone ( ) )
187
205
. build ( )
188
- )
206
+ ) )
207
+ }
208
+ #[ cfg( not( all( feature = "mbed-crypto-provider" , feature = "pkcs11-provider" ) ) ) ]
209
+ _ => {
210
+ warn ! (
211
+ "Provider \" {:?}\" chosen in the configuration was not compiled in Parsec binary." ,
212
+ config. provider_type
213
+ ) ;
214
+ None
189
215
}
190
216
}
191
217
}
0 commit comments