vc++网络安全编程范例(14)-openssl bio编程

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

   作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。

 

我们来用VC++实现使用各种source/sink类型bio的例子程序,请见代码实现与注释讲解

[cpp]  view plain  copy
  1. #include "commonlib.h"  
  2.   
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #include <openssl/crypto.h>  
  6. #include <openssl/err.h>  
  7.   
  8. void printBuffer(const char* msg,BUF_MEM *buffer)  
  9. {  
  10.     if(buffer->length<buffer->max)  
  11.     {  
  12.         buffer->data[buffer->length]=0;  
  13.     }  
  14.     printf("%s:[%s]\n",msg,buffer->data);  
  15. }  
  16.   
  17. #define TESTFILENAME "testfilebio.txt"  
  18.   
  19. int main(int argc, char *argv[])  
  20. {  
  21.     char testdata[]="a whole new world";  
  22.     char outdata[256];  
  23.     BIO *bio,*pair_0,*pair_1;  
  24.   
  25.     BUF_MEM *buffer=NULL;  
  26.     void *databuffer=NULL;  
  27.   
  28.     //建立一个读/写内存BIO  
  29.     bio = BIO_new(BIO_s_mem());  
  30.     BIO_get_mem_ptr(bio, &buffer);  
  31.     BIO_puts(bio, "Hello World;");  
  32.     printBuffer("bio内容:",buffer);  
  33.   
  34.     //write some data into it  
  35.     BIO_write(bio,testdata,(int)strlen(testdata));  
  36.     int len=BIO_read(bio,outdata,sizeof(outdata));  
  37.     outdata[len]=0;  
  38.     printf("现在的内容是:%s\n",outdata);  
  39.     //建立一个只读内存BIO  
  40.     bio = BIO_new_mem_buf("这是一个只读的缓冲区", -1);  
  41.     //获取BIO中所指向的内存地址  
  42.     BIO_get_mem_ptr(bio, &buffer);  
  43.     printBuffer("在内存中的内容",buffer);  
  44.     //阻止当bio关闭时破坏内存段  
  45.     BIO_set_close(bio, BIO_NOCLOSE);  
  46.     BIO_free(bio);  
  47.     printBuffer("释放bio对象之后",buffer);  
  48.   
  49.     //另外一种方式建立只读内存  
  50.     databuffer = malloc(4096);  
  51.     //也可以给databuffer中写入一些数据,然后再进行下一步。  
  52.     bio = BIO_new_mem_buf(buffer, 4096);  
  53.     BIO_free(bio);  
  54.   
  55.     //文件相关的BIO  
  56.     //创建一个和标准输出关联的bio  
  57.     bio = BIO_new(BIO_s_file());  
  58.     BIO_set_fp(bio, stdout, BIO_NOCLOSE);  
  59.     BIO_printf(bio, "来自标准输出的消息\n");  
  60.     BIO_free(bio);  
  61.     //创建一个读/写文件bio,并且,当bio被释放时,关闭此文件。  
  62.     bio = BIO_new_file(TESTFILENAME, "w+");  
  63.     BIO_puts(bio, "Hello World;\n");  
  64.     //写一些数据当文件里去  
  65.     BIO_write(bio,testdata,(int)strlen(testdata));  
  66.     BIO_printf(bio,"\ntest printf to file:%s=%d\n","length of testdata",strlen(testdata));  
  67.     //必须将文件指针重置到头部,否则后面读不到数据。  
  68.     BIO_seek(bio,0L);  
  69.     len=BIO_read(bio,outdata,sizeof(outdata));  
  70.     outdata[len]=0;  
  71.     printf("===在文件中的内容[%s]====:\n%s"  
  72.         "=====================================\n",TESTFILENAME,outdata);  
  73.     BIO_free(bio);     
  74.       
  75.     //BIO对  
  76.     pair_0= BIO_new(BIO_s_bio());  
  77.     BIO_set_write_buf_size(pair_0, 4096);  
  78.     pair_1 = BIO_new(BIO_s_bio());  
  79.     BIO_set_write_buf_size(pair_1, 4096);  
  80.     BIO_make_bio_pair(pair_0, pair_1);//组成BIO对  
  81.     //下面方式也可以,下面的语句等价于上面四句  
  82.     //BIO_new_bio_pair(&pair_0, 4096, &pair_1, 4096);//identical to above 4 lines  
  83.     BIO_write(pair_0,testdata,(int)strlen(testdata));  
  84.     memset(outdata,0,sizeof(outdata));  
  85.     len=BIO_read(pair_1,outdata,sizeof(outdata));  
  86.     outdata[len]=0;  
  87.     printf("=====从bio对中读取的数据:===\n%s"  
  88.         "\n================================\n",outdata);  
  89.   
  90.     printf("\n click any key to continue.");  
  91.     getchar();  
  92.   
  93.     return 0;  
  94. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值