-#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"
+//