標籤:
轉自:http://blog.csdn.net/kmyhy/article/details/6534067
在你的 iOS App中 使用 OpenSSL 庫
——譯自x2on的“Tutorial: iPhone App with compiled OpenSSL 1.0.0a Library”
原文地址:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/,本文有少許地方做了調整。
1、下載OpenSSL原始碼庫:
http://www.openssl.org/source/
當前最新版本1.0.0d。
下載後,將其中的 openssl-1.0.0x 目錄解壓出來放在合適的地方。
2、編譯OpenSSL
openssl是一個c語言函數庫,為方便在Xcode中使用,我們需要把它編譯為靜態庫。
開啟crypto/ui/ui_openssl.c進行編輯。
將
static volatile sig_atomic_t intr_signal;
修改為:
static volatile int intr_signal;
否則會出現一個編譯錯誤。
2.1 編譯 i386 庫(用於iPhone模擬器)
執行以下命令:
mkdir ssllibs
將在使用者主目錄下建立ssllibs目錄。
切換到openssl-1.0.0a安裝(解壓)目錄,在其下建立3個子目錄:
cd openssl-1.0.0a
mkdir openssl_armv6 openssl_armv7 openssl_i386
執行目錄下的congfigure:
./configure BSD-generic32 --openssldir=/Users/<username>/openssl-1.0.0a/openssl_i386
編輯 makefile 檔案,找到:
CC= gcc
修改為:
CC= /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386
下一行,在CFLAG = 的後面增加
-isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk
進行編譯:
make
make install
檢查 openssl_i386/lib目錄下 libcrypto.a 和 libssl.a 是否產生。
2.2 編譯 armv6 庫(armv6架構的iOS使用)
先將編譯好的 i386 庫儲存到 ssllibs 目錄:
mv openssl_i386 ../ssllibs
清除上次編譯的配置:
make clean
執行configure,重建新的編譯配置:
./configure BSD-generic32 --openssldir=/Users/<username>/openssl-1.0.0a/openssl_armv6
修改 makefile 檔案,將 CC=gcc修改為:
CC= /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv6
注意,這裡是iPhoneOS.platform而不是先前的 iPhoneSimulator.platform了。
同樣,需要在CFLAG=後面加上:
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk
可以進行編譯了:
make
make install
檢查 openssl_armv6/lib 目錄下 libcrypto.a 和 libssl.a 是否產生。
2.3 編譯 armv7 庫(armv7 架構的 iOS 使用)
先將先前編譯好的 armv6 庫移到 ssllibs 目錄。
mv openssl_armv6 ../ssllibs
清除前面編譯配置:
make clean
執行configure配置編譯環境:
./configure BSD-generic32 --openssldir=/Users/<username>/openssl-1.0.0a/openssl_armv7
修改 makefile 檔案,將 CC=cc修改為:
CC= /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv7
注意,gcc 編譯選項 arch 由 armv6 變為了 armv7。
同時,在CFLAG=後面添加:
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk
進行編譯:
make make
install
檢查 openssl_armv7/lib 目錄下 libcrypto.a 和 libssl.a 是否產生。
把編譯結果移到ssllibs目錄:
mv openssl_armv7 ../ssllibs
2.4 製作“通用”靜態庫
通用靜態庫是一個“多架構”檔案,它是多個單一架構靜態庫的融合。
製作“通用”靜態庫需要使用 Mac OS X 的 lipo 命令(具體請參考 Mac OS X 手冊)。
合并 libcrypto.a 庫:
lipo -create ../ssllibs/openssl_i386/lib/libcrypto.a ../ssllibs/openssl_armv6/lib/libcrypto.a ../ssllibs/openssl_armv7/lib/libcrypto.a -output ../ssllibs/libcrypto.a
合并 libssl.a 庫:
lipo -create ../ssllibs/openssl_i386/lib/libssl.a ../ssllibs/openssl_armv6/lib/libssl.a ../ssllibs/openssl_armv7/lib/libssl.a -output ../ssllibs/libssl.a
3、在 Xcode 項目的進行設定
把 OpenSSL 的 include 目錄拷貝到專案檔夾。
把 libcrypto.a 和 libssl.a 檔案拷貝到專案檔夾。
把 libcrypto.a 和 libssl.a 檔案拖到項目的 Framework 組中。
在 target 上右鍵,選擇 Get Info,將 Library Search Path 設定為:
$(inherited) “$(SRCROOT)”
將 User Header Search Paths 設為 include。
選中 Always Search User Paths 選項。
現在可以在你的iPhone項目中實用OpenSSL了。
4、寫一個應用 OpenSSL 的小例子
建立 Window-based application,命名為OpenSSLTest.
“Add à Existing Frameworks à Others…”,把libssl.a和libcrypto.a加進來(即我們前面製作的“通用”庫)。
開啟項目info 的 Build 設定,在 Header Search Paths 中加入 OpenSSL 的標頭檔路徑,如:
/Users/<yourname>/Library/openssl-1.0.0a/include
注意,勾上“Recursive”(搜尋子目錄)。
接下來寫點簡單的代碼。為求省事,我們把所有代碼寫在main.m裡:
#import <UIKit/UIKit.h>
#include <Openssl/md5.h>
void Md5( NSString *);
int main( int argc, char *argv[]) {
NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ];
Md5 ( @"12345" );
int retVal = UIApplicationMain (argc, argv, nil , nil );
[pool release ];
return retVal;
}
void Md5( NSString * string){
// 輸入參數 1 :要產生 md5 值的字串, NSString-->uchar*
unsigned char *inStrg = ( unsigned char *)[[string dataUsingEncoding :NSASCIIStringEncoding ] bytes];
// 輸入參數 2 :字串長度
unsigned long lngth = [string length ];
// 輸出參數 3 :要返回的 md5 值, MD5_DIGEST_LENGTH 為 16bytes , 128 bits
unsigned char result[ MD5_DIGEST_LENGTH ];
// 臨時 NSString 變數,用於把 uchar* 組裝成可以顯示的字串: 2 個字元一 byte 的 16 進位數
NSMutableString *outStrg = [ NSMutableString string ];
// 調用 OpenSSL 函數
MD5 (inStrg, lngth, result);
unsigned int i;
for (i = 0 ; i < MD5_DIGEST_LENGTH ; i++)
{
[outStrg appendFormat : @"%02x" , result[i]];
}
NSLog ( @"input string:%@" ,string);
NSLog ( @"md5:%@" ,outStrg);
}
你可以在控制台查看程式的輸出:
input string:12345
md5:827ccb0eea8a706c4c34a16891f84e7b
iOS App中 使用 OpenSSL 庫