在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
10-安全传输平台项目-第03天(统一报文-动态库制作-统一通信组件-函数接口)
目录:
一、复习
1、ANSI.1抽象语法标记
2、教师结构体的编码解码
二、学习目标
三、安全传输平台项目—统一报文编码组和统一通信组件
1、教师结构体编码解码封装
2、wind下制作动态库原理
3、wind动态库制作
4、库使用问题总结
5、Linux动态库制作理论
6、Linux下动态库制作
7、Makefile复习
8、Makefile项目目录管理
四、安全传输平台项目—统一通信组件
1、统一通信组件-客户端服务器API
2、统一通信组件-服务器实现
一、复习
1、ANSI.1抽象语法标记
2、教师结构体的编码解码
int MsgEncode(void *teacher, unsigned char **out, int *outlen, int type)
{
1.编码type
2.编码Teacher结构体
1)name
2)age
3)p
4)plen
5)Teacher结构体本身 --> Anybuf
3.编码 大结构体(type、Teacher)
}
二、学习目标
1 MsgKey_Req 结构体 编码解码 三个 20
2 MsgKey_Req三个api函数 集成到 框架中 40
3 生成win mymsgreal.dll 50
4 win 编程测试案例 60
5 win移植到到linux 70
6 编程linux动态库 80
7 测试和调试linux动态库 90
8 代码优化、makefile 100
三、安全传输平台项目—统一报文编码组和统一通信组件
重点:深入理解,报文编码解码组件和业务流模块的解耦合
》统一报文编码解码设计思想
统一报文编解码组件:实现了把各种各样的数据类型进行隐藏、把各种各样的报文结果类型进行隐藏
》统一报文编码解码设计思想
1)定义统一报文API 打桩API函数 (keymng_msg.c keymng_msg.h)
2)编写统一报文组件的测试案例
3)编码实现统一报文组件的编码业务流
4)编码实现统一报文组件的解码业务流程)
5)优化统一报文组件 日志/内存泄漏)
6)统一报文组件动态库 和 动态库测试程序
7)统一报文组件 linux下的移植 跨平台的移植
Win系统文件上传/linux系统文件编译/动态库工程makefile和动态库文件
1、教师结构体编码解码封装
keymng_msg.h
#ifndef _KEYMNG_MSG_H_ #define _KEYMNG_MSG_H_ #ifdef __cplusplus extern "C" { #endif #define KeyMng_ParamErr 200 //输入参数失败 #define KeyMng_TypeErr 201 //输入类型失败 #define KeyMng_MallocErr 202 //分配内存失败 #define KeyMng_NEWorUPDATE 1 //1 密钥协商 #define KeyMng_Check 2 //2 密钥校验 #define KeyMng_Revoke 3 //3 密钥注销 #define ID_MsgKey_Teacher 80 typedef struct _Teacher { char name[64]; int age; char *p; int plen; }Teacher; //密钥请求报文 --- 结构体 #define ID_MsgKey_Req 60 typedef struct _MsgKey_Req { //1 密钥协商 //2 密钥校验; //3 密钥注销 int cmdType; //报文命令码 char clientId[12]; //客户端编号 char AuthCode[16]; //认证码 char serverId[12]; //服务器端I编号 char r1[64]; //客户端随机数 }MsgKey_Req; //密钥应答报文 --- 结构体 #define ID_MsgKey_Res 61 typedef struct _MsgKey_Res { int rv; //返回值 char clientId[12]; //客户端编号 char serverId[12]; //服务器编号 unsigned char r2[64]; //服务器端随机数 int seckeyid; //对称密钥编号 //modfy 2015.07.20 }MsgKey_Res; /* pstruct : 输入的报文数据 ; (指向相应结构体的指针) type : 输入的类型标识(函数内部通过type 得到 pstruct 所指向的报文类型) poutData: 输出的编码后的报文 ; outlen : 输出的数据长度; */ int MsgEncode( void *pStruct , /*in*/ int type, unsigned char **outData, /*out*/ int *outLen ); /* inData : 输入的编码后的数据; inLen : 输入的数据长度 ; pstruct : 输出的解码后的数据; (其空间是在内部开辟的,也需要用内部定义的free函数进行释放) type : 结构的类型标识(返回类型标识,使得调用者通过flag进行判断,将pstruct 转换为相应的结构) */ int MsgDecode( unsigned char *inData,/*in*/ int inLen, void **pStruct /*out*/, int *type /*out*/); /* 释放 MsgEncode( )函数中的outData; 方法:MsgMemFree((void **)outData, 0); 释放MsgDecode( )函数中的pstruct结构体,MsgMemFree((void **)outData, type); type : 输入参数,便于函数判断调用哪个结构体的free函数 */ int MsgMemFree(void **point,int type); #ifdef __cplusplus } #endif #endif
keymng_msg.c
#include <stdarg.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include "keymng_msg.h" #include "itcast_asn1_der.h" int TeacherEncode_(Teacher *pTeacher, ITCAST_ANYBUF **outData) { int ret = 0; ITCAST_ANYBUF *pTmp = NULL, *pHeadBuf = NULL; ITCAST_ANYBUF *pTmpBuf = NULL; ITCAST_ANYBUF *pOutData = NULL; unsigned char *tmpout = NULL; int tmpoutlen = 0; // 把C语言的buf 转化成 ITCAST_ANYBUF ret = DER_ITCAST_String_To_AnyBuf(&pTmpBuf, pTeacher->name, strlen(pTeacher->name)); if (ret != 0) { printf("func DER_ITCAST_String_To_AnyBuf() err:%d ", ret); return ret; } //编码 name ret = DER_ItAsn1_WritePrintableString(pTmpBuf, &pHeadBuf); if (ret != 0) { DER_ITCAST_FreeQueue(pTmpBuf); printf("func DER_ITCAST_String_To_AnyBuf() err:%d ", ret); return ret; } //两个辅助指针变量 指向 同一个节点 pTmp = pHeadBuf; //编码 age ret = DER_ItAsn1_WriteInteger(pTeacher->age, &(pTmp->next)); if (ret != 0) { DER_ITCAST_FreeQueue(pHeadBuf); //释放链表 以免内存泄漏 printf("func DER_ItAsn1_WriteInteger() err:%d ", ret); return ret; } pTmp = pTmp->next; //编码 p ret = EncodeChar(pTeacher->p, pTeacher->plen, &pTmp->next); if (ret != 0) { DER_ITCAST_FreeQueue(pHeadBuf); //释放链表 以免内存泄漏 printf("func EncodeChar() err:%d ", ret); return ret; } pTmp = pTmp->next; //编码 plen ret = DER_ItAsn1_WriteInteger(pTeacher->plen, &(pTmp->next)); if (ret != 0) { DER_ITCAST_FreeQueue(pHeadBuf); //释放链表 以免内存泄漏 printf("func DER_ItAsn1_WriteInteger() err:%d ", ret); return ret; } ret = DER_ItAsn1_WriteSequence(pHeadBuf, &pOutData); if (ret != 0) { DER_ITCAST_FreeQueue(pHeadBuf); //释放链表 以免内存泄漏 printf("func DER_ItAsn1_WriteSequence() err:%d ", ret); return ret; } *outData = pOutData; //老师结构体 大节点 传出来 DER_ITCAST_FreeQueue(pHeadBuf); //释放链表 以免内存泄漏 /* *out = (unsigned char *)malloc(pOutData->dataLen); if (*out == NULL) { ret = 2; DER_ITCAST_FreeQueue(pOutData); printf("func TeacherEncode() malloc err:%d ", ret); return ret; } memcpy(*out, pOutData->pData, pOutData->dataLen); //把运算结果copy到新分配的内存块中 *outlen = pOutData->dataLen; */ //DER_ITCAST_FreeQueue(pOutData); return ret; } int TeacherDecode_(unsigned char *indata, int inLen, Teacher **pStruct) { int ret = 0; ITCAST_ANYBUF *pTmp = NULL, *pHead = NULL; ITCAST_ANYBUF *pOutData = NULL; ITCAST_ANYBUF *inAnyBuf = NULL; Teacher *pTmpStru = NULL; /* //把c语言buf 转化成 ITCAST_ANYBUF inAnyBuf = (ITCAST_ANYBUF *)malloc(sizeof(ITCAST_ANYBUF)); if (inAnyBuf == NULL) { ret = 1; printf("func TeacherDecode malloc error: %d", ret); return ret; } memset(inAnyBuf, 0, sizeof(ITCAST_ANYBUF)); inAnyBuf->pData = (unsigned char *)malloc(inLen); if (inAnyBuf->pData == NULL) { DER_ITCAST_FreeQueue(inAnyBuf); ret = 2; printf("func TeacherDecode malloc error: %d", ret); return ret; } memcpy(inAnyBuf->pData, indata, inLen); inAnyBuf->dataLen = inLen; */ //将 ber 格式的字节流,转换成AnyBuf ret = DER_ITCAST_String_To_AnyBuf(&inAnyBuf, indata, inLen); if (ret != 0) { printf("func DER_ITCAST_String_To_AnyBuf error : %d", ret); return ret; } //解码 Teacher 结构体 得到4个节点 ret = DER_ItAsn1_ReadSequence(inAnyBuf, &pHead); if (ret != 0) { DER_ITCAST_FreeQueue(inAnyBuf); printf("func DER_ItAsn1_ReadSequence() err:%d ", ret); return ret; } DER_ITCAST_FreeQueue(inAnyBuf); //把老师结构体给分配出来 pTmpStru = (Teacher *)malloc(sizeof(Teacher)); if (pTmpStru == NULL) { ret = 3; DER_ITCAST_FreeQueue(pHead); //释放链表 printf("func malloc() err:%d ", ret); return ret; } memset(pTmpStru, 0, sizeof(Teacher)); pTmp = pHead; //解码 name ret = DER_ItAsn1_ReadPrintableString(pTmp, &pOutData); if (ret != 0) { DER_ITCAST_FreeQueue(pHead); //释放链表 printf("func DER_ItAsn1_ReadPrintableString() err:%d ", ret); return ret; } //给name变量赋值 memcpy(pTmpStru->name, pOutData->pData, pOutData->dataLen); pTmp = pTmp->next; //跳到下一个节点 DER_ITCAST_FreeQueue(pOutData); //解码age ret = DER_ItAsn1_ReadInteger(pTmp, &(pTmpStru->age)); if (ret != 0) { DER_ITCAST_FreeQueue(pHead); //释放链表 printf("func DER_ItAsn1_ReadInteger() err:%d ", ret); return ret; } pTmp = pTmp->next; //跳到下一个节点 //解码 p ret = DER_ItAsn1_ReadPrintableString(pTmp, &pOutData); if (ret != 0) { DER_ITCAST_FreeQueue(pHead); //释放链表 printf("func DER_ItAsn1_ReadPrintableString() err:%d ", ret); return ret; } pTmpStru->p = (char *)malloc(pOutData->dataLen + 1); if (pTmpStru->p == NULL) { ret = 4; printf("func malloc err:%d ", ret); return ret; } memcpy(pTmpStru->p, pOutData->pData, pOutData->dataLen); pTmpStru->p[pOutData->dataLen] = '