|
10 | 10 | // Purpose: WEBRTC拉流服务 |
11 | 11 | // History: |
12 | 12 | *********************************************************************/ |
13 | | -bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen) |
| 13 | +int PullStream_ClientProtocol_Dtls(LPCXSTR lpszMSGBuffer, int nMSGLen) |
14 | 14 | { |
15 | | - int nAttrCount = 0; |
16 | | - RFCCOMPONENTS_NATATTR** ppSt_ListAttr; |
17 | | - RFCCOMPONENTS_NATSTUN st_NatClient = {}; |
18 | | - |
19 | | - if (!NatProtocol_StunNat_Parse(lpszMsgBuffer, nMsgLen, &st_NatClient, &ppSt_ListAttr, &nAttrCount)) |
| 15 | + // DTLS有可能以多种不同的记录层类型开头,这里检查它是否是handshake(0x16) |
| 16 | + return nMSGLen >= 13 && lpszMSGBuffer[0] == 0x16; |
| 17 | +} |
| 18 | +int PullStream_ClientProtocol_Stun(LPCXSTR lpszMSGBuffer, int nMSGLen) |
| 19 | +{ |
| 20 | + // STUN消息的类型字段(前两位为00)以及魔术cookie字段 |
| 21 | + return nMSGLen >= 20 && (lpszMSGBuffer[0] & 0xC0) == 0x00 && lpszMSGBuffer[4] == 0x21 && lpszMSGBuffer[5] == 0x12 && lpszMSGBuffer[6] == 0xA4 && lpszMSGBuffer[7] == 0x42; |
| 22 | +} |
| 23 | +bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszMsgBuffer, int nMsgLen) |
| 24 | +{ |
| 25 | + if (PullStream_ClientProtocol_Dtls(lpszMsgBuffer, nMsgLen)) |
20 | 26 | { |
21 | | - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("STUN客户端:%s,请求的STUN协议不正确,解析失败,错误:%lX"), lpszClientAddr, NatProtocol_GetLastError()); |
22 | | - return false; |
| 27 | + int nSDLen = 2048; |
| 28 | + XCHAR tszSDBuffer[2048] = {}; |
| 29 | + XBYTE tszSDKey[128] = {}; |
| 30 | + XBYTE tszRVKey[128] = {}; |
| 31 | + |
| 32 | + if (OPenSsl_Server_AcceptMemoryEx(xhRTCSsl, hSocket, lpszClientAddr, tszSDBuffer, &nSDLen, lpszMsgBuffer, nMsgLen)) |
| 33 | + { |
| 34 | + OPenSsl_Server_GetKeyEx(xhRTCSsl, lpszClientAddr, tszSDKey, tszRVKey); |
| 35 | + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTC客户端:%s,请求的DTLS握手协议处理成功"), lpszClientAddr); |
| 36 | + } |
| 37 | + else |
| 38 | + { |
| 39 | + int nPort = 0; |
| 40 | + XCHAR tszIPPort[128] = {}; |
| 41 | + _tcsxcpy(tszIPPort, lpszClientAddr); |
| 42 | + BaseLib_OperatorIPAddr_SegAddr(tszIPPort, &nPort); |
| 43 | + NetCore_UDPSelect_Send(xhRTCSocket, tszSDBuffer, nSDLen, tszIPPort, nPort); |
| 44 | + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTC客户端:%s,请求的DTLS握手协议,还需要进一步处理,响应大小:%d"), lpszClientAddr, nSDLen); |
| 45 | + } |
23 | 46 | } |
24 | | - XCHAR tszUserStr[128] = {}; |
25 | | - for (int i = 0; i < nAttrCount; i++) |
| 47 | + else if (PullStream_ClientProtocol_Stun(lpszMsgBuffer, nMsgLen)) |
26 | 48 | { |
27 | | - if (RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_USERNAME == ppSt_ListAttr[i]->wAttr) |
| 49 | + int nAttrCount = 0; |
| 50 | + RFCCOMPONENTS_NATATTR** ppSt_ListAttr; |
| 51 | + RFCCOMPONENTS_NATSTUN st_NatClient = {}; |
| 52 | + |
| 53 | + if (!NatProtocol_StunNat_Parse(lpszMsgBuffer, nMsgLen, &st_NatClient, &ppSt_ListAttr, &nAttrCount)) |
28 | 54 | { |
29 | | - memcpy(tszUserStr, ppSt_ListAttr[i]->tszMsgBuffer, ppSt_ListAttr[i]->wLen); |
| 55 | + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("STUN客户端:%s,请求的STUN协议不正确,解析失败,错误:%lX"), lpszClientAddr, NatProtocol_GetLastError()); |
| 56 | + return false; |
30 | 57 | } |
31 | | - } |
32 | | - int nTMPLen = 0; |
33 | | - int nMSGLen = 0; |
34 | | - int nIPPort = 0; |
35 | | - XCHAR tszTMPBuffer[1024] = {}; |
36 | | - XCHAR tszMSGBuffer[1024] = {}; |
37 | | - XCHAR tszIPAddr[128] = {}; |
| 58 | + XCHAR tszUserStr[128] = {}; |
| 59 | + for (int i = 0; i < nAttrCount; i++) |
| 60 | + { |
| 61 | + if (RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_USERNAME == ppSt_ListAttr[i]->wAttr) |
| 62 | + { |
| 63 | + memcpy(tszUserStr, ppSt_ListAttr[i]->tszMsgBuffer, ppSt_ListAttr[i]->wLen); |
| 64 | + } |
| 65 | + } |
| 66 | + int nTMPLen = 0; |
| 67 | + int nMSGLen = 0; |
| 68 | + int nIPPort = 0; |
| 69 | + XCHAR tszTMPBuffer[1024] = {}; |
| 70 | + XCHAR tszMSGBuffer[1024] = {}; |
| 71 | + XCHAR tszIPAddr[128] = {}; |
38 | 72 |
|
39 | | - _tcsxcpy(tszIPAddr, lpszClientAddr); |
| 73 | + _tcsxcpy(tszIPAddr, lpszClientAddr); |
40 | 74 |
|
41 | | - BaseLib_OperatorIPAddr_SegAddr(tszIPAddr, &nIPPort); |
| 75 | + BaseLib_OperatorIPAddr_SegAddr(tszIPAddr, &nIPPort); |
42 | 76 |
|
43 | | - NatProtocol_StunNat_BuildAttr(tszTMPBuffer, &nTMPLen, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_USERNAME, tszUserStr, _tcsxlen(tszUserStr)); |
44 | | - NatProtocol_StunNat_BuildMapAddress(tszTMPBuffer + nTMPLen, &nTMPLen, tszIPAddr, nIPPort, true); |
45 | | - //NatProtocol_StunNat_BuildMSGIntegrity(tszMSGBuffer, &nMSGLen, tszTMPBuffer, nTMPLen, ); |
46 | | - NatProtocol_StunNat_Packet(tszMSGBuffer, &nMSGLen, (LPCXSTR)st_NatClient.byTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_FLAGS, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS); |
| 77 | + NatProtocol_StunNat_BuildAttr(tszTMPBuffer, &nTMPLen, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_USERNAME, tszUserStr, _tcsxlen(tszUserStr)); |
| 78 | + NatProtocol_StunNat_BuildMapAddress(tszTMPBuffer + nTMPLen, &nTMPLen, tszIPAddr, nIPPort, true); |
| 79 | + //NatProtocol_StunNat_BuildMSGIntegrity(tszMSGBuffer, &nMSGLen, tszTMPBuffer, nTMPLen, ); |
| 80 | + NatProtocol_StunNat_Packet(tszMSGBuffer, &nMSGLen, (LPCXSTR)st_NatClient.byTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_FLAGS, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS); |
47 | 81 |
|
48 | | - BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListAttr, nAttrCount); |
| 82 | + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListAttr, nAttrCount); |
| 83 | + } |
| 84 | + else |
| 85 | + { |
| 86 | + |
| 87 | + } |
| 88 | + |
| 89 | + |
49 | 90 | return true; |
50 | 91 | } |
51 | 92 | bool PullStream_ClientWebRtc_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen) |
@@ -137,7 +178,7 @@ bool PullStream_ClientWebRtc_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, |
137 | 178 | XBYTE tszDigestStr[MAX_PATH] = {}; |
138 | 179 | XCHAR tszDigestHex[MAX_PATH] = {}; |
139 | 180 | int nPos = _xstprintf(tszDigestHex, _X("sha-256 ")); |
140 | | - OPenSsl_Api_Digest(st_ServiceConfig.st_XPull.st_PullWebRtc.tszRequestKey, tszDigestStr, &nDLen, true, XENGINE_OPENSSL_API_DIGEST_SHA256); |
| 181 | + OPenSsl_Api_Digest(st_ServiceConfig.st_XPull.st_PullWebRtc.tszCsrStr, tszDigestStr, &nDLen, true, XENGINE_OPENSSL_API_DIGEST_SHA256); |
141 | 182 | for (int i = 0; i < nDLen; i++) |
142 | 183 | { |
143 | 184 | int nRet = _xstprintf(tszDigestHex + nPos, _X("%02X"), tszDigestStr[i]); |
|
0 commit comments