@@ -374,12 +374,17 @@ pkcs11_terminate(void)
374
374
bool
375
375
pkcs11_addProvider (
376
376
const char * const provider ,
377
- const bool protected_auth ,
377
+ const bool _protected_auth ,
378
378
const unsigned private_mode ,
379
- const bool cert_private
379
+ const bool _cert_private ,
380
+ const unsigned init_flags
380
381
)
381
382
{
382
383
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 ;
383
388
384
389
ASSERT (provider != NULL );
385
390
@@ -396,29 +401,66 @@ pkcs11_addProvider(
396
401
provider
397
402
);
398
403
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 ;
412
428
}
413
429
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 :
414
457
dmsg (
415
458
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
+ );
420
462
421
- return rv == CKR_OK ;
463
+ return success ;
422
464
}
423
465
424
466
int
0 commit comments