1/* 2 * Copyright (c) 2005,2011-2014 Apple 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 24/* 25 * TrustSettingsUtils.cpp - Utility routines for TrustSettings module 26 * 27 */ 28 29#include "TrustSettingsUtils.h" 30#include <Security/cssmtype.h> 31#include <Security/cssmapple.h> 32#include <Security/oidscert.h> 33#include <assert.h> 34#include <sys/param.h> 35#include <sys/stat.h> 36#include <sys/fcntl.h> 37 38/* 39 * Preferred location for user root store is ~/Library/Keychain/UserRootCerts.keychain. 40 * If we're creating a root store and there is a file there we iterate thru 41 * ~/Library/Keychains/UserRootCerts_N.keychain, 0 <= N <= 10. 42 */ 43#define kSecUserRootStoreBase "~/Library/Keychains/UserRootCerts" 44#define kSecUserRootStoreExtension ".keychain" 45 46namespace Security { 47 48namespace KeychainCore { 49 50/* 51 * Read entire file. 52 */ 53int tsReadFile( 54 const char *fileName, 55 Allocator &alloc, 56 CSSM_DATA &fileData) // mallocd via alloc and RETURNED 57{ 58 int rtn; 59 int fd; 60 struct stat sb; 61 unsigned size; 62 63 fileData.Data = NULL; 64 fileData.Length = 0; 65 fd = open(fileName, O_RDONLY, 0); 66 if(fd < 0) { 67 return errno; 68 } 69 rtn = fstat(fd, &sb); 70 if(rtn) { 71 goto errOut; 72 } 73 size = (unsigned)sb.st_size; 74 fileData.Data = (uint8 *)alloc.malloc(size); 75 if(fileData.Data == NULL) { 76 rtn = ENOMEM; 77 goto errOut; 78 } 79 rtn = (int)lseek(fd, 0, SEEK_SET); 80 if(rtn < 0) { 81 goto errOut; 82 } 83 rtn = (int)read(fd, fileData.Data, (size_t)size); 84 if(rtn != (int)size) { 85 rtn = EIO; 86 } 87 else { 88 rtn = 0; 89 fileData.Length = size; 90 } 91errOut: 92 close(fd); 93 return rtn; 94} 95 96} /* end namespace KeychainCore */ 97 98} /* end namespace Security */ 99