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