Move crypto-vala to shared library
This commit is contained in:
parent
bec73ed371
commit
6399892bf2
|
@ -203,6 +203,7 @@ add_subdirectory(qlite)
|
|||
add_subdirectory(xmpp-vala)
|
||||
add_subdirectory(libdino)
|
||||
add_subdirectory(main)
|
||||
add_subdirectory(crypto-vala)
|
||||
add_subdirectory(plugins)
|
||||
|
||||
# uninstall target
|
||||
|
|
41
crypto-vala/CMakeLists.txt
Normal file
41
crypto-vala/CMakeLists.txt
Normal file
|
@ -0,0 +1,41 @@
|
|||
find_package(GCrypt REQUIRED)
|
||||
find_package(Srtp2 REQUIRED)
|
||||
find_packages(CRYPTO_VALA_PACKAGES REQUIRED
|
||||
GLib
|
||||
GObject
|
||||
GIO
|
||||
)
|
||||
|
||||
vala_precompile(CRYPTO_VALA_C
|
||||
SOURCES
|
||||
"src/cipher.vala"
|
||||
"src/cipher_converter.vala"
|
||||
"src/error.vala"
|
||||
"src/random.vala"
|
||||
"src/srtp.vala"
|
||||
CUSTOM_VAPIS
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/vapi/gcrypt.vapi"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/vapi/libsrtp2.vapi"
|
||||
PACKAGES
|
||||
${CRYPTO_VALA_PACKAGES}
|
||||
GENERATE_VAPI
|
||||
crypto-vala
|
||||
GENERATE_HEADER
|
||||
crypto-vala
|
||||
)
|
||||
|
||||
add_custom_target(crypto-vala-vapi
|
||||
DEPENDS
|
||||
${CMAKE_BINARY_DIR}/exports/crypto-vala.vapi
|
||||
${CMAKE_BINARY_DIR}/exports/crypto-vala.deps
|
||||
)
|
||||
|
||||
add_definitions(${VALA_CFLAGS} -DG_LOG_DOMAIN="crypto-vala")
|
||||
add_library(crypto-vala SHARED ${CRYPTO_VALA_C})
|
||||
add_dependencies(crypto-vala crypto-vala-vapi)
|
||||
target_link_libraries(crypto-vala ${CRYPTO_VALA_PACKAGES} gcrypt libsrtp2)
|
||||
set_target_properties(crypto-vala PROPERTIES VERSION 0.0 SOVERSION 0)
|
||||
|
||||
install(TARGETS crypto-vala ${TARGET_INSTALL})
|
||||
install(FILES ${CMAKE_BINARY_DIR}/exports/crypto-vala.vapi ${CMAKE_BINARY_DIR}/exports/crypto-vala.deps DESTINATION ${VAPI_INSTALL_DIR})
|
||||
install(FILES ${CMAKE_BINARY_DIR}/exports/crypto-vala.h DESTINATION ${INCLUDE_INSTALL_DIR})
|
122
crypto-vala/src/srtp.vala
Normal file
122
crypto-vala/src/srtp.vala
Normal file
|
@ -0,0 +1,122 @@
|
|||
using Srtp;
|
||||
|
||||
namespace Crypto.Srtp {
|
||||
public const string AES_CM_128_HMAC_SHA1_80 = "AES_CM_128_HMAC_SHA1_80";
|
||||
public const string AES_CM_128_HMAC_SHA1_32 = "AES_CM_128_HMAC_SHA1_32";
|
||||
public const string F8_128_HMAC_SHA1_80 = "F8_128_HMAC_SHA1_80";
|
||||
|
||||
public class Session {
|
||||
public bool has_encrypt { get; private set; default = false; }
|
||||
public bool has_decrypt { get; private set; default = false; }
|
||||
|
||||
private Context encrypt_context;
|
||||
private Context decrypt_context;
|
||||
|
||||
static construct {
|
||||
init();
|
||||
install_log_handler(log);
|
||||
}
|
||||
|
||||
private static void log(LogLevel level, string msg) {
|
||||
print(@"SRTP[$level]: $msg\n");
|
||||
}
|
||||
|
||||
public Session() {
|
||||
Context.create(out encrypt_context, null);
|
||||
Context.create(out decrypt_context, null);
|
||||
}
|
||||
|
||||
public uint8[] encrypt_rtp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length + MAX_TRAILER_LEN];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = encrypt_context.protect(buf, ref buf_use);
|
||||
if (res != ErrorStatus.ok) {
|
||||
throw new Error.UNKNOWN(@"SRTP encrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public uint8[] decrypt_rtp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = decrypt_context.unprotect(buf, ref buf_use);
|
||||
switch (res) {
|
||||
case ErrorStatus.auth_fail:
|
||||
throw new Error.AUTHENTICATION_FAILED("SRTP packet failed the message authentication check");
|
||||
case ErrorStatus.ok:
|
||||
break;
|
||||
default:
|
||||
throw new Error.UNKNOWN(@"SRTP decrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public uint8[] encrypt_rtcp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length + MAX_TRAILER_LEN + 4];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = encrypt_context.protect_rtcp(buf, ref buf_use);
|
||||
if (res != ErrorStatus.ok) {
|
||||
throw new Error.UNKNOWN(@"SRTCP encrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public uint8[] decrypt_rtcp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = decrypt_context.unprotect_rtcp(buf, ref buf_use);
|
||||
switch (res) {
|
||||
case ErrorStatus.auth_fail:
|
||||
throw new Error.AUTHENTICATION_FAILED("SRTCP packet failed the message authentication check");
|
||||
case ErrorStatus.ok:
|
||||
break;
|
||||
default:
|
||||
throw new Error.UNKNOWN(@"SRTP decrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
private Policy create_policy(string profile) {
|
||||
Policy policy = Policy();
|
||||
switch (profile) {
|
||||
case AES_CM_128_HMAC_SHA1_80:
|
||||
policy.rtp.set_aes_cm_128_hmac_sha1_80();
|
||||
policy.rtcp.set_aes_cm_128_hmac_sha1_80();
|
||||
break;
|
||||
}
|
||||
return policy;
|
||||
}
|
||||
|
||||
public void set_encryption_key(string profile, uint8[] key, uint8[] salt) {
|
||||
Policy policy = create_policy(profile);
|
||||
policy.ssrc.type = SsrcType.any_outbound;
|
||||
policy.key = new uint8[key.length + salt.length];
|
||||
Memory.copy(policy.key, key, key.length);
|
||||
Memory.copy(((uint8*)policy.key) + key.length, salt, salt.length);
|
||||
encrypt_context.add_stream(ref policy);
|
||||
has_encrypt = true;
|
||||
}
|
||||
|
||||
public void set_decryption_key(string profile, uint8[] key, uint8[] salt) {
|
||||
Policy policy = create_policy(profile);
|
||||
policy.ssrc.type = SsrcType.any_inbound;
|
||||
policy.key = new uint8[key.length + salt.length];
|
||||
Memory.copy(policy.key, key, key.length);
|
||||
Memory.copy(((uint8*)policy.key) + key.length, salt, salt.length);
|
||||
decrypt_context.add_stream(ref policy);
|
||||
has_decrypt = true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -16,7 +16,6 @@ if(DINO_PLUGIN_ENABLED_openpgp)
|
|||
endif(DINO_PLUGIN_ENABLED_openpgp)
|
||||
|
||||
if(DINO_PLUGIN_ENABLED_omemo)
|
||||
add_subdirectory(crypto-vala)
|
||||
add_subdirectory(omemo)
|
||||
add_subdirectory(signal-protocol)
|
||||
endif(DINO_PLUGIN_ENABLED_omemo)
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
find_package(GCrypt REQUIRED)
|
||||
find_package(Srtp2 REQUIRED)
|
||||
find_packages(CRYPTO_VALA_PACKAGES REQUIRED
|
||||
GLib
|
||||
GObject
|
||||
GIO
|
||||
)
|
||||
|
||||
vala_precompile(CRYPTO_VALA_C
|
||||
SOURCES
|
||||
"src/cipher.vala"
|
||||
"src/cipher_converter.vala"
|
||||
"src/error.vala"
|
||||
"src/random.vala"
|
||||
"src/srtp.vala"
|
||||
CUSTOM_VAPIS
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/vapi/gcrypt.vapi"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/vapi/libsrtp2.vapi"
|
||||
PACKAGES
|
||||
${CRYPTO_VALA_PACKAGES}
|
||||
GENERATE_VAPI
|
||||
crypto-vala
|
||||
GENERATE_HEADER
|
||||
crypto-vala
|
||||
)
|
||||
|
||||
set(CFLAGS ${VALA_CFLAGS})
|
||||
add_definitions(${CFLAGS})
|
||||
add_library(crypto-vala STATIC ${CRYPTO_VALA_C})
|
||||
target_link_libraries(crypto-vala ${CRYPTO_VALA_PACKAGES} gcrypt libsrtp2)
|
||||
set_property(TARGET crypto-vala PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||
|
|
@ -1,122 +0,0 @@
|
|||
using Srtp;
|
||||
|
||||
public class Crypto.Srtp {
|
||||
public const string AES_CM_128_HMAC_SHA1_80 = "AES_CM_128_HMAC_SHA1_80";
|
||||
public const string AES_CM_128_HMAC_SHA1_32 = "AES_CM_128_HMAC_SHA1_32";
|
||||
public const string F8_128_HMAC_SHA1_80 = "F8_128_HMAC_SHA1_80";
|
||||
|
||||
public class Session {
|
||||
public bool has_encrypt { get; private set; default = false; }
|
||||
public bool has_decrypt { get; private set; default = false; }
|
||||
|
||||
private Context encrypt_context;
|
||||
private Context decrypt_context;
|
||||
|
||||
static construct {
|
||||
init();
|
||||
install_log_handler(log);
|
||||
}
|
||||
|
||||
private static void log(LogLevel level, string msg) {
|
||||
print(@"SRTP[$level]: $msg\n");
|
||||
}
|
||||
|
||||
public Session() {
|
||||
Context.create(out encrypt_context, null);
|
||||
Context.create(out decrypt_context, null);
|
||||
}
|
||||
|
||||
public uint8[] encrypt_rtp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length + MAX_TRAILER_LEN];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = encrypt_context.protect(buf, ref buf_use);
|
||||
if (res != ErrorStatus.ok) {
|
||||
throw new Error.UNKNOWN(@"SRTP encrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public uint8[] decrypt_rtp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = decrypt_context.unprotect(buf, ref buf_use);
|
||||
switch (res) {
|
||||
case ErrorStatus.auth_fail:
|
||||
throw new Error.AUTHENTICATION_FAILED("SRTP packet failed the message authentication check");
|
||||
case ErrorStatus.ok:
|
||||
break;
|
||||
default:
|
||||
throw new Error.UNKNOWN(@"SRTP decrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public uint8[] encrypt_rtcp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length + MAX_TRAILER_LEN + 4];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = encrypt_context.protect_rtcp(buf, ref buf_use);
|
||||
if (res != ErrorStatus.ok) {
|
||||
throw new Error.UNKNOWN(@"SRTCP encrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public uint8[] decrypt_rtcp(uint8[] data) throws Error {
|
||||
uint8[] buf = new uint8[data.length];
|
||||
Memory.copy(buf, data, data.length);
|
||||
int buf_use = data.length;
|
||||
ErrorStatus res = decrypt_context.unprotect_rtcp(buf, ref buf_use);
|
||||
switch (res) {
|
||||
case ErrorStatus.auth_fail:
|
||||
throw new Error.AUTHENTICATION_FAILED("SRTCP packet failed the message authentication check");
|
||||
case ErrorStatus.ok:
|
||||
break;
|
||||
default:
|
||||
throw new Error.UNKNOWN(@"SRTP decrypt failed: $res");
|
||||
}
|
||||
uint8[] ret = new uint8[buf_use];
|
||||
GLib.Memory.copy(ret, buf, buf_use);
|
||||
return ret;
|
||||
}
|
||||
|
||||
private Policy create_policy(string profile) {
|
||||
Policy policy = Policy();
|
||||
switch (profile) {
|
||||
case AES_CM_128_HMAC_SHA1_80:
|
||||
policy.rtp.set_aes_cm_128_hmac_sha1_80();
|
||||
policy.rtcp.set_aes_cm_128_hmac_sha1_80();
|
||||
break;
|
||||
}
|
||||
return policy;
|
||||
}
|
||||
|
||||
public void set_encryption_key(string profile, uint8[] key, uint8[] salt) {
|
||||
Policy policy = create_policy(profile);
|
||||
policy.ssrc.type = SsrcType.any_outbound;
|
||||
policy.key = new uint8[key.length + salt.length];
|
||||
Memory.copy(policy.key, key, key.length);
|
||||
Memory.copy(((uint8*)policy.key) + key.length, salt, salt.length);
|
||||
encrypt_context.add_stream(ref policy);
|
||||
has_encrypt = true;
|
||||
}
|
||||
|
||||
public void set_decryption_key(string profile, uint8[] key, uint8[] salt) {
|
||||
Policy policy = create_policy(profile);
|
||||
policy.ssrc.type = SsrcType.any_inbound;
|
||||
policy.key = new uint8[key.length + salt.length];
|
||||
Memory.copy(policy.key, key, key.length);
|
||||
Memory.copy(((uint8*)policy.key) + key.length, salt, salt.length);
|
||||
decrypt_context.add_stream(ref policy);
|
||||
has_decrypt = true;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue