]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_keychain/lib/SecBridge.h
Security-59754.80.3.tar.gz
[apple/security.git] / OSX / libsecurity_keychain / lib / SecBridge.h
index 2c541baf1eb702da0b908d4fbdcbf8d2e6a44034..c9e39bf9c5cf56d39c38150161628ce33d1523b4 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2000-2004,2011,2013-2015 Apple Inc. All Rights Reserved.
+ * Copyright (c) 2000-2004,2011,2013-2016 Apple Inc. All Rights Reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  *
  *
  * @APPLE_LICENSE_HEADER_START@
  *
 
 #include <security_keychain/Globals.h>
 #include <security_keychain/SecCFTypes.h>
 
 #include <security_keychain/Globals.h>
 #include <security_keychain/SecCFTypes.h>
-#include "SecBasePriv.h"
+#include <Security/SecBasePriv.h>
 #include <Security/SecKeychainPriv.h>
 #include <security_keychain/KCUtilities.h>
 #include <security_cdsa_utilities/cssmbridge.h>
 #include <Security/SecKeychainPriv.h>
 #include <security_keychain/KCUtilities.h>
 #include <security_cdsa_utilities/cssmbridge.h>
+#include "LegacyAPICounts.h"
 
 using namespace KeychainCore;
 
 
 using namespace KeychainCore;
 
+#define COUNTLEGACYAPI static dispatch_once_t countToken; \
+       countLegacyAPI(&countToken, __FUNCTION__);
+
 //
 // API boilerplate macros. These provide a frame for C++ code that is impermeable to exceptions.
 // Usage:
 //
 // API boilerplate macros. These provide a frame for C++ code that is impermeable to exceptions.
 // Usage:
@@ -45,14 +49,16 @@ using namespace KeychainCore;
 //     END_API3(name, bad) // like END_API1, with API name as debug scope for printing function result
 //
 #define BEGIN_SECAPI \
 //     END_API3(name, bad) // like END_API1, with API name as debug scope for printing function result
 //
 #define BEGIN_SECAPI \
-    OSStatus __secapiresult = errSecSuccess; \
+       OSStatus __secapiresult = errSecSuccess; \
+       static dispatch_once_t countToken; \
+       countLegacyAPI(&countToken, __FUNCTION__); \
        try {
 #define END_SECAPI }\
        catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
        catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
        catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
        catch (...) { __secapiresult=errSecInternalComponent; } \
        try {
 #define END_SECAPI }\
        catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
        catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
        catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
        catch (...) { __secapiresult=errSecInternalComponent; } \
-    return __secapiresult;
+       return __secapiresult;
 #define END_SECAPI1(BAD_RETURN_VAL) \
        } \
        catch (...) \
 #define END_SECAPI1(BAD_RETURN_VAL) \
        } \
        catch (...) \
@@ -61,30 +67,93 @@ using namespace KeychainCore;
        } \
        return __secapiresult;
 #define END_SECAPI1(BAD_RETURN_VAL) }\
        } \
        return __secapiresult;
 #define END_SECAPI1(BAD_RETURN_VAL) }\
-    catch (...) { __secapiresult=BAD_RETURN_VAL; } \
-    return __secapiresult;
+       catch (...) { __secapiresult=BAD_RETURN_VAL; } \
+       return __secapiresult;
 #define END_SECAPI0 }\
 #define END_SECAPI0 }\
-    catch (...) { return; }
+       catch (...) { return; }
 
 
-#if SECTRUST_OSX
-#define BEGIN_SECCERTAPI \
-OSStatus __secapiresult=errSecSuccess; \
-SecCertificateRef __itemImplRef=(SecCertificateRef)SecCertificateCopyKeychainItem(certificate); \
-if (!__itemImplRef) { __itemImplRef=SecCertificateCreateItemImplInstance(certificate); } \
-try {
-#else
+
+//
+// BEGIN_SECKCITEMAPI
+// Note: this macro assumes an input parameter named "itemRef"
+//
+#define BEGIN_SECKCITEMAPI \
+       OSStatus __secapiresult=errSecSuccess; \
+       static dispatch_once_t countToken; \
+       countLegacyAPI(&countToken, __FUNCTION__); \
+       SecKeychainItemRef __itemImplRef=NULL; \
+       bool __is_certificate=(itemRef && (CFGetTypeID(itemRef) == SecCertificateGetTypeID())); \
+       if (__is_certificate) { \
+               if (SecCertificateIsItemImplInstance((SecCertificateRef)itemRef)) { \
+                       __itemImplRef=(SecKeychainItemRef)CFRetain(itemRef); \
+               } else { \
+                       __itemImplRef=(SecKeychainItemRef)SecCertificateCopyKeychainItem((SecCertificateRef)itemRef); \
+                       if (!__itemImplRef) { \
+                               __itemImplRef=(SecKeychainItemRef)SecCertificateCreateItemImplInstance((SecCertificateRef)itemRef); \
+                               (void)SecCertificateSetKeychainItem((SecCertificateRef)itemRef,__itemImplRef); \
+                       } \
+               } \
+       } else { \
+               __itemImplRef=(SecKeychainItemRef)((itemRef) ? CFRetain(itemRef) : NULL); \
+       } \
+       try {
+
+//
+// END_SECKCITEMAPI
+//
+#define END_SECKCITEMAPI } \
+       catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
+       catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
+       catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
+       catch (...) { __secapiresult=errSecInternalComponent; } \
+       if (__itemImplRef) { CFRelease(__itemImplRef); } \
+       return __secapiresult;
+
+
+//
+// BEGIN_SECCERTAPI
+// Note: this macro assumes an input parameter named "certificate"
+//
 #define BEGIN_SECCERTAPI \
 #define BEGIN_SECCERTAPI \
-OSStatus __secapiresult=errSecSuccess; \
-SecCertificateRef __itemImplRef=(SecCertificateRef)((certificate)?CFRetain(certificate):NULL); \
-try {
-#endif
-#define END_SECCERTAPI }\
-catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
-catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
-catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
-catch (...) { __secapiresult=errSecInternalComponent; } \
-if (__itemImplRef) { CFRelease(__itemImplRef); } \
-return __secapiresult;
+       OSStatus __secapiresult=errSecSuccess; \
+       static dispatch_once_t countToken; \
+       countLegacyAPI(&countToken, __FUNCTION__); \
+       SecCertificateRef __itemImplRef=NULL; \
+       if (SecCertificateIsItemImplInstance(certificate)) { __itemImplRef=(SecCertificateRef)CFRetain(certificate); } \
+       if (!__itemImplRef && certificate) { __itemImplRef=(SecCertificateRef)SecCertificateCopyKeychainItem(certificate); } \
+       if (!__itemImplRef && certificate) { __itemImplRef=SecCertificateCreateItemImplInstance(certificate); \
+               (void)SecCertificateSetKeychainItem(certificate,__itemImplRef); } \
+       try {
+
+//
+// END_SECCERTAPI
+//
+#define END_SECCERTAPI } \
+       catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
+       catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
+       catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
+       catch (...) { __secapiresult=errSecInternalComponent; } \
+       if (__itemImplRef) { CFRelease(__itemImplRef); } \
+       return __secapiresult;
 
 
 
 
+//
+// BEGIN_SECKEYAPI
+//
+#define BEGIN_SECKEYAPI(resultType, resultInit) \
+resultType result = resultInit; try {
+
+extern "C" bool SecError(OSStatus status, CFErrorRef *error, CFStringRef format, ...);
+
+#define END_SECKEYAPI }\
+catch (const MacOSError &err) { SecError(err.osStatus(), error, CFSTR("%s"), err.what()); result = NULL; } \
+catch (const CommonError &err) { \
+       if (err.osStatus() != CSSMERR_CSP_INVALID_DIGEST_ALGORITHM) { \
+       OSStatus status = SecKeychainErrFromOSStatus(err.osStatus()); if (status == errSecInputLengthError) status = errSecParam; \
+       SecError(status, error, CFSTR("%s"), err.what()); result = NULL; } \
+       } \
+catch (const std::bad_alloc &) { SecError(errSecAllocate, error, CFSTR("allocation failed")); result = NULL; } \
+catch (...) { SecError(errSecInternalComponent, error, CFSTR("internal error")); result = NULL; } \
+return result;
+
 #endif /* !_SECURITY_SECBRIDGE_H_ */
 #endif /* !_SECURITY_SECBRIDGE_H_ */