]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTool/macOS/trusted_cert_dump.c
Security-59306.11.20.tar.gz
[apple/security.git] / SecurityTool / macOS / trusted_cert_dump.c
diff --git a/SecurityTool/macOS/trusted_cert_dump.c b/SecurityTool/macOS/trusted_cert_dump.c
new file mode 100644 (file)
index 0000000..4123ede
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2003-2009,2012,2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ *
+ * trusted_cert_dump.c
+ */
+
+#include "security_tool.h"
+
+#include "trusted_cert_dump.h"
+#include "trusted_cert_utils.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include <Security/Security.h>
+#include <Security/cssmapple.h>
+#include <Security/SecTrustSettings.h>
+#include <Security/oidsalg.h>
+#include <security_cdsa_utils/cuFileIo.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+/*
+ * Display a Trust Settings array as obtained from
+ * SecTrustSettingsCopyTrustSettings().
+ */
+static int displayTrustSettings(
+       CFArrayRef      trustSettings)
+{
+       /* must always be there though it may be empty */
+       if(trustSettings == NULL) {
+               fprintf(stderr, "***displayTrustSettings: missing trust settings array");
+               return -1;
+       }
+       if(CFGetTypeID(trustSettings) != CFArrayGetTypeID()) {
+               fprintf(stderr, "***displayTrustSettings: malformed trust settings array");
+               return -1;
+       }
+
+       int ourRtn = 0;
+       CFIndex numUseConstraints = CFArrayGetCount(trustSettings);
+       indentIncr();
+       indent(); printf("Number of trust settings : %ld\n", (long)numUseConstraints);
+       OSStatus ortn;
+       SecPolicyRef certPolicy;
+       SecTrustedApplicationRef certApp;
+       CFDictionaryRef ucDict;
+       CFStringRef policyStr;
+       CFNumberRef cfNum;
+       CFIndex ucDex;
+
+       /* grind thru the trust settings dictionaries */
+       for(ucDex=0; ucDex<numUseConstraints; ucDex++) {
+               indent(); printf("Trust Setting %ld:\n", (long)ucDex);
+               indentIncr();
+
+               ucDict = (CFDictionaryRef)CFArrayGetValueAtIndex(trustSettings, ucDex);
+               if(CFGetTypeID(ucDict) != CFDictionaryGetTypeID()) {
+                       fprintf(stderr, "***displayTrustSettings: malformed usage constraints dictionary");
+                       ourRtn = -1;
+                       goto nextAp;
+               }
+
+               /* policy - optional */
+               certPolicy = (SecPolicyRef)CFDictionaryGetValue(ucDict, kSecTrustSettingsPolicy);
+               if(certPolicy != NULL) {
+                       if(CFGetTypeID(certPolicy) != SecPolicyGetTypeID()) {
+                               fprintf(stderr, "***displayTrustSettings: malformed certPolicy");
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       CSSM_OID policyOid;
+                       ortn = SecPolicyGetOID(certPolicy, &policyOid);
+                       if(ortn) {
+                               cssmPerror("SecPolicyGetOID", ortn);
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       indent(); printf("Policy OID            : %s\n",
+                                       oidToOidString(&policyOid));
+               }
+
+               /* app - optional  */
+               certApp = (SecTrustedApplicationRef)CFDictionaryGetValue(ucDict,
+                       kSecTrustSettingsApplication);
+               if(certApp != NULL) {
+                       if(CFGetTypeID(certApp) != SecTrustedApplicationGetTypeID()) {
+                               fprintf(stderr, "***displayTrustSettings: malformed certApp");
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       CFDataRef appPath = NULL;
+                       ortn = SecTrustedApplicationCopyData(certApp, &appPath);
+                       if(ortn) {
+                               cssmPerror("SecTrustedApplicationCopyData", ortn);
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       indent(); printf("Application           : %s", CFDataGetBytePtr(appPath));
+                       printf("\n");
+                       CFRelease(appPath);
+               }
+
+               /* policy string */
+               policyStr = (CFStringRef)CFDictionaryGetValue(ucDict, kSecTrustSettingsPolicyString);
+               if(policyStr != NULL) {
+                       if(CFGetTypeID(policyStr) != CFStringGetTypeID()) {
+                               fprintf(stderr, "***displayTrustSettings: malformed policyStr");
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       indent(); printf("Policy String         : ");
+                       printCfStr(policyStr); printf("\n");
+               }
+
+               /* Allowed error */
+               cfNum = (CFNumberRef)CFDictionaryGetValue(ucDict, kSecTrustSettingsAllowedError);
+               if(cfNum != NULL) {
+                       if(CFGetTypeID(cfNum) != CFNumberGetTypeID()) {
+                               fprintf(stderr, "***displayTrustSettings: malformed allowedError");
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       indent(); printf("Allowed Error         : ");
+                       printCssmErr(cfNum); printf("\n");
+               }
+
+               /* ResultType */
+               cfNum = (CFNumberRef)CFDictionaryGetValue(ucDict, kSecTrustSettingsResult);
+               if(cfNum != NULL) {
+                       if(CFGetTypeID(cfNum) != CFNumberGetTypeID()) {
+                               fprintf(stderr, "***displayTrustSettings: malformed ResultType");
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       indent(); printf("Result Type           : ");
+                       printResultType(cfNum); printf("\n");
+               }
+
+               /* key usage */
+               cfNum = (CFNumberRef)CFDictionaryGetValue(ucDict, kSecTrustSettingsKeyUsage);
+               if(cfNum != NULL) {
+                       if(CFGetTypeID(cfNum) != CFNumberGetTypeID()) {
+                               fprintf(stderr, "***displayTrustSettings: malformed keyUsage");
+                               ourRtn = -1;
+                               goto nextAp;
+                       }
+                       indent(); printf("Key Usage             : ");
+                       printKeyUsage(cfNum); printf("\n");
+               }
+
+       nextAp:
+               indentDecr();
+       }
+       indentDecr();
+       return ourRtn;
+}
+
+int
+trusted_cert_dump(int argc, char * const *argv)
+{
+       CFArrayRef certArray = NULL;
+       OSStatus ortn = noErr;
+       CFIndex numCerts;
+       CFIndex dex;
+       CFArrayRef trustSettings;
+       int ourRtn = 0;
+       SecTrustSettingsDomain domain = kSecTrustSettingsDomainUser;
+
+       extern char *optarg;
+       extern int optind;
+       int arg;
+
+       optind = 1;
+       while ((arg = getopt(argc, argv, "sdh")) != -1) {
+               switch (arg) {
+                       case 's':
+                               domain = kSecTrustSettingsDomainSystem;
+                               break;
+                       case 'd':
+                               domain = kSecTrustSettingsDomainAdmin;
+                               break;
+                       default:
+                       case 'h':
+                               return SHOW_USAGE_MESSAGE;
+               }
+       }
+
+       if(optind != argc) {
+               return SHOW_USAGE_MESSAGE;
+       }
+
+       ortn = SecTrustSettingsCopyCertificates(domain, &certArray);
+       if(ortn) {
+               cssmPerror("SecTrustSettingsCopyCertificates", ortn);
+               return 1;
+       }
+       numCerts = CFArrayGetCount(certArray);
+       printf("Number of trusted certs = %ld\n", (long)numCerts);
+
+       for(dex=0; dex<numCerts; dex++) {
+               SecCertificateRef certRef =
+                               (SecCertificateRef)CFArrayGetValueAtIndex(certArray, dex);
+               if(CFGetTypeID(certRef) != SecCertificateGetTypeID()) {
+                       fprintf(stderr, "***Bad CFGetTypeID for cert %ld\n", (long)dex);
+                       ourRtn = -1;
+                       break;
+               }
+
+               /* always print the cert's label */
+               printf("Cert %ld: ", dex);
+               printCertLabel(certRef);
+               printf("\n");
+
+               /* see if the cert has any usage constraints (it should!) */
+               ortn = SecTrustSettingsCopyTrustSettings(certRef, domain, &trustSettings);
+               if(ortn) {
+                       cssmPerror("SecTrustSettingsCopyTrustSettings", ortn);
+                       ourRtn = -1;
+                       continue;
+               }
+               if(displayTrustSettings(trustSettings)) {
+                       ourRtn = -1;
+               }
+       }
+       CFRelease(certArray);
+
+       return ourRtn;
+}