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()
...
@@ -49,4 +49,3 @@ else()
endif
()
endif
()
target_link_libraries
(
MediaServer jsoncpp
${
LINK_LIB_LIST
}
)
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 <functional>
#include <memory>
#include <memory>
#include "logger.h"
namespace
RTC
#include "stun_packet.h"
{
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
;
public
:
void
ProcessStunPacket
(
RTC
::
StunPacket
*
packet
,
RTC
::
TransportTuple
*
tuple
);
class
IceServer
{
const
std
::
string
&
GetUsernameFragment
()
const
public
:
{
enum
class
IceState
{
kNew
=
1
,
kConnect
,
kCompleted
,
kDisconnected
};
return
this
->
usernameFragment
;
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_
;
}
}
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
:
#endif
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_
;
};
webrtc/logger.h
查看文件 @
704421b7
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
#define MS_DEBUG_2TAGS(tag1, tag2,fmt, ...) printf("debug:" fmt "\n", ##__VA_ARGS__)
#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_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_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_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_WARN_TAG(tag,fmt, ...) printf("warn:" fmt "\n", ##__VA_ARGS__)
#define MS_DEBUG_DEV(fmt, ...) printf("debug:" 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
#ifndef MS_RTC_DTLS_TRANSPORT_HPP
#define MS_RTC_DTLS_TRANSPORT_HPP
#define MS_RTC_DTLS_TRANSPORT_HPP
#include "srtp_session.h"
#include <openssl/bio.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/ssl.h>
#include <openssl/x509.h>
#include <openssl/x509.h>
#include <map>
#include <map>
#include <string>
#include <string>
#include <vector>
#include <vector>
#include "Poller/Timer.h"
namespace
RTC
{
#include "Poller/EventPoller.h"
enum
class
CryptoSuite
{
using
namespace
toolkit
;
NONE
=
0
,
AES_CM_128_HMAC_SHA1_80
=
1
,
namespace
RTC
AES_CM_128_HMAC_SHA1_32
,
{
AEAD_AES_256_GCM
,
class
DtlsTransport
:
public
std
::
enable_shared_from_this
<
DtlsTransport
>
AEAD_AES_128_GCM
{
};
class
DtlsTransport
{
public
:
public
:
enum
class
DtlsState
{
NEW
=
1
,
CONNECTING
,
CONNECTED
,
FAILED
,
CLOSED
};
enum
class
DtlsState
{
NEW
=
1
,
CONNECTING
,
CONNECTED
,
FAILED
,
CLOSED
};
public
:
public
:
enum
class
Role
{
NONE
=
0
,
AUTO
=
1
,
CLIENT
,
SERVER
};
enum
class
Role
{
NONE
=
0
,
AUTO
=
1
,
CLIENT
,
SERVER
};
public
:
public
:
enum
class
FingerprintAlgorithm
{
NONE
=
0
,
SHA1
=
1
,
SHA224
,
SHA256
,
SHA384
,
SHA512
};
enum
class
FingerprintAlgorithm
{
NONE
=
0
,
SHA1
=
1
,
SHA224
,
SHA256
,
SHA384
,
SHA512
};
public
:
public
:
struct
Fingerprint
{
struct
Fingerprint
FingerprintAlgorithm
algorithm
{
FingerprintAlgorithm
::
NONE
};
{
FingerprintAlgorithm
algorithm
{
FingerprintAlgorithm
::
NONE
};
std
::
string
value
;
std
::
string
value
;
};
};
private
:
private
:
struct
SrtpCryptoSuiteMapEntry
{
struct
SrtpCryptoSuiteMapEntry
RTC
::
CryptoSuite
cryptoSuite
;
{
RTC
::
SrtpSession
::
CryptoSuite
cryptoSuite
;
const
char
*
name
;
const
char
*
name
;
};
};
public
:
public
:
class
Listener
{
class
Listener
{
public
:
public
:
// DTLS is in the process of negotiating a secure connection. Incoming
// DTLS is in the process of negotiating a secure connection. Incoming
// media can flow through.
// media can flow through.
...
@@ -49,27 +71,32 @@ class DtlsTransport {
...
@@ -49,27 +71,32 @@ class DtlsTransport {
// DTLS has completed negotiation of a secure connection (including DTLS-SRTP
// DTLS has completed negotiation of a secure connection (including DTLS-SRTP
// and remote fingerprint verification). Outgoing media can now flow through.
// and remote fingerprint verification). Outgoing media can now flow through.
// NOTE: The caller MUST NOT call any method during this callback.
// NOTE: The caller MUST NOT call any method during this callback.
virtual
void
OnDtlsTransportConnected
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
virtual
void
OnDtlsTransportConnected
(
RTC
::
CryptoSuite
srtpCryptoSuite
,
uint8_t
*
srtpLocalKey
,
const
RTC
::
DtlsTransport
*
dtlsTransport
,
size_t
srtpLocalKeyLen
,
uint8_t
*
srtpRemoteKey
,
RTC
::
SrtpSession
::
CryptoSuite
srtpCryptoSuite
,
size_t
srtpRemoteKeyLen
,
std
::
string
&
remoteCert
)
=
0
;
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
// 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).
// DTLS alert or a failure to validate the remote fingerprint).
virtual
void
OnDtlsTransportFailed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
=
0
;
virtual
void
OnDtlsTransportFailed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
=
0
;
// The DTLS connection has been closed due to receipt of a close_notify alert.
// The DTLS connection has been closed due to receipt of a close_notify alert.
virtual
void
OnDtlsTransportClosed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
=
0
;
virtual
void
OnDtlsTransportClosed
(
const
RTC
::
DtlsTransport
*
dtlsTransport
)
=
0
;
// Need to send DTLS data to the peer.
// Need to send DTLS data to the peer.
virtual
void
OnDtlsTransportSendData
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
virtual
void
OnDtlsTransportSendData
(
const
uint8_t
*
data
,
size_t
len
)
=
0
;
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
=
0
;
// DTLS application data received.
// DTLS application data received.
virtual
void
OnDtlsTransportApplicationDataReceived
(
const
RTC
::
DtlsTransport
*
dtlsTransport
,
virtual
void
OnDtlsTransportApplicationDataReceived
(
const
uint8_t
*
data
,
size_t
len
)
=
0
;
const
RTC
::
DtlsTransport
*
dtlsTransport
,
const
uint8_t
*
data
,
size_t
len
)
=
0
;
};
};
public
:
public
:
static
void
ClassInit
();
static
void
ClassInit
();
static
void
ClassDestroy
();
static
void
ClassDestroy
();
static
Role
StringToRole
(
const
std
::
string
&
role
)
{
static
Role
StringToRole
(
const
std
::
string
&
role
)
{
auto
it
=
DtlsTransport
::
string2Role
.
find
(
role
);
auto
it
=
DtlsTransport
::
string2Role
.
find
(
role
);
if
(
it
!=
DtlsTransport
::
string2Role
.
end
())
if
(
it
!=
DtlsTransport
::
string2Role
.
end
())
...
@@ -77,7 +104,8 @@ class DtlsTransport {
...
@@ -77,7 +104,8 @@ class DtlsTransport {
else
else
return
DtlsTransport
::
Role
::
NONE
;
return
DtlsTransport
::
Role
::
NONE
;
}
}
static
FingerprintAlgorithm
GetFingerprintAlgorithm
(
const
std
::
string
&
fingerprint
)
{
static
FingerprintAlgorithm
GetFingerprintAlgorithm
(
const
std
::
string
&
fingerprint
)
{
auto
it
=
DtlsTransport
::
string2FingerprintAlgorithm
.
find
(
fingerprint
);
auto
it
=
DtlsTransport
::
string2FingerprintAlgorithm
.
find
(
fingerprint
);
if
(
it
!=
DtlsTransport
::
string2FingerprintAlgorithm
.
end
())
if
(
it
!=
DtlsTransport
::
string2FingerprintAlgorithm
.
end
())
...
@@ -85,12 +113,14 @@ class DtlsTransport {
...
@@ -85,12 +113,14 @@ class DtlsTransport {
else
else
return
DtlsTransport
::
FingerprintAlgorithm
::
NONE
;
return
DtlsTransport
::
FingerprintAlgorithm
::
NONE
;
}
}
static
std
::
string
&
GetFingerprintAlgorithmString
(
FingerprintAlgorithm
fingerprint
)
{
static
std
::
string
&
GetFingerprintAlgorithmString
(
FingerprintAlgorithm
fingerprint
)
{
auto
it
=
DtlsTransport
::
fingerprintAlgorithm2String
.
find
(
fingerprint
);
auto
it
=
DtlsTransport
::
fingerprintAlgorithm2String
.
find
(
fingerprint
);
return
it
->
second
;
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
// clang-format off
return
(
return
(
// Minimum DTLS record length is 13 bytes.
// Minimum DTLS record length is 13 bytes.
...
@@ -119,24 +149,33 @@ class DtlsTransport {
...
@@ -119,24 +149,33 @@ class DtlsTransport {
static
std
::
vector
<
SrtpCryptoSuiteMapEntry
>
srtpCryptoSuites
;
static
std
::
vector
<
SrtpCryptoSuiteMapEntry
>
srtpCryptoSuites
;
public
:
public
:
explicit
DtlsTransport
(
Listener
*
listener
);
DtlsTransport
(
EventPoller
::
Ptr
poller
,
Listener
*
listener
);
~
DtlsTransport
();
~
DtlsTransport
();
public
:
public
:
void
Dump
()
const
;
void
Dump
()
const
;
void
Run
(
Role
localRole
);
void
Run
(
Role
localRole
);
std
::
vector
<
Fingerprint
>&
GetLocalFingerprints
()
const
{
std
::
vector
<
Fingerprint
>&
GetLocalFingerprints
()
const
{
return
DtlsTransport
::
localFingerprints
;
return
DtlsTransport
::
localFingerprints
;
}
}
bool
SetRemoteFingerprint
(
Fingerprint
fingerprint
);
bool
SetRemoteFingerprint
(
Fingerprint
fingerprint
);
void
ProcessDtlsData
(
const
uint8_t
*
data
,
size_t
len
);
void
ProcessDtlsData
(
const
uint8_t
*
data
,
size_t
len
);
DtlsState
GetState
()
const
{
return
this
->
state
;
}
DtlsState
GetState
()
const
Role
GetLocalRole
()
const
{
return
this
->
localRole
;
}
{
return
this
->
state
;
}
Role
GetLocalRole
()
const
{
return
this
->
localRole
;
}
void
SendApplicationData
(
const
uint8_t
*
data
,
size_t
len
);
void
SendApplicationData
(
const
uint8_t
*
data
,
size_t
len
);
private
:
private
:
bool
IsRunning
()
const
{
bool
IsRunning
()
const
switch
(
this
->
state
)
{
{
switch
(
this
->
state
)
{
case
DtlsState
:
:
NEW
:
case
DtlsState
:
:
NEW
:
return
false
;
return
false
;
case
DtlsState
:
:
CONNECTING
:
case
DtlsState
:
:
CONNECTING
:
...
@@ -156,32 +195,30 @@ class DtlsTransport {
...
@@ -156,32 +195,30 @@ class DtlsTransport {
bool
SetTimeout
();
bool
SetTimeout
();
bool
ProcessHandshake
();
bool
ProcessHandshake
();
bool
CheckRemoteFingerprint
();
bool
CheckRemoteFingerprint
();
void
ExtractSrtpKeys
(
RTC
::
CryptoSuite
srtpCryptoSuite
);
void
ExtractSrtpKeys
(
RTC
::
SrtpSession
::
CryptoSuite
srtpCryptoSuite
);
RTC
::
CryptoSuite
GetNegotiatedSrtpCryptoSuite
();
RTC
::
SrtpSession
::
CryptoSuite
GetNegotiatedSrtpCryptoSuite
();
/* Callbacks fired by OpenSSL events. */
private
:
public
:
void
OnSslInfo
(
int
where
,
int
ret
);
void
OnSslInfo
(
int
where
,
int
ret
);
/* Pure virtual methods inherited from Timer::Listener. */
public
:
void
OnTimer
();
void
OnTimer
();
private
:
private
:
EventPoller
::
Ptr
poller
;
// Passed by argument.
// Passed by argument.
Listener
*
listener
{
nullptr
};
Listener
*
listener
{
nullptr
};
// Allocated by this.
// Allocated by this.
SSL
*
ssl
{
nullptr
};
SSL
*
ssl
{
nullptr
};
BIO
*
sslBioFromNetwork
{
nullptr
};
// The BIO from which ssl reads.
BIO
*
sslBioFromNetwork
{
nullptr
};
// The BIO from which ssl reads.
BIO
*
sslBioToNetwork
{
nullptr
};
// The BIO in which ssl writes.
BIO
*
sslBioToNetwork
{
nullptr
};
// The BIO in which ssl writes.
Timer
::
Ptr
timer
;
// Others.
// Others.
DtlsState
state
{
DtlsState
::
NEW
};
DtlsState
state
{
DtlsState
::
NEW
};
Role
localRole
{
Role
::
NONE
};
Role
localRole
{
Role
::
NONE
};
Fingerprint
remoteFingerprint
;
Fingerprint
remoteFingerprint
;
bool
handshakeDone
{
false
};
bool
handshakeDone
{
false
};
bool
handshakeDoneNow
{
false
};
bool
handshakeDoneNow
{
false
};
std
::
string
remoteCert
;
std
::
string
remoteCert
;
};
};
}
// namespace RTC
}
// namespace RTC
#endif
#endif
webrtc/srtp_session.cc
查看文件 @
704421b7
...
@@ -2,21 +2,17 @@
...
@@ -2,21 +2,17 @@
// #define MS_LOG_DEV_LEVEL 3
// #define MS_LOG_DEV_LEVEL 3
#include "srtp_session.h"
#include "srtp_session.h"
#include <cstring> // std::memset(), std::memcpy()
#include <cstring> // std::memset(), std::memcpy()
#include <iostream>
#include "logger.h"
#include "logger.h"
namespace
RTC
{
namespace
RTC
/* Static. */
{
/* Static. */
static
constexpr
size_t
EncryptBufferSize
{
65536
};
static
constexpr
size_t
EncryptBufferSize
{
65536
};
static
uint8_t
EncryptBuffer
[
EncryptBufferSize
];
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).
// From 0 (srtp_err_status_ok) to 24 (srtp_err_status_pfkey_err).
"success (srtp_err_status_ok)"
,
"success (srtp_err_status_ok)"
,
"unspecified failure (srtp_err_status_fail)"
,
"unspecified failure (srtp_err_status_fail)"
,
...
@@ -47,7 +43,7 @@ std::vector<const char *> DepLibSRTP::errors = {
...
@@ -47,7 +43,7 @@ std::vector<const char *> DepLibSRTP::errors = {
/* Static methods. */
/* Static methods. */
void
DepLibSRTP
::
ClassInit
()
{
void
DepLibSRTP
::
ClassInit
()
{
MS_TRACE
();
MS_TRACE
();
MS_DEBUG_TAG
(
info
,
"libsrtp version:
\"
%s
\"
"
,
srtp_get_version_string
());
MS_DEBUG_TAG
(
info
,
"libsrtp version:
\"
%s
\"
"
,
srtp_get_version_string
());
...
@@ -56,28 +52,34 @@ void DepLibSRTP::ClassInit() {
...
@@ -56,28 +52,34 @@ void DepLibSRTP::ClassInit() {
if
(
DepLibSRTP
::
IsError
(
err
))
if
(
DepLibSRTP
::
IsError
(
err
))
MS_THROW_ERROR
(
"srtp_init() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
MS_THROW_ERROR
(
"srtp_init() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
}
}
void
DepLibSRTP
::
ClassDestroy
()
{
void
DepLibSRTP
::
ClassDestroy
()
{
MS_TRACE
();
MS_TRACE
();
srtp_shutdown
();
srtp_shutdown
();
}
}
/* Class methods. */
void
SrtpSession
::
ClassInit
()
{
void
SrtpSession
::
ClassInit
()
{
// Set libsrtp event handler.
// Set libsrtp event handler.
srtp_err_status_t
err
=
srtp_err_status_t
err
=
srtp_install_event_handler
(
static_cast
<
srtp_event_handler_func_t
*>
(
OnSrtpEvent
));
srtp_install_event_handler
(
static_cast
<
srtp_event_handler_func_t
*>
(
OnSrtpEvent
));
if
(
DepLibSRTP
::
IsError
(
err
))
{
if
(
DepLibSRTP
::
IsError
(
err
))
{
MS_THROW_ERROR
(
"srtp_install_event_handler() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
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
();
MS_TRACE
();
switch
(
data
->
event
)
{
switch
(
data
->
event
)
{
case
event_ssrc_collision
:
case
event_ssrc_collision
:
MS_WARN_TAG
(
srtp
,
"SSRC collision occurred"
);
MS_WARN_TAG
(
srtp
,
"SSRC collision occurred"
);
break
;
break
;
...
@@ -94,27 +96,31 @@ void SrtpSession::OnSrtpEvent(srtp_event_data_t *data) {
...
@@ -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)"
);
MS_WARN_TAG
(
srtp
,
"stream reached the hard packet limit (2^48 packets)"
);
break
;
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
();
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.
// Set all policy fields to 0.
std
::
memset
(
&
policy
,
0
,
sizeof
(
srtp_policy_t
));
std
::
memset
(
&
policy
,
0
,
sizeof
(
srtp_policy_t
));
switch
(
cryptoSuite
)
{
switch
(
cryptoSuite
)
case
CryptoSuite
:
:
AES_CM_128_HMAC_SHA1_80
:
{
{
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
.
rtp
);
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80
(
&
policy
.
rtcp
);
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80
(
&
policy
.
rtcp
);
break
;
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
);
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32
(
&
policy
.
rtp
);
// NOTE: Must be 80 for RTCP.
// NOTE: Must be 80 for RTCP.
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80
(
&
policy
.
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_
...
@@ -122,29 +128,34 @@ SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_
break
;
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
.
rtp
);
srtp_crypto_policy_set_aes_gcm_256_16_auth
(
&
policy
.
rtcp
);
srtp_crypto_policy_set_aes_gcm_256_16_auth
(
&
policy
.
rtcp
);
break
;
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
.
rtp
);
srtp_crypto_policy_set_aes_gcm_128_16_auth
(
&
policy
.
rtcp
);
srtp_crypto_policy_set_aes_gcm_128_16_auth
(
&
policy
.
rtcp
);
break
;
break
;
}
}
default
:
{
default
:
{
MS_ABORT
(
"unknown SRTP crypto suite"
);
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"
);
"given keyLen does not match policy.rtp.cipher_keyLen"
);
switch
(
type
)
{
switch
(
type
)
{
case
Type
:
:
INBOUND
:
case
Type
:
:
INBOUND
:
policy
.
ssrc
.
type
=
ssrc_any_inbound
;
policy
.
ssrc
.
type
=
ssrc_any_inbound
;
break
;
break
;
...
@@ -163,73 +174,78 @@ SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_
...
@@ -163,73 +174,78 @@ SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_
// Set the SRTP session.
// Set the SRTP session.
srtp_err_status_t
err
=
srtp_create
(
&
this
->
session
,
&
policy
);
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
));
MS_THROW_ERROR
(
"srtp_create() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
}
else
{
is_init
=
true
;
}
}
}
SrtpSession
::~
SrtpSession
()
{
SrtpSession
::~
SrtpSession
()
{
MS_TRACE
();
MS_TRACE
();
if
(
this
->
session
!=
nullptr
)
{
if
(
this
->
session
!=
nullptr
)
{
srtp_err_status_t
err
=
srtp_dealloc
(
this
->
session
);
srtp_err_status_t
err
=
srtp_dealloc
(
this
->
session
);
if
(
DepLibSRTP
::
IsError
(
err
))
if
(
DepLibSRTP
::
IsError
(
err
))
MS_ABORT
(
"srtp_dealloc() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
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
();
MS_TRACE
();
if
(
!
is_init
)
{
return
false
;
}
// Ensure that the resulting SRTP packet fits into the encrypt buffer.
// 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
);
MS_WARN_TAG
(
srtp
,
"cannot encrypt RTP packet, size too big (%zu bytes)"
,
*
len
);
return
false
;
return
false
;
}
}
std
::
memcpy
(
EncryptBuffer
,
*
data
,
*
len
);
std
::
memcpy
(
EncryptBuffer
,
*
data
,
*
len
);
srtp_err_status_t
err
=
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
));
MS_WARN_TAG
(
srtp
,
"srtp_protect() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
return
false
;
}
}
// Update the given data pointer.
// Update the given data pointer.
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
return
true
;
return
true
;
}
}
bool
SrtpSession
::
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
)
{
bool
SrtpSession
::
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
)
{
MS_TRACE
();
MS_TRACE
();
srtp_err_status_t
err
=
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
));
MS_DEBUG_TAG
(
srtp
,
"srtp_unprotect() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
return
false
;
}
}
return
true
;
return
true
;
}
}
bool
SrtpSession
::
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
)
{
bool
SrtpSession
::
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
)
{
MS_TRACE
();
MS_TRACE
();
// Ensure that the resulting SRTCP packet fits into the encrypt buffer.
// 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
);
MS_WARN_TAG
(
srtp
,
"cannot encrypt RTCP packet, size too big (%zu bytes)"
,
*
len
);
return
false
;
return
false
;
...
@@ -237,33 +253,36 @@ bool SrtpSession::EncryptRtcp(const uint8_t **data, size_t *len) {
...
@@ -237,33 +253,36 @@ bool SrtpSession::EncryptRtcp(const uint8_t **data, size_t *len) {
std
::
memcpy
(
EncryptBuffer
,
*
data
,
*
len
);
std
::
memcpy
(
EncryptBuffer
,
*
data
,
*
len
);
srtp_err_status_t
err
=
srtp_protect_rtcp
(
this
->
session
,
static_cast
<
void
*>
(
EncryptBuffer
),
srtp_err_status_t
err
=
srtp_protect_rtcp
(
reinterpret_cast
<
int
*>
(
len
));
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
));
MS_WARN_TAG
(
srtp
,
"srtp_protect_rtcp() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
return
false
;
}
}
// Update the given data pointer.
// Update the given data pointer.
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
*
data
=
(
const
uint8_t
*
)
EncryptBuffer
;
return
true
;
return
true
;
}
}
bool
SrtpSession
::
DecryptSrtcp
(
uint8_t
*
data
,
size_t
*
len
)
{
bool
SrtpSession
::
DecryptSrtcp
(
uint8_t
*
data
,
size_t
*
len
)
{
MS_TRACE
();
MS_TRACE
();
srtp_err_status_t
err
=
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
));
MS_DEBUG_TAG
(
srtp
,
"srtp_unprotect_rtcp() failed: %s"
,
DepLibSRTP
::
GetErrorString
(
err
));
return
false
;
return
false
;
}
}
return
true
;
return
true
;
}
}
}
// namespace RTC
}
// namespace RTC
webrtc/srtp_session.h
查看文件 @
704421b7
#ifndef MS_RTC_SRTP_SESSION_HPP
#ifndef MS_RTC_SRTP_SESSION_HPP
#define MS_RTC_SRTP_SESSION_HPP
#define MS_RTC_SRTP_SESSION_HPP
#include "rtc_dtls_transport.h"
#include "utils.h"
#include "utils.h"
#include <srtp2/srtp.h>
#include <srtp2/srtp.h>
#include <vector>
#include <vector>
namespace
RTC
{
namespace
RTC
{
class
DepLibSRTP
{
class
DepLibSRTP
{
public
:
public
:
static
void
ClassInit
();
static
void
ClassInit
();
static
void
ClassDestroy
();
static
void
ClassDestroy
();
static
bool
IsError
(
srtp_err_status_t
code
)
{
return
(
code
!=
srtp_err_status_ok
);
}
static
bool
IsError
(
srtp_err_status_t
code
)
{
return
(
code
!=
srtp_err_status_ok
);
}
...
@@ -18,37 +17,53 @@ public:
...
@@ -18,37 +17,53 @@ public:
return
DepLibSRTP
::
errors
.
at
(
code
);
return
DepLibSRTP
::
errors
.
at
(
code
);
}
}
private
:
private
:
static
std
::
vector
<
const
char
*>
errors
;
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
public
:
{
enum
class
Type
{
INBOUND
=
1
,
OUTBOUND
};
INBOUND
=
1
,
OUTBOUND
};
public
:
public
:
static
void
ClassInit
();
static
void
ClassInit
();
private
:
private
:
static
void
OnSrtpEvent
(
srtp_event_data_t
*
data
);
static
void
OnSrtpEvent
(
srtp_event_data_t
*
data
);
public
:
public
:
SrtpSession
(
Type
type
,
CryptoSuite
cryptoSuite
,
uint8_t
*
key
,
size_t
keyLen
);
SrtpSession
(
Type
type
,
CryptoSuite
cryptoSuite
,
uint8_t
*
key
,
size_t
keyLen
);
~
SrtpSession
();
~
SrtpSession
();
public
:
public
:
bool
EncryptRtp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
EncryptRtp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
);
bool
DecryptSrtp
(
uint8_t
*
data
,
size_t
*
len
);
bool
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
EncryptRtcp
(
const
uint8_t
**
data
,
size_t
*
len
);
bool
DecryptSrtcp
(
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
)});
}
void
RemoveStream
(
uint32_t
ssrc
)
{
srtp_remove_stream
(
this
->
session
,
uint32_t
{
htonl
(
ssrc
)
});
}
private
:
private
:
bool
is_init
=
false
;
// Allocated by this.
// Allocated by this.
srtp_t
session
{
nullptr
};
srtp_t
session
{
nullptr
};
};
};
}
// namespace RTC
}
// namespace RTC
#endif
#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 @@
...
@@ -30,76 +30,6 @@
#include <string>
#include <string>
namespace
Utils
{
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
{
class
Byte
{
public
:
public
:
...
@@ -181,138 +111,6 @@ inline uint16_t Byte::PadTo4Bytes(uint16_t size) {
...
@@ -181,138 +111,6 @@ inline uint16_t Byte::PadTo4Bytes(uint16_t size) {
return
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
}
// namespace Utils
#endif
#endif
webrtc/webrtc_transport.cc
查看文件 @
704421b7
...
@@ -4,31 +4,81 @@
...
@@ -4,31 +4,81 @@
WebRtcTransport
::
WebRtcTransport
()
{
WebRtcTransport
::
WebRtcTransport
()
{
static
onceToken
token
([](){
static
onceToken
token
([](){
Utils
::
Crypto
::
ClassInit
();
RTC
::
DtlsTransport
::
ClassInit
();
RTC
::
DtlsTransport
::
ClassInit
();
RTC
::
DepLibSRTP
::
ClassInit
();
RTC
::
DepLibSRTP
::
ClassInit
();
RTC
::
SrtpSession
::
ClassInit
();
RTC
::
SrtpSession
::
ClassInit
();
});
});
ice_server_
=
std
::
make_shared
<
IceServer
>
(
Utils
::
Crypto
::
GetRandomString
(
4
),
Utils
::
Crypto
::
GetRandomString
(
24
));
dtls_transport_
=
std
::
make_shared
<
RTC
::
DtlsTransport
>
(
EventPollerPool
::
Instance
().
getFirstPoller
(),
this
);
ice_server_
->
SetIceServerCompletedCB
([
this
]()
{
ice_server_
=
std
::
make_shared
<
RTC
::
IceServer
>
(
this
,
makeRandStr
(
4
),
makeRandStr
(
24
));
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
);
});
}
}
WebRtcTransport
::~
WebRtcTransport
()
{}
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
()
{
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
};
char
sdp
[
1024
*
10
]
=
{
0
};
auto
ssrc
=
getSSRC
();
auto
ssrc
=
getSSRC
();
auto
ip
=
getIP
();
auto
ip
=
getIP
();
...
@@ -60,22 +110,10 @@ std::string WebRtcTransport::GetLocalSdp() {
...
@@ -60,22 +110,10 @@ std::string WebRtcTransport::GetLocalSdp() {
"a=candidate:%s 1 udp %u %s %u typ %s
\r\n
"
,
"a=candidate:%s 1 udp %u %s %u typ %s
\r\n
"
,
ip
.
c_str
(),
port
,
pt
,
ip
.
c_str
(),
ip
.
c_str
(),
port
,
pt
,
ip
.
c_str
(),
ice_server_
->
GetUsernameFragment
().
c_str
(),
ice_server_
->
GetPassword
().
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
;
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
)
{
bool
is_dtls
(
char
*
buf
)
{
return
((
*
buf
>
19
)
&&
(
*
buf
<
64
));
return
((
*
buf
>
19
)
&&
(
*
buf
<
64
));
}
}
...
@@ -90,25 +128,23 @@ bool is_rtcp(char *buf) {
...
@@ -90,25 +128,23 @@ bool is_rtcp(char *buf) {
return
((
header
->
pt
>=
64
)
&&
(
header
->
pt
<
96
));
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
))
{
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
);
RTC
::
StunPacket
*
packet
=
RTC
::
StunPacket
::
Parse
((
const
uint8_t
*
)
buf
,
len
);
if
(
packet
==
nullptr
)
{
if
(
packet
==
nullptr
)
{
WarnL
<<
"parse stun error"
<<
std
::
endl
;
WarnL
<<
"parse stun error"
<<
std
::
endl
;
return
;
return
;
}
}
ice_server_
->
ProcessStunPacket
(
packet
,
remote_address
);
ice_server_
->
ProcessStunPacket
(
packet
,
tuple
);
return
;
return
;
}
}
if
(
DtlsTransport
::
IsDtlsPacket
(
buf
,
len
))
{
if
(
is_dtls
(
buf
))
{
InfoL
<<
"dtls:"
<<
hexdump
(
buf
,
len
);
dtls_transport_
->
ProcessDtlsData
((
uint8_t
*
)
buf
,
len
);
dtls_transport_
->
InputData
(
buf
,
len
);
return
;
return
;
}
}
if
(
is_rtp
(
buf
))
{
if
(
is_rtp
(
buf
))
{
RtpHeader
*
header
=
(
RtpHeader
*
)
buf
;
RtpHeader
*
header
=
(
RtpHeader
*
)
buf
;
InfoL
<<
"rtp:"
<<
header
->
dumpString
(
len
);
//
InfoL << "rtp:" << header->dumpString(len);
return
;
return
;
}
}
if
(
is_rtcp
(
buf
))
{
if
(
is_rtcp
(
buf
))
{
...
@@ -118,10 +154,6 @@ void WebRtcTransport::OnInputDataPacket(char *buf, size_t len, struct sockaddr_i
...
@@ -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
)
{
void
WebRtcTransport
::
WritRtpPacket
(
char
*
buf
,
size_t
len
)
{
const
uint8_t
*
p
=
(
uint8_t
*
)
buf
;
const
uint8_t
*
p
=
(
uint8_t
*
)
buf
;
bool
ret
=
false
;
bool
ret
=
false
;
...
@@ -129,7 +161,7 @@ void WebRtcTransport::WritRtpPacket(char *buf, size_t len) {
...
@@ -129,7 +161,7 @@ void WebRtcTransport::WritRtpPacket(char *buf, size_t len) {
ret
=
srtp_session_
->
EncryptRtp
(
&
p
,
&
len
);
ret
=
srtp_session_
->
EncryptRtp
(
&
p
,
&
len
);
}
}
if
(
ret
)
{
if
(
ret
)
{
onWrite
((
char
*
)
p
,
len
,
ice_server_
->
GetSelectAddr
()
);
onWrite
((
char
*
)
p
,
len
);
}
}
}
}
...
@@ -139,8 +171,8 @@ WebRtcTransportImp::WebRtcTransportImp(const EventPoller::Ptr &poller) {
...
@@ -139,8 +171,8 @@ WebRtcTransportImp::WebRtcTransportImp(const EventPoller::Ptr &poller) {
_socket
=
Socket
::
createSocket
(
poller
,
false
);
_socket
=
Socket
::
createSocket
(
poller
,
false
);
//随机端口,绑定全部网卡
//随机端口,绑定全部网卡
_socket
->
bindUdpSock
(
0
);
_socket
->
bindUdpSock
(
0
);
_socket
->
setOnRead
([
this
](
const
Buffer
::
Ptr
&
buf
,
struct
sockaddr
*
addr
,
int
addr_len
){
_socket
->
setOnRead
([
this
](
const
Buffer
::
Ptr
&
buf
,
struct
sockaddr
*
addr
,
int
addr_len
)
mutable
{
OnInputDataPacket
(
buf
->
data
(),
buf
->
size
(),
(
struct
sockaddr_in
*
)
addr
);
OnInputDataPacket
(
buf
->
data
(),
buf
->
size
(),
addr
);
});
});
}
}
...
@@ -149,7 +181,7 @@ void WebRtcTransportImp::attach(const RtspMediaSource::Ptr &src) {
...
@@ -149,7 +181,7 @@ void WebRtcTransportImp::attach(const RtspMediaSource::Ptr &src) {
_src
=
src
;
_src
=
src
;
}
}
void
WebRtcTransportImp
::
onDtlsCo
mple
ted
()
{
void
WebRtcTransportImp
::
onDtlsCo
nnec
ted
()
{
_reader
=
_src
->
getRing
()
->
attach
(
_socket
->
getPoller
(),
true
);
_reader
=
_src
->
getRing
()
->
attach
(
_socket
->
getPoller
(),
true
);
weak_ptr
<
WebRtcTransportImp
>
weak_self
=
shared_from_this
();
weak_ptr
<
WebRtcTransportImp
>
weak_self
=
shared_from_this
();
_reader
->
setReadCB
([
weak_self
](
const
RtspMediaSource
::
RingDataType
&
pkt
){
_reader
->
setReadCB
([
weak_self
](
const
RtspMediaSource
::
RingDataType
&
pkt
){
...
@@ -167,14 +199,9 @@ void WebRtcTransportImp::onDtlsCompleted() {
...
@@ -167,14 +199,9 @@ void WebRtcTransportImp::onDtlsCompleted() {
});
});
}
}
void
WebRtcTransportImp
::
onIceConnected
(){
}
void
WebRtcTransportImp
::
onWrite
(
const
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
dst
)
{
void
WebRtcTransportImp
::
onWrite
(
const
char
*
buf
,
size_t
len
,
struct
sockaddr_in
*
dst
)
{
auto
ptr
=
BufferRaw
::
create
();
auto
ptr
=
BufferRaw
::
create
();
ptr
->
assign
(
buf
,
len
);
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
));
_socket
->
send
(
ptr
,
(
struct
sockaddr
*
)(
dst
),
sizeof
(
struct
sockaddr
));
}
}
...
@@ -201,15 +228,5 @@ std::string WebRtcTransportImp::getIP() const {
...
@@ -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 @@
...
@@ -3,12 +3,12 @@
#include <memory>
#include <memory>
#include <string>
#include <string>
#include "dtls_transport.h"
#include "
rtc_
dtls_transport.h"
#include "ice_server.h"
#include "ice_server.h"
#include "srtp_session.h"
#include "srtp_session.h"
#include "stun_packet.h"
#include "stun_packet.h"
class
WebRtcTransport
{
class
WebRtcTransport
:
public
RTC
::
DtlsTransport
::
Listener
,
public
RTC
::
IceServer
::
Listener
{
public
:
public
:
using
Ptr
=
std
::
shared_ptr
<
WebRtcTransport
>
;
using
Ptr
=
std
::
shared_ptr
<
WebRtcTransport
>
;
WebRtcTransport
();
WebRtcTransport
();
...
@@ -22,7 +22,7 @@ public:
...
@@ -22,7 +22,7 @@ public:
/// \param buf
/// \param buf
/// \param len
/// \param len
/// \param remote_address
/// \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
/// 发送rtp
/// \param buf
/// \param buf
...
@@ -30,6 +30,31 @@ public:
...
@@ -30,6 +30,31 @@ public:
void
WritRtpPacket
(
char
*
buf
,
size_t
len
);
void
WritRtpPacket
(
char
*
buf
,
size_t
len
);
protected
:
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数据
/// 输出udp数据
/// \param buf
/// \param buf
/// \param len
/// \param len
...
@@ -39,17 +64,14 @@ protected:
...
@@ -39,17 +64,14 @@ protected:
virtual
uint16_t
getPort
()
const
=
0
;
virtual
uint16_t
getPort
()
const
=
0
;
virtual
std
::
string
getIP
()
const
=
0
;
virtual
std
::
string
getIP
()
const
=
0
;
virtual
int
getPayloadType
()
const
=
0
;
virtual
int
getPayloadType
()
const
=
0
;
virtual
void
onIceConnected
()
=
0
;
virtual
void
onDtlsConnected
()
=
0
;
virtual
void
onDtlsCompleted
()
=
0
;
private
:
private
:
void
OnIceServerCompleted
();
void
onWrite
(
const
char
*
buf
,
size_t
len
);
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
);
private
:
private
:
IceServer
::
Ptr
ice_server_
;
std
::
shared_ptr
<
RTC
::
IceServer
>
ice_server_
;
DtlsTransport
::
Ptr
dtls_transport_
;
std
::
shared_ptr
<
RTC
::
DtlsTransport
>
dtls_transport_
;
std
::
shared_ptr
<
RTC
::
SrtpSession
>
srtp_session_
;
std
::
shared_ptr
<
RTC
::
SrtpSession
>
srtp_session_
;
};
};
...
@@ -74,8 +96,7 @@ protected:
...
@@ -74,8 +96,7 @@ protected:
uint32_t
getSSRC
()
const
override
;
uint32_t
getSSRC
()
const
override
;
uint16_t
getPort
()
const
override
;
uint16_t
getPort
()
const
override
;
std
::
string
getIP
()
const
override
;
std
::
string
getIP
()
const
override
;
void
onIceConnected
()
override
;
void
onDtlsConnected
()
override
;
void
onDtlsCompleted
()
override
;
private
:
private
:
Socket
::
Ptr
_socket
;
Socket
::
Ptr
_socket
;
...
@@ -83,16 +104,6 @@ private:
...
@@ -83,16 +104,6 @@ private:
RtspMediaSource
::
RingType
::
RingReader
::
Ptr
_reader
;
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 @@
...
@@ -22,7 +22,7 @@
<video
id=
"vid2"
autoplay
></video>
<video
id=
"vid2"
autoplay
></video>
<br>
<br>
<p>
ip_address
</p>
<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>
<br>
<button
id=
"btn1"
>
Call
</button>
<button
id=
"btn1"
>
Call
</button>
<button
id=
"btn3"
>
Hang Up
</button>
<button
id=
"btn3"
>
Hang Up
</button>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论