+++ /dev/null
-/*
- * 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 <Security/SecKey.h>
-#include <Security/KeyItem.h>
-
-#include "SecBridge.h"
-
-#include <Security/Access.h>
-#include <Security/Keychains.h>
-#include <Security/KeyItem.h>
-
-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<Access> theAccess(initialAccess ? Access::required(initialAccess) : new Access("<key>"));
- SecPointer<KeyItem> 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(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(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(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(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<Access> theAccess(initialAccess ? Access::required(initialAccess) : new Access("<key>"));
- SecPointer<KeyItem> 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<Access> 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
-}