csprocess.cpp
1 /* 2 * Copyright (c) 2006,2011,2013-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 // csprocess - UNIX process implementation of the Code Signing Host Interface 26 // 27 #include "csprocess.h" 28 #include "cskernel.h" 29 #include <securityd_client/ssclient.h> 30 #include <System/sys/codesign.h> 31 32 namespace Security { 33 namespace CodeSigning { 34 35 36 // 37 // Construct a running process representation 38 // 39 ProcessCode::ProcessCode(pid_t pid, const audit_token_t* token, PidDiskRep *pidDiskRep /*= NULL */) 40 : SecCode(KernelCode::active()), mPid(pid), mPidBased(pidDiskRep) 41 { 42 if (token) 43 mAudit = new audit_token_t(*token); 44 else 45 mAudit = NULL; 46 } 47 48 49 int ProcessCode::csops(unsigned int ops, void *addr, size_t size) 50 { 51 // pass pid and audit token both if we have it, or just the pid if we don't 52 if (mAudit) 53 return ::csops_audittoken(mPid, ops, addr, size, mAudit); 54 else 55 return ::csops(mPid, ops, addr, size); 56 } 57 58 59 /* 60 * 61 */ 62 63 ProcessDynamicCode::ProcessDynamicCode(ProcessCode *guest) 64 : SecStaticCode(guest->pidBased()), mGuest(guest) 65 { 66 } 67 68 CFDataRef ProcessDynamicCode::component(CodeDirectory::SpecialSlot slot, OSStatus fail /* = errSecCSSignatureFailed */) 69 { 70 if (slot == cdInfoSlot && !mGuest->pidBased()->supportInfoPlist()) 71 return NULL; 72 else if (slot == cdResourceDirSlot) 73 return NULL; 74 return SecStaticCode::component(slot, fail); 75 } 76 77 CFDictionaryRef ProcessDynamicCode::infoDictionary() 78 { 79 if (mGuest->pidBased()->supportInfoPlist()) 80 return SecStaticCode::infoDictionary(); 81 if (!mEmptyInfoDict) { 82 mEmptyInfoDict.take(makeCFDictionary(0)); 83 } 84 return mEmptyInfoDict; 85 } 86 87 void ProcessDynamicCode::validateComponent(CodeDirectory::SpecialSlot slot, OSStatus fail /* = errSecCSSignatureFailed */) 88 { 89 if (slot == cdInfoSlot && !mGuest->pidBased()->supportInfoPlist()) 90 return; 91 else if (slot == cdResourceDirSlot) 92 return; 93 SecStaticCode::validateComponent(slot, fail); 94 } 95 96 97 98 } // CodeSigning 99 } // Security