summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-02-13 03:19:17 -0600
committerKamil Kaminski <kamilkss@gmail.com>2011-02-13 03:19:17 -0600
commit2cf68a5a02f025ce163f99908bd2b768692ad673 (patch)
tree2f43f741606440e06b4123d59858b3cd226c2cdd
parent6b9ca0f16a0a4b6eca1a2f7c1ee000de2289aa93 (diff)
downloadsandbox-2cf68a5a02f025ce163f99908bd2b768692ad673.tar.gz
sandbox-2cf68a5a02f025ce163f99908bd2b768692ad673.tar.bz2
sandbox-2cf68a5a02f025ce163f99908bd2b768692ad673.zip
add few more files
-rw-r--r--Makefile2
-rw-r--r--keygen_args.c2
-rw-r--r--miller_rabin.c80
-rw-r--r--prime_mask.c23
4 files changed, 105 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 4a52efa..5c2f6c5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
BINS = ascii class depipe_strings dup fpipe pipe realloc strpbrk strsep \
- tokenizer getopt
+ tokenizer getopt prime_mask
CC = gcc
DBGFLAGS = -g -O0
ifdef DEBUG
diff --git a/keygen_args.c b/keygen_args.c
index 6c12e9c..2eafa5f 100644
--- a/keygen_args.c
+++ b/keygen_args.c
@@ -70,7 +70,7 @@ int keygen_args(int argc, char **argv)
if (opt_args == 2)
{
pubkey = strdup(argv[fname_arg]);
- prikey = strdup(argv[fname_arg+1]);
+ prikey = strdup(argv[fname_arg+1]);
}
else if (fname_f) /* opt_args equals 0 here */
{
diff --git a/miller_rabin.c b/miller_rabin.c
new file mode 100644
index 0000000..3794ee6
--- /dev/null
+++ b/miller_rabin.c
@@ -0,0 +1,80 @@
+/* Source:
+ * http://en.literateprograms.org/Miller-Rabin_primality_test_%28C%29
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define COMPOSITE 0
+#define PRIME 1
+
+unsigned short modular_exponent_16(unsigned short base, unsigned short power,
+ unsigned short modulus)
+{
+ unsigned long result = 1;
+
+ int i;
+ for (i = 15; i >= 0; i--)
+ {
+ result = (result*result) % modulus;
+
+ if (power & (1 << i))
+ result = (result*base) % modulus;
+ }
+
+ return (unsigned short) result; /* will not truncate since modulus is a unsigned short */
+}
+
+int miller_rabin_pass_16(unsigned short a, unsigned short n)
+{
+ unsigned short a_to_power, s, d, i;
+
+ s = 0;
+ d = n - 1;
+ while ((d % 2) == 0)
+ {
+ d /= 2;
+ s++;
+ }
+
+ a_to_power = modular_exponent_16(a, d, n);
+
+ if (a_to_power == 1)
+ return PRIME;
+
+ for (i = 0; i < s-1; i++)
+ {
+ if (a_to_power == n-1)
+ return PRIME;
+ a_to_power = modular_exponent_16(a_to_power, 2, n);
+ }
+
+ if (a_to_power == n-1)
+ return PRIME;
+
+ return COMPOSITE;
+}
+
+int miller_rabin_16(unsigned short n)
+{
+ if (n <= 1)
+ return COMPOSITE;
+ if (n == 2)
+ return PRIME;
+ if (miller_rabin_pass_16( 2, n) == PRIME &&
+ (n <= 7 || miller_rabin_pass_16( 7, n) == PRIME) &&
+ (n <= 61 || miller_rabin_pass_16(61, n) == PRIME))
+ return PRIME;
+ else
+ return COMPOSITE;
+}
+
+int main(int argc, char* argv[])
+{
+ unsigned short n = (unsigned short) atoi(argv[1]);
+ puts(miller_rabin_16(n) == PRIME ? "PRIME" : "COMPOSITE");
+
+ return 0;
+}
+
diff --git a/prime_mask.c b/prime_mask.c
new file mode 100644
index 0000000..d6b02d0
--- /dev/null
+++ b/prime_mask.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define LOW_BIT_ON 1 << 0
+#define FIRST_TWO_BITS_ON 3 << ((sizeof(unsigned int) * 8) - 2)
+
+int main(int argc, char **argv)
+{
+ /* seed rand() */
+ srand((unsigned int ) time(NULL));
+
+ unsigned int x = rand();
+ printf("x before masking: %10u 0x%08x\n", x, x);
+
+ x |= LOW_BIT_ON;
+ x |= FIRST_TWO_BITS_ON;
+
+ printf("x after masking : %10u 0x%08x\n", x, x);
+
+ return 0;
+}
+