Compare commits
No commits in common. "88def95e47ace9fbb4215e91b420e74c7bdfd871" and "8745c2226896daee95695931d2ed0bdb806ba818" have entirely different histories.
88def95e47
...
8745c22268
3 changed files with 27 additions and 16 deletions
|
@ -6,4 +6,3 @@ ColumnLimit: 80 # Wrap lines after 80 characters
|
||||||
AllowShortLoopsOnASingleLine: true
|
AllowShortLoopsOnASingleLine: true
|
||||||
AlwaysBreakTemplateDeclarations: true
|
AlwaysBreakTemplateDeclarations: true
|
||||||
BreakConstructorInitializers: BeforeComma
|
BreakConstructorInitializers: BeforeComma
|
||||||
AllowShortIfStatementsOnASingleLine: true
|
|
||||||
|
|
2
assert.h
2
assert.h
|
@ -3,7 +3,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define ASSERT(expr) \
|
#define ASSERT(expr) \
|
||||||
do { \
|
do { \
|
||||||
if (!(expr)) { \
|
if (!(expr)) { \
|
||||||
printf("ASSERTION FAILED: %s at %s:%d\n", #expr, __FILE__, \
|
printf("ASSERTION FAILED: %s at %s:%d\n", #expr, __FILE__, \
|
||||||
|
|
40
rsa.c
40
rsa.c
|
@ -7,16 +7,20 @@ u64 gcd(u64 a, u64 b) { return extended_euclid(a, b, NULL, NULL); }
|
||||||
|
|
||||||
u64 extended_euclid(u64 a, u64 b, u64 *x, u64 *y) {
|
u64 extended_euclid(u64 a, u64 b, u64 *x, u64 *y) {
|
||||||
if (b == 0) {
|
if (b == 0) {
|
||||||
if (x) *x = 1;
|
if (x)
|
||||||
if (y) *y = 0;
|
*x = 1;
|
||||||
|
if (y)
|
||||||
|
*y = 0;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 x1, y1;
|
u64 x1, y1;
|
||||||
u64 gcd = extended_euclid(b, a % b, &x1, &y1);
|
u64 gcd = extended_euclid(b, a % b, &x1, &y1);
|
||||||
|
|
||||||
if (x) *x = y1;
|
if (x)
|
||||||
if (y) *y = x1 - (a / b) * y1;
|
*x = y1;
|
||||||
|
if (y)
|
||||||
|
*y = x1 - (a / b) * y1;
|
||||||
|
|
||||||
return gcd;
|
return gcd;
|
||||||
}
|
}
|
||||||
|
@ -52,8 +56,8 @@ u64 mulmod(u64 a, u64 b, u64 m) {
|
||||||
if (b & 1) {
|
if (b & 1) {
|
||||||
result = (result + a) % m;
|
result = (result + a) % m;
|
||||||
}
|
}
|
||||||
a = (a * 2) % m; // Double a, keep it within the modulus
|
a = (a * 2) % m; // Double a, keep it within the modulus
|
||||||
b >>= 1; // Right shift b (divide by 2)
|
b >>= 1; // Right shift b (divide by 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -82,17 +86,20 @@ u64 gen_prime(u64 min, u64 max) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_prime(u64 n) {
|
bool is_prime(u64 n) {
|
||||||
if (n < 2) return false;
|
if (n < 2)
|
||||||
|
return false;
|
||||||
|
|
||||||
for (int i = 2; i < n / 2 + 1; i++) {
|
for (int i = 2; i < n / 2 + 1; i++) {
|
||||||
if (n % i == 0) return false;
|
if (n % i == 0)
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool miller_rabin(u64 n, u64 k) {
|
bool miller_rabin(u64 n, u64 k) {
|
||||||
if (n < 2) return false;
|
if (n < 2)
|
||||||
|
return false;
|
||||||
|
|
||||||
u64 d = n - 1;
|
u64 d = n - 1;
|
||||||
u64 s = 0;
|
u64 s = 0;
|
||||||
|
@ -106,14 +113,17 @@ bool miller_rabin(u64 n, u64 k) {
|
||||||
u64 a = prand_range(2, n - 2);
|
u64 a = prand_range(2, n - 2);
|
||||||
u64 x = modexp(a, d, n);
|
u64 x = modexp(a, d, n);
|
||||||
|
|
||||||
if (x == 1 || x == n - 1) continue;
|
if (x == 1 || x == n - 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (u64 r = 1; r < s; r++) {
|
for (u64 r = 1; r < s; r++) {
|
||||||
x = modexp(x, 2, n);
|
x = modexp(x, 2, n);
|
||||||
if (x == n - 1) break;
|
if (x == n - 1)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x != n - 1) return false; // Not prime
|
if (x != n - 1)
|
||||||
|
return false; // Not prime
|
||||||
}
|
}
|
||||||
|
|
||||||
return true; // Likely prime
|
return true; // Likely prime
|
||||||
|
@ -124,7 +134,8 @@ u64 mod_inverse(u64 a, u64 m) {
|
||||||
u64 y = 0, x = 1;
|
u64 y = 0, x = 1;
|
||||||
|
|
||||||
// Modular inverse does not exist when m is 1
|
// Modular inverse does not exist when m is 1
|
||||||
if (m == 1) return 0;
|
if (m == 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
while (a > 1) {
|
while (a > 1) {
|
||||||
// q is quotient
|
// q is quotient
|
||||||
|
@ -142,7 +153,8 @@ u64 mod_inverse(u64 a, u64 m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make x positive
|
// Make x positive
|
||||||
if (x < 0) x += m0;
|
if (x < 0)
|
||||||
|
x += m0;
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue