交叉編譯openssl-1.0.2l測試的第一個程序--隨機數生成

上一篇博文介紹了交叉編譯opensll-1.0.2l,是否編譯成功,可以在目標環境中進行測試,這裏給編寫的一個簡單的測試程序,即利用openssl的rand功能生成隨機數。

本次測試的目標環境和編譯環境如下:

目標環境:CPU爲64位ARMv8的Samsung S6手機;

編譯環境:Ubuntu14.04 LTS + aarch64-linux-gnu-gcc 4.8編譯器。

       測試步驟如下:

  1. 假設通過上一篇博文中的方法,將openssl的相關文件install在瞭如下路徑:/home/xiaot/armlib/openssl/則編寫測試程序代碼如下:
    #include <stdio.h>
    #include <string.h>
    #include <openssl/rand.h>
    
    int main(int argc, char* argv[])
    {
    	int num = 10;
    	int res = 0; 
    	int i = 0;
    	unsigned char buf[10];
    	
    	printf("RNG for default rand seed!\n\n");	
    	res = RAND_bytes( buf, num );
    	if( res == 1 )
    	{
    		printf("Succeed to generate rand numbers by RAND_bytes:\n");
    		for( i = 0; i < num; i++ )
    			printf("%0x ", buf[i]);
    		printf("\n");
    	}
    	else
    		printf("Fail to generate rand numbers!\n");
    
    	res = RAND_bytes( buf, num );
    	if( res == 1 )
    	{
    		printf("Succeed to generate rand numbers by RAND_bytes:\n");
    		for( i = 0; i < num; i++ )
    			printf("%0x ", buf[i]);
    		printf("\n\n");
    	}
    	else
    		printf("Fail to generate rand numbers!\n");
    
    	res = RAND_pseudo_bytes( buf, num );
    	if( res == 1 )
    	{
    		printf("Succeed to generate rand numbers by RAND_pseudo_bytes:\n");
    		for( i = 0; i < num; i++ )
    			printf("%0x ", buf[i]);
    		printf("\n");
    	}
    	else
    		printf("Fail to generate rand numbers!\n");
    
    	res = RAND_pseudo_bytes( buf, num );
    	if( res == 1 )
    	{
    		printf("Succeed to generate rand numbers by RAND_pseudo_bytes:\n");
    		for( i = 0; i < num; i++ )
    			printf("%0x ", buf[i]);
    		printf("\n\n");
    	}
    	else
    		printf("Fail to generate rand numbers!\n");
    
    return 0;	
    }
    
  2. 編寫Makefile文件,如下:
    #source file
    #源文件,自動找所有.c和.cpp文件,並將目標定義爲同名.o文件
    SOURCE  := $(wildcard *.c) $(wildcard *.cpp)
    OBJS    := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
    
    TARGET  := rng_SSL
    
    CC      := aarch64-linux-gnu-gcc
    LIBS    := -lssl -lcrypto -ldl -static 
    LDFLAGS := -L /home/xiaot/armlib/openssl/lib/
    DEFINES :=
    INCLUDE := -I /home/xiaot/armlib/openssl/include/
    CFLAGS  := -g -Wall -std=c99 -O0 $(DEFINES) $(INCLUDE)
    CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
    
    .PHONY : everything objs clean veryclean rebuild
      
    everything : $(TARGET)
      
    all : $(TARGET)
      
    objs : $(OBJS)
      
    rebuild: veryclean everything
                    
    clean :
    	rm -fr *.so
    	rm -fr *.o
    	rm -fr $(TARGET)
        
    veryclean : clean
    	rm -fr $(TARGET)
      
    $(TARGET) : $(OBJS)
    	$(CC) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS) 
    
    需要注意的一點是S6環境不是一個標準的Linux環境,許多庫不存在,因此這裏需要加上-static的編譯選項,保證編譯出的可執行程序可以自包含。

  3. 進行make操作,生成對應的可執行文件如下圖:


  4. 將S6連接主機,在Ubuntu中通過adb連接S6(此步驟不再詳述),將可執行文件複製到S6的sdcard中,如下圖:

    再將文件拷貝至S6本機下目錄(S6具有限制,只能在本機下目錄纔可以執行文件),將可執行文件提權使其能夠被執行。

  5. 通過運行./rng_SSL執行程序,成功執行的輸出結果如下圖:

    至此完成了對openssl-1.0.2l的交叉編譯測試,該測試程序可以通用於ARMv8的開發板及設備,如果開發板上的Linux系統完整,且包含openssl庫,則Makefile文件中的編譯選項不需要添加-static選項。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章