--- /dev/null
+/*
+ * sysIdTool.cpp
+ */
+
+#include <stdlib.h>
+#include <strings.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <Security/Security.h>
+#include <utilLib/common.h>
+#include <clAppUtils/identPicker.h>
+#include <clAppUtils/printCertName.h>
+#include <security_cdsa_utils/cuPrintCert.h>
+
+static void usage(char **argv)
+{
+ printf("usage: %s command domain [options]\n", argv[0]);
+ printf("Commands:\n");
+ printf(" s -- select with picker, set as identity for domain\n");
+ printf(" d -- display identity for domain\n");
+ printf(" D -- delete identity for domain\n");
+ printf("Options:\n");
+ printf(" -v -- verbose display of certs\n");
+ printf(" -l -- loop for malloc debug\n");
+ printf(" <none for now>\n");
+ /* etc. */
+ exit(1);
+}
+
+
+static int selectId(CFStringRef domain)
+{
+ /* open system keychain */
+ SecKeychainRef kcRef;
+ const char *sysKcPath = kSystemKeychainDir kSystemKeychainName;
+
+ OSStatus ortn = SecKeychainOpen(sysKcPath, &kcRef);
+ if(ortn) {
+ cssmPerror("SecKeychainOpen", ortn);
+ exit(1);
+ }
+
+ /* pick an identity */
+ SecIdentityRef idRef = NULL;
+ ortn = sslSimpleIdentPicker(kcRef, &idRef);
+ CFRelease(kcRef);
+ if(ortn) {
+ printf("IdentityPicker aborted\n");
+ return -1;
+ }
+
+ ortn = SecIdentitySetSystemIdentity(domain, idRef);
+ if(ortn) {
+ cssmPerror("SecIdentitySetSystemIdentity", ortn);
+ }
+ else {
+ printf("...system identity set.\n");
+ }
+ CFRelease(idRef);
+ return ortn;
+}
+
+static void printCFString(
+ const char *label,
+ CFStringRef cfString)
+{
+ char cstr[300];
+ if(!CFStringGetCString(cfString, cstr, sizeof(cstr),
+ kCFStringEncodingUTF8)) {
+ printf("***Error converting %s to UTF8\n", label);
+ }
+ else {
+ printf("%s '%s'\n", label, cstr);
+ }
+}
+
+static int showId(CFStringRef domain, bool verbose)
+{
+ SecIdentityRef idRef = NULL;
+ CFStringRef actualDomain = NULL;
+ OSStatus ortn;
+
+ ortn = SecIdentityCopySystemIdentity(domain, &idRef, &actualDomain);
+ if(ortn) {
+ cssmPerror("SecIdentityCopySystemIdentity", ortn);
+ return ortn;
+ }
+ SecCertificateRef certRef = NULL;
+ ortn = SecIdentityCopyCertificate(idRef, &certRef);
+ if(ortn) {
+ cssmPerror("SecIdentityCopyCertificate", ortn);
+ CFRelease(idRef);
+ return ortn;
+ }
+ CSSM_DATA certData;
+ ortn = SecCertificateGetData(certRef, &certData);
+ if(ortn) {
+ cssmPerror("SecCertificateGetData", ortn);
+ CFRelease(idRef);
+ CFRelease(certRef);
+ return ortn;
+ }
+
+ printCFString("Identity obtained for domain", domain);
+ if(verbose) {
+ printf("\n ---- System Identity Certificate ----\n");
+ printCert(certData.Data, certData.Length, CSSM_FALSE);
+ printf(" ---- End of System Identity Certificate ----\n");
+ }
+ else {
+ printCertName(certData.Data, certData.Length, NameIssuer);
+ }
+ printCFString("Actual domain :", actualDomain);
+ CFRelease(idRef);
+ CFRelease(certRef);
+ CFRelease(actualDomain);
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ char op;
+ char *domain;
+
+ if(argc < 3) {
+ usage(argv);
+ }
+ op = argv[1][0];
+ domain = argv[2];
+
+ bool verbose = false;
+ bool loop = false;
+
+ //extern char *optarg;
+ int arg;
+ optind = 3;
+ while ((arg = getopt(argc, argv, "hvl")) != -1) {
+ switch (arg) {
+ case 'v':
+ verbose = true;
+ break;
+ case 'l':
+ loop = true;
+ break;
+ case 'h':
+ usage(argv);
+ }
+ }
+ if(optind != argc) {
+ usage(argv);
+ }
+
+ CFStringRef cfDomain = CFStringCreateWithCString(NULL, domain, kCFStringEncodingASCII);
+ int ourRtn = 0;
+ do {
+ switch(op) {
+ case 's':
+ ourRtn = selectId(cfDomain);
+ break;
+ case 'd':
+ ourRtn = showId(cfDomain, verbose);
+ break;
+ case 'D':
+ ourRtn = SecIdentitySetSystemIdentity(cfDomain, NULL);
+ if(ourRtn) {
+ cssmPerror("SecIdentitySetSystemIdentity(NULL)", ourRtn);
+ }
+ else {
+ printf("...system identity assignment deleted.\n");
+ }
+ break;
+ default:
+ usage(argv);
+ }
+ if(ourRtn) {
+ break;
+ }
+ if(loop) {
+ fpurge(stdin);
+ printf("q to quit, CR to loop again: ");
+ if(getchar() == 'q') {
+ break;
+ }
+ }
+ } while(loop);
+ return ourRtn;
+}