commit 89a3585c7f3a1a5d10e036050111255e21856058 from: Evan Burkey date: Mon May 6 00:05:12 2024 UTC add hamming_distance commit - c81c8bfa3cdcf805bce8a7fa5f3b24633a617edc commit + 89a3585c7f3a1a5d10e036050111255e21856058 blob - d99342714d356f7522a5bbfa60dc07a705eae98d blob + e3833e976756f9493549228401d6381208d33932 --- docs/crypto.md +++ docs/crypto.md @@ -92,8 +92,16 @@ const unsigned char *repeating_key_xor_s(const char* s ### hamming_distance +Calculates the Hamming Distance (the number of differing bits) between two arrays of unsigned bytes + +```c +unsigned int hamming_distance(unsigned char *a, unsigned char *b); +``` + +### hamming_distance_s + Calculates the Hamming Distance (the number of differing bits) between two strings ```c -unsigned int hamming_distance(const char *a, const char *b); +unsigned int hamming_distance_s(const char *a, const char *b); ``` blob - 7492841f711f95664274e86ed0b5b09fdec228b2 blob + 29c64bdbce1d9efd5c8a3483d49bb07f307a2612 --- include/lfcrypto.h +++ include/lfcrypto.h @@ -13,6 +13,7 @@ const char *hex_to_str(const unsigned char *hex, size_ const unsigned char* repeating_key_xor(const unsigned char* s, size_t s_sz, const unsigned char* key, size_t k_sz); const unsigned char *repeating_key_xor_s(const char* s, const char* key); -unsigned int hamming_distance(const char *a, const char *b); +unsigned int hamming_distance_s(const char *a, const char *b); +unsigned int hamming_distance(unsigned char *a, unsigned char *b, size_t sz); #endif // LIBFLINT_CRYPTO_H blob - ac04bdf6dd1f0e1aad801618db5d6ef3e5b87cae blob + d0cfea920978a4bc0a5254e3bcb8d94bbd0dbc88 --- src/crypto.c +++ src/crypto.c @@ -272,12 +272,16 @@ const unsigned char *repeating_key_xor_s(const char* s return repeating_key_xor((unsigned char*)s, strlen(s), (unsigned char*)key, strlen(key)); } -unsigned int hamming_distance(const char *a, const char *b) { +unsigned int hamming_distance_s(const char *a, const char *b) { size_t sz = strlen(a); if (sz != strlen(b)) { return -1; } + return hamming_distance((unsigned char *)a, (unsigned char *)b, sz); +} + +unsigned int hamming_distance(unsigned char *a, unsigned char *b, size_t sz) { unsigned int hamming = 0; for (size_t i = 0; i < sz; ++i) { if (a[i] == b[i]) { blob - e8d4ddfa9858cdc34b8946285ddd62caa2bd6f0f blob + 541550ed203d975a79e17157c67a45991f80cbba --- tests/tests.c +++ tests/tests.c @@ -374,7 +374,12 @@ void test_crypto() { free(enc); free(s); - unsigned int hamming = hamming_distance("this is a test", "wokka wokka!!!"); + unsigned char ua[2] = { 0x2, 0xF }; + unsigned char ub[2] = { 0x4, 0xE }; + unsigned int hamming = hamming_distance(ua, ub, 2); + assert(hamming == 3); + + hamming = hamming_distance_s("this is a test", "wokka wokka!!!"); assert(hamming == 37); printf("Passes all crypto tests\n");