/* * 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@ */ #include #include #include "SecBridge.h" #include #include #include CFTypeID SecKeyGetTypeID(void) { BEGIN_SECAPI return gTypes().KeyItem.typeID; END_SECAPI1(_kCFRuntimeNotATypeID) } OSStatus SecKeyCreatePair( SecKeychainRef keychainRef, CSSM_ALGORITHMS algorithm, uint32 keySizeInBits, CSSM_CC_HANDLE contextHandle, CSSM_KEYUSE publicKeyUsage, uint32 publicKeyAttr, CSSM_KEYUSE privateKeyUsage, uint32 privateKeyAttr, SecAccessRef initialAccess, SecKeyRef* publicKeyRef, SecKeyRef* privateKeyRef) { BEGIN_SECAPI Keychain keychain = Keychain::optional(keychainRef); SecPointer theAccess(initialAccess ? Access::required(initialAccess) : new Access("")); SecPointer pubItem, privItem; KeyItem::createPair(keychain, algorithm, keySizeInBits, contextHandle, publicKeyUsage, publicKeyAttr, privateKeyUsage, privateKeyAttr, theAccess, pubItem, privItem); // Return the generated keys. if (publicKeyRef) *publicKeyRef = pubItem->handle(); if (privateKeyRef) *privateKeyRef = privItem->handle(); END_SECAPI } OSStatus SecKeyGetCSSMKey(SecKeyRef key, const CSSM_KEY **cssmKey) { BEGIN_SECAPI Required(cssmKey) = KeyItem::required(key)->key(); END_SECAPI } // // Private APIs // OSStatus SecKeyGetCSPHandle(SecKeyRef keyRef, CSSM_CSP_HANDLE *cspHandle) { BEGIN_SECAPI SecPointer keyItem(KeyItem::required(keyRef)); Required(cspHandle) = keyItem->csp()->handle(); END_SECAPI } OSStatus SecKeyGetAlgorithmID(SecKeyRef keyRef, const CSSM_X509_ALGORITHM_IDENTIFIER **algid) { BEGIN_SECAPI SecPointer keyItem(KeyItem::required(keyRef)); Required(algid) = &keyItem->algorithmIdentifier(); END_SECAPI } OSStatus SecKeyGetStrengthInBits(SecKeyRef keyRef, const CSSM_X509_ALGORITHM_IDENTIFIER *algid, unsigned int *strength) { BEGIN_SECAPI SecPointer keyItem(KeyItem::required(keyRef)); Required(strength) = keyItem->strengthInBits(algid); END_SECAPI } OSStatus SecKeyGetCredentials( SecKeyRef keyRef, CSSM_ACL_AUTHORIZATION_TAG operation, SecCredentialType credentialType, const CSSM_ACCESS_CREDENTIALS **outCredentials) { BEGIN_SECAPI SecPointer keyItem(KeyItem::required(keyRef)); Required(outCredentials) = keyItem->getCredentials(operation, credentialType); END_SECAPI } OSStatus SecKeyImportPair( SecKeychainRef keychainRef, const CSSM_KEY *publicCssmKey, const CSSM_KEY *privateCssmKey, SecAccessRef initialAccess, SecKeyRef* publicKey, SecKeyRef* privateKey) { BEGIN_SECAPI Keychain keychain = Keychain::optional(keychainRef); SecPointer theAccess(initialAccess ? Access::required(initialAccess) : new Access("")); SecPointer pubItem, privItem; KeyItem::importPair(keychain, Required(publicCssmKey), Required(privateCssmKey), theAccess, pubItem, privItem); // Return the generated keys. if (publicKey) *publicKey = pubItem->handle(); if (privateKey) *privateKey = privItem->handle(); END_SECAPI } OSStatus SecKeyGenerate( SecKeychainRef keychainRef, CSSM_ALGORITHMS algorithm, uint32 keySizeInBits, CSSM_CC_HANDLE contextHandle, CSSM_KEYUSE keyUsage, uint32 keyAttr, SecAccessRef initialAccess, SecKeyRef* keyRef) { BEGIN_SECAPI Keychain keychain; SecPointer theAccess; if (keychainRef) keychain = KeychainImpl::required(keychainRef); if (initialAccess) theAccess = Access::required(initialAccess); KeyItem *item = KeyItem::generate(keychain, algorithm, keySizeInBits, contextHandle, keyUsage, keyAttr, theAccess); // Return the generated key. if (keyRef) *keyRef = item->handle(); END_SECAPI } OSStatus SecKeyCreate(const CSSM_KEY *cssmKey, SecKeyRef* keyRef) { BEGIN_SECAPI Required(cssmKey); CssmClient::CSP csp(cssmKey->KeyHeader.CspId); CssmClient::Key key(csp, *cssmKey); KeyItem *item = new KeyItem(key); // Return the generated key. if (keyRef) *keyRef = item->handle(); END_SECAPI }