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+ }
0 commit comments