TrustSettingsUtils.cpp   [plain text]


/*
 * Copyright (c) 2005 Apple Computer, Inc. All Rights Reserved.
 * 
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

/*
 * TrustSettingsUtils.cpp - Utility routines for TrustSettings module
 *
 * Created May 10 2005 by dmitch.
 */

#include "TrustSettingsUtils.h"
#include <Security/cssmtype.h>
#include <Security/cssmapple.h>
#include <Security/oidscert.h>
#include <assert.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacErrors.h>

/* 
 * Preferred location for user root store is ~/Library/Keychain/UserRootCerts.keychain. 
 * If we're creating a root store and there is a file there we iterate thru  
 * ~/Library/Keychains/UserRootCerts_N.keychain, 0 <= N <= 10.
 */
#define kSecUserRootStoreBase			"~/Library/Keychains/UserRootCerts"
#define kSecUserRootStoreExtension		".keychain"

namespace Security {

namespace KeychainCore {

/*
 * Read entire file. 
 */
int tsReadFile(
	const char		*fileName,
	Allocator		&alloc,
	CSSM_DATA		&fileData)		// mallocd via alloc and RETURNED
{
	int rtn;
	int fd;
	struct stat	sb;
	unsigned size;
	
	fileData.Data = NULL;
	fileData.Length = 0;
	fd = open(fileName, O_RDONLY, 0);
	if(fd < 0) {
		return errno;
	}
	rtn = fstat(fd, &sb);
	if(rtn) {
		goto errOut;
	}
	size = sb.st_size;
	fileData.Data = (uint8 *)alloc.malloc(size);
	if(fileData.Data == NULL) {
		rtn = ENOMEM;
		goto errOut;
	}
	rtn = lseek(fd, 0, SEEK_SET);
	if(rtn < 0) {
		goto errOut;
	}
	rtn = read(fd, fileData.Data, (size_t)size);
	if(rtn != (int)size) {
		rtn = EIO;
	}
	else {
		rtn = 0;
		fileData.Length = size;
	}
errOut:
	close(fd);
	return rtn;
}

} /* end namespace KeychainCore */

} /* end namespace Security */