X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/72a12576750f52947eb043106ba5c12c0d07decf..b1ab9ed8d0e0f1c3b66d7daa8fd5564444c56195:/libsecurity_keychain/lib/Identity.cpp diff --git a/libsecurity_keychain/lib/Identity.cpp b/libsecurity_keychain/lib/Identity.cpp new file mode 100644 index 00000000..52c72ac2 --- /dev/null +++ b/libsecurity_keychain/lib/Identity.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2002-2004 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@ + */ + +// +// Identity.cpp - Working with Identities +// +#include + +#include +#include + +using namespace KeychainCore; + +Identity::Identity(const SecPointer &privateKey, + const SecPointer &certificate) : + mPrivateKey(privateKey), + mCertificate(certificate) +{ +} + +Identity::Identity(const StorageManager::KeychainList &keychains, const SecPointer &certificate) : + mCertificate(certificate) +{ + // Find a key whose label matches the publicKeyHash of the public key in the certificate. + KCCursor keyCursor(keychains, CSSM_DL_DB_RECORD_PRIVATE_KEY, NULL); + keyCursor->add(CSSM_DB_EQUAL, KeySchema::Label, certificate->publicKeyHash()); + + Item key; + if (!keyCursor->next(key)) + MacOSError::throwMe(errSecItemNotFound); + + SecPointer keyItem(static_cast(&*key)); + mPrivateKey = keyItem; +} + +Identity::~Identity() throw() +{ +} + +SecPointer +Identity::privateKey() const +{ + return mPrivateKey; +} + +SecPointer +Identity::certificate() const +{ + return mCertificate; +} + +bool +Identity::operator < (const Identity &other) const +{ + // Certificates in different keychains are considered equal if data is equal + return (mCertificate < other.mCertificate); +} + +bool +Identity::operator == (const Identity &other) const +{ + // Certificates in different keychains are considered equal if data is equal; + // however, if their keys are in different keychains, the identities should + // not be considered equal (according to mb) + return (mCertificate == other.mCertificate && mPrivateKey == other.mPrivateKey); +} + +bool +Identity::equal(SecCFObject &other) +{ + return (*this) == (const Identity &)other; +} +