Edit

kc3-lang/kc3/test/crypt_test.c

Branch :

  • test/crypt_test.c
  • #include <string.h>
    #include "../libkc3/crypt.h"
    #include "../libkc3/str.h"
    #include "test.h"
    
    #define CRYPT_TEST_CHECK_PASSWORD(password, stored_hash, expected)      \
      do {                                                               \
        s_str pass;                                                      \
        bool result = ! (expected);                                      \
        str_init_1(&pass, NULL, password);                                \
        TEST_EQ(crypt_check_password(&pass, stored_hash, &result),          \
                &result);                                                \
        TEST_EQ(result, expected);                                       \
      } while (0)
    
    static const char g_crypt_test_password[] =
      "Xy01@#\x01\x02\x80\x7f\xff\r\n\x81\t !";
    static const char g_crypt_test_hash[] =
      "$6$rounds=1234$abc0123456789$"
      "BCpt8zLrc/RcyuXmCDOE1ALqMXB2MH6n1g891HhFj8.w7LxGv.FTkqq6Vxc/"
      "km3Y0jE0j24jY5PIv/oOu6reg1";
    
    TEST_CASE_PROTOTYPE(crypt_check_password_match);
    TEST_CASE_PROTOTYPE(crypt_check_password_mismatch);
    TEST_CASE_PROTOTYPE(crypt_check_password_modified_hash);
    TEST_CASE_PROTOTYPE(crypt_check_password_hash_length);
    TEST_CASE_PROTOTYPE(crypt_hash_password);
    
    void crypt_test (void)
    {
      TEST_CASE_RUN(crypt_check_password_match);
      TEST_CASE_RUN(crypt_check_password_mismatch);
      TEST_CASE_RUN(crypt_check_password_modified_hash);
      TEST_CASE_RUN(crypt_check_password_hash_length);
      TEST_CASE_RUN(crypt_hash_password);
    }
    
    TEST_CASE(crypt_check_password_match)
    {
      s_str hash;
      str_init_1(&hash, NULL, g_crypt_test_hash);
      CRYPT_TEST_CHECK_PASSWORD(g_crypt_test_password, &hash, true);
    }
    TEST_CASE_END(crypt_check_password_match)
    
    TEST_CASE(crypt_check_password_mismatch)
    {
      s_str hash;
      str_init_1(&hash, NULL, g_crypt_test_hash);
      CRYPT_TEST_CHECK_PASSWORD("wrong password", &hash, false);
      CRYPT_TEST_CHECK_PASSWORD("", &hash, false);
    }
    TEST_CASE_END(crypt_check_password_mismatch)
    
    TEST_CASE(crypt_check_password_modified_hash)
    {
      s_str hash;
      uw i;
      char saved;
      char value[sizeof(g_crypt_test_hash)];
      memcpy(value, g_crypt_test_hash, sizeof(value));
      str_init_1(&hash, NULL, value);
      i = sizeof("$6$rounds=1234$abc0123456789$") - 1;
      while (i < hash.size) {
        saved = value[i];
        value[i] = saved == '.' ? '/' : '.';
        CRYPT_TEST_CHECK_PASSWORD(g_crypt_test_password, &hash, false);
        value[i] = saved;
        i++;
      }
    }
    TEST_CASE_END(crypt_check_password_modified_hash)
    
    TEST_CASE(crypt_check_password_hash_length)
    {
      s_str hash;
      s_str suffix = {{NULL}, 1, {"x"}};
      s_str extended;
      str_init_1(&hash, NULL, "$6$rounds=1234$abc0123456789$");
      CRYPT_TEST_CHECK_PASSWORD(g_crypt_test_password, &hash, false);
      str_init_1(&hash, NULL, g_crypt_test_hash);
      hash.size--;
      CRYPT_TEST_CHECK_PASSWORD(g_crypt_test_password, &hash, false);
      hash.size++;
      TEST_ASSERT(str_init_concatenate(&extended, &hash, &suffix));
      CRYPT_TEST_CHECK_PASSWORD(g_crypt_test_password, &extended, false);
      str_clean(&extended);
    }
    TEST_CASE_END(crypt_check_password_hash_length)
    
    TEST_CASE(crypt_hash_password)
    {
      s_str hash;
      s_str pass;
      str_init_1(&pass, NULL, "KC3 test password");
      TEST_ASSERT(crypt_hash_password(&pass, &hash));
      CRYPT_TEST_CHECK_PASSWORD("KC3 test password", &hash, true);
      CRYPT_TEST_CHECK_PASSWORD("wrong password", &hash, false);
      str_clean(&hash);
    }
    TEST_CASE_END(crypt_hash_password)