X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/90dc47c27df1983f6ebc252b0c4b94c8718fe52d..02b2aca600d4a0fe6fb259262bd6808ef889acde:/OSX/libsecurity_codesigning/lib/CodeSigner.cpp diff --git a/OSX/libsecurity_codesigning/lib/CodeSigner.cpp b/OSX/libsecurity_codesigning/lib/CodeSigner.cpp index b6b274e2..8cbc67f8 100644 --- a/OSX/libsecurity_codesigning/lib/CodeSigner.cpp +++ b/OSX/libsecurity_codesigning/lib/CodeSigner.cpp @@ -121,7 +121,7 @@ SecCodeSigner::SecCodeSigner(SecCSFlags flags) // // Clean up a SecCodeSigner // -SecCodeSigner::~SecCodeSigner() throw() +SecCodeSigner::~SecCodeSigner() _NOEXCEPT try { delete mLimitedAsync; } catch (...) { @@ -170,8 +170,9 @@ std::string SecCodeSigner::getTeamIDFromSigner(CFArrayRef certs) // bool SecCodeSigner::valid() const { - if (mOpFlags & kSecCSRemoveSignature) + if (mOpFlags & (kSecCSRemoveSignature | kSecCSEditSignature)) { return true; + } return mSigner; } @@ -181,13 +182,20 @@ bool SecCodeSigner::valid() const // void SecCodeSigner::sign(SecStaticCode *code, SecCSFlags flags) { - code->setValidationFlags(flags); - if (code->isSigned() && (flags & kSecCSSignPreserveSignature)) + //Never preserve a linker signature. + if (code->isSigned() && + (flags & kSecCSSignPreserveSignature) && + !code->flag(kSecCodeSignatureLinkerSigned)) { return; + } + code->setValidationFlags(flags); Signer operation(*this, code); if ((flags | mOpFlags) & kSecCSRemoveSignature) { secinfo("signer", "%p will remove signature from %p", this, code); operation.remove(flags); + } else if ((flags | mOpFlags) & kSecCSEditSignature) { + secinfo("signer", "%p will edit signature of %p", this, code); + operation.edit(flags); } else { if (!valid()) MacOSError::throwMe(errSecCSInvalidObjectRef); @@ -229,6 +237,29 @@ void SecCodeSigner::returnDetachedSignature(BlobCore *blob, Signer &signer) SecCodeSigner::Parser::Parser(SecCodeSigner &state, CFDictionaryRef parameters) : CFDictionary(parameters, errSecCSBadDictionaryFormat) { + CFNumberRef editCpuType = get(kSecCodeSignerEditCpuType); + CFNumberRef editCpuSubtype = get(kSecCodeSignerEditCpuSubtype); + if (editCpuType != NULL && editCpuSubtype != NULL) { + state.mEditArch = Architecture(cfNumber(editCpuType), + cfNumber(editCpuSubtype)); + } + + state.mEditCMS = get(kSecCodeSignerEditCMS); + + state.mDryRun = getBool(kSecCodeSignerDryRun); + + state.mSDKRoot = get(kSecCodeSignerSDKRoot); + + state.mPreserveAFSC = getBool(kSecCodeSignerPreserveAFSC); + + if (state.mOpFlags & kSecCSEditSignature) { + return; + /* Everything below this point is irrelevant for + * Signature Editing, which does not create any + * parts of the signature, only replaces them. + */ + } + // the signer may be an identity or null state.mSigner = SecIdentityRef(get(kSecCodeSignerIdentity)); if (state.mSigner) @@ -305,15 +336,11 @@ SecCodeSigner::Parser::Parser(SecCodeSigner &state, CFDictionaryRef parameters) MacOSError::throwMe(errSecCSInvalidObjectRef); } - state.mDryRun = getBool(kSecCodeSignerDryRun); - state.mResourceRules = get(kSecCodeSignerResourceRules); state.mApplicationData = get(kSecCodeSignerApplicationData); state.mEntitlementData = get(kSecCodeSignerEntitlements); - state.mSDKRoot = get(kSecCodeSignerSDKRoot); - if (CFBooleanRef timestampRequest = get(kSecCodeSignerRequireTimestamp)) { state.mWantTimeStamp = timestampRequest == kCFBooleanTrue; } else { // pick default @@ -336,6 +363,10 @@ SecCodeSigner::Parser::Parser(SecCodeSigner &state, CFDictionaryRef parameters) } state.mRuntimeVersionOverride = parseRuntimeVersion(runtime); } + + // Don't add the adhoc flag, even if no signer identity was specified. + // Useful for editing in the CMS at a later point. + state.mOmitAdhocFlag = getBool(kSecCodeSignerOmitAdhocFlag); }