交叉编译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 
    #include 
    #include 
    
    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操作,生成对应的可执行文件如下图:
    交叉编译openssl-1.0.2l测试的第一个程序--随机数生成_第1张图片

  4. 将S6连接主机,在Ubuntu中通过adb连接S6(此步骤不再详述),将可执行文件复制到S6的sdcard中,如下图:
    交叉编译openssl-1.0.2l测试的第一个程序--随机数生成_第2张图片
    再将文件拷贝至S6本机下目录(S6具有限制,只能在本机下目录才可以执行文件),将可执行文件提权使其能够被执行。

  5. 通过运行./rng_SSL执行程序,成功执行的输出结果如下图:
    交叉编译openssl-1.0.2l测试的第一个程序--随机数生成_第3张图片

    至此完成了对openssl-1.0.2l的交叉编译测试,该测试程序可以通用于ARMv8的开发板及设备,如果开发板上的Linux系统完整,且包含openssl库,则Makefile文件中的编译选项不需要添加-static选项。

你可能感兴趣的:(其他技术方向)