From bfcbb77570ae615e4d5f14a2d8f2af61ef2080ac Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 14 Feb 2025 06:20:41 +0100 Subject: [PATCH] Remove junk, add testing and assertions --- main.c | 80 ++++++++++++++++------------------------------------------ 1 file changed, 22 insertions(+), 58 deletions(-) diff --git a/main.c b/main.c index d503654..28a423d 100644 --- a/main.c +++ b/main.c @@ -8,6 +8,7 @@ #define LED_PIN PD6 #define RANDOM +#define W 16 void exit_blink() { for (int i = 0; i < 4; i++) { @@ -60,88 +61,51 @@ int main() { enter_blink(); -#ifdef RANDOM -#define W 16 - const int64_t p = gen_prime(1 << (W - 1), 1 << W); + test_mulmod(); + test_modexp(); - int64_t qprev = p; + const u64 p = gen_prime(1 << (W - 1), 1 << W); + printf("P: %u\n", (u32)p); + + u64 qprev = p; while (p == qprev) qprev = gen_prime(1 << (W - 1), 1 << W); - const i64 q = qprev; -#undef W -#else - int64_t p = 56857; - int64_t q = 47963; -#endif + const u64 q = qprev; + printf("Q: %u\n", (u32)q); - int64_t n = p * q; - int64_t phi_n = (p - 1) * (q - 1); + ASSERT(gcd(p - 1, PUBEXP) == 1); + ASSERT(gcd(q - 1, PUBEXP) == 1); - // 'e' is public. E for encrypt. - int64_t e = 0; - do { - e = prand_range(3, phi_n - 1); - } while (gcd(e, phi_n) != 1); + u64 n = p * q; + printf("N: %u\n", (u32)n); - // 'd' is our private key. D as in decrypt - int64_t d = mod_inverse(e, phi_n); + u64 phi_n = (p - 1) * (q - 1); + printf("Phi_N: %u\n", (u32)phi_n); + + u64 d = mod_inverse(PUBEXP, phi_n); + printf("D: %u\n", (u32)d); if (d == 0 || d == 1) { printf("Modular inverse not found..."); - while (1); } - { - char test = 'o'; - u64 enc = modexp(test, e, n); - char dec = (char)modexp(enc, d, n); - - if (dec != test) { - printf("ERROR: %c != %c => %d != %d\n", test, dec, test, dec); - // while (1); - } - } - { - char test = 'c'; - - u64 p = 3, q = 11; - u64 n = p * q; - u64 e = 7; - u64 d = 3; - u64 enc = modexp(test, e, n); - char dec = (char)modexp(enc, d, n); - - if (dec != test) { - printf("ERROR: %c != %c => %d != %d\n", test, dec, test, dec); - } else - printf("INFO: %c == %c => %d == %d\n", test, dec, test, dec); - } + ASSERT_EQ(mulmod(PUBEXP, d, phi_n), 1); char msg[] = "Hello"; - int64_t coded[sizeof(msg)] = {0}; + u64 coded[sizeof(msg)] = {0}; char decoded[sizeof(msg)] = {0}; // Encode the message for (int i = 0; i < strlen(msg); i++) { - coded[i] = modexp((int64_t)msg[i], e, n); + coded[i] = modexp((u64)msg[i], PUBEXP, n); } // Decode the message for (int i = 0; i < strlen(msg); i++) { - int64_t dec = modexp(coded[i], d, n); + u64 dec = modexp(coded[i], d, n); decoded[i] = dec & 0xFF; } - test_mulmod(); - test_modexp(); - { - printf("P: %u\n", (uint32_t)p); - printf("Q: %u\n", (uint32_t)q); - printf("N: %u\n", (uint32_t)n); - printf("Phi_N: %u\n", (uint32_t)phi_n); - printf("Pubkey (e): %u\n", (uint32_t)e); - printf("Privkey (d): %u\n", (uint32_t)d); - printf("Message: %s\n", msg); printf("Decoded: %s\n", decoded);