Skip to content

Commit 915c8aa

Browse files
committed
added:implement encryption and decryption for http basic and digest
1 parent b22c3e2 commit 915c8aa

File tree

9 files changed

+409
-4
lines changed

9 files changed

+409
-4
lines changed

XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ bool CAPIHelp_Api::APIHelp_Api_ProxyAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR
7676
APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTSUPPORT;
7777
return false;
7878
}
79-
OPenSsl_Help_BasicDecoder(tszAuthStr, ptszUser, ptszPass);
79+
APIHelp_Cryption_BasicDecoder(tszAuthStr, ptszUser, ptszPass);
8080
return true;
8181
}
8282
/********************************************************************
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
#include "pch.h"
2+
#include "APIHelp_Cryption.h"
3+
/********************************************************************
4+
// Created: 2024/10/29 11:43:48
5+
// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_APIHelp\APIHelp_Cryption\APIHelp_Cryption.cpp
6+
// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_APIHelp\APIHelp_Cryption
7+
// File Base: APIHelp_Cryption
8+
// File Ext: cpp
9+
// Project: XEngine(网络通信引擎)
10+
// Author: qyt
11+
// Purpose: 加解密帮助函数
12+
// History:
13+
*********************************************************************/
14+
CAPIHelp_Cryption::CAPIHelp_Cryption()
15+
{
16+
}
17+
CAPIHelp_Cryption::~CAPIHelp_Cryption()
18+
{
19+
}
20+
//////////////////////////////////////////////////////////////////////////
21+
// 公有函数
22+
//////////////////////////////////////////////////////////////////////////
23+
/********************************************************************
24+
函数名称:APIHelp_Cryption_BasicEncoder
25+
函数功能:HTTP基本验证加密函数
26+
参数.一:lpszUser
27+
In/Out:In
28+
类型:常量字符指针
29+
可空:N
30+
意思:输入用户名
31+
参数.二:lpszPass
32+
In/Out:In
33+
类型:常量字符指针
34+
可空:N
35+
意思:输入密码
36+
参数.三:ptszMsgBuffer
37+
In/Out:In
38+
类型:字符指针
39+
可空:N
40+
意思:输出加密后的缓冲区
41+
参数.四:bADD
42+
In/Out:In
43+
类型:逻辑型
44+
可空:N
45+
意思:是否添加验证算法类型
46+
返回值
47+
类型:逻辑型
48+
意思:是否成功
49+
备注:格式:Basic BASE64
50+
*********************************************************************/
51+
bool CAPIHelp_Cryption::APIHelp_Cryption_BasicEncoder(LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, bool bADD /* = true */)
52+
{
53+
APIHelp_IsErrorOccur = false;
54+
55+
if ((NULL == lpszUser) || (NULL == lpszPass) || (NULL == ptszMsgBuffer))
56+
{
57+
APIHelp_IsErrorOccur = true;
58+
APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT;
59+
return false;
60+
}
61+
XCHAR tszMsgBuffer[2048];
62+
XCHAR tszBaseBuffer[2048];
63+
64+
memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer));
65+
memset(tszBaseBuffer, '\0', sizeof(tszBaseBuffer));
66+
67+
int nLen = _xstprintf(tszMsgBuffer, _X("%s:%s"), lpszUser, lpszPass);
68+
if (!OPenSsl_Codec_Base64(tszMsgBuffer, tszBaseBuffer, &nLen))
69+
{
70+
return false;
71+
}
72+
if (bADD)
73+
{
74+
_xstprintf(ptszMsgBuffer, _X("Basic %s"), tszBaseBuffer);
75+
}
76+
else
77+
{
78+
_tcsxcpy(ptszMsgBuffer, tszBaseBuffer);
79+
}
80+
return true;
81+
}
82+
/********************************************************************
83+
函数名称:APIHelp_Cryption_BasicDecoder
84+
函数功能:HTTP基本验证解密函数
85+
参数.一:lpszMsgBuffer
86+
In/Out:In
87+
类型:常量字符指针
88+
可空:N
89+
意思:输入要解密的缓冲区
90+
参数.二:ptszUser
91+
In/Out:Out
92+
类型:字符指针
93+
可空:N
94+
意思:输出用户名
95+
参数.三:ptszPass
96+
In/Out:Out
97+
类型:字符指针
98+
可空:N
99+
意思:输出密码
100+
返回值
101+
类型:逻辑型
102+
意思:是否成功
103+
备注:HttpProtocol_ServerHelp_GetAuthInfo 返回的内容
104+
格式:Basic BASE64
105+
*********************************************************************/
106+
bool CAPIHelp_Cryption::APIHelp_Cryption_BasicDecoder(LPCXSTR lpszMsgBuffer, XCHAR* ptszUser, XCHAR* ptszPass)
107+
{
108+
APIHelp_IsErrorOccur = false;
109+
110+
if ((NULL == lpszMsgBuffer) || (NULL == ptszUser) || (NULL == ptszPass))
111+
{
112+
APIHelp_IsErrorOccur = true;
113+
APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT;
114+
return false;
115+
}
116+
XCHAR tszBaseBuffer[2048];
117+
memset(tszBaseBuffer, '\0', sizeof(tszBaseBuffer));
118+
//是否有Basic
119+
if (NULL == _tcsxstr(lpszMsgBuffer, _X("Basic")))
120+
{
121+
int nMsgLen = _tcsxlen(lpszMsgBuffer);
122+
if (!OPenSsl_Codec_Base64(lpszMsgBuffer, tszBaseBuffer, &nMsgLen, false))
123+
{
124+
return false;
125+
}
126+
}
127+
else
128+
{
129+
int nMsgLen = _tcsxlen(lpszMsgBuffer) - 6;
130+
if (!OPenSsl_Codec_Base64(lpszMsgBuffer + 6, tszBaseBuffer, &nMsgLen, false))
131+
{
132+
return false;
133+
}
134+
}
135+
//分割用户名和密码
136+
XCHAR* ptszPassString = NULL;
137+
XCHAR* ptszUserString = _tcsxtok_s(tszBaseBuffer, _X(":"), &ptszPassString);
138+
if (NULL == ptszUserString)
139+
{
140+
APIHelp_IsErrorOccur = true;
141+
APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_FORMAT;
142+
return false;
143+
}
144+
_tcsxcpy(ptszUser, ptszUserString);
145+
_tcsxcpy(ptszPass, ptszPassString);
146+
147+
return true;
148+
}
149+
/********************************************************************
150+
函数名称:APIHelp_Cryption_Digest
151+
函数功能:摘要计算函数
152+
参数.一:ptszResponseStr
153+
In/Out:Out
154+
类型:字符指针
155+
可空:N
156+
意思:输出计算后的RESPONSE字符串
157+
参数.二:lpszUser
158+
In/Out:In
159+
类型:常量字符指针
160+
可空:N
161+
意思:输入用户名
162+
参数.三:lpszPass
163+
In/Out:In
164+
类型:常量字符指针
165+
可空:N
166+
意思:输入密码
167+
参数.四:lpszRealm
168+
In/Out:In
169+
类型:常量字符指针
170+
可空:N
171+
意思:输入作用域,服务器发送的
172+
参数.五:lpszMethod
173+
In/Out:In
174+
类型:常量字符指针
175+
可空:N
176+
意思:输入请求的方法
177+
参数.六:lpszUrl
178+
In/Out:In
179+
类型:常量字符指针
180+
可空:N
181+
意思:输入请求的URL地址
182+
参数.七:lpszNonce
183+
In/Out:In
184+
类型:常量字符指针
185+
可空:N
186+
意思:服务器生成并且发送的
187+
参数.八:lpszCNonce
188+
In/Out:In
189+
类型:常量字符指针
190+
可空:N
191+
意思:客户端生成的随机字符串
192+
参数.九:lpszNC
193+
In/Out:In
194+
类型:常量字符指针
195+
可空:Y
196+
意思:验证的次数,建议为NULL.
197+
返回值
198+
类型:逻辑型
199+
意思:是否成功
200+
备注:信息摘要支持QOP=AUTH 算法MD5的验证模式
201+
*********************************************************************/
202+
bool CAPIHelp_Cryption::APIHelp_Cryption_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC /* = NULL */)
203+
{
204+
APIHelp_IsErrorOccur = false;
205+
206+
XCHAR tszResponseStr[2048];
207+
XBYTE tszResponseMD5[2048];
208+
XBYTE tszUserMD5[MAX_PATH];
209+
XBYTE tszUrlMD5[MAX_PATH];
210+
XCHAR tszUserStr[MAX_PATH];
211+
XCHAR tszUrlStr[MAX_PATH];
212+
XCHAR tszUserHex[MAX_PATH];
213+
XCHAR tszUrlHex[MAX_PATH];
214+
215+
memset(tszResponseStr, '\0', sizeof(tszResponseStr));
216+
memset(tszResponseMD5, '\0', sizeof(tszResponseMD5));
217+
memset(tszUserMD5, '\0', MAX_PATH);
218+
memset(tszUrlMD5, '\0', MAX_PATH);
219+
memset(tszUserStr, '\0', MAX_PATH);
220+
memset(tszUrlStr, '\0', MAX_PATH);
221+
memset(tszUserHex, '\0', MAX_PATH);
222+
memset(tszUrlHex, '\0', MAX_PATH);
223+
224+
//计算HA1 的MD5字符串 MD5(USER:PASS:REAL)
225+
int nRet = _xstprintf(tszUserStr, _X("%s:%s:%s"), lpszUser, lpszRealm, lpszPass);
226+
OPenSsl_Api_Digest(tszUserStr, tszUserMD5, &nRet);
227+
BaseLib_OperatorString_StrToHex((XCHAR*)tszUserMD5, nRet, tszUserHex);
228+
//计算HA2 的MD5字符串,根据验证模式来计算
229+
nRet = _xstprintf(tszUrlStr, _X("%s:%s"), lpszMethod, lpszUrl);
230+
OPenSsl_Api_Digest(tszUrlStr, tszUrlMD5, &nRet);
231+
BaseLib_OperatorString_StrToHex((XCHAR*)tszUrlMD5, nRet, tszUrlHex);
232+
//计算RESPONSE值
233+
nRet = _xstprintf(tszResponseStr, _X("%s:%s:%s:%s:auth:%s"), tszUserHex, lpszNonce, lpszNC, lpszCNonce, tszUrlHex);
234+
OPenSsl_Api_Digest(tszResponseStr, tszResponseMD5, &nRet);
235+
BaseLib_OperatorString_StrToHex((XCHAR*)tszResponseMD5, nRet, ptszResponseStr);
236+
return true;
237+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
/********************************************************************
3+
// Created: 2024/10/29 11:43:31
4+
// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_APIHelp\APIHelp_Cryption\APIHelp_Cryption.h
5+
// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_APIHelp\APIHelp_Cryption
6+
// File Base: APIHelp_Cryption
7+
// File Ext: h
8+
// Project: XEngine(网络通信引擎)
9+
// Author: qyt
10+
// Purpose: 加解密帮助函数
11+
// History:
12+
*********************************************************************/
13+
14+
class CAPIHelp_Cryption
15+
{
16+
public:
17+
CAPIHelp_Cryption();
18+
~CAPIHelp_Cryption();
19+
public:
20+
bool APIHelp_Cryption_BasicEncoder(LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, bool bADD = true);
21+
bool APIHelp_Cryption_BasicDecoder(LPCXSTR lpszMsgBuffer, XCHAR* ptszUser, XCHAR* ptszPass);
22+
bool APIHelp_Cryption_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC = NULL);
23+
};

XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,4 +370,115 @@ extern "C" bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSiz
370370
意思:是否成功
371371
备注:
372372
*********************************************************************/
373-
extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl);
373+
extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl);
374+
/************************************************************************/
375+
/* 加解密函数 */
376+
/************************************************************************/
377+
/********************************************************************
378+
函数名称:APIHelp_Cryption_BasicEncoder
379+
函数功能:HTTP基本验证加密函数
380+
参数.一:lpszUser
381+
In/Out:In
382+
类型:常量字符指针
383+
可空:N
384+
意思:输入用户名
385+
参数.二:lpszPass
386+
In/Out:In
387+
类型:常量字符指针
388+
可空:N
389+
意思:输入密码
390+
参数.三:ptszMsgBuffer
391+
In/Out:In
392+
类型:字符指针
393+
可空:N
394+
意思:输出加密后的缓冲区
395+
参数.四:bADD
396+
In/Out:In
397+
类型:逻辑型
398+
可空:N
399+
意思:是否添加验证算法类型
400+
返回值
401+
类型:逻辑型
402+
意思:是否成功
403+
备注:格式:Basic BASE64
404+
*********************************************************************/
405+
extern "C" bool APIHelp_Cryption_BasicEncoder(LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, bool bADD = true);
406+
/********************************************************************
407+
函数名称:APIHelp_Cryption_BasicDecoder
408+
函数功能:HTTP基本验证解密函数
409+
参数.一:lpszMsgBuffer
410+
In/Out:In
411+
类型:常量字符指针
412+
可空:N
413+
意思:输入要解密的缓冲区
414+
参数.二:ptszUser
415+
In/Out:Out
416+
类型:字符指针
417+
可空:N
418+
意思:输出用户名
419+
参数.三:ptszPass
420+
In/Out:Out
421+
类型:字符指针
422+
可空:N
423+
意思:输出密码
424+
返回值
425+
类型:逻辑型
426+
意思:是否成功
427+
备注:HttpProtocol_ServerHelp_GetAuthInfo 返回的内容
428+
格式:Basic BASE64
429+
*********************************************************************/
430+
extern "C" bool APIHelp_Cryption_BasicDecoder(LPCXSTR lpszMsgBuffer, XCHAR* ptszUser, XCHAR* ptszPass);
431+
/********************************************************************
432+
函数名称:APIHelp_Cryption_Digest
433+
函数功能:摘要计算函数
434+
参数.一:ptszResponseStr
435+
In/Out:Out
436+
类型:字符指针
437+
可空:N
438+
意思:输出计算后的RESPONSE字符串
439+
参数.二:lpszUser
440+
In/Out:In
441+
类型:常量字符指针
442+
可空:N
443+
意思:输入用户名
444+
参数.三:lpszPass
445+
In/Out:In
446+
类型:常量字符指针
447+
可空:N
448+
意思:输入密码
449+
参数.四:lpszRealm
450+
In/Out:In
451+
类型:常量字符指针
452+
可空:N
453+
意思:输入作用域,服务器发送的
454+
参数.五:lpszMethod
455+
In/Out:In
456+
类型:常量字符指针
457+
可空:N
458+
意思:输入请求的方法
459+
参数.六:lpszUrl
460+
In/Out:In
461+
类型:常量字符指针
462+
可空:N
463+
意思:输入请求的URL地址
464+
参数.七:lpszNonce
465+
In/Out:In
466+
类型:常量字符指针
467+
可空:N
468+
意思:服务器生成并且发送的
469+
参数.八:lpszCNonce
470+
In/Out:In
471+
类型:常量字符指针
472+
可空:N
473+
意思:客户端生成的随机字符串
474+
参数.九:lpszNC
475+
In/Out:In
476+
类型:常量字符指针
477+
可空:Y
478+
意思:验证的次数,建议为NULL.
479+
返回值
480+
类型:逻辑型
481+
意思:是否成功
482+
备注:信息摘要支持QOP=AUTH 算法MD5的验证模式
483+
*********************************************************************/
484+
extern "C" bool APIHelp_Cryption_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC = NULL);

XEngine_Source/StorageModule_APIHelp/APIHelp_Error.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@
2121
#define ERROR_STORAGE_MODULE_APIHELP_NOTHASH 0x0030014 //没有HASH值
2222
#define ERROR_STORAGE_MODULE_APIHELP_NOTMATCH 0x0030015 //HASH不匹配
2323
#define ERROR_STORAGE_MODULE_APIHELP_SIZE 0x0030016 //目录大小已经满了
24-
#define ERROR_STORAGE_MODULE_APIHELP_CODE 0x0030017 //服务器返回失败
24+
#define ERROR_STORAGE_MODULE_APIHELP_CODE 0x0030017 //服务器返回失败
25+
#define ERROR_STORAGE_MODULE_APIHELP_FORMAT 0x0030018 //格式化失败

0 commit comments

Comments
 (0)