From 89a3585c7f3a1a5d10e036050111255e21856058 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Sun, 5 May 2024 17:05:12 -0700 Subject: [PATCH] add hamming_distance --- docs/crypto.md | 10 +++++++++- include/lfcrypto.h | 3 ++- src/crypto.c | 6 +++++- tests/tests.c | 7 ++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/docs/crypto.md b/docs/crypto.md index d993427..e3833e9 100644 --- a/docs/crypto.md +++ b/docs/crypto.md @@ -92,8 +92,16 @@ const unsigned char *repeating_key_xor_s(const char* s, const char* key); ### 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); ``` diff --git a/include/lfcrypto.h b/include/lfcrypto.h index 7492841..29c64bd 100644 --- a/include/lfcrypto.h +++ b/include/lfcrypto.h @@ -13,6 +13,7 @@ const char *hex_to_str(const unsigned char *hex, size_t sz); 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 diff --git a/src/crypto.c b/src/crypto.c index ac04bdf..d0cfea9 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -272,12 +272,16 @@ const unsigned char *repeating_key_xor_s(const char* s, const char* key) { 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]) { diff --git a/tests/tests.c b/tests/tests.c index e8d4ddf..541550e 100644 --- a/tests/tests.c +++ b/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");