Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
704421b7
Commit
704421b7
authored
Mar 26, 2021
by
ziyue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善
parent
581ebfad
全部展开
显示空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
511 行增加
和
820 行删除
+511
-820
server/CMakeLists.txt
+0
-1
webrtc/dtls_transport.cc
+0
-75
webrtc/dtls_transport.h
+0
-58
webrtc/ice_server.cc
+0
-0
webrtc/ice_server.h
+105
-33
webrtc/logger.h
+2
-1
webrtc/rtc_dtls_transport.cc
+0
-0
webrtc/rtc_dtls_transport.h
+90
-53
webrtc/srtp_session.cc
+85
-66
webrtc/srtp_session.h
+42
-27
webrtc/stun_packet.cc
+78
-83
webrtc/utils.cc
+0
-140
webrtc/utils.h
+0
-202
webrtc/webrtc_transport.cc
+75
-58
webrtc/webrtc_transport.h
+33
-22
www/webrtc/index.html
+1
-1
没有找到文件。
server/CMakeLists.txt
查看文件 @
704421b7
...
...
@@ -49,4 +49,3 @@ else()
endif
()
target_link_libraries
(
MediaServer jsoncpp
${
LINK_LIB_LIST
}
)
message
(
${
LINK_LIB_LIST
}
)
webrtc/dtls_transport.cc
deleted
100644 → 0
查看文件 @
581ebfad
//
// Created by xueyuegui on 19-12-7.
//
#include "dtls_transport.h"
#include <iostream>
DtlsTransport
::
DtlsTransport
(
bool
is_server
)
:
is_server_
(
is_server
)
{
dtls_transport_
.
reset
(
new
RTC
::
DtlsTransport
(
this
));
}
DtlsTransport
::~
DtlsTransport
()
{}
void
DtlsTransport
::
Start
()
{
if
(
is_server_
)
{
dtls_transport_
->
Run
(
RTC
::
DtlsTransport
::
Role
::
SERVER
);
}
else
{
dtls_transport_
->
Run
(
RTC
::
DtlsTransport
::
Role
::
CLIENT
);
}
}
void
DtlsTransport
::
Close
()
{}
void
DtlsTransport
::
OnDtlsTransportConnecting
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
{}
void
DtlsTransport
::
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
RTC
::
CryptoSuite
srtp_crypto_suite
,
uint8_t
*
srtpLocalKey
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
{
std
::
string
client_key
;
std
::
string
server_key
;
server_key
.
assign
((
char
*
)
srtpLocalKey
,
srtpLocalKeyLen
);
client_key
.
assign
((
char
*
)
srtpRemoteKey
,
srtpRemoteKeyLen
);
if
(
is_server_
)
{
// If we are server, we swap the keys
client_key
.
swap
(
server_key
);
}
if
(
handshake_completed_callback_
)
{
handshake_completed_callback_
(
client_key
,
server_key
,
srtp_crypto_suite
);
}
}
void
DtlsTransport
::
OnDtlsTransportFailed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
{
if
(
handshake_failed_callback_
)
{
handshake_failed_callback_
();
}
}
void
DtlsTransport
::
OnDtlsTransportClosed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
{}
void
DtlsTransport
::
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
{
if
(
output_callback_
)
{
output_callback_
((
char
*
)
data
,
len
);
}
}
void
DtlsTransport
::
OutputData
(
char
*
buf
,
size_t
len
)
{
if
(
output_callback_
)
{
output_callback_
(
buf
,
len
);
}
}
void
DtlsTransport
::
OnDtlsTransportApplicationDataReceived
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
{}
bool
DtlsTransport
::
IsDtlsPacket
(
const
char
*
buf
,
size_t
len
)
{
return
RTC
::
DtlsTransport
::
IsDtls
((
uint8_t
*
)
buf
,
len
);
}
void
DtlsTransport
::
InputData
(
char
*
buf
,
size_t
len
)
{
dtls_transport_
->
ProcessDtlsData
((
uint8_t
*
)
buf
,
len
);
}
webrtc/dtls_transport.h
deleted
100644 → 0
查看文件 @
581ebfad
//
// Created by xueyuegui on 19-12-7.
//
#ifndef MYWEBRTC_MYDTLSTRANSPORT_H
#define MYWEBRTC_MYDTLSTRANSPORT_H
#include <functional>
#include <memory>
#include "rtc_dtls_transport.h"
class
DtlsTransport
:
RTC
::
DtlsTransport
::
Listener
{
public
:
typedef
std
::
shared_ptr
<
DtlsTransport
>
Ptr
;
DtlsTransport
(
bool
bServer
);
~
DtlsTransport
();
void
Start
();
void
Close
();
void
InputData
(
char
*
buf
,
size_t
len
);
void
OutputData
(
char
*
buf
,
size_t
len
);
static
bool
IsDtlsPacket
(
const
char
*
buf
,
size_t
len
);
std
::
string
GetMyFingerprint
()
{
auto
finger_prints
=
dtls_transport_
->
GetLocalFingerprints
();
for
(
size_t
i
=
0
;
i
<
finger_prints
.
size
();
i
++
)
{
if
(
finger_prints
[
i
].
algorithm
==
RTC
::
DtlsTransport
::
FingerprintAlgorithm
::
SHA256
)
{
return
finger_prints
[
i
].
value
;
}
}
return
""
;
};
void
SetHandshakeCompletedCB
(
std
::
function
<
void
(
std
::
string
clientKey
,
std
::
string
serverKey
,
RTC
::
CryptoSuite
)
>
cb
)
{
handshake_completed_callback_
=
std
::
move
(
cb
);
}
void
SetHandshakeFailedCB
(
std
::
function
<
void
()
>
cb
)
{
handshake_failed_callback_
=
std
::
move
(
cb
);
}
void
SetOutPutCB
(
std
::
function
<
void
(
char
*
buf
,
size_t
len
)
>
cb
)
{
output_callback_
=
std
::
move
(
cb
);
}
/* Pure virtual methods inherited from RTC::DtlsTransport::Listener. */
public
:
void
OnDtlsTransportConnecting
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
override
;
void
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
RTC
::
CryptoSuite
srtpCryptoSuite
,
uint8_t
*
srtpLocalKey
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
override
;
void
OnDtlsTransportFailed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
override
;
void
OnDtlsTransportClosed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
override
;
void
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
override
;
void
OnDtlsTransportApplicationDataReceived
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
override
;
private
:
bool
is_server_
=
false
;
std
::
function
<
void
()
>
handshake_failed_callback_
;
std
::
shared_ptr
<
RTC
::
DtlsTransport
>
dtls_transport_
;
std
::
function
<
void
(
char
*
buf
,
size_t
len
)
>
output_callback_
;
std
::
function
<
void
(
std
::
string
client_key
,
std
::
string
server_key
,
RTC
::
CryptoSuite
srtp_crypto_suite
)
>
handshake_completed_callback_
;
};
#endif// MYWEBRTC_MYDTLSTRANSPORT_H
webrtc/ice_server.cc
查看文件 @
704421b7
差异被折叠。
点击展开。
webrtc/ice_server.h
查看文件 @
704421b7
#pragma once
#ifndef MS_RTC_ICE_SERVER_HPP
#define MS_RTC_ICE_SERVER_HPP
#include "stun_packet.h"
#include "logger.h"
#include <list>
#include <string>
#include <functional>
#include <memory>
#include "logger.h"
#include "stun_packet.h"
namespace
RTC
{
using
TransportTuple
=
struct
sockaddr
;
class
IceServer
{
public
:
enum
class
IceState
{
NEW
=
1
,
CONNECTED
,
COMPLETED
,
DISCONNECTED
};
public
:
class
Listener
{
public
:
virtual
~
Listener
()
=
default
;
public
:
/**
* These callbacks are guaranteed to be called before ProcessStunPacket()
* returns, so the given pointers are still usable.
*/
virtual
void
OnIceServerSendStunPacket
(
const
RTC
::
IceServer
*
iceServer
,
const
RTC
::
StunPacket
*
packet
,
RTC
::
TransportTuple
*
tuple
)
=
0
;
virtual
void
OnIceServerSelectedTuple
(
const
RTC
::
IceServer
*
iceServer
,
RTC
::
TransportTuple
*
tuple
)
=
0
;
virtual
void
OnIceServerConnected
(
const
RTC
::
IceServer
*
iceServer
)
=
0
;
virtual
void
OnIceServerCompleted
(
const
RTC
::
IceServer
*
iceServer
)
=
0
;
virtual
void
OnIceServerDisconnected
(
const
RTC
::
IceServer
*
iceServer
)
=
0
;
};
public
:
IceServer
(
Listener
*
listener
,
const
std
::
string
&
usernameFragment
,
const
std
::
string
&
password
);
typedef
std
::
function
<
void
(
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
remote_address
)
>
UdpSendCallback
;
class
IceServer
{
public
:
enum
class
IceState
{
kNew
=
1
,
kConnect
,
kCompleted
,
kDisconnected
};
typedef
std
::
shared_ptr
<
IceServer
>
Ptr
;
IceServer
();
IceServer
(
const
std
::
string
&
username_fragment
,
const
std
::
string
&
password
);
const
std
::
string
&
GetUsernameFragment
()
const
;
const
std
::
string
&
GetPassword
()
const
;
void
SetUsernameFragment
(
const
std
::
string
&
username_fragment
);
void
SetPassword
(
const
std
::
string
&
password
);
IceState
GetState
()
const
;
void
ProcessStunPacket
(
RTC
::
StunPacket
*
packet
,
struct
sockaddr_in
*
remote_address
);
void
HandleTuple
(
struct
sockaddr_in
*
remote_address
,
bool
has_use_candidate
);
~
IceServer
();
void
SetSendCB
(
UdpSendCallback
send_cb
)
{
send_callback_
=
send_cb
;
}
void
SetIceServerCompletedCB
(
std
::
function
<
void
()
>
cb
)
{
ice_server_completed_callback_
=
cb
;
};
struct
sockaddr_in
*
GetSelectAddr
()
{
return
&
remote_address_
;
public
:
void
ProcessStunPacket
(
RTC
::
StunPacket
*
packet
,
RTC
::
TransportTuple
*
tuple
);
const
std
::
string
&
GetUsernameFragment
()
const
{
return
this
->
usernameFragment
;
}
const
std
::
string
&
GetPassword
()
const
{
return
this
->
password
;
}
IceState
GetState
()
const
{
return
this
->
state
;
}
RTC
::
TransportTuple
*
GetSelectedTuple
()
const
{
return
this
->
selectedTuple
;
}
void
SetUsernameFragment
(
const
std
::
string
&
usernameFragment
)
{
this
->
oldUsernameFragment
=
this
->
usernameFragment
;
this
->
usernameFragment
=
usernameFragment
;
}
void
SetPassword
(
const
std
::
string
&
password
)
{
this
->
oldPassword
=
this
->
password
;
this
->
password
=
password
;
}
bool
IsValidTuple
(
const
RTC
::
TransportTuple
*
tuple
)
const
;
void
RemoveTuple
(
RTC
::
TransportTuple
*
tuple
);
// This should be just called in 'connected' or completed' state
// and the given tuple must be an already valid tuple.
void
ForceSelectedTuple
(
const
RTC
::
TransportTuple
*
tuple
);
private
:
void
HandleTuple
(
RTC
::
TransportTuple
*
tuple
,
bool
hasUseCandidate
);
/**
* Store the given tuple and return its stored address.
*/
RTC
::
TransportTuple
*
AddTuple
(
RTC
::
TransportTuple
*
tuple
);
/**
* If the given tuple exists return its stored address, nullptr otherwise.
*/
RTC
::
TransportTuple
*
HasTuple
(
const
RTC
::
TransportTuple
*
tuple
)
const
;
/**
* Set the given tuple as the selected tuple.
* NOTE: The given tuple MUST be already stored within the list.
*/
void
SetSelectedTuple
(
RTC
::
TransportTuple
*
storedTuple
);
private
:
// Passed by argument.
Listener
*
listener
{
nullptr
};
// Others.
std
::
string
usernameFragment
;
std
::
string
password
;
std
::
string
oldUsernameFragment
;
std
::
string
oldPassword
;
IceState
state
{
IceState
::
NEW
};
std
::
list
<
RTC
::
TransportTuple
>
tuples
;
RTC
::
TransportTuple
*
selectedTuple
{
nullptr
};
};
}
// namespace RTC
private
:
UdpSendCallback
send_callback_
;
std
::
function
<
void
()
>
ice_server_completed_callback_
;
std
::
string
username_fragment_
;
std
::
string
password_
;
std
::
string
old_username_fragment_
;
std
::
string
old_password_
;
IceState
state
{
IceState
::
kNew
};
struct
sockaddr_in
remote_address_
;
};
#endif
webrtc/logger.h
查看文件 @
704421b7
...
...
@@ -12,7 +12,7 @@
#define MS_DEBUG_2TAGS(tag1, tag2,fmt, ...) printf("debug:" fmt "\n", ##__VA_ARGS__)
#define MS_WARN_2TAGS(tag1, tag2,fmt, ...) printf("warn:" fmt "\n", ##__VA_ARGS__)
#define MS_DEBUG_TAG(tag,fmt, ...) printf("debug:" fmt "\n", ##__VA_ARGS__)
#define MS_ASSERT(con,
log) assert(con)
#define MS_ASSERT(con,
fmt, ...) do{if(!(con)) { printf("assert failed:%s" fmt "\n", #con, ##__VA_ARGS__);} assert(con); } while(false);
#define MS_ABORT(fmt, ...) do{ printf("abort:" fmt "\n", ##__VA_ARGS__); abort(); } while(false);
#define MS_WARN_TAG(tag,fmt, ...) printf("warn:" fmt "\n", ##__VA_ARGS__)
#define MS_DEBUG_DEV(fmt, ...) printf("debug:" fmt "\n", ##__VA_ARGS__)
\ No newline at end of file
webrtc/rtc_dtls_transport.cc
查看文件 @
704421b7
差异被折叠。
点击展开。
webrtc/rtc_dtls_transport.h
查看文件 @
704421b7
#ifndef MS_RTC_DTLS_TRANSPORT_HPP
#define MS_RTC_DTLS_TRANSPORT_HPP
#include "srtp_session.h"
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/x509.h>
#include <map>
#include <string>
#include <vector>
namespace
RTC
{
enum
class
CryptoSuite
{
NONE
=
0
,
AES_CM_128_HMAC_SHA1_80
=
1
,
AES_CM_128_HMAC_SHA1_32
,
AEAD_AES_256_GCM
,
AEAD_AES_128_GCM
};
class
DtlsTransport
{
#include "Poller/Timer.h"
#include "Poller/EventPoller.h"
using
namespace
toolkit
;
namespace
RTC
{
class
DtlsTransport
:
public
std
::
enable_shared_from_this
<
DtlsTransport
>
{
public
:
enum
class
DtlsState
{
NEW
=
1
,
CONNECTING
,
CONNECTED
,
FAILED
,
CLOSED
};
enum
class
DtlsState
{
NEW
=
1
,
CONNECTING
,
CONNECTED
,
FAILED
,
CLOSED
};
public
:
enum
class
Role
{
NONE
=
0
,
AUTO
=
1
,
CLIENT
,
SERVER
};
enum
class
Role
{
NONE
=
0
,
AUTO
=
1
,
CLIENT
,
SERVER
};
public
:
enum
class
FingerprintAlgorithm
{
NONE
=
0
,
SHA1
=
1
,
SHA224
,
SHA256
,
SHA384
,
SHA512
};
enum
class
FingerprintAlgorithm
{
NONE
=
0
,
SHA1
=
1
,
SHA224
,
SHA256
,
SHA384
,
SHA512
};
public
:
struct
Fingerprint
{
FingerprintAlgorithm
algorithm
{
FingerprintAlgorithm
::
NONE
};
struct
Fingerprint
{
FingerprintAlgorithm
algorithm
{
FingerprintAlgorithm
::
NONE
};
std
::
string
value
;
};
private
:
struct
SrtpCryptoSuiteMapEntry
{
RTC
::
CryptoSuite
cryptoSuite
;
struct
SrtpCryptoSuiteMapEntry
{
RTC
::
SrtpSession
::
CryptoSuite
cryptoSuite
;
const
char
*
name
;
};
public
:
class
Listener
{
class
Listener
{
public
:
// DTLS is in the process of negotiating a secure connection. Incoming
// media can flow through.
...
...
@@ -49,27 +71,32 @@ class DtlsTransport {
// DTLS has completed negotiation of a secure connection (including DTLS-SRTP
// and remote fingerprint verification). Outgoing media can now flow through.
// NOTE: The caller MUST NOT call any method during this callback.
virtual
void
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
RTC
::
CryptoSuite
srtpCryptoSuite
,
uint8_t
*
srtpLocalKey
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
=
0
;
virtual
void
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
RTC
::
SrtpSession
::
CryptoSuite
srtpCryptoSuite
,
uint8_t
*
srtpLocalKey
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
=
0
;
// The DTLS connection has been closed as the result of an error (such as a
// DTLS alert or a failure to validate the remote fingerprint).
virtual
void
OnDtlsTransportFailed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
=
0
;
// The DTLS connection has been closed due to receipt of a close_notify alert.
virtual
void
OnDtlsTransportClosed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
=
0
;
// Need to send DTLS data to the peer.
virtual
void
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
=
0
;
virtual
void
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
=
0
;
// DTLS application data received.
virtual
void
OnDtlsTransportApplicationDataReceived
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
=
0
;
virtual
void
OnDtlsTransportApplicationDataReceived
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
=
0
;
};
public
:
static
void
ClassInit
();
static
void
ClassDestroy
();
static
Role
StringToRole
(
const
std
::
string
&
role
)
{
static
Role
StringToRole
(
const
std
::
string
&
role
)
{
auto
it
=
DtlsTransport
::
string2Role
.
find
(
role
);
if
(
it
!=
DtlsTransport
::
string2Role
.
end
())
...
...
@@ -77,7 +104,8 @@ class DtlsTransport {
else
return
DtlsTransport
::
Role
::
NONE
;
}
static
FingerprintAlgorithm
GetFingerprintAlgorithm
(
const
std
::
string
&
fingerprint
)
{
static
FingerprintAlgorithm
GetFingerprintAlgorithm
(
const
std
::
string
&
fingerprint
)
{
auto
it
=
DtlsTransport
::
string2FingerprintAlgorithm
.
find
(
fingerprint
);
if
(
it
!=
DtlsTransport
::
string2FingerprintAlgorithm
.
end
())
...
...
@@ -85,12 +113,14 @@ class DtlsTransport {
else
return
DtlsTransport
::
FingerprintAlgorithm
::
NONE
;
}
static
std
::
string
&
GetFingerprintAlgorithmString
(
FingerprintAlgorithm
fingerprint
)
{
static
std
::
string
&
GetFingerprintAlgorithmString
(
FingerprintAlgorithm
fingerprint
)
{
auto
it
=
DtlsTransport
::
fingerprintAlgorithm2String
.
find
(
fingerprint
);
return
it
->
second
;
}
static
bool
IsDtls
(
const
uint8_t
*
data
,
size_t
len
)
{
static
bool
IsDtls
(
const
uint8_t
*
data
,
size_t
len
)
{
// clang-format off
return
(
// Minimum DTLS record length is 13 bytes.
...
...
@@ -119,24 +149,33 @@ class DtlsTransport {
static
std
::
vector
<
SrtpCryptoSuiteMapEntry
>
srtpCryptoSuites
;
public
:
explicit
DtlsTransport
(
Listener
*
listener
);
DtlsTransport
(
EventPoller
::
Ptr
poller
,
Listener
*
listener
);
~
DtlsTransport
();
public
:
void
Dump
()
const
;
void
Run
(
Role
localRole
);
std
::
vector
<
Fingerprint
>&
GetLocalFingerprints
()
const
{
std
::
vector
<
Fingerprint
>&
GetLocalFingerprints
()
const
{
return
DtlsTransport
::
localFingerprints
;
}
bool
SetRemoteFingerprint
(
Fingerprint
fingerprint
);
void
ProcessDtlsData
(
const
uint8_t
*
data
,
size_t
len
);
DtlsState
GetState
()
const
{
return
this
->
state
;
}
Role
GetLocalRole
()
const
{
return
this
->
localRole
;
}
DtlsState
GetState
()
const
{
return
this
->
state
;
}
Role
GetLocalRole
()
const
{
return
this
->
localRole
;
}
void
SendApplicationData
(
const
uint8_t
*
data
,
size_t
len
);
private
:
bool
IsRunning
()
const
{
switch
(
this
->
state
)
{
bool
IsRunning
()
const
{
switch
(
this
->
state
)
{
case
DtlsState
:
:
NEW
:
return
false
;
case
DtlsState
:
:
CONNECTING
:
...
...
@@ -156,32 +195,30 @@ class DtlsTransport {
bool
SetTimeout
();
bool
ProcessHandshake
();
bool
CheckRemoteFingerprint
();
void
ExtractSrtpKeys
(
RTC
::
CryptoSuite
srtpCryptoSuite
);
RTC
::
CryptoSuite
GetNegotiatedSrtpCryptoSuite
();
void
ExtractSrtpKeys
(
RTC
::
SrtpSession
::
CryptoSuite
srtpCryptoSuite
);
RTC
::
SrtpSession
::
CryptoSuite
GetNegotiatedSrtpCryptoSuite
();
/* Callbacks fired by OpenSSL events. */
public
:
private
:
void
OnSslInfo
(
int
where
,
int
ret
);
/* Pure virtual methods inherited from Timer::Listener. */
public
:
void
OnTimer
();
private
:
EventPoller
::
Ptr
poller
;
// Passed by argument.
Listener
*
listener
{
nullptr
};
Listener
*
listener
{
nullptr
};
// Allocated by this.
SSL
*
ssl
{
nullptr
};
BIO
*
sslBioFromNetwork
{
nullptr
};
// The BIO from which ssl reads.
BIO
*
sslBioToNetwork
{
nullptr
};
// The BIO in which ssl writes.
SSL
*
ssl
{
nullptr
};
BIO
*
sslBioFromNetwork
{
nullptr
};
// The BIO from which ssl reads.
BIO
*
sslBioToNetwork
{
nullptr
};
// The BIO in which ssl writes.
Timer
::
Ptr
timer
;
// Others.
DtlsState
state
{
DtlsState
::
NEW
};
Role
localRole
{
Role
::
NONE
};
DtlsState
state
{
DtlsState
::
NEW
};
Role
localRole
{
Role
::
NONE
};
Fingerprint
remoteFingerprint
;
bool
handshakeDone
{
false
};
bool
handshakeDoneNow
{
false
};
bool
handshakeDone
{
false
};
bool
handshakeDoneNow
{
false
};
std
::
string
remoteCert
;
};
};
}
// namespace RTC
#endif
webrtc/srtp_session.cc
查看文件 @
704421b7
...
...
@@ -2,21 +2,17 @@
// #define MS_LOG_DEV_LEVEL 3
#include "srtp_session.h"
#include <cstring> // std::memset(), std::memcpy()
#include <iostream>
#include "logger.h"
namespace
RTC
{
/* Static. */
namespace
RTC
{
/* Static. */
static
constexpr
size_t
EncryptBufferSize
{
65536
};
static
uint8_t
EncryptBuffer
[
EncryptBufferSize
];
static
constexpr
size_t
EncryptBufferSize
{
65536
};
static
uint8_t
EncryptBuffer
[
EncryptBufferSize
];
/* Class methods. */
std
::
vector
<
const
char
*>
DepLibSRTP
::
errors
=
{
std
::
vector
<
const
char
*>
DepLibSRTP
::
errors
=
{
// From 0 (srtp_err_status_ok) to 24 (srtp_err_status_pfkey_err).
"success (srtp_err_status_ok)"
,
"unspecified failure (srtp_err_status_fail)"
,
...
...
@@ -47,7 +43,7 @@ std::vector<const char *> DepLibSRTP::errors = {
/* Static methods. */
void
DepLibSRTP
::
ClassInit
()
{
void
DepLibSRTP
::
ClassInit
()
{
MS_TRACE
();
MS_DEBUG_TAG
(
info
,
"libsrtp version:
\"
%s
\"
"
,
srtp_get_version_string
());
...
...
@@ -56,28 +52,34 @@ void DepLibSRTP::ClassInit() {
if
(
DepLibSRTP
::
IsError
(
err
))
MS_THROW_ERROR
(
"srtp_init() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
}
}
void
DepLibSRTP
::
ClassDestroy
()
{
void
DepLibSRTP
::
ClassDestroy
()
{
MS_TRACE
();
srtp_shutdown
();
}
}
/* Class methods. */
void
SrtpSession
::
ClassInit
()
{
void
SrtpSession
::
ClassInit
()
{
// Set libsrtp event handler.
srtp_err_status_t
err
=
srtp_install_event_handler
(
static_cast
<
srtp_event_handler_func_t
*>
(
OnSrtpEvent
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
srtp_install_event_handler
(
static_cast
<
srtp_event_handler_func_t
*>
(
OnSrtpEvent
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
MS_THROW_ERROR
(
"srtp_install_event_handler() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
std
::
cout
<<
"srtp_install_event_handler() failed :"
<<
DepLibSRTP
::
GetErrorString
(
err
);
}
}
}
void
SrtpSession
::
OnSrtpEvent
(
srtp_event_data_t
*
data
)
{
void
SrtpSession
::
OnSrtpEvent
(
srtp_event_data_t
*
data
)
{
MS_TRACE
();
switch
(
data
->
event
)
{
switch
(
data
->
event
)
{
case
event_ssrc_collision
:
MS_WARN_TAG
(
srtp
,
"SSRC collision occurred"
);
break
;
...
...
@@ -94,27 +96,31 @@ void SrtpSession::OnSrtpEvent(srtp_event_data_t *data) {
MS_WARN_TAG
(
srtp
,
"stream reached the hard packet limit (2^48 packets)"
);
break
;
}
}
}
/* Instance methods. */
/* Instance methods. */
SrtpSession
::
SrtpSession
(
Type
type
,
CryptoSuite
cryptoSuite
,
uint8_t
*
key
,
size_t
keyLen
)
{
SrtpSession
::
SrtpSession
(
Type
type
,
CryptoSuite
cryptoSuite
,
uint8_t
*
key
,
size_t
keyLen
)
{
MS_TRACE
();
srtp_policy_t
policy
;
// NOLINT(cppcoreguidelines-pro-type-member-init)
srtp_policy_t
policy
;
// NOLINT(cppcoreguidelines-pro-type-member-init)
// Set all policy fields to 0.
std
::
memset
(
&
policy
,
0
,
sizeof
(
srtp_policy_t
));
switch
(
cryptoSuite
)
{
case
CryptoSuite
:
:
AES_CM_128_HMAC_SHA1_80
:
{
switch
(
cryptoSuite
)
{
case
CryptoSuite
:
:
AES_CM_128_HMAC_SHA1_80
:
{
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80
(
&
policy
.
rtp
);
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80
(
&
policy
.
rtcp
);
break
;
}
case
CryptoSuite
:
:
AES_CM_128_HMAC_SHA1_32
:
{
case
CryptoSuite
:
:
AES_CM_128_HMAC_SHA1_32
:
{
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32
(
&
policy
.
rtp
);
// NOTE: Must be 80 for RTCP.
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80
(
&
policy
.
rtcp
);
...
...
@@ -122,29 +128,34 @@ SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_
break
;
}
case
CryptoSuite
:
:
AEAD_AES_256_GCM
:
{
case
CryptoSuite
:
:
AEAD_AES_256_GCM
:
{
srtp_crypto_policy_set_aes_gcm_256_16_auth
(
&
policy
.
rtp
);
srtp_crypto_policy_set_aes_gcm_256_16_auth
(
&
policy
.
rtcp
);
break
;
}
case
CryptoSuite
:
:
AEAD_AES_128_GCM
:
{
case
CryptoSuite
:
:
AEAD_AES_128_GCM
:
{
srtp_crypto_policy_set_aes_gcm_128_16_auth
(
&
policy
.
rtp
);
srtp_crypto_policy_set_aes_gcm_128_16_auth
(
&
policy
.
rtcp
);
break
;
}
default
:
{
default
:
{
MS_ABORT
(
"unknown SRTP crypto suite"
);
}
}
MS_ASSERT
((
int
)
keyLen
==
policy
.
rtp
.
cipher_key_len
,
MS_ASSERT
(
(
int
)
keyLen
==
policy
.
rtp
.
cipher_key_len
,
"given keyLen does not match policy.rtp.cipher_keyLen"
);
switch
(
type
)
{
switch
(
type
)
{
case
Type
:
:
INBOUND
:
policy
.
ssrc
.
type
=
ssrc_any_inbound
;
break
;
...
...
@@ -163,73 +174,78 @@ SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_
// Set the SRTP session.
srtp_err_status_t
err
=
srtp_create
(
&
this
->
session
,
&
policy
);
if
(
DepLibSRTP
::
IsError
(
err
))
{
is_init
=
false
;
if
(
DepLibSRTP
::
IsError
(
err
))
MS_THROW_ERROR
(
"srtp_create() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
}
else
{
is_init
=
true
;
}
}
SrtpSession
::~
SrtpSession
()
{
SrtpSession
::~
SrtpSession
()
{
MS_TRACE
();
if
(
this
->
session
!=
nullptr
)
{
if
(
this
->
session
!=
nullptr
)
{
srtp_err_status_t
err
=
srtp_dealloc
(
this
->
session
);
if
(
DepLibSRTP
::
IsError
(
err
))
MS_ABORT
(
"srtp_dealloc() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
}
}
}
bool
SrtpSession
::
EncryptRtp
(
const
uint8_t
**
data
,
size_t
*
len
)
{
bool
SrtpSession
::
EncryptRtp
(
const
uint8_t
**
data
,
size_t
*
len
)
{
MS_TRACE
();
if
(
!
is_init
)
{
return
false
;
}
// Ensure that the resulting SRTP packet fits into the encrypt buffer.
if
(
*
len
+
SRTP_MAX_TRAILER_LEN
>
EncryptBufferSize
)
{
if
(
*
len
+
SRTP_MAX_TRAILER_LEN
>
EncryptBufferSize
)
{
MS_WARN_TAG
(
srtp
,
"cannot encrypt RTP packet, size too big (%zu bytes)"
,
*
len
);
return
false
;
}
std
::
memcpy
(
EncryptBuffer
,
*
data
,
*
len
);
srtp_err_status_t
err
=
srtp_protect
(
this
->
session
,
static_cast
<
void
*>
(
EncryptBuffer
),
reinterpret_cast
<
int
*>
(
len
));
srtp_protect
(
this
->
session
,
static_cast
<
void
*>
(
EncryptBuffer
),
reinterpret_cast
<
int
*>
(
len
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
if
(
DepLibSRTP
::
IsError
(
err
))
{
MS_WARN_TAG
(
srtp
,
"srtp_protect() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
}
// Update the given data pointer.
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
return
true
;
}
}
bool
SrtpSession
::
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
)
{
bool
SrtpSession
::
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
)
{
MS_TRACE
();
srtp_err_status_t
err
=
srtp_unprotect
(
this
->
session
,
static_cast
<
void
*>
(
data
),
reinterpret_cast
<
int
*>
(
len
));
srtp_unprotect
(
this
->
session
,
static_cast
<
void
*>
(
data
),
reinterpret_cast
<
int
*>
(
len
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
if
(
DepLibSRTP
::
IsError
(
err
))
{
MS_DEBUG_TAG
(
srtp
,
"srtp_unprotect() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
}
return
true
;
}
}
bool
SrtpSession
::
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
)
{
bool
SrtpSession
::
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
)
{
MS_TRACE
();
// Ensure that the resulting SRTCP packet fits into the encrypt buffer.
if
(
*
len
+
SRTP_MAX_TRAILER_LEN
>
EncryptBufferSize
)
{
if
(
*
len
+
SRTP_MAX_TRAILER_LEN
>
EncryptBufferSize
)
{
MS_WARN_TAG
(
srtp
,
"cannot encrypt RTCP packet, size too big (%zu bytes)"
,
*
len
);
return
false
;
...
...
@@ -237,33 +253,36 @@ bool SrtpSession::EncryptRtcp(const uint8_t **data, size_t *len) {
std
::
memcpy
(
EncryptBuffer
,
*
data
,
*
len
);
srtp_err_status_t
err
=
srtp_protect_rtcp
(
this
->
session
,
static_cast
<
void
*>
(
EncryptBuffer
),
reinterpret_cast
<
int
*>
(
len
));
srtp_err_status_t
err
=
srtp_protect_rtcp
(
this
->
session
,
static_cast
<
void
*>
(
EncryptBuffer
),
reinterpret_cast
<
int
*>
(
len
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
if
(
DepLibSRTP
::
IsError
(
err
))
{
MS_WARN_TAG
(
srtp
,
"srtp_protect_rtcp() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
}
// Update the given data pointer.
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
return
true
;
}
}
bool
SrtpSession
::
DecryptSrtcp
(
uint8_t
*
data
,
size_t
*
len
)
{
bool
SrtpSession
::
DecryptSrtcp
(
uint8_t
*
data
,
size_t
*
len
)
{
MS_TRACE
();
srtp_err_status_t
err
=
srtp_unprotect_rtcp
(
this
->
session
,
static_cast
<
void
*>
(
data
),
reinterpret_cast
<
int
*>
(
len
));
srtp_unprotect_rtcp
(
this
->
session
,
static_cast
<
void
*>
(
data
),
reinterpret_cast
<
int
*>
(
len
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
if
(
DepLibSRTP
::
IsError
(
err
))
{
MS_DEBUG_TAG
(
srtp
,
"srtp_unprotect_rtcp() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
}
return
true
;
}
}
// namespace RTC
}
}
// namespace RTC
webrtc/srtp_session.h
查看文件 @
704421b7
#ifndef MS_RTC_SRTP_SESSION_HPP
#define MS_RTC_SRTP_SESSION_HPP
#include "rtc_dtls_transport.h"
#include "utils.h"
#include <srtp2/srtp.h>
#include <vector>
namespace
RTC
{
class
DepLibSRTP
{
public
:
namespace
RTC
{
class
DepLibSRTP
{
public
:
static
void
ClassInit
();
static
void
ClassDestroy
();
static
bool
IsError
(
srtp_err_status_t
code
)
{
return
(
code
!=
srtp_err_status_ok
);
}
...
...
@@ -18,37 +17,53 @@ public:
return
DepLibSRTP
::
errors
.
at
(
code
);
}
private
:
private
:
static
std
::
vector
<
const
char
*>
errors
;
};
};
class
SrtpSession
{
public
:
enum
class
CryptoSuite
{
NONE
=
0
,
AES_CM_128_HMAC_SHA1_80
=
1
,
AES_CM_128_HMAC_SHA1_32
,
AEAD_AES_256_GCM
,
AEAD_AES_128_GCM
};
class
SrtpSession
{
public
:
public
:
enum
class
Type
{
INBOUND
=
1
,
OUTBOUND
};
public
:
enum
class
Type
{
INBOUND
=
1
,
OUTBOUND
};
public
:
public
:
static
void
ClassInit
();
private
:
static
void
OnSrtpEvent
(
srtp_event_data_t
*
data
);
private
:
static
void
OnSrtpEvent
(
srtp_event_data_t
*
data
);
public
:
SrtpSession
(
Type
type
,
CryptoSuite
cryptoSuite
,
uint8_t
*
key
,
size_t
keyLen
);
public
:
SrtpSession
(
Type
type
,
CryptoSuite
cryptoSuite
,
uint8_t
*
key
,
size_t
keyLen
);
~
SrtpSession
();
public
:
bool
EncryptRtp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
);
bool
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
DecryptSrtcp
(
uint8_t
*
data
,
size_t
*
len
);
void
RemoveStream
(
uint32_t
ssrc
)
{
srtp_remove_stream
(
this
->
session
,
uint32_t
{
htonl
(
ssrc
)});
}
public
:
bool
EncryptRtp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
);
bool
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
DecryptSrtcp
(
uint8_t
*
data
,
size_t
*
len
);
void
RemoveStream
(
uint32_t
ssrc
)
{
srtp_remove_stream
(
this
->
session
,
uint32_t
{
htonl
(
ssrc
)
});
}
private
:
bool
is_init
=
false
;
private
:
// Allocated by this.
srtp_t
session
{
nullptr
};
};
}
// namespace RTC
srtp_t
session
{
nullptr
};
};
}
// namespace RTC
#endif
webrtc/stun_packet.cc
查看文件 @
704421b7
差异被折叠。
点击展开。
webrtc/utils.cc
deleted
100644 → 0
查看文件 @
581ebfad
#define MS_CLASS "Utils::Crypto"
// #define MS_LOG_DEV
#include "utils.h"
#include "openssl/sha.h"
namespace
Utils
{
/* Static variables. */
uint32_t
Crypto
::
seed
;
HMAC_CTX
*
Crypto
::
hmacSha1Ctx
{
nullptr
};
uint8_t
Crypto
::
hmacSha1Buffer
[
20
];
// SHA-1 result is 20 bytes long.
// clang-format off
const
uint32_t
Crypto
::
crc32Table
[]
=
{
0x00000000
,
0x77073096
,
0xee0e612c
,
0x990951ba
,
0x076dc419
,
0x706af48f
,
0xe963a535
,
0x9e6495a3
,
0x0edb8832
,
0x79dcb8a4
,
0xe0d5e91e
,
0x97d2d988
,
0x09b64c2b
,
0x7eb17cbd
,
0xe7b82d07
,
0x90bf1d91
,
0x1db71064
,
0x6ab020f2
,
0xf3b97148
,
0x84be41de
,
0x1adad47d
,
0x6ddde4eb
,
0xf4d4b551
,
0x83d385c7
,
0x136c9856
,
0x646ba8c0
,
0xfd62f97a
,
0x8a65c9ec
,
0x14015c4f
,
0x63066cd9
,
0xfa0f3d63
,
0x8d080df5
,
0x3b6e20c8
,
0x4c69105e
,
0xd56041e4
,
0xa2677172
,
0x3c03e4d1
,
0x4b04d447
,
0xd20d85fd
,
0xa50ab56b
,
0x35b5a8fa
,
0x42b2986c
,
0xdbbbc9d6
,
0xacbcf940
,
0x32d86ce3
,
0x45df5c75
,
0xdcd60dcf
,
0xabd13d59
,
0x26d930ac
,
0x51de003a
,
0xc8d75180
,
0xbfd06116
,
0x21b4f4b5
,
0x56b3c423
,
0xcfba9599
,
0xb8bda50f
,
0x2802b89e
,
0x5f058808
,
0xc60cd9b2
,
0xb10be924
,
0x2f6f7c87
,
0x58684c11
,
0xc1611dab
,
0xb6662d3d
,
0x76dc4190
,
0x01db7106
,
0x98d220bc
,
0xefd5102a
,
0x71b18589
,
0x06b6b51f
,
0x9fbfe4a5
,
0xe8b8d433
,
0x7807c9a2
,
0x0f00f934
,
0x9609a88e
,
0xe10e9818
,
0x7f6a0dbb
,
0x086d3d2d
,
0x91646c97
,
0xe6635c01
,
0x6b6b51f4
,
0x1c6c6162
,
0x856530d8
,
0xf262004e
,
0x6c0695ed
,
0x1b01a57b
,
0x8208f4c1
,
0xf50fc457
,
0x65b0d9c6
,
0x12b7e950
,
0x8bbeb8ea
,
0xfcb9887c
,
0x62dd1ddf
,
0x15da2d49
,
0x8cd37cf3
,
0xfbd44c65
,
0x4db26158
,
0x3ab551ce
,
0xa3bc0074
,
0xd4bb30e2
,
0x4adfa541
,
0x3dd895d7
,
0xa4d1c46d
,
0xd3d6f4fb
,
0x4369e96a
,
0x346ed9fc
,
0xad678846
,
0xda60b8d0
,
0x44042d73
,
0x33031de5
,
0xaa0a4c5f
,
0xdd0d7cc9
,
0x5005713c
,
0x270241aa
,
0xbe0b1010
,
0xc90c2086
,
0x5768b525
,
0x206f85b3
,
0xb966d409
,
0xce61e49f
,
0x5edef90e
,
0x29d9c998
,
0xb0d09822
,
0xc7d7a8b4
,
0x59b33d17
,
0x2eb40d81
,
0xb7bd5c3b
,
0xc0ba6cad
,
0xedb88320
,
0x9abfb3b6
,
0x03b6e20c
,
0x74b1d29a
,
0xead54739
,
0x9dd277af
,
0x04db2615
,
0x73dc1683
,
0xe3630b12
,
0x94643b84
,
0x0d6d6a3e
,
0x7a6a5aa8
,
0xe40ecf0b
,
0x9309ff9d
,
0x0a00ae27
,
0x7d079eb1
,
0xf00f9344
,
0x8708a3d2
,
0x1e01f268
,
0x6906c2fe
,
0xf762575d
,
0x806567cb
,
0x196c3671
,
0x6e6b06e7
,
0xfed41b76
,
0x89d32be0
,
0x10da7a5a
,
0x67dd4acc
,
0xf9b9df6f
,
0x8ebeeff9
,
0x17b7be43
,
0x60b08ed5
,
0xd6d6a3e8
,
0xa1d1937e
,
0x38d8c2c4
,
0x4fdff252
,
0xd1bb67f1
,
0xa6bc5767
,
0x3fb506dd
,
0x48b2364b
,
0xd80d2bda
,
0xaf0a1b4c
,
0x36034af6
,
0x41047a60
,
0xdf60efc3
,
0xa867df55
,
0x316e8eef
,
0x4669be79
,
0xcb61b38c
,
0xbc66831a
,
0x256fd2a0
,
0x5268e236
,
0xcc0c7795
,
0xbb0b4703
,
0x220216b9
,
0x5505262f
,
0xc5ba3bbe
,
0xb2bd0b28
,
0x2bb45a92
,
0x5cb36a04
,
0xc2d7ffa7
,
0xb5d0cf31
,
0x2cd99e8b
,
0x5bdeae1d
,
0x9b64c2b0
,
0xec63f226
,
0x756aa39c
,
0x026d930a
,
0x9c0906a9
,
0xeb0e363f
,
0x72076785
,
0x05005713
,
0x95bf4a82
,
0xe2b87a14
,
0x7bb12bae
,
0x0cb61b38
,
0x92d28e9b
,
0xe5d5be0d
,
0x7cdcefb7
,
0x0bdbdf21
,
0x86d3d2d4
,
0xf1d4e242
,
0x68ddb3f8
,
0x1fda836e
,
0x81be16cd
,
0xf6b9265b
,
0x6fb077e1
,
0x18b74777
,
0x88085ae6
,
0xff0f6a70
,
0x66063bca
,
0x11010b5c
,
0x8f659eff
,
0xf862ae69
,
0x616bffd3
,
0x166ccf45
,
0xa00ae278
,
0xd70dd2ee
,
0x4e048354
,
0x3903b3c2
,
0xa7672661
,
0xd06016f7
,
0x4969474d
,
0x3e6e77db
,
0xaed16a4a
,
0xd9d65adc
,
0x40df0b66
,
0x37d83bf0
,
0xa9bcae53
,
0xdebb9ec5
,
0x47b2cf7f
,
0x30b5ffe9
,
0xbdbdf21c
,
0xcabac28a
,
0x53b39330
,
0x24b4a3a6
,
0xbad03605
,
0xcdd70693
,
0x54de5729
,
0x23d967bf
,
0xb3667a2e
,
0xc4614ab8
,
0x5d681b02
,
0x2a6f2b94
,
0xb40bbe37
,
0xc30c8ea1
,
0x5a05df1b
,
0x2d02ef8d
};
// clang-format on
/* Static methods. */
void
Crypto
::
ClassInit
()
{
// MS_TRACE();
// Init the vrypto seed with a random number taken from the address
// of the seed variable itself (which is random).
Crypto
::
seed
=
static_cast
<
uint32_t
>
(
reinterpret_cast
<
uintptr_t
>
(
std
::
addressof
(
Crypto
::
seed
)));
// Create an OpenSSL HMAC_CTX context for HMAC SHA1 calculation.
// Crypto::hmacSha1Ctx = HMAC_CTX_new();
if
(
Crypto
::
hmacSha1Ctx
==
nullptr
)
{
Crypto
::
hmacSha1Ctx
=
HMAC_CTX_new
();
}
}
void
Crypto
::
ClassDestroy
()
{
// MS_TRACE();
if
(
Crypto
::
hmacSha1Ctx
!=
nullptr
)
{
HMAC_CTX_free
(
Crypto
::
hmacSha1Ctx
);
}
}
const
uint8_t
*
Crypto
::
GetHmacShA1
(
const
std
::
string
&
key
,
const
uint8_t
*
data
,
size_t
len
)
{
// MS_TRACE();
size_t
ret
;
ret
=
HMAC_Init_ex
(
Crypto
::
hmacSha1Ctx
,
key
.
c_str
(),
key
.
length
(),
EVP_sha1
(),
nullptr
);
// MS_ASSERT(ret == 1, "OpenSSL HMAC_Init_ex() failed with key '%s'", key.c_str());
ret
=
HMAC_Update
(
Crypto
::
hmacSha1Ctx
,
data
,
static_cast
<
int
>
(
len
));
/*
MS_ASSERT(
ret == 1,
"OpenSSL HMAC_Update() failed with key '%s' and data length %zu bytes",
key.c_str(),
len);
*/
uint32_t
resultLen
;
ret
=
HMAC_Final
(
Crypto
::
hmacSha1Ctx
,
(
uint8_t
*
)
Crypto
::
hmacSha1Buffer
,
&
resultLen
);
/*
MS_ASSERT(
ret == 1, "OpenSSL HMAC_Final() failed with key '%s' and data length %zu bytes", key.c_str(),
len); MS_ASSERT(resultLen == 20, "OpenSSL HMAC_Final() resultLen is %u instead of 20", resultLen);
*/
return
Crypto
::
hmacSha1Buffer
;
}
}
// namespace Utils
namespace
Utils
{
static
std
::
string
inet_ntoa
(
struct
in_addr
in
)
{
char
buf
[
20
];
unsigned
char
*
p
=
(
unsigned
char
*
)
&
(
in
);
snprintf
(
buf
,
sizeof
(
buf
),
"%u.%u.%u.%u"
,
p
[
0
],
p
[
1
],
p
[
2
],
p
[
3
]);
return
buf
;
}
void
IP
::
GetAddressInfo
(
const
struct
sockaddr
*
addr
,
int
&
family
,
std
::
string
&
ip
,
uint16_t
&
port
)
{
char
ipBuffer
[
INET6_ADDRSTRLEN
+
1
];
switch
(
addr
->
sa_family
)
{
case
AF_INET
:
{
ip
=
Utils
::
inet_ntoa
(
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
addr
)
->
sin_addr
);
port
=
static_cast
<
uint16_t
>
(
ntohs
(
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
addr
)
->
sin_port
));
break
;
}
case
AF_INET6
:
{
port
=
static_cast
<
uint16_t
>
(
ntohs
(
reinterpret_cast
<
const
struct
sockaddr_in6
*>
(
addr
)
->
sin6_port
));
break
;
}
default
:
{
// MS_ABORT("unknown network family: %d", static_cast<int>(addr->sa_family));
}
}
family
=
addr
->
sa_family
;
ip
.
assign
(
ipBuffer
);
}
}
//
namespace
Utils
\ No newline at end of file
webrtc/utils.h
查看文件 @
704421b7
...
...
@@ -30,76 +30,6 @@
#include <string>
namespace
Utils
{
class
IP
{
public
:
static
int
GetFamily
(
const
char
*
ip
,
size_t
ipLen
);
static
int
GetFamily
(
const
std
::
string
&
ip
);
static
void
GetAddressInfo
(
const
struct
sockaddr
*
addr
,
int
&
family
,
std
::
string
&
ip
,
uint16_t
&
port
);
static
bool
CompareAddresses
(
const
struct
sockaddr
*
addr1
,
const
struct
sockaddr
*
addr2
);
static
struct
sockaddr_storage
CopyAddress
(
const
struct
sockaddr
*
addr
);
static
void
NormalizeIp
(
std
::
string
&
ip
);
};
/* Inline static methods. */
inline
int
IP
::
GetFamily
(
const
std
::
string
&
ip
)
{
return
GetFamily
(
ip
.
c_str
(),
ip
.
size
());
}
inline
bool
IP
::
CompareAddresses
(
const
struct
sockaddr
*
addr1
,
const
struct
sockaddr
*
addr2
)
{
// Compare family.
if
(
addr1
->
sa_family
!=
addr2
->
sa_family
||
(
addr1
->
sa_family
!=
AF_INET
&&
addr1
->
sa_family
!=
AF_INET6
))
{
return
false
;
}
// Compare port.
if
(
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
addr1
)
->
sin_port
!=
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
addr2
)
->
sin_port
)
{
return
false
;
}
// Compare IP.
switch
(
addr1
->
sa_family
)
{
case
AF_INET
:
{
return
(
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
addr1
)
->
sin_addr
.
s_addr
==
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
addr2
)
->
sin_addr
.
s_addr
);
}
case
AF_INET6
:
{
return
(
std
::
memcmp
(
std
::
addressof
(
reinterpret_cast
<
const
struct
sockaddr_in6
*>
(
addr1
)
->
sin6_addr
),
std
::
addressof
(
reinterpret_cast
<
const
struct
sockaddr_in6
*>
(
addr2
)
->
sin6_addr
),
16
)
==
0
?
true
:
false
);
}
default
:
{
return
false
;
}
}
}
inline
struct
sockaddr_storage
IP
::
CopyAddress
(
const
struct
sockaddr
*
addr
)
{
struct
sockaddr_storage
copiedAddr
;
switch
(
addr
->
sa_family
)
{
case
AF_INET
:
std
::
memcpy
(
std
::
addressof
(
copiedAddr
),
addr
,
sizeof
(
struct
sockaddr_in
));
break
;
case
AF_INET6
:
std
::
memcpy
(
std
::
addressof
(
copiedAddr
),
addr
,
sizeof
(
struct
sockaddr_in6
));
break
;
}
return
copiedAddr
;
}
class
File
{
public
:
static
void
CheckFile
(
const
char
*
file
);
};
class
Byte
{
public
:
...
...
@@ -181,138 +111,6 @@ inline uint16_t Byte::PadTo4Bytes(uint16_t size) {
return
size
;
}
inline
uint32_t
Byte
::
PadTo4Bytes
(
uint32_t
size
)
{
// If size is not multiple of 32 bits then pad it.
if
(
size
&
0x03
)
return
(
size
&
0xFFFFFFFC
)
+
4
;
else
return
size
;
}
class
Bits
{
public
:
static
size_t
CountSetBits
(
const
uint16_t
mask
);
};
/* Inline static methods. */
class
Crypto
{
public
:
static
void
ClassInit
();
static
void
ClassDestroy
();
static
uint32_t
GetRandomUInt
(
uint32_t
min
,
uint32_t
max
);
static
const
std
::
string
GetRandomString
(
size_t
len
);
static
uint32_t
GetCRC32
(
const
uint8_t
*
data
,
size_t
size
);
static
const
uint8_t
*
GetHmacShA1
(
const
std
::
string
&
key
,
const
uint8_t
*
data
,
size_t
len
);
private
:
static
uint32_t
seed
;
static
HMAC_CTX
*
hmacSha1Ctx
;
static
uint8_t
hmacSha1Buffer
[];
static
const
uint32_t
crc32Table
[
256
];
};
/* Inline static methods. */
inline
uint32_t
Crypto
::
GetRandomUInt
(
uint32_t
min
,
uint32_t
max
)
{
// NOTE: This is the original, but produces very small values.
// Crypto::seed = (214013 * Crypto::seed) + 2531011;
// return (((Crypto::seed>>16)&0x7FFF) % (max - min + 1)) + min;
// This seems to produce better results.
Crypto
::
seed
=
uint32_t
{((
214013
*
Crypto
::
seed
)
+
2531011
)};
return
(((
Crypto
::
seed
>>
4
)
&
0x7FFF7FFF
)
%
(
max
-
min
+
1
))
+
min
;
}
inline
const
std
::
string
Crypto
::
GetRandomString
(
size_t
len
)
{
static
char
buffer
[
64
];
static
const
char
chars
[]
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
,
'g'
,
'h'
,
'i'
,
'j'
,
'k'
,
'l'
,
'm'
,
'n'
,
'o'
,
'p'
,
'q'
,
'r'
,
's'
,
't'
,
'u'
,
'v'
,
'w'
,
'x'
,
'y'
,
'z'
};
if
(
len
>
64
)
len
=
64
;
for
(
size_t
i
{
0
};
i
<
len
;
++
i
)
{
buffer
[
i
]
=
chars
[
GetRandomUInt
(
0
,
sizeof
(
chars
)
-
1
)];
}
return
std
::
string
(
buffer
,
len
);
}
inline
uint32_t
Crypto
::
GetCRC32
(
const
uint8_t
*
data
,
size_t
size
)
{
uint32_t
crc
{
0xFFFFFFFF
};
const
uint8_t
*
p
=
data
;
while
(
size
--
)
{
crc
=
Crypto
::
crc32Table
[(
crc
^
*
p
++
)
&
0xFF
]
^
(
crc
>>
8
);
}
return
crc
^
~
0U
;
}
class
String
{
public
:
static
void
ToLowerCase
(
std
::
string
&
str
);
};
inline
void
String
::
ToLowerCase
(
std
::
string
&
str
)
{
std
::
transform
(
str
.
begin
(),
str
.
end
(),
str
.
begin
(),
::
tolower
);
}
class
Time
{
// Seconds from Jan 1, 1900 to Jan 1, 1970.
static
constexpr
uint32_t
UnixNtpOffset
{
0x83AA7E80
};
// NTP fractional unit.
static
constexpr
uint64_t
NtpFractionalUnit
{
1LL
<<
32
};
public
:
struct
Ntp
{
uint32_t
seconds
;
uint32_t
fractions
;
};
static
Time
::
Ntp
TimeMs2Ntp
(
uint64_t
ms
);
static
uint64_t
Ntp2TimeMs
(
Time
::
Ntp
ntp
);
static
bool
IsNewerTimestamp
(
uint32_t
timestamp
,
uint32_t
prevTimestamp
);
static
uint32_t
LatestTimestamp
(
uint32_t
timestamp1
,
uint32_t
timestamp2
);
};
inline
Time
::
Ntp
Time
::
TimeMs2Ntp
(
uint64_t
ms
)
{
Time
::
Ntp
ntp
;
// NOLINT(cppcoreguidelines-pro-type-member-init)
ntp
.
seconds
=
uint32_t
(
ms
/
1000
);
ntp
.
fractions
=
static_cast
<
uint32_t
>
((
static_cast
<
double
>
(
ms
%
1000
)
/
1000
)
*
NtpFractionalUnit
);
return
ntp
;
}
inline
uint64_t
Time
::
Ntp2TimeMs
(
Time
::
Ntp
ntp
)
{
// clang-format off
return
(
static_cast
<
uint64_t
>
(
ntp
.
seconds
)
*
1000
+
static_cast
<
uint64_t
>
(
std
::
round
((
static_cast
<
double
>
(
ntp
.
fractions
)
*
1000
)
/
NtpFractionalUnit
))
);
// clang-format on
}
inline
bool
Time
::
IsNewerTimestamp
(
uint32_t
timestamp
,
uint32_t
prevTimestamp
)
{
// Distinguish between elements that are exactly 0x80000000 apart.
// If t1>t2 and |t1-t2| = 0x80000000: IsNewer(t1,t2)=true,
// IsNewer(t2,t1)=false
// rather than having IsNewer(t1,t2) = IsNewer(t2,t1) = false.
if
(
static_cast
<
uint32_t
>
(
timestamp
-
prevTimestamp
)
==
0x80000000
)
return
timestamp
>
prevTimestamp
;
return
timestamp
!=
prevTimestamp
&&
static_cast
<
uint32_t
>
(
timestamp
-
prevTimestamp
)
<
0x80000000
;
}
inline
uint32_t
Time
::
LatestTimestamp
(
uint32_t
timestamp1
,
uint32_t
timestamp2
)
{
return
IsNewerTimestamp
(
timestamp1
,
timestamp2
)
?
timestamp1
:
timestamp2
;
}
}
// namespace Utils
#endif
webrtc/webrtc_transport.cc
查看文件 @
704421b7
...
...
@@ -4,31 +4,81 @@
WebRtcTransport
::
WebRtcTransport
()
{
static
onceToken
token
([](){
Utils
::
Crypto
::
ClassInit
();
RTC
::
DtlsTransport
::
ClassInit
();
RTC
::
DepLibSRTP
::
ClassInit
();
RTC
::
SrtpSession
::
ClassInit
();
});
ice_server_
=
std
::
make_shared
<
IceServer
>
(
Utils
::
Crypto
::
GetRandomString
(
4
),
Utils
::
Crypto
::
GetRandomString
(
24
));
ice_server_
->
SetIceServerCompletedCB
([
this
]()
{
this
->
OnIceServerCompleted
();
});
ice_server_
->
SetSendCB
([
this
](
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
remote_address
)
{
this
->
WritePacket
(
buf
,
len
,
remote_address
);
});
// todo dtls服务器或客户端模式
dtls_transport_
=
std
::
make_shared
<
DtlsTransport
>
(
true
);
dtls_transport_
->
SetHandshakeCompletedCB
([
this
](
std
::
string
client_key
,
std
::
string
server_key
,
RTC
::
CryptoSuite
srtp_crypto_suite
)
{
this
->
OnDtlsCompleted
(
client_key
,
server_key
,
srtp_crypto_suite
);
});
dtls_transport_
->
SetOutPutCB
([
this
](
char
*
buf
,
size_t
len
)
{
this
->
WritePacket
(
buf
,
len
);
});
dtls_transport_
=
std
::
make_shared
<
RTC
::
DtlsTransport
>
(
EventPollerPool
::
Instance
().
getFirstPoller
(),
this
);
ice_server_
=
std
::
make_shared
<
RTC
::
IceServer
>
(
this
,
makeRandStr
(
4
),
makeRandStr
(
24
));
}
WebRtcTransport
::~
WebRtcTransport
()
{}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void
WebRtcTransport
::
OnIceServerSendStunPacket
(
const
RTC
::
IceServer
*
iceServer
,
const
RTC
::
StunPacket
*
packet
,
RTC
::
TransportTuple
*
tuple
)
{
onWrite
((
char
*
)
packet
->
GetData
(),
packet
->
GetSize
(),
(
struct
sockaddr_in
*
)
tuple
);
}
void
WebRtcTransport
::
OnIceServerSelectedTuple
(
const
RTC
::
IceServer
*
iceServer
,
RTC
::
TransportTuple
*
tuple
)
{
InfoL
;
}
void
WebRtcTransport
::
OnIceServerConnected
(
const
RTC
::
IceServer
*
iceServer
)
{
InfoL
;
dtls_transport_
->
Run
(
RTC
::
DtlsTransport
::
Role
::
SERVER
);
}
void
WebRtcTransport
::
OnIceServerCompleted
(
const
RTC
::
IceServer
*
iceServer
)
{
InfoL
;
}
void
WebRtcTransport
::
OnIceServerDisconnected
(
const
RTC
::
IceServer
*
iceServer
)
{
InfoL
;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void
WebRtcTransport
::
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
RTC
::
SrtpSession
::
CryptoSuite
srtpCryptoSuite
,
uint8_t
*
srtpLocalKey
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
{
InfoL
;
srtp_session_
=
std
::
make_shared
<
RTC
::
SrtpSession
>
(
RTC
::
SrtpSession
::
Type
::
OUTBOUND
,
srtpCryptoSuite
,
srtpLocalKey
,
srtpLocalKeyLen
);
onDtlsConnected
();
}
void
WebRtcTransport
::
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
{
onWrite
((
char
*
)
data
,
len
);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void
WebRtcTransport
::
onWrite
(
const
char
*
buf
,
size_t
len
){
auto
tuple
=
ice_server_
->
GetSelectedTuple
();
assert
(
tuple
);
onWrite
(
buf
,
len
,
(
struct
sockaddr_in
*
)
tuple
);
}
std
::
string
WebRtcTransport
::
GetLocalSdp
()
{
RTC
::
DtlsTransport
::
Fingerprint
remote_fingerprint
;
remote_fingerprint
.
algorithm
=
RTC
::
DtlsTransport
::
GetFingerprintAlgorithm
(
"sha-256"
);
remote_fingerprint
.
value
=
""
;
dtls_transport_
->
SetRemoteFingerprint
(
remote_fingerprint
);
string
finger_print_sha256
;
auto
finger_prints
=
dtls_transport_
->
GetLocalFingerprints
();
for
(
size_t
i
=
0
;
i
<
finger_prints
.
size
();
i
++
)
{
if
(
finger_prints
[
i
].
algorithm
==
RTC
::
DtlsTransport
::
FingerprintAlgorithm
::
SHA256
)
{
finger_print_sha256
=
finger_prints
[
i
].
value
;
}
}
char
sdp
[
1024
*
10
]
=
{
0
};
auto
ssrc
=
getSSRC
();
auto
ip
=
getIP
();
...
...
@@ -60,22 +110,10 @@ std::string WebRtcTransport::GetLocalSdp() {
"a=candidate:%s 1 udp %u %s %u typ %s
\r\n
"
,
ip
.
c_str
(),
port
,
pt
,
ip
.
c_str
(),
ice_server_
->
GetUsernameFragment
().
c_str
(),
ice_server_
->
GetPassword
().
c_str
(),
dtls_transport_
->
GetMyFingerprint
()
.
c_str
(),
pt
,
ssrc
,
ssrc
,
ssrc
,
ssrc
,
"4"
,
ssrc
,
ip
.
c_str
(),
port
,
"host"
);
finger_print_sha256
.
c_str
(),
pt
,
ssrc
,
ssrc
,
ssrc
,
ssrc
,
"4"
,
ssrc
,
ip
.
c_str
(),
port
,
"host"
);
return
sdp
;
}
void
WebRtcTransport
::
OnIceServerCompleted
()
{
InfoL
;
dtls_transport_
->
Start
();
onIceConnected
();
}
void
WebRtcTransport
::
OnDtlsCompleted
(
std
::
string
client_key
,
std
::
string
server_key
,
RTC
::
CryptoSuite
srtp_crypto_suite
)
{
InfoL
<<
client_key
<<
" "
<<
server_key
<<
" "
<<
(
int
)
srtp_crypto_suite
;
srtp_session_
=
std
::
make_shared
<
RTC
::
SrtpSession
>
(
RTC
::
SrtpSession
::
Type
::
OUTBOUND
,
srtp_crypto_suite
,
(
uint8_t
*
)
client_key
.
c_str
(),
client_key
.
size
());
onDtlsCompleted
();
}
bool
is_dtls
(
char
*
buf
)
{
return
((
*
buf
>
19
)
&&
(
*
buf
<
64
));
}
...
...
@@ -90,25 +128,23 @@ bool is_rtcp(char *buf) {
return
((
header
->
pt
>=
64
)
&&
(
header
->
pt
<
96
));
}
void
WebRtcTransport
::
OnInputDataPacket
(
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
remote_address
)
{
void
WebRtcTransport
::
OnInputDataPacket
(
char
*
buf
,
size_t
len
,
RTC
::
TransportTuple
*
tuple
)
{
if
(
RTC
::
StunPacket
::
IsStun
((
const
uint8_t
*
)
buf
,
len
))
{
InfoL
<<
"stun:"
<<
hexdump
(
buf
,
len
);
RTC
::
StunPacket
*
packet
=
RTC
::
StunPacket
::
Parse
((
const
uint8_t
*
)
buf
,
len
);
if
(
packet
==
nullptr
)
{
WarnL
<<
"parse stun error"
<<
std
::
endl
;
return
;
}
ice_server_
->
ProcessStunPacket
(
packet
,
remote_address
);
ice_server_
->
ProcessStunPacket
(
packet
,
tuple
);
return
;
}
if
(
DtlsTransport
::
IsDtlsPacket
(
buf
,
len
))
{
InfoL
<<
"dtls:"
<<
hexdump
(
buf
,
len
);
dtls_transport_
->
InputData
(
buf
,
len
);
if
(
is_dtls
(
buf
))
{
dtls_transport_
->
ProcessDtlsData
((
uint8_t
*
)
buf
,
len
);
return
;
}
if
(
is_rtp
(
buf
))
{
RtpHeader
*
header
=
(
RtpHeader
*
)
buf
;
InfoL
<<
"rtp:"
<<
header
->
dumpString
(
len
);
//
InfoL << "rtp:" << header->dumpString(len);
return
;
}
if
(
is_rtcp
(
buf
))
{
...
...
@@ -118,10 +154,6 @@ void WebRtcTransport::OnInputDataPacket(char *buf, size_t len, struct sockaddr_i
}
}
void
WebRtcTransport
::
WritePacket
(
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
remote_address
)
{
onWrite
(
buf
,
len
,
remote_address
?
remote_address
:
(
ice_server_
?
ice_server_
->
GetSelectAddr
()
:
nullptr
));
}
void
WebRtcTransport
::
WritRtpPacket
(
char
*
buf
,
size_t
len
)
{
const
uint8_t
*
p
=
(
uint8_t
*
)
buf
;
bool
ret
=
false
;
...
...
@@ -129,7 +161,7 @@ void WebRtcTransport::WritRtpPacket(char *buf, size_t len) {
ret
=
srtp_session_
->
EncryptRtp
(
&
p
,
&
len
);
}
if
(
ret
)
{
onWrite
((
char
*
)
p
,
len
,
ice_server_
->
GetSelectAddr
()
);
onWrite
((
char
*
)
p
,
len
);
}
}
...
...
@@ -139,8 +171,8 @@ WebRtcTransportImp::WebRtcTransportImp(const EventPoller::Ptr &poller) {
_socket
=
Socket
::
createSocket
(
poller
,
false
);
//随机端口,绑定全部网卡
_socket
->
bindUdpSock
(
0
);
_socket
->
setOnRead
([
this
](
const
Buffer
::
Ptr
&
buf
,
struct
sockaddr
*
addr
,
int
addr_len
){
OnInputDataPacket
(
buf
->
data
(),
buf
->
size
(),
(
struct
sockaddr_in
*
)
addr
);
_socket
->
setOnRead
([
this
](
const
Buffer
::
Ptr
&
buf
,
struct
sockaddr
*
addr
,
int
addr_len
)
mutable
{
OnInputDataPacket
(
buf
->
data
(),
buf
->
size
(),
addr
);
});
}
...
...
@@ -149,7 +181,7 @@ void WebRtcTransportImp::attach(const RtspMediaSource::Ptr &src) {
_src
=
src
;
}
void
WebRtcTransportImp
::
onDtlsCo
mple
ted
()
{
void
WebRtcTransportImp
::
onDtlsCo
nnec
ted
()
{
_reader
=
_src
->
getRing
()
->
attach
(
_socket
->
getPoller
(),
true
);
weak_ptr
<
WebRtcTransportImp
>
weak_self
=
shared_from_this
();
_reader
->
setReadCB
([
weak_self
](
const
RtspMediaSource
::
RingDataType
&
pkt
){
...
...
@@ -167,14 +199,9 @@ void WebRtcTransportImp::onDtlsCompleted() {
});
}
void
WebRtcTransportImp
::
onIceConnected
(){
}
void
WebRtcTransportImp
::
onWrite
(
const
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
dst
)
{
auto
ptr
=
BufferRaw
::
create
();
ptr
->
assign
(
buf
,
len
);
// InfoL << len << " " << SockUtil::inet_ntoa(dst->sin_addr) << " " << ntohs(dst->sin_port);
_socket
->
send
(
ptr
,
(
struct
sockaddr
*
)(
dst
),
sizeof
(
struct
sockaddr
));
}
...
...
@@ -201,15 +228,5 @@ std::string WebRtcTransportImp::getIP() const {
///////////////////////////////////////////////////////////////////
INSTANCE_IMP
(
WebRtcManager
)
WebRtcManager
::
WebRtcManager
()
{
}
WebRtcManager
::~
WebRtcManager
()
{
}
webrtc/webrtc_transport.h
查看文件 @
704421b7
...
...
@@ -3,12 +3,12 @@
#include <memory>
#include <string>
#include "dtls_transport.h"
#include "
rtc_
dtls_transport.h"
#include "ice_server.h"
#include "srtp_session.h"
#include "stun_packet.h"
class
WebRtcTransport
{
class
WebRtcTransport
:
public
RTC
::
DtlsTransport
::
Listener
,
public
RTC
::
IceServer
::
Listener
{
public
:
using
Ptr
=
std
::
shared_ptr
<
WebRtcTransport
>
;
WebRtcTransport
();
...
...
@@ -22,7 +22,7 @@ public:
/// \param buf
/// \param len
/// \param remote_address
void
OnInputDataPacket
(
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
remote_address
);
void
OnInputDataPacket
(
char
*
buf
,
size_t
len
,
RTC
::
TransportTuple
*
tuple
);
/// 发送rtp
/// \param buf
...
...
@@ -30,6 +30,31 @@ public:
void
WritRtpPacket
(
char
*
buf
,
size_t
len
);
protected
:
// dtls相关的回调
void
OnDtlsTransportConnecting
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
override
{};
void
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
RTC
::
SrtpSession
::
CryptoSuite
srtpCryptoSuite
,
uint8_t
*
srtpLocalKey
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
override
;
void
OnDtlsTransportFailed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
override
{};
void
OnDtlsTransportClosed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
override
{};
void
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
override
;
void
OnDtlsTransportApplicationDataReceived
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
override
{};
protected
:
//ice相关的回调
void
OnIceServerSendStunPacket
(
const
RTC
::
IceServer
*
iceServer
,
const
RTC
::
StunPacket
*
packet
,
RTC
::
TransportTuple
*
tuple
)
override
;
void
OnIceServerSelectedTuple
(
const
RTC
::
IceServer
*
iceServer
,
RTC
::
TransportTuple
*
tuple
)
override
;
void
OnIceServerConnected
(
const
RTC
::
IceServer
*
iceServer
)
override
;
void
OnIceServerCompleted
(
const
RTC
::
IceServer
*
iceServer
)
override
;
void
OnIceServerDisconnected
(
const
RTC
::
IceServer
*
iceServer
)
override
;
protected
:
/// 输出udp数据
/// \param buf
/// \param len
...
...
@@ -39,17 +64,14 @@ protected:
virtual
uint16_t
getPort
()
const
=
0
;
virtual
std
::
string
getIP
()
const
=
0
;
virtual
int
getPayloadType
()
const
=
0
;
virtual
void
onIceConnected
()
=
0
;
virtual
void
onDtlsCompleted
()
=
0
;
virtual
void
onDtlsConnected
()
=
0
;
private
:
void
OnIceServerCompleted
();
void
OnDtlsCompleted
(
std
::
string
client_key
,
std
::
string
server_key
,
RTC
::
CryptoSuite
srtp_crypto_suite
);
void
WritePacket
(
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
remote_address
=
nullptr
);
void
onWrite
(
const
char
*
buf
,
size_t
len
);
private
:
IceServer
::
Ptr
ice_server_
;
DtlsTransport
::
Ptr
dtls_transport_
;
std
::
shared_ptr
<
RTC
::
IceServer
>
ice_server_
;
std
::
shared_ptr
<
RTC
::
DtlsTransport
>
dtls_transport_
;
std
::
shared_ptr
<
RTC
::
SrtpSession
>
srtp_session_
;
};
...
...
@@ -74,8 +96,7 @@ protected:
uint32_t
getSSRC
()
const
override
;
uint16_t
getPort
()
const
override
;
std
::
string
getIP
()
const
override
;
void
onIceConnected
()
override
;
void
onDtlsCompleted
()
override
;
void
onDtlsConnected
()
override
;
private
:
Socket
::
Ptr
_socket
;
...
...
@@ -83,16 +104,6 @@ private:
RtspMediaSource
::
RingType
::
RingReader
::
Ptr
_reader
;
};
class
WebRtcManager
:
public
std
::
enable_shared_from_this
<
WebRtcManager
>
{
public
:
~
WebRtcManager
();
static
WebRtcManager
&
Instance
();
private
:
WebRtcManager
();
};
...
...
www/webrtc/index.html
查看文件 @
704421b7
...
...
@@ -22,7 +22,7 @@
<video
id=
"vid2"
autoplay
></video>
<br>
<p>
ip_address
</p>
<input
id=
"input1"
type=
"text"
name=
"ip_address"
value=
"http
://172.26.10.29:20080
/webrtc?app=live&stream=test"
>
<input
id=
"input1"
type=
"text"
name=
"ip_address"
value=
"http
s://rp.zlmediakit.com:20443
/webrtc?app=live&stream=test"
>
<br>
<button
id=
"btn1"
>
Call
</button>
<button
id=
"btn3"
>
Hang Up
</button>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论