|
@@ -13,6 +13,7 @@
|
|
#ifdef CURVE25519_ENABLED
|
|
#ifdef CURVE25519_ENABLED
|
|
#include "crypto_curve25519.h"
|
|
#include "crypto_curve25519.h"
|
|
#endif
|
|
#endif
|
|
|
|
+#include "crypto_s2k.h"
|
|
|
|
|
|
extern const char AUTHORITY_SIGNKEY_3[];
|
|
extern const char AUTHORITY_SIGNKEY_3[];
|
|
extern const char AUTHORITY_SIGNKEY_A_DIGEST[];
|
|
extern const char AUTHORITY_SIGNKEY_A_DIGEST[];
|
|
@@ -696,7 +697,7 @@ test_crypto_formats(void)
|
|
|
|
|
|
|
|
|
|
static void
|
|
static void
|
|
-test_crypto_s2k(void)
|
|
+test_crypto_s2k_rfc2440(void)
|
|
{
|
|
{
|
|
char buf[29];
|
|
char buf[29];
|
|
char buf2[29];
|
|
char buf2[29];
|
|
@@ -727,6 +728,165 @@ test_crypto_s2k(void)
|
|
tor_free(buf3);
|
|
tor_free(buf3);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void
|
|
|
|
+run_s2k_tests(const unsigned flags, const unsigned type,
|
|
|
|
+ int speclen, const int keylen, int legacy)
|
|
|
|
+{
|
|
|
|
+ uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN];
|
|
|
|
+ int r;
|
|
|
|
+ size_t sz;
|
|
|
|
+ const char pw1[] = "You can't come in here unless you say swordfish!";
|
|
|
|
+ const char pw2[] = "Now, I give you one more guess.";
|
|
|
|
+
|
|
|
|
+ r = secret_to_key_new(buf, sizeof(buf), &sz,
|
|
|
|
+ pw1, strlen(pw1), flags);
|
|
|
|
+ tt_int_op(r, ==, S2K_OKAY);
|
|
|
|
+ tt_int_op(buf[0], ==, type);
|
|
|
|
+
|
|
|
|
+ tt_int_op(sz, ==, keylen + speclen);
|
|
|
|
+
|
|
|
|
+ if (legacy) {
|
|
|
|
+ memmove(buf, buf+1, sz-1);
|
|
|
|
+ --sz;
|
|
|
|
+ --speclen;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ tt_int_op(S2K_OKAY, ==,
|
|
|
|
+ secret_to_key_check(buf, sz, pw1, strlen(pw1)));
|
|
|
|
+
|
|
|
|
+ tt_int_op(S2K_BAD_SECRET, ==,
|
|
|
|
+ secret_to_key_check(buf, sz, pw2, strlen(pw2)));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ memset(buf3, 0, sizeof(buf3));
|
|
|
|
+ memcpy(buf2, buf+speclen, keylen);
|
|
|
|
+ memset(buf+speclen, 0, sz - speclen);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ tt_int_op(S2K_OKAY, ==,
|
|
|
|
+ secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1)));
|
|
|
|
+
|
|
|
|
+ tt_mem_op(buf2, ==, buf3, keylen);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ memset(buf2, 0, sizeof(buf2));
|
|
|
|
+ tt_int_op(S2K_OKAY, ==,
|
|
|
|
+ secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen,
|
|
|
|
+ pw1, strlen(pw1)));
|
|
|
|
+
|
|
|
|
+ tt_mem_op(buf2, !=, buf3, keylen);
|
|
|
|
+
|
|
|
|
+ memset(buf3, 0, sizeof(buf3));
|
|
|
|
+ tt_int_op(S2K_OKAY, ==,
|
|
|
|
+ secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen,
|
|
|
|
+ pw1, strlen(pw1)));
|
|
|
|
+ tt_mem_op(buf2, ==, buf3, sizeof(buf3));
|
|
|
|
+ tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen));
|
|
|
|
+
|
|
|
|
+ done:
|
|
|
|
+ ;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+test_crypto_s2k_general(void *arg)
|
|
|
|
+{
|
|
|
|
+ const char *which = arg;
|
|
|
|
+
|
|
|
|
+ if (!strcmp(which, "scrypt")) {
|
|
|
|
+ run_s2k_tests(0, 2, 19, 32, 0);
|
|
|
|
+ } else if (!strcmp(which, "scrypt-low")) {
|
|
|
|
+ run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0);
|
|
|
|
+ } else if (!strcmp(which, "pbkdf2")) {
|
|
|
|
+ run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0);
|
|
|
|
+ } else if (!strcmp(which, "rfc2440")) {
|
|
|
|
+ run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0);
|
|
|
|
+ } else if (!strcmp(which, "rfc2440-legacy")) {
|
|
|
|
+ run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1);
|
|
|
|
+ } else {
|
|
|
|
+ tt_fail();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+test_crypto_s2k_errors(void *arg)
|
|
|
|
+{
|
|
|
|
+ uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN];
|
|
|
|
+ size_t sz;
|
|
|
|
+
|
|
|
|
+ (void)arg;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ tt_int_op(S2K_BAD_LEN, ==,
|
|
|
|
+ secret_to_key_derivekey(buf, sizeof(buf),
|
|
|
|
+ (const uint8_t*)"", 0, "ABC", 3));
|
|
|
|
+ tt_int_op(S2K_BAD_ALGORITHM, ==,
|
|
|
|
+ secret_to_key_derivekey(buf, sizeof(buf),
|
|
|
|
+ (const uint8_t*)"\x10", 1, "ABC", 3));
|
|
|
|
+ tt_int_op(S2K_BAD_LEN, ==,
|
|
|
|
+ secret_to_key_derivekey(buf, sizeof(buf),
|
|
|
|
+ (const uint8_t*)"\x01\x02", 2, "ABC", 3));
|
|
|
|
+
|
|
|
|
+ tt_int_op(S2K_BAD_LEN, ==,
|
|
|
|
+ secret_to_key_check((const uint8_t*)"", 0, "ABC", 3));
|
|
|
|
+ tt_int_op(S2K_BAD_ALGORITHM, ==,
|
|
|
|
+ secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3));
|
|
|
|
+ tt_int_op(S2K_BAD_LEN, ==,
|
|
|
|
+ secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ memset(buf, 0, sizeof(buf));
|
|
|
|
+ buf[0] = 2;
|
|
|
|
+ tt_int_op(S2K_BAD_LEN, ==,
|
|
|
|
+ secret_to_key_derivekey(buf2, sizeof(buf2),
|
|
|
|
+ buf, sizeof(buf), "ABC", 3));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#ifdef HAVE_LIBSCRYPT_H
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 50, &sz,
|
|
|
|
+ "ABC", 3, 0));
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 50, &sz,
|
|
|
|
+ "ABC", 3, S2K_FLAG_LOW_MEM));
|
|
|
|
+#endif
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 37, &sz,
|
|
|
|
+ "ABC", 3, S2K_FLAG_USE_PBKDF2));
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 29, &sz,
|
|
|
|
+ "ABC", 3, S2K_FLAG_NO_SCRYPT));
|
|
|
|
+
|
|
|
|
+#ifdef HAVE_LIBSCRYPT_H
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 18, 0));
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 18,
|
|
|
|
+ S2K_FLAG_LOW_MEM));
|
|
|
|
+#endif
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 17,
|
|
|
|
+ S2K_FLAG_USE_PBKDF2));
|
|
|
|
+ tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 9,
|
|
|
|
+ S2K_FLAG_NO_SCRYPT));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ * int32_t. */
|
|
|
|
+ memset(buf, 0, sizeof(buf));
|
|
|
|
+ buf[0] = 1;
|
|
|
|
+ buf[17] = 100;
|
|
|
|
+ tt_int_op(S2K_BAD_PARAMS, ==,
|
|
|
|
+ secret_to_key_derivekey(buf2, sizeof(buf2),
|
|
|
|
+ buf, 18, "ABC", 3));
|
|
|
|
+
|
|
|
|
+#ifdef HAVE_LIBSCRYPT_H
|
|
|
|
+
|
|
|
|
+ memset(buf, 0, sizeof(buf));
|
|
|
|
+ buf[0] = 2;
|
|
|
|
+ buf[17] = 100;
|
|
|
|
+ tt_int_op(S2K_BAD_PARAMS, ==,
|
|
|
|
+ secret_to_key_derivekey(buf2, sizeof(buf2),
|
|
|
|
+ buf, 19, "ABC", 3));
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ done:
|
|
|
|
+ ;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
static void
|
|
static void
|
|
test_crypto_aes_iv(void *arg)
|
|
test_crypto_aes_iv(void *arg)
|
|
@@ -1288,7 +1448,20 @@ struct testcase_t crypto_tests[] = {
|
|
{ "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL },
|
|
{ "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL },
|
|
CRYPTO_LEGACY(digests),
|
|
CRYPTO_LEGACY(digests),
|
|
CRYPTO_LEGACY(dh),
|
|
CRYPTO_LEGACY(dh),
|
|
- CRYPTO_LEGACY(s2k),
|
|
+ CRYPTO_LEGACY(s2k_rfc2440),
|
|
|
|
+#ifdef HAVE_LIBSCRYPT_H
|
|
|
|
+ { "s2k_scrypt", test_crypto_s2k_general, 0, &pass_data,
|
|
|
|
+ (void*)"scrypt" },
|
|
|
|
+ { "s2k_scrypt_low", test_crypto_s2k_general, 0, &pass_data,
|
|
|
|
+ (void*)"scrypt-low" },
|
|
|
|
+#endif
|
|
|
|
+ { "s2k_pbkdf2", test_crypto_s2k_general, 0, &pass_data,
|
|
|
|
+ (void*)"pbkdf2" },
|
|
|
|
+ { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &pass_data,
|
|
|
|
+ (void*)"rfc2440" },
|
|
|
|
+ { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &pass_data,
|
|
|
|
+ (void*)"rfc2440-legacy" },
|
|
|
|
+ { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL },
|
|
{ "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"aes" },
|
|
{ "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"aes" },
|
|
{ "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"evp" },
|
|
{ "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"evp" },
|
|
CRYPTO_LEGACY(base32_decode),
|
|
CRYPTO_LEGACY(base32_decode),
|