⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macsecurity.cxx

📁 这是国外的resip协议栈
💻 CXX
字号:
#include "resip/stack/MacSecurity.hxx"#include "rutil/Logger.hxx"#include <CoreFoundation/CoreFoundation.h>#include <CoreServices/CoreServices.h>#include <Security/Security.h>#include <openssl/e_os2.h>#include <openssl/evp.h>#include <openssl/crypto.h>#include <openssl/err.h>#include <openssl/pem.h>#include <openssl/pkcs7.h>#include <openssl/ossl_typ.h>#include <openssl/x509.h>#include <openssl/x509v3.h>#include <openssl/ssl.h>using namespace resip;using namespace std;#define RESIPROCATE_SUBSYSTEM Subsystem::SIPint verifyCallback(int iInCode, X509_STORE_CTX *pInStore);voidMacSecurity::preload(){   // load the root certificates   getCerts();}// Opens a search handle to certificates store in// the X509Anchors keychainKeychainHandleMacSecurity::openSystemCertStore(){   OSStatus status = noErr;   const char *pathName = nil;   SInt32 MacVersion = 0;       if (Gestalt(gestaltSystemVersion, &MacVersion) == noErr)   {      if (MacVersion >= 0x1050)      {         //for Leopard OSX, the root certificate are located in SystemRootCertificates.keychain	     pathName = "/System/Library/Keychains/SystemRootCertificates.keychain";       }      else      {         //for earlier OSX (including Tiger), the root certificate are located in X509Anchors         pathName = "/System/Library/Keychains/X509Anchors";      }   }   if(nil == pathName)   {      ErrLog( << "Cannot retrieve OS version");      return NULL;   }   // NOTE: instead of hardcoding the "/System" portion of the path   // we could retrieve it using ::FSFindFolder instead. But it   // doesn't seem useful right now.   SecKeychainRef systemCertsKeyChain;   status = ::SecKeychainOpen(      pathName,      &systemCertsKeyChain   );   if (status != noErr)   {      ErrLog( << "X509Anchors keychain could not be opened");      assert(0);      return NULL;   }   // Create a handle to search that iterates over root certificates   // in the X509Anchors keychain   SecKeychainSearchRef searchReference = nil;   status = ::SecKeychainSearchCreateFromAttributes(      systemCertsKeyChain,      kSecCertificateItemClass,      NULL,      &searchReference   );      // Now that we have the search handle we don't need an explicit   // reference to the keychain      ::CFRelease(systemCertsKeyChain);      if (status != noErr)   {            ErrLog( << "System certificate store cannot be opened");      assert(0);      return NULL;   }   InfoLog( << "System certificate store opened");   return searchReference;}void MacSecurity::closeCertifStore(KeychainHandle searchReference){   if (NULL == searchReference)      return;       ::CFRelease(searchReference);}voidMacSecurity::getCerts(){   SecKeychainSearchRef searchReference = NULL;   searchReference = (SecKeychainSearchRef) openSystemCertStore();   // nothing to do, error already reported   if (searchReference == NULL)      return;      // iterate over each certificate   for (;;)   {      OSStatus status = noErr;      SecKeychainItemRef itemRef = nil;            // get the next certificate in the search      status = ::SecKeychainSearchCopyNext(         searchReference,         &itemRef      );      if (status == errSecItemNotFound)      {         // no more certificates left         break;      }            // get data from the certificate      if (status == noErr)      {                 void *data;         UInt32 dataSize;         status = ::SecKeychainItemCopyAttributesAndData(            itemRef,            NULL,            NULL,            NULL,            &dataSize,            &data         );                           if (status == noErr && data != NULL)         {            Data certDER(Data::Borrow, (const char*)data, dataSize);            addCertDER(BaseSecurity::RootCert, NULL, certDER, false);                        status = ::SecKeychainItemFreeAttributesAndData(NULL, data);         }      }            // free the certificate handle      if (itemRef != NULL)         ::CFRelease(itemRef);            if (status != noErr)      {         // there was an error loading the certificate         ErrLog( << "Couldn't load certificate, error code: " << status);         assert(0);      }   }      closeCertifStore(searchReference);}// TODO: this needs to be refactored with WinSecurity.cxxint verifyCallback(int iInCode, X509_STORE_CTX *pInStore){   char cBuf1[500];   char cBuf2[500];   X509 *pErrCert;   int iErr = 0;   int iDepth = 0;   pErrCert = X509_STORE_CTX_get_current_cert(pInStore);   iErr = X509_STORE_CTX_get_error(pInStore);   iDepth =	X509_STORE_CTX_get_error_depth(pInStore);   if (NULL != pErrCert)      X509_NAME_oneline(X509_get_subject_name(pErrCert),cBuf1,256);   sprintf(cBuf2,"depth=%d %s\n",iDepth,cBuf1);   if(!iInCode)   {      memset(cBuf2, 0, sizeof(cBuf2) );       sprintf(cBuf2, "\n Error %s", X509_verify_cert_error_string(pInStore->error) );   }    return iInCode;}/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -