Move SRTP implementation into crypto library for reuse
This commit is contained in:
parent
97ab7de7ab
commit
4b230808b9
|
@ -11,6 +11,7 @@ SOURCES
|
|||
"src/cipher_converter.vala"
|
||||
"src/error.vala"
|
||||
"src/random.vala"
|
||||
"src/srtp.vapi"
|
||||
CUSTOM_VAPIS
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/vapi/gcrypt.vapi"
|
||||
PACKAGES
|
||||
|
@ -21,9 +22,33 @@ GENERATE_HEADER
|
|||
crypto-vala
|
||||
)
|
||||
|
||||
add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/exports/srtp.h"
|
||||
COMMAND
|
||||
cp "${CMAKE_CURRENT_SOURCE_DIR}/src/srtp.h" "${CMAKE_BINARY_DIR}/exports/srtp.h"
|
||||
DEPENDS
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/srtp.h"
|
||||
COMMENT
|
||||
Copy header file srtp.h
|
||||
)
|
||||
|
||||
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/exports/crypto.vapi
|
||||
COMMAND
|
||||
cat "${CMAKE_BINARY_DIR}/exports/crypto-vala.vapi" "${CMAKE_CURRENT_SOURCE_DIR}/src/srtp.vapi" > "${CMAKE_BINARY_DIR}/exports/crypto.vapi"
|
||||
DEPENDS
|
||||
${CMAKE_BINARY_DIR}/exports/crypto-vala.vapi
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/srtp.vapi
|
||||
)
|
||||
|
||||
add_custom_target(crypto-vapi
|
||||
DEPENDS
|
||||
${CMAKE_BINARY_DIR}/exports/crypto.vapi
|
||||
${CMAKE_BINARY_DIR}/exports/srtp.h
|
||||
)
|
||||
|
||||
set(CFLAGS ${VALA_CFLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||
add_definitions(${CFLAGS})
|
||||
add_library(crypto-vala STATIC ${CRYPTO_VALA_C})
|
||||
add_library(crypto-vala STATIC ${CRYPTO_VALA_C} src/srtp.c)
|
||||
add_dependencies(crypto-vala crypto-vapi)
|
||||
target_link_libraries(crypto-vala ${CRYPTO_VALA_PACKAGES} gcrypt)
|
||||
set_property(TARGET crypto-vala PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
[CCode (cheader_filename="srtp.h")]
|
||||
namespace Crypto.Srtp {
|
||||
|
||||
[Compact]
|
||||
[CCode (cname = "srtp_session_t", free_function = "srtp_destroy", cheader_filename="srtp.h")]
|
||||
public class Dino.Plugins.Rtp.SrtpSession {
|
||||
[CCode (cname = "srtp_session_t", free_function = "srtp_destroy")]
|
||||
public class Session {
|
||||
[CCode (cname = "srtp_create")]
|
||||
public SrtpSession(SrtpEncryption encr, SrtpAuthentication auth, uint tag_len, SrtpPrf prf, SrtpFlags flags);
|
||||
public Session(Encryption encr, Authentication auth, uint tag_len, Prf prf, Flags flags);
|
||||
[CCode (cname = "srtp_setkey")]
|
||||
public int setkey(uint8[] key, uint8[] salt);
|
||||
[CCode (cname = "srtp_setkeystring")]
|
||||
|
@ -73,31 +76,32 @@ public class Dino.Plugins.Rtp.SrtpSession {
|
|||
}
|
||||
|
||||
[Flags]
|
||||
[CCode (cname = "unsigned", cprefix = "", cheader_filename="srtp.h", has_type_id = false)]
|
||||
public enum Dino.Plugins.Rtp.SrtpFlags {
|
||||
[CCode (cname = "unsigned", cprefix = "", has_type_id = false)]
|
||||
public enum Flags {
|
||||
SRTP_UNENCRYPTED,
|
||||
SRTCP_UNENCRYPTED,
|
||||
SRTP_UNAUTHENTICATED,
|
||||
|
||||
SRTP_RCC_MODE1,
|
||||
SRTP_RCC_MODE2,
|
||||
SRTP_RCC_MODE3
|
||||
}
|
||||
|
||||
[CCode (cname = "int", cprefix = "SRTP_ENCR_", cheader_filename="srtp.h", has_type_id = false)]
|
||||
public enum Dino.Plugins.Rtp.SrtpEncryption {
|
||||
[CCode (cname = "int", cprefix = "SRTP_ENCR_", has_type_id = false)]
|
||||
public enum Encryption {
|
||||
NULL,
|
||||
AES_CM,
|
||||
AES_F8
|
||||
}
|
||||
|
||||
[CCode (cname = "int", cprefix = "SRTP_AUTH_", cheader_filename="srtp.h", has_type_id = false)]
|
||||
public enum Dino.Plugins.Rtp.SrtpAuthentication {
|
||||
[CCode (cname = "int", cprefix = "SRTP_AUTH_", has_type_id = false)]
|
||||
public enum Authentication {
|
||||
NULL,
|
||||
HMAC_SHA1
|
||||
}
|
||||
|
||||
[CCode (cname = "int", cprefix = "SRTP_PRF_", cheader_filename="srtp.h", has_type_id = false)]
|
||||
public enum Dino.Plugins.Rtp.SrtpPrf {
|
||||
[CCode (cname = "int", cprefix = "SRTP_PRF_", has_type_id = false)]
|
||||
public enum Prf {
|
||||
AES_CM
|
||||
}
|
||||
|
||||
}
|
|
@ -18,11 +18,10 @@ SOURCES
|
|||
src/video_widget.vala
|
||||
src/register_plugin.vala
|
||||
CUSTOM_VAPIS
|
||||
${CMAKE_BINARY_DIR}/exports/crypto-vala.vapi
|
||||
${CMAKE_BINARY_DIR}/exports/crypto.vapi
|
||||
${CMAKE_BINARY_DIR}/exports/xmpp-vala.vapi
|
||||
${CMAKE_BINARY_DIR}/exports/dino.vapi
|
||||
${CMAKE_BINARY_DIR}/exports/qlite.vapi
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/srtp.vapi
|
||||
PACKAGES
|
||||
${RTP_PACKAGES}
|
||||
OPTIONS
|
||||
|
@ -30,7 +29,7 @@ OPTIONS
|
|||
)
|
||||
|
||||
add_definitions(${VALA_CFLAGS} -DG_LOG_DOMAIN="rtp" -I${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||
add_library(rtp SHARED ${RTP_VALA_C} src/srtp.c)
|
||||
add_library(rtp SHARED ${RTP_VALA_C})
|
||||
target_link_libraries(rtp libdino crypto-vala ${RTP_PACKAGES})
|
||||
set_target_properties(rtp PROPERTIES PREFIX "")
|
||||
set_target_properties(rtp PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugins/)
|
||||
|
|
|
@ -53,8 +53,8 @@ public class Dino.Plugins.Rtp.Stream : Xmpp.Xep.JingleRtp.Stream {
|
|||
private Gst.Pad send_rtp_sink_pad;
|
||||
private Gst.Pad send_rtp_src_pad;
|
||||
|
||||
private SrtpSession? local_crypto_session;
|
||||
private SrtpSession? remote_crypto_session;
|
||||
private Crypto.Srtp.Session? local_crypto_session;
|
||||
private Crypto.Srtp.Session? remote_crypto_session;
|
||||
|
||||
public Stream(Plugin plugin, Xmpp.Xep.Jingle.Content content) {
|
||||
base(content);
|
||||
|
@ -149,11 +149,11 @@ public class Dino.Plugins.Rtp.Stream : Xmpp.Xep.JingleRtp.Stream {
|
|||
|
||||
private void prepare_local_crypto() {
|
||||
if (local_crypto != null && local_crypto_session == null) {
|
||||
local_crypto_session = new SrtpSession(
|
||||
local_crypto.crypto_suite == Xep.JingleRtp.Crypto.F8_128_HMAC_SHA1_80 ? SrtpEncryption.AES_F8 : SrtpEncryption.AES_CM,
|
||||
SrtpAuthentication.HMAC_SHA1,
|
||||
local_crypto_session = new Crypto.Srtp.Session(
|
||||
local_crypto.crypto_suite == Xep.JingleRtp.Crypto.F8_128_HMAC_SHA1_80 ? Crypto.Srtp.Encryption.AES_F8 : Crypto.Srtp.Encryption.AES_CM,
|
||||
Crypto.Srtp.Authentication.HMAC_SHA1,
|
||||
local_crypto.crypto_suite == Xep.JingleRtp.Crypto.AES_CM_128_HMAC_SHA1_32 ? 4 : 10,
|
||||
SrtpPrf.AES_CM,
|
||||
Crypto.Srtp.Prf.AES_CM,
|
||||
0
|
||||
);
|
||||
local_crypto_session.setkey(local_crypto.key, local_crypto.salt);
|
||||
|
@ -284,11 +284,11 @@ public class Dino.Plugins.Rtp.Stream : Xmpp.Xep.JingleRtp.Stream {
|
|||
|
||||
private void prepare_remote_crypto() {
|
||||
if (remote_crypto != null && remote_crypto_session == null) {
|
||||
remote_crypto_session = new SrtpSession(
|
||||
remote_crypto.crypto_suite == Xep.JingleRtp.Crypto.F8_128_HMAC_SHA1_80 ? SrtpEncryption.AES_F8 : SrtpEncryption.AES_CM,
|
||||
SrtpAuthentication.HMAC_SHA1,
|
||||
remote_crypto_session = new Crypto.Srtp.Session(
|
||||
remote_crypto.crypto_suite == Xep.JingleRtp.Crypto.F8_128_HMAC_SHA1_80 ? Crypto.Srtp.Encryption.AES_F8 : Crypto.Srtp.Encryption.AES_CM,
|
||||
Crypto.Srtp.Authentication.HMAC_SHA1,
|
||||
remote_crypto.crypto_suite == Xep.JingleRtp.Crypto.AES_CM_128_HMAC_SHA1_32 ? 4 : 10,
|
||||
SrtpPrf.AES_CM,
|
||||
Crypto.Srtp.Prf.AES_CM,
|
||||
0
|
||||
);
|
||||
remote_crypto_session.setkey(remote_crypto.key, remote_crypto.salt);
|
||||
|
|
Loading…
Reference in a new issue