@@ -381,6 +381,35 @@ static void addIdentitiesToKeystore(JNIEnv *env, jobject keyStore)
381
381
382
382
#define ADDNULL (list ) (*env)->CallBooleanMethod (env, list, jm_listAdd, NULL )
383
383
384
+
385
+ static void addTrustSettingsToInputTrust(JNIEnv *env, jmethodID jm_listAdd, CFArrayRef trustSettings, jobject inputTrust)
386
+ {
387
+ CFIndex count = CFArrayGetCount (trustSettings);
388
+ for (int i = 0 ; i < count; i++) {
389
+ CFDictionaryRef oneTrust = (CFDictionaryRef ) CFArrayGetValueAtIndex (trustSettings, i);
390
+ CFIndex size = CFDictionaryGetCount (oneTrust);
391
+ const void * keys [size];
392
+ const void * values [size];
393
+ CFDictionaryGetKeysAndValues (oneTrust, keys, values);
394
+ for (int j = 0 ; j < size; j++) {
395
+ NSString * s = [NSString stringWithFormat: @" %@ " , keys[j]];
396
+ ADD (inputTrust, s);
397
+ s = [NSString stringWithFormat: @" %@ " , values[j]];
398
+ ADD (inputTrust, s);
399
+ }
400
+ SecPolicyRef certPolicy;
401
+ certPolicy = (SecPolicyRef)CFDictionaryGetValue (oneTrust, kSecTrustSettingsPolicy );
402
+ if (certPolicy != NULL ) {
403
+ CFDictionaryRef policyDict = SecPolicyCopyProperties (certPolicy);
404
+ ADD (inputTrust, @" SecPolicyOid" );
405
+ NSString * s = [NSString stringWithFormat: @" %@ " , CFDictionaryGetValue (policyDict, @" SecPolicyOid" )];
406
+ ADD (inputTrust, s);
407
+ CFRelease (policyDict);
408
+ }
409
+ ADDNULL (inputTrust);
410
+ }
411
+ }
412
+
384
413
static void addCertificatesToKeystore (JNIEnv *env, jobject keyStore)
385
414
{
386
415
// Search the user keychain list for all X509 certificates.
@@ -435,46 +464,40 @@ static void addCertificatesToKeystore(JNIEnv *env, jobject keyStore)
435
464
goto errOut;
436
465
}
437
466
438
- // Only add certificates with trusted settings
439
- CFArrayRef trustSettings;
440
- if (SecTrustSettingsCopyTrustSettings (certRef, kSecTrustSettingsDomainUser , &trustSettings)
441
- == errSecItemNotFound) {
442
- continue ;
443
- }
444
-
445
467
// See KeychainStore::createTrustedCertEntry for content of inputTrust
446
- jobject inputTrust = (*env)->NewObject (env, jc_arrayListClass, jm_arrayListCons);
447
- if (inputTrust == NULL ) {
468
+ // We load trust settings from domains kSecTrustSettingsDomainUser and kSecTrustSettingsDomainAdmin
469
+ // kSecTrustSettingsDomainSystem is ignored because it seems to only contain data for root certificates
470
+ jobject inputTrust = NULL ;
471
+ CFArrayRef trustSettings = NULL ;
472
+
473
+ // Load user trustSettings into inputTrust
474
+ if (SecTrustSettingsCopyTrustSettings (certRef, kSecTrustSettingsDomainUser , &trustSettings) == errSecSuccess && trustSettings != NULL ) {
475
+ inputTrust = (*env)->NewObject (env, jc_arrayListClass, jm_arrayListCons);
476
+ if (inputTrust == NULL ) {
477
+ CFRelease (trustSettings);
478
+ goto errOut;
479
+ }
480
+ addTrustSettingsToInputTrust (env, jm_listAdd, trustSettings, inputTrust);
448
481
CFRelease (trustSettings);
449
- goto errOut;
450
482
}
451
-
452
- // Dump everything inside trustSettings into inputTrust
453
- CFIndex count = CFArrayGetCount (trustSettings);
454
- for (int i = 0 ; i < count; i++) {
455
- CFDictionaryRef oneTrust = (CFDictionaryRef ) CFArrayGetValueAtIndex (trustSettings, i);
456
- CFIndex size = CFDictionaryGetCount (oneTrust);
457
- const void * keys [size];
458
- const void * values [size];
459
- CFDictionaryGetKeysAndValues (oneTrust, keys, values);
460
- for (int j = 0 ; j < size; j++) {
461
- NSString * s = [NSString stringWithFormat: @" %@ " , keys[j]];
462
- ADD (inputTrust, s);
463
- s = [NSString stringWithFormat: @" %@ " , values[j]];
464
- ADD (inputTrust, s);
483
+ // Load admin trustSettings into inputTrust
484
+ trustSettings = NULL ;
485
+ if (SecTrustSettingsCopyTrustSettings (certRef, kSecTrustSettingsDomainAdmin , &trustSettings) == errSecSuccess && trustSettings != NULL ) {
486
+ if (inputTrust == NULL ) {
487
+ inputTrust = (*env)->NewObject (env, jc_arrayListClass, jm_arrayListCons);
465
488
}
466
- SecPolicyRef certPolicy;
467
- certPolicy = (SecPolicyRef)CFDictionaryGetValue (oneTrust, kSecTrustSettingsPolicy );
468
- if (certPolicy != NULL ) {
469
- CFDictionaryRef policyDict = SecPolicyCopyProperties (certPolicy);
470
- ADD (inputTrust, @" SecPolicyOid" );
471
- NSString * s = [NSString stringWithFormat: @" %@ " , CFDictionaryGetValue (policyDict, @" SecPolicyOid" )];
472
- ADD (inputTrust, s);
473
- CFRelease (policyDict);
489
+ if (inputTrust == NULL ) {
490
+ CFRelease (trustSettings);
491
+ goto errOut;
474
492
}
475
- ADDNULL (inputTrust);
493
+ addTrustSettingsToInputTrust (env, jm_listAdd, trustSettings, inputTrust);
494
+ CFRelease (trustSettings);
495
+ }
496
+
497
+ // Only add certificates with trust settings
498
+ if (inputTrust == NULL ) {
499
+ continue ;
476
500
}
477
- CFRelease (trustSettings);
478
501
479
502
// Find the creation date.
480
503
jlong creationDate = getModDateFromItem (env, theItem);
0 commit comments