2 * Copyright (c) 2003-2005,2009,2012,2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
26 #include "keychain_recode.h"
28 #include "keychain_utilities.h"
29 #include "readline_cssm.h"
30 #include "security_tool.h"
37 #include <CoreFoundation/CoreFoundation.h>
38 #include <Security/SecKeychain.h>
40 // SecKeychainCopyBlob, SecKeychainRecodeKeychain
41 #include <Security/SecKeychainPriv.h>
45 do_recode(const char *keychainName1
, const char *keychainName2
)
47 SecKeychainRef keychain1
= NULL
, keychain2
= NULL
;
48 CFMutableArrayRef dbBlobArray
= NULL
;
49 CFDataRef dbBlob
= NULL
, extraData
= NULL
;
54 keychain1
= keychain_open(keychainName1
);
62 keychain2
= keychain_open(keychainName2
);
69 result
= SecKeychainCopyBlob(keychain2
, &dbBlob
);
72 sec_error("SecKeychainCopyBlob %s: %s", keychainName2
,
77 extraData
= CFDataCreate(NULL
, NULL
, 0);
79 dbBlobArray
= CFArrayCreateMutable(NULL
, 1, &kCFTypeArrayCallBacks
);
81 CFArrayAppendValue(dbBlobArray
, dbBlob
);
84 #if !defined MAC_OS_X_VERSION_10_6 || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
85 result
= SecKeychainRecodeKeychain(keychain1
, dbBlob
, extraData
);
87 result
= SecKeychainRecodeKeychain(keychain1
, dbBlobArray
, extraData
);
90 sec_error("SecKeychainRecodeKeychain %s, %s: %s", keychainName1
,
91 keychainName2
, sec_errstr(result
));
95 CFRelease(dbBlobArray
);
101 CFRelease(keychain1
);
103 CFRelease(keychain2
);
109 keychain_recode(int argc
, char * const *argv
)
111 char *keychainName1
= NULL
, *keychainName2
= NULL
;
114 while ((ch
= getopt(argc
, argv
, "h")) != -1)
120 return SHOW_USAGE_MESSAGE
;
128 keychainName1
= argv
[0];
129 if (*keychainName1
== '\0')
135 keychainName2
= argv
[1];
136 if (*keychainName2
== '\0')
144 return SHOW_USAGE_MESSAGE
;
146 result
= do_recode(keychainName1
, keychainName2
);