/* * Copyright (c) 2002 Apple Computer, Inc. All Rights Reserved. * * The contents of this file constitute Original Code as defined in and are * subject to the Apple Public Source License Version 1.2 (the 'License'). * You may not use this file except in compliance with the License. Please obtain * a copy of the License at http://www.apple.com/publicsource and read it before * using this file. * * This 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. */ #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 }