mirror of
https://github.com/transmission/transmission
synced 2024-12-31 03:56:14 +00:00
Switch to a standalone ARC4 implementation (#1788)
* Switch to a standalone ARC4 implementation This frees us from expecting it being provided by one of the crypto libraries we support, all of which deprecated and/or removed it at this point. Fixes: #1103 Fixes: #1777 * Suppress lgtm warnings about RC4 being weak (we don't care)
This commit is contained in:
parent
97a6f1232e
commit
a459e5e11b
13 changed files with 147 additions and 218 deletions
4
.gitmodules
vendored
4
.gitmodules
vendored
|
@ -1,3 +1,7 @@
|
|||
[submodule "third-party/arc4"]
|
||||
path = third-party/arc4
|
||||
url = https://github.com/transmission/arc4
|
||||
branch = v1.0.0
|
||||
[submodule "third-party/dht"]
|
||||
path = third-party/dht
|
||||
url = https://github.com/transmission/dht
|
||||
|
|
|
@ -348,6 +348,8 @@ endif()
|
|||
|
||||
tr_add_external_auto_library(B64 libb64 b64)
|
||||
|
||||
add_subdirectory(third-party/arc4)
|
||||
|
||||
if(WITH_INOTIFY)
|
||||
tr_get_required_flag(WITH_INOTIFY INOTIFY_IS_REQUIRED)
|
||||
|
||||
|
|
|
@ -358,6 +358,9 @@
|
|||
C1639A791A55F56600E42033 /* cencode.c in Sources */ = {isa = PBXBuildFile; fileRef = C1639A771A55F56600E42033 /* cencode.c */; };
|
||||
C1639A7C1A55F57200E42033 /* cdecode.h in Headers */ = {isa = PBXBuildFile; fileRef = C1639A7A1A55F57200E42033 /* cdecode.h */; };
|
||||
C1639A7D1A55F57200E42033 /* cencode.h in Headers */ = {isa = PBXBuildFile; fileRef = C1639A7B1A55F57200E42033 /* cencode.h */; };
|
||||
C1A7517526ED048C0038B90A /* libarc4.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C1A7516426ED03140038B90A /* libarc4.a */; };
|
||||
C1A751E526ED09A30038B90A /* arc4.c in Sources */ = {isa = PBXBuildFile; fileRef = C1A751E326ED09A30038B90A /* arc4.c */; };
|
||||
C1A751E626ED09A30038B90A /* arc4.h in Headers */ = {isa = PBXBuildFile; fileRef = C1A751E426ED09A30038B90A /* arc4.h */; };
|
||||
C1BF7BA81F2A3CB7008E88A7 /* upnpdev.c in Sources */ = {isa = PBXBuildFile; fileRef = C1BF7BA71F2A3CB7008E88A7 /* upnpdev.c */; };
|
||||
C1BF7BAA1F2A3CCE008E88A7 /* upnpdev.h in Headers */ = {isa = PBXBuildFile; fileRef = C1BF7BA91F2A3CCE008E88A7 /* upnpdev.h */; };
|
||||
C1F690FD1AD0627500D95CF0 /* daemon-posix.c in Sources */ = {isa = PBXBuildFile; fileRef = C1F690FC1AD0627500D95CF0 /* daemon-posix.c */; };
|
||||
|
@ -460,6 +463,13 @@
|
|||
remoteGlobalIDString = C1639A6E1A55F4D600E42033;
|
||||
remoteInfo = b64;
|
||||
};
|
||||
C1A751C726ED06390038B90A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = C1A7516326ED03140038B90A;
|
||||
remoteInfo = arc4;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
|
@ -1010,6 +1020,9 @@
|
|||
C1639A771A55F56600E42033 /* cencode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cencode.c; path = src/cencode.c; sourceTree = "<group>"; };
|
||||
C1639A7A1A55F57200E42033 /* cdecode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cdecode.h; path = include/b64/cdecode.h; sourceTree = "<group>"; };
|
||||
C1639A7B1A55F57200E42033 /* cencode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cencode.h; path = include/b64/cencode.h; sourceTree = "<group>"; };
|
||||
C1A7516426ED03140038B90A /* libarc4.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libarc4.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C1A751E326ED09A30038B90A /* arc4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = arc4.c; path = "third-party/arc4/src/arc4.c"; sourceTree = SOURCE_ROOT; };
|
||||
C1A751E426ED09A30038B90A /* arc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arc4.h; path = "third-party/arc4/src/arc4.h"; sourceTree = SOURCE_ROOT; };
|
||||
C1BF7BA71F2A3CB7008E88A7 /* upnpdev.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upnpdev.c; sourceTree = "<group>"; };
|
||||
C1BF7BA91F2A3CCE008E88A7 /* upnpdev.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upnpdev.h; sourceTree = "<group>"; };
|
||||
C1F690FC1AD0627500D95CF0 /* daemon-posix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "daemon-posix.c"; sourceTree = "<group>"; };
|
||||
|
@ -1119,6 +1132,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
C1A7517526ED048C0038B90A /* libarc4.a in Frameworks */,
|
||||
C1639A741A55F4E000E42033 /* libb64.a in Frameworks */,
|
||||
A22CFCCB0FC24FDA0009BD3E /* libdht.a in Frameworks */,
|
||||
A267927C130DFF2700CB7464 /* libutp.a in Frameworks */,
|
||||
|
@ -1163,6 +1177,13 @@
|
|||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
C1A7516226ED03140038B90A /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
|
@ -1272,6 +1293,7 @@
|
|||
A2E38544130DFEE3001F501B /* libutp.a */,
|
||||
A2F35BB915C5A0A100EBF632 /* QuickLookPlugin.qlgenerator */,
|
||||
C1639A6F1A55F4D600E42033 /* libb64.a */,
|
||||
C1A7516426ED03140038B90A /* libarc4.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
|
@ -1286,6 +1308,7 @@
|
|||
4DDBB71F09E16BFE00284745 /* CLI */,
|
||||
BEFC1C0B0C07754700B0BB3C /* daemon */,
|
||||
C15E58AC219A37C600AB292F /* utils */,
|
||||
C1A7518626ED04EC0038B90A /* arc4 */,
|
||||
A22CFCB50FC24F630009BD3E /* dht */,
|
||||
A2E384BF130DFA49001F501B /* libutp */,
|
||||
BE75C3570C72A0D600DBEFE0 /* libevent */,
|
||||
|
@ -1738,6 +1761,15 @@
|
|||
path = "third-party/libb64";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C1A7518626ED04EC0038B90A /* arc4 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C1A751E326ED09A30038B90A /* arc4.c */,
|
||||
C1A751E426ED09A30038B90A /* arc4.h */,
|
||||
);
|
||||
path = arc4;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E1B6FBF80C0D719B0015FE4D /* Info Window */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -1949,6 +1981,14 @@
|
|||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
C1A7516026ED03140038B90A /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
C1A751E626ED09A30038B90A /* arc4.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
|
@ -1981,6 +2021,7 @@
|
|||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
C1A751C826ED06390038B90A /* PBXTargetDependency */,
|
||||
A226FDB10D0CDF6E005A7F71 /* PBXTargetDependency */,
|
||||
BE1183760CE161040002D0F3 /* PBXTargetDependency */,
|
||||
BE75C34F0C729ED300DBEFE0 /* PBXTargetDependency */,
|
||||
|
@ -2174,6 +2215,23 @@
|
|||
productReference = C1639A6F1A55F4D600E42033 /* libb64.a */;
|
||||
productType = "com.apple.product-type.library.static";
|
||||
};
|
||||
C1A7516326ED03140038B90A /* arc4 */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = C1A7516826ED03140038B90A /* Build configuration list for PBXNativeTarget "arc4" */;
|
||||
buildPhases = (
|
||||
C1A7516026ED03140038B90A /* Headers */,
|
||||
C1A7516126ED03140038B90A /* Sources */,
|
||||
C1A7516226ED03140038B90A /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = arc4;
|
||||
productName = arc4;
|
||||
productReference = C1A7516426ED03140038B90A /* libarc4.a */;
|
||||
productType = "com.apple.product-type.library.static";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
|
@ -2229,6 +2287,7 @@
|
|||
BE1183470CE160960002D0F3 /* miniupnp */,
|
||||
3C7A118C0D0B2EB800B5701F /* natpmp */,
|
||||
C1639A6E1A55F4D600E42033 /* b64 */,
|
||||
C1A7516326ED03140038B90A /* arc4 */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
@ -2646,6 +2705,14 @@
|
|||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
C1A7516126ED03140038B90A /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
C1A751E526ED09A30038B90A /* arc4.c in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
|
@ -2709,6 +2776,11 @@
|
|||
target = C1639A6E1A55F4D600E42033 /* b64 */;
|
||||
targetProxy = C165AB8C1A55FAA900D37711 /* PBXContainerItemProxy */;
|
||||
};
|
||||
C1A751C826ED06390038B90A /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = C1A7516326ED03140038B90A /* arc4 */;
|
||||
targetProxy = C1A751C726ED06390038B90A /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
|
@ -2963,6 +3035,7 @@
|
|||
CLANG_ENABLE_OBJC_ARC = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"third-party/arc4/src",
|
||||
"third-party/dht",
|
||||
"third-party/libb64/include",
|
||||
"third-party/libevent/include",
|
||||
|
@ -3151,6 +3224,7 @@
|
|||
CLANG_ENABLE_OBJC_ARC = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"third-party/arc4/src",
|
||||
"third-party/dht",
|
||||
"third-party/libb64/include",
|
||||
"third-party/libevent/include",
|
||||
|
@ -3404,6 +3478,7 @@
|
|||
CLANG_ENABLE_OBJC_ARC = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"third-party/arc4/src",
|
||||
"third-party/dht",
|
||||
"third-party/libb64/include",
|
||||
"third-party/libevent/include",
|
||||
|
@ -3644,6 +3719,30 @@
|
|||
};
|
||||
name = Release;
|
||||
};
|
||||
C1A7516526ED03140038B90A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = NO;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
C1A7516626ED03140038B90A /* Release - Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = NO;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = "Release - Debug";
|
||||
};
|
||||
C1A7516726ED03140038B90A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = NO;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
|
@ -3777,6 +3876,16 @@
|
|||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
C1A7516826ED03140038B90A /* Build configuration list for PBXNativeTarget "arc4" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
C1A7516526ED03140038B90A /* Debug */,
|
||||
C1A7516626ED03140038B90A /* Release - Debug */,
|
||||
C1A7516726ED03140038B90A /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
|
||||
|
|
|
@ -285,6 +285,7 @@ target_link_libraries(${TR_NAME}
|
|||
${LIBINTL_LIBRARY}
|
||||
${LIBM_LIBRARY}
|
||||
${TR_NETWORK_LIBRARIES}
|
||||
arc4::arc4
|
||||
)
|
||||
|
||||
if(ICONV_FOUND)
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#define API_VERSION_HEX LIBCYASSL_VERSION_HEX
|
||||
#endif
|
||||
|
||||
#include API_HEADER_CRYPT(arc4.h)
|
||||
#include API_HEADER_CRYPT(dh.h)
|
||||
#include API_HEADER_CRYPT(error-crypt.h)
|
||||
#include API_HEADER_CRYPT(random.h)
|
||||
|
@ -165,43 +164,6 @@ bool tr_sha1_final(tr_sha1_ctx_t handle, uint8_t* hash)
|
|||
****
|
||||
***/
|
||||
|
||||
tr_rc4_ctx_t tr_rc4_new(void)
|
||||
{
|
||||
return tr_new0(Arc4, 1);
|
||||
}
|
||||
|
||||
void tr_rc4_free(tr_rc4_ctx_t handle)
|
||||
{
|
||||
tr_free(handle);
|
||||
}
|
||||
|
||||
void tr_rc4_set_key(tr_rc4_ctx_t handle, uint8_t const* key, size_t key_length)
|
||||
{
|
||||
TR_ASSERT(handle != NULL);
|
||||
TR_ASSERT(key != NULL);
|
||||
|
||||
API(Arc4SetKey)(handle, key, key_length);
|
||||
}
|
||||
|
||||
void tr_rc4_process(tr_rc4_ctx_t handle, void const* input, void* output, size_t length)
|
||||
{
|
||||
TR_ASSERT(handle != NULL);
|
||||
|
||||
if (length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TR_ASSERT(input != NULL);
|
||||
TR_ASSERT(output != NULL);
|
||||
|
||||
API(Arc4Process)(handle, output, input, length);
|
||||
}
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
|
||||
tr_dh_ctx_t tr_dh_new(
|
||||
uint8_t const* prime_num,
|
||||
size_t prime_num_length,
|
||||
|
|
|
@ -181,59 +181,6 @@ static void openssl_evp_cipher_context_free(EVP_CIPHER_CTX* handle)
|
|||
|
||||
#endif
|
||||
|
||||
tr_rc4_ctx_t tr_rc4_new(void)
|
||||
{
|
||||
EVP_CIPHER_CTX* handle = EVP_CIPHER_CTX_new();
|
||||
|
||||
if (check_result(EVP_CipherInit_ex(handle, EVP_rc4(), NULL, NULL, NULL, -1)))
|
||||
{
|
||||
return handle;
|
||||
}
|
||||
|
||||
EVP_CIPHER_CTX_free(handle);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void tr_rc4_free(tr_rc4_ctx_t handle)
|
||||
{
|
||||
if (handle == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
EVP_CIPHER_CTX_free(handle);
|
||||
}
|
||||
|
||||
void tr_rc4_set_key(tr_rc4_ctx_t handle, uint8_t const* key, size_t key_length)
|
||||
{
|
||||
TR_ASSERT(handle != NULL);
|
||||
TR_ASSERT(key != NULL);
|
||||
|
||||
if (!check_result(EVP_CIPHER_CTX_set_key_length(handle, key_length)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
check_result(EVP_CipherInit_ex(handle, NULL, NULL, key, NULL, -1));
|
||||
}
|
||||
|
||||
void tr_rc4_process(tr_rc4_ctx_t handle, void const* input, void* output, size_t length)
|
||||
{
|
||||
TR_ASSERT(handle != NULL);
|
||||
|
||||
if (length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TR_ASSERT(input != NULL);
|
||||
TR_ASSERT(output != NULL);
|
||||
|
||||
int output_length;
|
||||
|
||||
check_result(EVP_CipherUpdate(handle, output, &output_length, input, length));
|
||||
}
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#define API_VERSION_NUMBER POLARSSL_VERSION_NUMBER
|
||||
#endif
|
||||
|
||||
#include API_HEADER(arc4.h)
|
||||
#include API_HEADER(base64.h)
|
||||
#include API_HEADER(ctr_drbg.h)
|
||||
#include API_HEADER(dhm.h)
|
||||
|
@ -43,7 +42,6 @@
|
|||
|
||||
typedef API(ctr_drbg_context) api_ctr_drbg_context;
|
||||
typedef API(sha1_context) api_sha1_context;
|
||||
typedef API(arc4_context) api_arc4_context;
|
||||
typedef API(dhm_context) api_dhm_context;
|
||||
|
||||
static void log_polarssl_error(int error_code, char const* file, int line)
|
||||
|
@ -186,53 +184,6 @@ bool tr_sha1_final(tr_sha1_ctx_t handle, uint8_t* hash)
|
|||
****
|
||||
***/
|
||||
|
||||
tr_rc4_ctx_t tr_rc4_new(void)
|
||||
{
|
||||
api_arc4_context* handle = tr_new0(api_arc4_context, 1);
|
||||
|
||||
#if API_VERSION_NUMBER >= 0x01030800
|
||||
API(arc4_init)(handle);
|
||||
#endif
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
void tr_rc4_free(tr_rc4_ctx_t handle)
|
||||
{
|
||||
#if API_VERSION_NUMBER >= 0x01030800
|
||||
API(arc4_free)(handle);
|
||||
#endif
|
||||
|
||||
tr_free(handle);
|
||||
}
|
||||
|
||||
void tr_rc4_set_key(tr_rc4_ctx_t handle, uint8_t const* key, size_t key_length)
|
||||
{
|
||||
TR_ASSERT(handle != NULL);
|
||||
TR_ASSERT(key != NULL);
|
||||
|
||||
API(arc4_setup)(handle, key, key_length);
|
||||
}
|
||||
|
||||
void tr_rc4_process(tr_rc4_ctx_t handle, void const* input, void* output, size_t length)
|
||||
{
|
||||
TR_ASSERT(handle != NULL);
|
||||
|
||||
if (length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TR_ASSERT(input != NULL);
|
||||
TR_ASSERT(output != NULL);
|
||||
|
||||
API(arc4_crypt)(handle, length, input, output);
|
||||
}
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
|
||||
tr_dh_ctx_t tr_dh_new(
|
||||
uint8_t const* prime_num,
|
||||
size_t prime_num_length,
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <stdlib.h> /* abs(), srand(), rand() */
|
||||
#include <string.h> /* memcpy(), memmove(), memset(), strcmp(), strlen() */
|
||||
|
||||
#include <arc4.h>
|
||||
#include <b64/cdecode.h>
|
||||
#include <b64/cencode.h>
|
||||
|
||||
|
|
|
@ -25,8 +25,6 @@ TR_BEGIN_DECLS
|
|||
|
||||
/** @brief Opaque SHA1 context type. */
|
||||
typedef void* tr_sha1_ctx_t;
|
||||
/** @brief Opaque RC4 context type. */
|
||||
typedef void* tr_rc4_ctx_t;
|
||||
/** @brief Opaque DH context type. */
|
||||
typedef void* tr_dh_ctx_t;
|
||||
/** @brief Opaque DH secret key type. */
|
||||
|
@ -58,26 +56,6 @@ bool tr_sha1_update(tr_sha1_ctx_t handle, void const* data, size_t data_length);
|
|||
*/
|
||||
bool tr_sha1_final(tr_sha1_ctx_t handle, uint8_t* hash);
|
||||
|
||||
/**
|
||||
* @brief Allocate and initialize new RC4 cipher context.
|
||||
*/
|
||||
tr_rc4_ctx_t tr_rc4_new(void);
|
||||
|
||||
/**
|
||||
* @brief Free RC4 cipher context.
|
||||
*/
|
||||
void tr_rc4_free(tr_rc4_ctx_t handle);
|
||||
|
||||
/**
|
||||
* @brief Set RC4 cipher key.
|
||||
*/
|
||||
void tr_rc4_set_key(tr_rc4_ctx_t handle, uint8_t const* key, size_t key_length);
|
||||
|
||||
/**
|
||||
* @brief Process memory block with RC4 cipher.
|
||||
*/
|
||||
void tr_rc4_process(tr_rc4_ctx_t handle, void const* input, void* output, size_t length);
|
||||
|
||||
/**
|
||||
* @brief Allocate and initialize new Diffie-Hellman (DH) key exchange context.
|
||||
*/
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
#include <string.h> /* memcpy(), memmove(), memset() */
|
||||
|
||||
#include <arc4.h>
|
||||
|
||||
#include "transmission.h"
|
||||
#include "crypto.h"
|
||||
#include "crypto-utils.h"
|
||||
|
@ -63,8 +65,8 @@ void tr_cryptoDestruct(tr_crypto* crypto)
|
|||
{
|
||||
tr_dh_secret_free(crypto->mySecret);
|
||||
tr_dh_free(crypto->dh);
|
||||
tr_rc4_free(crypto->enc_key);
|
||||
tr_rc4_free(crypto->dec_key);
|
||||
tr_free(crypto->enc_key);
|
||||
tr_free(crypto->dec_key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -89,71 +91,57 @@ uint8_t const* tr_cryptoGetMyPublicKey(tr_crypto const* crypto, int* setme_len)
|
|||
***
|
||||
**/
|
||||
|
||||
static void initRC4(tr_crypto const* crypto, tr_rc4_ctx_t* setme, char const* key)
|
||||
static void init_rc4(tr_crypto const* crypto, struct arc4_context** setme, char const* key)
|
||||
{
|
||||
TR_ASSERT(crypto->torrentHashIsSet);
|
||||
|
||||
if (*setme == NULL)
|
||||
{
|
||||
*setme = tr_rc4_new();
|
||||
*setme = tr_new0(struct arc4_context, 1);
|
||||
}
|
||||
|
||||
uint8_t buf[SHA_DIGEST_LENGTH];
|
||||
|
||||
if (tr_cryptoSecretKeySha1(crypto, key, 4, crypto->torrentHash, SHA_DIGEST_LENGTH, buf))
|
||||
{
|
||||
tr_rc4_set_key(*setme, buf, SHA_DIGEST_LENGTH);
|
||||
arc4_init(*setme, buf, SHA_DIGEST_LENGTH);
|
||||
arc4_discard(*setme, 1024);
|
||||
}
|
||||
}
|
||||
|
||||
static void crypt_rc4(struct arc4_context* key, size_t buf_len, void const* buf_in, void* buf_out)
|
||||
{
|
||||
if (key == NULL)
|
||||
{
|
||||
if (buf_in != buf_out)
|
||||
{
|
||||
memmove(buf_out, buf_in, buf_len);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
arc4_process(key, buf_in, buf_out, buf_len);
|
||||
}
|
||||
|
||||
void tr_cryptoDecryptInit(tr_crypto* crypto)
|
||||
{
|
||||
uint8_t discard[1024];
|
||||
char const* txt = crypto->isIncoming ? "keyA" : "keyB";
|
||||
|
||||
initRC4(crypto, &crypto->dec_key, txt);
|
||||
tr_rc4_process(crypto->dec_key, discard, discard, sizeof(discard));
|
||||
init_rc4(crypto, &crypto->dec_key, crypto->isIncoming ? "keyA" : "keyB"); // lgtm[cpp/weak-cryptographic-algorithm]
|
||||
}
|
||||
|
||||
void tr_cryptoDecrypt(tr_crypto* crypto, size_t buf_len, void const* buf_in, void* buf_out)
|
||||
{
|
||||
/* FIXME: someone calls this function with uninitialized key */
|
||||
if (crypto->dec_key == NULL)
|
||||
{
|
||||
if (buf_in != buf_out)
|
||||
{
|
||||
memmove(buf_out, buf_in, buf_len);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
tr_rc4_process(crypto->dec_key, buf_in, buf_out, buf_len);
|
||||
crypt_rc4(crypto->dec_key, buf_len, buf_in, buf_out); // lgtm[cpp/weak-cryptographic-algorithm]
|
||||
}
|
||||
|
||||
void tr_cryptoEncryptInit(tr_crypto* crypto)
|
||||
{
|
||||
uint8_t discard[1024];
|
||||
char const* txt = crypto->isIncoming ? "keyB" : "keyA";
|
||||
|
||||
initRC4(crypto, &crypto->enc_key, txt);
|
||||
tr_rc4_process(crypto->enc_key, discard, discard, sizeof(discard));
|
||||
init_rc4(crypto, &crypto->enc_key, crypto->isIncoming ? "keyB" : "keyA"); // lgtm[cpp/weak-cryptographic-algorithm]
|
||||
}
|
||||
|
||||
void tr_cryptoEncrypt(tr_crypto* crypto, size_t buf_len, void const* buf_in, void* buf_out)
|
||||
{
|
||||
/* FIXME: someone calls this function with uninitialized key */
|
||||
if (crypto->enc_key == NULL)
|
||||
{
|
||||
if (buf_in != buf_out)
|
||||
{
|
||||
memmove(buf_out, buf_in, buf_len);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
tr_rc4_process(crypto->enc_key, buf_in, buf_out, buf_len);
|
||||
crypt_rc4(crypto->enc_key, buf_len, buf_in, buf_out); // lgtm[cpp/weak-cryptographic-algorithm]
|
||||
}
|
||||
|
||||
bool tr_cryptoSecretKeySha1(
|
||||
|
|
|
@ -35,8 +35,8 @@ enum
|
|||
/** @brief Holds state information for encrypted peer communications */
|
||||
typedef struct
|
||||
{
|
||||
tr_rc4_ctx_t dec_key;
|
||||
tr_rc4_ctx_t enc_key;
|
||||
struct arc4_context* dec_key;
|
||||
struct arc4_context* enc_key;
|
||||
tr_dh_ctx_t dh;
|
||||
uint8_t myPublicKey[KEY_LEN];
|
||||
tr_dh_secret_t mySecret;
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#define KEY_LEN KEY_LEN_
|
||||
|
||||
#define tr_sha1_ctx_t tr_sha1_ctx_t_
|
||||
#define tr_rc4_ctx_t tr_rc4_ctx_t_
|
||||
#define tr_dh_ctx_t tr_dh_ctx_t_
|
||||
#define tr_dh_secret_t tr_dh_secret_t_
|
||||
#define tr_ssl_ctx_t tr_ssl_ctx_t_
|
||||
|
@ -39,10 +38,6 @@
|
|||
#define tr_sha1_init tr_sha1_init_
|
||||
#define tr_sha1_update tr_sha1_update_
|
||||
#define tr_sha1_final tr_sha1_final_
|
||||
#define tr_rc4_new tr_rc4_new_
|
||||
#define tr_rc4_free tr_rc4_free_
|
||||
#define tr_rc4_set_key tr_rc4_set_key_
|
||||
#define tr_rc4_process tr_rc4_process_
|
||||
#define tr_dh_new tr_dh_new_
|
||||
#define tr_dh_free tr_dh_free_
|
||||
#define tr_dh_make_key tr_dh_make_key_
|
||||
|
@ -80,7 +75,6 @@
|
|||
#undef KEY_LEN_
|
||||
|
||||
#undef tr_sha1_ctx_t
|
||||
#undef tr_rc4_ctx_t
|
||||
#undef tr_dh_ctx_t
|
||||
#undef tr_dh_secret_t
|
||||
#undef tr_ssl_ctx_t
|
||||
|
@ -103,10 +97,6 @@
|
|||
#undef tr_sha1_init
|
||||
#undef tr_sha1_update
|
||||
#undef tr_sha1_final
|
||||
#undef tr_rc4_new
|
||||
#undef tr_rc4_free
|
||||
#undef tr_rc4_set_key
|
||||
#undef tr_rc4_process
|
||||
#undef tr_dh_new
|
||||
#undef tr_dh_free
|
||||
#undef tr_dh_make_key
|
||||
|
@ -137,7 +127,6 @@
|
|||
#define KEY_LEN_ KEY_LEN
|
||||
|
||||
#define tr_sha1_ctx_t_ tr_sha1_ctx_t
|
||||
#define tr_rc4_ctx_t_ tr_rc4_ctx_t
|
||||
#define tr_dh_ctx_t_ tr_dh_ctx_t
|
||||
#define tr_dh_secret_t_ tr_dh_secret_t
|
||||
#define tr_ssl_ctx_t_ tr_ssl_ctx_t
|
||||
|
@ -160,10 +149,6 @@
|
|||
#define tr_sha1_init_ tr_sha1_init
|
||||
#define tr_sha1_update_ tr_sha1_update
|
||||
#define tr_sha1_final_ tr_sha1_final
|
||||
#define tr_rc4_new_ tr_rc4_new
|
||||
#define tr_rc4_free_ tr_rc4_free
|
||||
#define tr_rc4_set_key_ tr_rc4_set_key
|
||||
#define tr_rc4_process_ tr_rc4_process
|
||||
#define tr_dh_new_ tr_dh_new
|
||||
#define tr_dh_free_ tr_dh_free
|
||||
#define tr_dh_make_key_ tr_dh_make_key
|
||||
|
|
1
third-party/arc4
vendored
Submodule
1
third-party/arc4
vendored
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 6c8a5dd7e5e3fafcf0afef74cdf71f9d20cb9a54
|
Loading…
Reference in a new issue