1/*
2 * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 *
23 * trust_cert_add.c
24 */
25
26#include "trust_settings_impexp.h"
27#include "security.h"
28#include <Security/Security.h>
29#include <Security/SecTrustSettings.h>
30#include <errno.h>
31#include <unistd.h>
32#include <security_cdsa_utils/cuFileIo.h>
33#include <CoreFoundation/CoreFoundation.h>
34#include <security_cdsa_utils/cuFileIo.h>
35
36extern int trust_settings_export(int argc, char * const *argv)
37{
38	extern char *optarg;
39	extern int optind;
40	OSStatus ortn;
41	int arg;
42	CFDataRef settings = NULL;
43	SecTrustSettingsDomain domain = kSecTrustSettingsDomainUser;
44	int rtn;
45	char *settingsFile = NULL;
46	unsigned len;
47
48	if(argc < 2) {
49		return 2; /* @@@ Return 2 triggers usage message. */
50	}
51
52	optind = 1;
53	while ((arg = getopt(argc, argv, "dsh")) != -1) {
54		switch (arg) {
55			case 'd':
56				domain = kSecTrustSettingsDomainAdmin;
57				break;
58			case 's':
59				domain = kSecTrustSettingsDomainSystem;
60				break;
61			default:
62				return 2;
63		}
64	}
65	if(optind != (argc - 1)) {
66		/* no args left for settings file */
67		return 2;
68	}
69	settingsFile = argv[optind];
70
71	ortn = SecTrustSettingsCreateExternalRepresentation(domain, &settings);
72	if(ortn) {
73		cssmPerror("SecTrustSettingsCreateExternalRepresentation", ortn);
74		return 1;
75	}
76	len = CFDataGetLength(settings);
77	rtn = writeFile(settingsFile, CFDataGetBytePtr(settings), len);
78	if(rtn) {
79		fprintf(stderr, "Error (%d) writing %s.\n", rtn, settingsFile);
80	}
81	else if(!do_quiet) {
82		fprintf(stdout, "...Trust Settings exported successfully.\n");
83	}
84	CFRelease(settings);
85	return rtn;
86}
87
88extern int trust_settings_import(int argc, char * const *argv)
89{
90	extern char *optarg;
91	extern int optind;
92	OSStatus ortn;
93	int arg;
94	char *settingsFile = NULL;
95	unsigned char *settingsData = NULL;
96	unsigned settingsLen = 0;
97	CFDataRef settings = NULL;
98	SecTrustSettingsDomain domain = kSecTrustSettingsDomainUser;
99	int rtn;
100
101	if(argc < 2) {
102		return 2; /* @@@ Return 2 triggers usage message. */
103	}
104
105	optind = 1;
106	while ((arg = getopt(argc, argv, "dh")) != -1) {
107		switch (arg) {
108			case 'd':
109				domain = kSecTrustSettingsDomainAdmin;
110				break;
111			default:
112				return 2;
113		}
114	}
115	if(optind != (argc - 1)) {
116		/* no args left for settings file */
117		return 2;
118	}
119	settingsFile = argv[optind];
120	rtn = readFile(settingsFile, &settingsData, &settingsLen);
121	if(rtn) {
122		fprintf(stderr, "Error (%d) reading %s.\n", rtn, settingsFile);
123		return 1;
124	}
125	settings = CFDataCreate(NULL, (const UInt8 *)settingsData, settingsLen);
126	free(settingsData);
127	ortn = SecTrustSettingsImportExternalRepresentation(domain, settings);
128	CFRelease(settings);
129	if(ortn) {
130		cssmPerror("SecTrustSettingsImportExternalRepresentation", ortn);
131		rtn = 1;
132	}
133	else if(!do_quiet) {
134		fprintf(stdout, "...Trust Settings imported successfully.\n");
135		rtn = 0;
136	}
137	return rtn;
138}
139
140