target_link_libraries(${TR_NAME}-test ${TR_NAME})
+ set(crypto-test_ADD_SOURCES crypto-test-ref.h)
+
foreach(T bitfield blocklist clients crypto error file history json magnet metainfo move peer-msgs quark rename rpc session tr-getopt utils variant)
set(TP ${TR_NAME}-test-${T})
- add_executable(${TP} ${T}-test.c)
+ add_executable(${TP} ${T}-test.c ${${T}-test_ADD_SOURCES})
target_link_libraries(${TP} ${TR_NAME} ${TR_NAME}-test)
add_test(${T} ${TP})
endforeach()
clients_test_LDFLAGS = ${apps_ldflags}
crypto_test_SOURCES = crypto-test.c $(TEST_SOURCES)
+crypto_test_HEADERS = crypto-test-ref.h
crypto_test_LDADD = ${apps_ldadd}
crypto_test_LDFLAGS = ${apps_ldflags}
--- /dev/null
+/*
+ * This file Copyright (C) 2015 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ *
+ * $Id$
+ */
+
+#ifndef TR_CRYPTO_TEST_REF_H
+#define TR_CRYPTO_TEST_REF_H
+
+/* #define CRYPTO_REFERENCE_CHECK */
+
+#ifdef CRYPTO_REFERENCE_CHECK
+
+#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_crypto tr_crypto_
+#define tr_cryptoConstruct tr_cryptoConstruct_
+#define tr_cryptoDestruct tr_cryptoDestruct_
+#define tr_cryptoSetTorrentHash tr_cryptoSetTorrentHash_
+#define tr_cryptoGetTorrentHash tr_cryptoGetTorrentHash_
+#define tr_cryptoHasTorrentHash tr_cryptoHasTorrentHash_
+#define tr_cryptoComputeSecret tr_cryptoComputeSecret_
+#define tr_cryptoGetMyPublicKey tr_cryptoGetMyPublicKey_
+#define tr_cryptoDecryptInit tr_cryptoDecryptInit_
+#define tr_cryptoDecrypt tr_cryptoDecrypt_
+#define tr_cryptoEncryptInit tr_cryptoEncryptInit_
+#define tr_cryptoEncrypt tr_cryptoEncrypt_
+#define tr_cryptoSecretKeySha1 tr_cryptoSecretKeySha1_
+#define tr_sha1 tr_sha1_
+#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_
+#define tr_dh_agree tr_dh_agree_
+#define tr_dh_secret_derive tr_dh_secret_derive_
+#define tr_dh_secret_free tr_dh_secret_free_
+#define tr_dh_align_key tr_dh_align_key_
+#define tr_rand_int tr_rand_int_
+#define tr_rand_int_weak tr_rand_int_weak_
+#define tr_rand_buffer tr_rand_buffer_
+#define tr_ssha1 tr_ssha1_
+#define tr_ssha1_matches tr_ssha1_matches_
+#define tr_base64_encode tr_base64_encode_
+#define tr_base64_encode_str tr_base64_encode_str_
+#define tr_base64_encode_impl tr_base64_encode_impl_
+#define tr_base64_decode tr_base64_decode_
+#define tr_base64_decode_str tr_base64_decode_str_
+#define tr_base64_decode_impl tr_base64_decode_impl_
+#define tr_sha1_to_hex tr_sha1_to_hex_
+#define tr_hex_to_sha1 tr_hex_to_sha1_
+
+#undef TR_ENCRYPTION_H
+#undef TR_CRYPTO_UTILS_H
+
+#include "crypto.h"
+#include "crypto-utils.h"
+#include "crypto.c"
+#include "crypto-utils.c"
+#include "crypto-utils-openssl.c"
+
+#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_crypto
+#undef tr_cryptoConstruct
+#undef tr_cryptoDestruct
+#undef tr_cryptoSetTorrentHash
+#undef tr_cryptoGetTorrentHash
+#undef tr_cryptoHasTorrentHash
+#undef tr_cryptoComputeSecret
+#undef tr_cryptoGetMyPublicKey
+#undef tr_cryptoDecryptInit
+#undef tr_cryptoDecrypt
+#undef tr_cryptoEncryptInit
+#undef tr_cryptoEncrypt
+#undef tr_cryptoSecretKeySha1
+#undef tr_sha1
+#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
+#undef tr_dh_agree
+#undef tr_dh_secret_derive
+#undef tr_dh_secret_free
+#undef tr_dh_align_key
+#undef tr_rand_int
+#undef tr_rand_int_weak
+#undef tr_rand_buffer
+#undef tr_ssha1
+#undef tr_ssha1_matches
+#undef tr_base64_encode
+#undef tr_base64_encode_str
+#undef tr_base64_encode_impl
+#undef tr_base64_decode
+#undef tr_base64_decode_str
+#undef tr_base64_decode_impl
+#undef tr_sha1_to_hex
+#undef tr_hex_to_sha1
+
+#else /* CRYPTO_REFERENCE_CHECK */
+
+#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_crypto_ tr_crypto
+#define tr_cryptoConstruct_ tr_cryptoConstruct
+#define tr_cryptoDestruct_ tr_cryptoDestruct
+#define tr_cryptoSetTorrentHash_ tr_cryptoSetTorrentHash
+#define tr_cryptoGetTorrentHash_ tr_cryptoGetTorrentHash
+#define tr_cryptoHasTorrentHash_ tr_cryptoHasTorrentHash
+#define tr_cryptoComputeSecret_ tr_cryptoComputeSecret
+#define tr_cryptoGetMyPublicKey_ tr_cryptoGetMyPublicKey
+#define tr_cryptoDecryptInit_ tr_cryptoDecryptInit
+#define tr_cryptoDecrypt_ tr_cryptoDecrypt
+#define tr_cryptoEncryptInit_ tr_cryptoEncryptInit
+#define tr_cryptoEncrypt_ tr_cryptoEncrypt
+#define tr_cryptoSecretKeySha1_ tr_cryptoSecretKeySha1
+#define tr_sha1_ tr_sha1
+#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
+#define tr_dh_agree_ tr_dh_agree
+#define tr_dh_secret_derive_ tr_dh_secret_derive
+#define tr_dh_secret_free_ tr_dh_secret_free
+#define tr_dh_align_key_ tr_dh_align_key
+#define tr_rand_int_ tr_rand_int
+#define tr_rand_int_weak_ tr_rand_int_weak
+#define tr_rand_buffer_ tr_rand_buffer
+#define tr_ssha1_ tr_ssha1
+#define tr_ssha1_matches_ tr_ssha1_matches
+#define tr_base64_encode_ tr_base64_encode
+#define tr_base64_encode_str_ tr_base64_encode_str
+#define tr_base64_encode_impl_ tr_base64_encode_impl
+#define tr_base64_decode_ tr_base64_decode
+#define tr_base64_decode_str_ tr_base64_decode_str
+#define tr_base64_decode_impl_ tr_base64_decode_impl
+#define tr_sha1_to_hex_ tr_sha1_to_hex
+#define tr_hex_to_sha1_ tr_hex_to_sha1
+
+#endif /* CRYPTO_REFERENCE_CHECK */
+
+#endif /* TR_CRYPTO_TEST_REF_H */
#include "libtransmission-test.h"
-#define SHA_DIGEST_LENGTH 20
+#include "crypto-test-ref.h"
static int
test_torrent_hash (void)
static int
test_encrypt_decrypt (void)
{
- tr_crypto a, b;
+ tr_crypto a;
+ tr_crypto_ b;
uint8_t hash[SHA_DIGEST_LENGTH];
const char test1[] = { "test1" };
char buf11[sizeof (test1)], buf12[sizeof (test1)];
hash[i] = i;
tr_cryptoConstruct (&a, hash, false);
- tr_cryptoConstruct (&b, hash, true);
- check (tr_cryptoComputeSecret (&a, tr_cryptoGetMyPublicKey (&b, &i)));
- check (tr_cryptoComputeSecret (&b, tr_cryptoGetMyPublicKey (&a, &i)));
+ tr_cryptoConstruct_ (&b, hash, true);
+ check (tr_cryptoComputeSecret (&a, tr_cryptoGetMyPublicKey_ (&b, &i)));
+ check (tr_cryptoComputeSecret_ (&b, tr_cryptoGetMyPublicKey (&a, &i)));
tr_cryptoEncryptInit (&a);
tr_cryptoEncrypt (&a, sizeof (test1), test1, buf11);
- tr_cryptoDecryptInit (&b);
- tr_cryptoDecrypt (&b, sizeof (test1), buf11, buf12);
+ tr_cryptoDecryptInit_ (&b);
+ tr_cryptoDecrypt_ (&b, sizeof (test1), buf11, buf12);
check_streq (test1, buf12);
- tr_cryptoEncryptInit (&b);
- tr_cryptoEncrypt (&b, sizeof (test2), test2, buf21);
+ tr_cryptoEncryptInit_ (&b);
+ tr_cryptoEncrypt_ (&b, sizeof (test2), test2, buf21);
tr_cryptoDecryptInit (&a);
tr_cryptoDecrypt (&a, sizeof (test2), buf21, buf22);
check_streq (test2, buf22);
- tr_cryptoDestruct (&b);
+ tr_cryptoDestruct_ (&b);
tr_cryptoDestruct (&a);
return 0;
test_sha1 (void)
{
uint8_t hash[SHA_DIGEST_LENGTH];
+ uint8_t hash_[SHA_DIGEST_LENGTH];
check (tr_sha1 (hash, "test", 4, NULL));
+ check (tr_sha1_ (hash_, "test", 4, NULL));
check (memcmp (hash, "\xa9\x4a\x8f\xe5\xcc\xb1\x9b\xa6\x1c\x4c\x08\x73\xd3\x91\xe9\x87\x98\x2f\xbb\xd3", SHA_DIGEST_LENGTH) == 0);
+ check (memcmp (hash, hash_, SHA_DIGEST_LENGTH) == 0);
check (tr_sha1 (hash, "1", 1, "22", 2, "333", 3, NULL));
+ check (tr_sha1_ (hash_, "1", 1, "22", 2, "333", 3, NULL));
check (memcmp (hash, "\x1f\x74\x64\x8e\x50\xa6\xa6\x70\x8e\xc5\x4a\xb3\x27\xa1\x63\xd5\x53\x6b\x7c\xed", SHA_DIGEST_LENGTH) == 0);
+ check (memcmp (hash, hash_, SHA_DIGEST_LENGTH) == 0);
return 0;
}
for (j = 0; j < HASH_COUNT; ++j)
{
- hashes[j] = tr_ssha1 (phrase);
+ hashes[j] = j % 2 == 0 ? tr_ssha1 (phrase) : tr_ssha1_ (phrase);
check (hashes[j] != NULL);
/* phrase matches each of generated hashes */
check (tr_ssha1_matches (hashes[j], phrase));
+ check (tr_ssha1_matches_ (hashes[j], phrase));
}
for (j = 0; j < HASH_COUNT; ++j)
phrase[0] ^= phrase[1];
for (j = 0; j < HASH_COUNT; ++j)
- /* changed phrase doesn't match the hashes */
- check (!tr_ssha1_matches (hashes[j], phrase));
+ {
+ /* changed phrase doesn't match the hashes */
+ check (!tr_ssha1_matches (hashes[j], phrase));
+ check (!tr_ssha1_matches_ (hashes[j], phrase));
+ }
for (j = 0; j < HASH_COUNT; ++j)
tr_free (hashes[j]);
out = tr_base64_encode_str ("YOYO!", &len);
check_int_eq (8, len);
check_streq ("WU9ZTyE=", out);
+ in = tr_base64_decode_str_ (out, &len);
+ check_int_eq (5, len);
+ check_streq ("YOYO!", in);
+ tr_free (in);
+ tr_free (out);
+
+ out = tr_base64_encode_str_ ("YOYO!", &len);
+ check_int_eq (8, len);
+ check_streq ("WU9ZTyE=", out);
in = tr_base64_decode_str (out, &len);
check_int_eq (5, len);
check_streq ("YOYO!", in);
check_int_eq (0, len);
check_streq ("", out);
tr_free (out);
+ out = tr_base64_decode_ ("", 0, &len);
+ check_int_eq (0, len);
+ check_streq ("", out);
+ tr_free (out);
+
+ out = tr_base64_encode_ ("", 0, &len);
+ check_int_eq (0, len);
+ check_streq ("", out);
+ tr_free (out);
out = tr_base64_decode ("", 0, &len);
check_int_eq (0, len);
check_streq ("", out);
check_int_eq (0, len);
check (out == NULL);
tr_free (out);
+ out = tr_base64_decode_ (NULL, 0, &len);
+ check_int_eq (0, len);
+ check (out == NULL);
+ tr_free (out);
+
+ out = tr_base64_encode_ (NULL, 0, &len);
+ check_int_eq (0, len);
+ check (out == NULL);
+ tr_free (out);
out = tr_base64_decode (NULL, 0, &len);
check_int_eq (0, len);
check (out == NULL);
out = tr_base64_encode (buf, j, &len);
check_int_eq ((j + 2) / 3 * 4, len);
+ in = tr_base64_decode_ (out, len, &len);
+ check_int_eq (j, len);
+ check (memcmp (in, buf, len) == 0);
+ tr_free (in);
+ tr_free (out);
+
+ out = tr_base64_encode_ (buf, j, &len);
+ check_int_eq ((j + 2) / 3 * 4, len);
in = tr_base64_decode (out, len, &len);
check_int_eq (j, len);
check (memcmp (in, buf, len) == 0);
out = tr_base64_encode_str (buf, &len);
check_int_eq ((j + 2) / 3 * 4, len);
+ in = tr_base64_decode_str_ (out, &len);
+ check_int_eq (j, len);
+ check_streq (in, buf);
+ tr_free (in);
+ tr_free (out);
+
+ out = tr_base64_encode_str_ (buf, &len);
+ check_int_eq ((j + 2) / 3 * 4, len);
in = tr_base64_decode_str (out, &len);
check_int_eq (j, len);
check_streq (in, buf);