@@ -374,12 +374,17 @@ pkcs11_terminate(void)
374374bool
375375pkcs11_addProvider (
376376 const char * const provider ,
377- const bool protected_auth ,
377+ const bool _protected_auth ,
378378 const unsigned private_mode ,
379- const bool cert_private
379+ const bool _cert_private ,
380+ const unsigned init_flags
380381 )
381382{
382383 CK_RV rv = CKR_OK ;
384+ int success = true;
385+ PKCS11H_BOOL protected_auth = _protected_auth ;
386+ PKCS11H_BOOL cert_private = _cert_private ;
387+ CK_C_INITIALIZE_ARGS_PTR p_init_args ;
383388
384389 ASSERT (provider != NULL );
385390
@@ -396,29 +401,66 @@ pkcs11_addProvider(
396401 provider
397402 );
398403
399- if (
400- (rv = pkcs11h_addProvider (
401- provider ,
402- provider ,
403- protected_auth ,
404- private_mode ,
405- PKCS11H_SLOTEVENT_METHOD_AUTO ,
406- 0 ,
407- cert_private
408- )) != CKR_OK
409- )
410- {
411- msg (M_WARN , "PKCS#11: Cannot initialize provider '%s' %ld-'%s'" , provider , rv , pkcs11h_getMessage (rv ));
404+ if ((rv = pkcs11h_registerProvider (provider )) != CKR_OK ) {
405+ msg (M_WARN , "PKCS#11: Cannot register provider '%s' %ld-'%s'" , provider , rv , pkcs11h_getMessage (rv ));
406+ success = false;
407+ goto exit ;
408+ }
409+ if ((rv = pkcs11h_setProviderProperty (provider , PKCS11H_PROVIDER_PROPERTY_LOCATION , provider , strlen (provider ) + 1 )) != CKR_OK ) {
410+ msg (M_WARN , "PKCS#11: Cannot setup provider '%s' location '%s' %ld-'%s'" , provider , provider , rv , pkcs11h_getMessage (rv ));
411+ success = false;
412+ goto cleanup ;
413+ }
414+ if ((rv = pkcs11h_setProviderProperty (provider , PKCS11H_PROVIDER_PROPERTY_ALLOW_PROTECTED_AUTH , & protected_auth , sizeof (protected_auth ))) != CKR_OK ) {
415+ msg (M_WARN , "PKCS#11: Cannot setup provider '%s' ptorected auth mode '%s' %ld-'%s'" , provider , protected_auth ? "true" : "false" , rv , pkcs11h_getMessage (rv ));
416+ success = false;
417+ goto cleanup ;
418+ }
419+ if ((rv = pkcs11h_setProviderProperty (provider , PKCS11H_PROVIDER_PROPERTY_MASK_PRIVATE_MODE , & private_mode , sizeof (private_mode ))) != CKR_OK ) {
420+ msg (M_WARN , "PKCS#11: Cannot setup provider '%s' private mask mode '%08x' %ld-'%s'" , provider , private_mode , rv , pkcs11h_getMessage (rv ));
421+ success = false;
422+ goto cleanup ;
423+ }
424+ if ((rv = pkcs11h_setProviderProperty (provider , PKCS11H_PROVIDER_PROPERTY_CERT_IS_PRIVATE , & cert_private , sizeof (cert_private ))) != CKR_OK ) {
425+ msg (M_WARN , "PKCS#11: Cannot setup provider '%s' private cert mode '%s' %ld-'%s'" , provider , cert_private ? "true" : "false" , rv , pkcs11h_getMessage (rv ));
426+ success = false;
427+ goto cleanup ;
412428 }
413429
430+ // pkcs11-helper take ownership over this pointer
431+ if ((p_init_args = malloc (sizeof (* p_init_args ))) == NULL ) {
432+ msg (M_FATAL , "PKCS#11: Cannot allocate memory" );
433+ success = false;
434+ goto cleanup ;
435+ }
436+
437+ memset (p_init_args , 0 , sizeof (* p_init_args ));
438+ p_init_args -> flags = init_flags ;
439+
440+ if ((rv = pkcs11h_setProviderProperty (provider , PKCS11H_PROVIDER_PROPERTY_INIT_ARGS , & p_init_args , sizeof (p_init_args ))) != CKR_OK ) {
441+ msg (M_WARN , "PKCS#11: Cannot setup provider '%s' init flags '%08x' %ld-'%s'" , provider , init_flags , rv , pkcs11h_getMessage (rv ));
442+ free (p_init_args );
443+ success = false;
444+ goto cleanup ;
445+ }
446+ if ((rv = pkcs11h_initializeProvider (provider )) != CKR_OK ) {
447+ success = false;
448+ goto cleanup ;
449+ }
450+
451+ cleanup :
452+ if (!success ) {
453+ pkcs11h_removeProvider (provider );
454+ }
455+
456+ exit :
414457 dmsg (
415458 D_PKCS11_DEBUG ,
416- "PKCS#11: pkcs11_addProvider - return rv=%ld-'%s'" ,
417- rv ,
418- pkcs11h_getMessage (rv )
419- );
459+ "PKCS#11: pkcs11 registration is %s" ,
460+ success ? "success" : "failed"
461+ );
420462
421- return rv == CKR_OK ;
463+ return success ;
422464}
423465
424466int
0 commit comments