raw
smg_comms_c_wrappers    1 #include "smg_rsa.h"
smg_comms_c_wrappers 2 #include "mpi.h"
smg_comms_c_wrappers 3
smg_comms_c_wrappers 4 #include <stdlib.h>
smg_comms_c_wrappers 5 #include <unistd.h>
smg_comms_c_wrappers 6 #include <time.h>
smg_comms_c_wrappers 7 #include <stdio.h>
smg_comms_c_wrappers 8
smg_comms_c_wrappers 9 extern void adainit(void);
smg_comms_c_wrappers 10 extern void adafinal(void);
smg_comms_c_wrappers 11
smg_comms_c_wrappers 12 void err(char *msg)
smg_comms_c_wrappers 13 {
smg_comms_c_wrappers 14 fprintf(stderr, "%s\n", msg);
smg_comms_c_wrappers 15 exit(1);
smg_comms_c_wrappers 16 }
smg_comms_c_wrappers 17
smg_comms_c_wrappers 18 void time_entropy_source(int nruns, int noctets) {
smg_comms_c_wrappers 19 unsigned char buffer[noctets];
smg_comms_c_wrappers 20 int read, i;
smg_comms_c_wrappers 21 struct timespec tstart, tend;
smg_comms_c_wrappers 22 long int diff;
smg_comms_c_wrappers 23
smg_comms_c_wrappers 24 clock_gettime(CLOCK_MONOTONIC, &tstart);
smg_comms_c_wrappers 25 for (i=0; i<nruns; i++) {
smg_comms_c_wrappers 26 read = get_random_octets(noctets,buffer);
smg_comms_c_wrappers 27 if (read != noctets)
smg_comms_c_wrappers 28 err("Failed reading from entropy source!");
smg_comms_c_wrappers 29 }
smg_comms_c_wrappers 30 clock_gettime(CLOCK_MONOTONIC, &tend);
smg_comms_c_wrappers 31
smg_comms_c_wrappers 32 diff = tend.tv_sec-tstart.tv_sec;
smg_comms_c_wrappers 33 double kbps = (nruns*noctets) / (diff*1000.0);
smg_comms_c_wrappers 34 printf("ENTROPY source timing: %d kB in %ld seconds, at an average speed of %f kB/s over %d runs of %d octets each\n", nruns*noctets, diff, kbps, nruns, noctets);
smg_comms_c_wrappers 35 }
smg_comms_c_wrappers 36
smg_comms_c_wrappers 37 void test_entropy_output(unsigned int noctets, char * filename) {
smg_comms_c_wrappers 38 FILE * out;
smg_comms_c_wrappers 39 int source;
smg_comms_c_wrappers 40 unsigned int nread, total_read, to_read;
smg_comms_c_wrappers 41 const int buffer_length = 1000;
smg_comms_c_wrappers 42 unsigned char buffer[buffer_length];
smg_comms_c_wrappers 43
smg_comms_c_wrappers 44 source = open_entropy_source(ENTROPY_SOURCE);
smg_comms_c_wrappers 45 if (source <= 0)
smg_comms_c_wrappers 46 err("unable to access entropy source!");
smg_comms_c_wrappers 47
smg_comms_c_wrappers 48 out = fopen(filename, "wb");
smg_comms_c_wrappers 49 if ( !out )
smg_comms_c_wrappers 50 err("unable to open output file for test_entropy_output!");
smg_comms_c_wrappers 51
smg_comms_c_wrappers 52 printf("TEST_ENTROPY_SOURCE: reading %u octets from %s ", noctets, ENTROPY_SOURCE);
smg_comms_c_wrappers 53 total_read = 0;
smg_comms_c_wrappers 54 while (total_read < noctets) {
smg_comms_c_wrappers 55 to_read = noctets - total_read;
smg_comms_c_wrappers 56 if (to_read > buffer_length)
smg_comms_c_wrappers 57 to_read = buffer_length;
smg_comms_c_wrappers 58
smg_comms_c_wrappers 59 nread = get_random_octets_from(to_read, buffer, source);
smg_comms_c_wrappers 60 if (nread > 0) {
smg_comms_c_wrappers 61 total_read = total_read + nread;
smg_comms_c_wrappers 62 fwrite(buffer, 1, nread, out);
smg_comms_c_wrappers 63 fflush(out);
smg_comms_c_wrappers 64 printf(".");
smg_comms_c_wrappers 65 fflush(stdout);
smg_comms_c_wrappers 66 }
smg_comms_c_wrappers 67 }
smg_comms_c_wrappers 68 printf("done.\n");
smg_comms_c_wrappers 69
smg_comms_c_wrappers 70 fclose(out);
smg_comms_c_wrappers 71 close(source);
smg_comms_c_wrappers 72 }
smg_comms_c_wrappers 73
smg_comms_c_wrappers 74 void test_is_composite(int nruns, char *hex_number, int expected) {
smg_comms_c_wrappers 75 int i;
smg_comms_c_wrappers 76 int output;
smg_comms_c_wrappers 77 int count_ok = 0;
smg_comms_c_wrappers 78 int source = open_entropy_source(ENTROPY_SOURCE);
smg_comms_c_wrappers 79 MPI p = mpi_alloc(0);
smg_comms_c_wrappers 80
smg_comms_c_wrappers 81 mpi_fromstr(p, hex_number);
smg_comms_c_wrappers 82 printf("TEST is_composite on MPI(hex) ");
smg_comms_c_wrappers 83 mpi_print(stdout, p, 1);
smg_comms_c_wrappers 84 for (i=0; i < nruns; i++) {
smg_comms_c_wrappers 85 printf(".");
smg_comms_c_wrappers 86 fflush(stdout);
smg_comms_c_wrappers 87 output = is_composite(p, M_R_ITERATIONS, source);
smg_comms_c_wrappers 88 if (output == expected)
smg_comms_c_wrappers 89 count_ok = count_ok + 1;
smg_comms_c_wrappers 90 }
smg_comms_c_wrappers 91 printf("done, with %d out of %d correct runs for expected=%d: %s\n", count_ok, nruns, expected, count_ok==nruns? "PASS":"FAIL");
smg_comms_c_wrappers 92 mpi_free(p);
smg_comms_c_wrappers 93 close(source);
smg_comms_c_wrappers 94 }
smg_comms_c_wrappers 95
smg_comms_c_wrappers 96 void time_mr(int nruns) {
smg_comms_c_wrappers 97 struct timespec tstart, tend;
smg_comms_c_wrappers 98 long int diff;
smg_comms_c_wrappers 99 int i;
smg_comms_c_wrappers 100 MPI prime;
smg_comms_c_wrappers 101 unsigned int noctets = KEY_LENGTH_OCTETS / 2;
smg_comms_c_wrappers 102 unsigned int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
smg_comms_c_wrappers 103
smg_comms_c_wrappers 104 int entropy_source = open_entropy_source(ENTROPY_SOURCE);
smg_comms_c_wrappers 105 if (entropy_source <= 0)
smg_comms_c_wrappers 106 err("can't open entropy source!");
smg_comms_c_wrappers 107
smg_comms_c_wrappers 108 /* first generate a prime of half key length, to make sure M-R will run max number of iterations */
smg_comms_c_wrappers 109 printf("Generating a prime number of %d octets length for M-R timing test\n", noctets);
smg_comms_c_wrappers 110 prime = mpi_alloc(nlimbs);
smg_comms_c_wrappers 111 gen_random_prime(noctets, prime);
smg_comms_c_wrappers 112
smg_comms_c_wrappers 113 printf("Running timing test for Miller-Rabin with %d repetitions and %d witnesses on prime number ", nruns, M_R_ITERATIONS);
smg_comms_c_wrappers 114 mpi_print(stdout, prime, 1);
smg_comms_c_wrappers 115 printf("\n");
smg_comms_c_wrappers 116 /* now do the actual runs and time it all */
smg_comms_c_wrappers 117 clock_gettime(CLOCK_MONOTONIC, &tstart);
smg_comms_c_wrappers 118 for (i=0; i<nruns; i++) {
smg_comms_c_wrappers 119 if (is_composite(prime, M_R_ITERATIONS, entropy_source))
smg_comms_c_wrappers 120 printf("FAIL");
smg_comms_c_wrappers 121 else printf(".");
smg_comms_c_wrappers 122 fflush(stdout);
smg_comms_c_wrappers 123 }
smg_comms_c_wrappers 124 clock_gettime(CLOCK_MONOTONIC, &tend);
smg_comms_c_wrappers 125
smg_comms_c_wrappers 126 diff = tend.tv_sec-tstart.tv_sec;
smg_comms_c_wrappers 127 printf("\nTimings on prime number %d octets long, %d runs of MR with %d iterations (witnesses checked) each\n", \
smg_comms_c_wrappers 128 noctets, nruns, M_R_ITERATIONS);
smg_comms_c_wrappers 129 printf("Total time: %ld seconds\nTime per MR run: %f seconds\nTime per MR iteration: %f seconds\n",\
smg_comms_c_wrappers 130 diff, diff / (1.0*nruns), diff / (1.0*nruns * M_R_ITERATIONS));
smg_comms_c_wrappers 131
smg_comms_c_wrappers 132 mpi_free(prime);
smg_comms_c_wrappers 133 close(entropy_source);
smg_comms_c_wrappers 134 }
smg_comms_c_wrappers 135
smg_comms_c_wrappers 136 void test_rpng(int nruns) {
smg_comms_c_wrappers 137 unsigned int noctets = KEY_LENGTH_OCTETS / 2;
smg_comms_c_wrappers 138 unsigned int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
smg_comms_c_wrappers 139 int entropy_source = open_entropy_source(ENTROPY_SOURCE);
smg_comms_c_wrappers 140 if (entropy_source <= 0)
smg_comms_c_wrappers 141 err("can't open entropy source!");
smg_comms_c_wrappers 142
smg_comms_c_wrappers 143 MPI prime = mpi_alloc(nlimbs);
smg_comms_c_wrappers 144 int i;
smg_comms_c_wrappers 145
smg_comms_c_wrappers 146 printf("TEST: random prime number generator with %d runs\n", nruns);
smg_comms_c_wrappers 147 for (i = 0;i < nruns; i++) {
smg_comms_c_wrappers 148 gen_random_prime(noctets, prime);
smg_comms_c_wrappers 149 printf("Run %d: ", i+1);
smg_comms_c_wrappers 150 mpi_print(stdout, prime, 1);
smg_comms_c_wrappers 151 if (is_composite(prime, M_R_ITERATIONS, entropy_source))
smg_comms_c_wrappers 152 printf(" **FAIL**\n");
smg_comms_c_wrappers 153 else
smg_comms_c_wrappers 154 printf(" **PASS**\n");
smg_comms_c_wrappers 155 }
smg_comms_c_wrappers 156
smg_comms_c_wrappers 157 mpi_free(prime);
smg_comms_c_wrappers 158 close(entropy_source);
smg_comms_c_wrappers 159 }
smg_comms_c_wrappers 160
smg_comms_c_wrappers 161 void time_rpng(int nruns) {
smg_comms_c_wrappers 162 struct timespec tstart, tend;
smg_comms_c_wrappers 163 long int diff;
smg_comms_c_wrappers 164
smg_comms_c_wrappers 165 unsigned int noctets = KEY_LENGTH_OCTETS / 2;
smg_comms_c_wrappers 166 unsigned int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
smg_comms_c_wrappers 167
smg_comms_c_wrappers 168 int entropy_source = open_entropy_source(ENTROPY_SOURCE);
smg_comms_c_wrappers 169 if (entropy_source <= 0)
smg_comms_c_wrappers 170 err("can't open entropy source!");
smg_comms_c_wrappers 171
smg_comms_c_wrappers 172 MPI prime = mpi_alloc(nlimbs);
smg_comms_c_wrappers 173 int i;
smg_comms_c_wrappers 174
smg_comms_c_wrappers 175 printf("TIMING: random prime number generator with %d runs\n", nruns);
smg_comms_c_wrappers 176 clock_gettime(CLOCK_MONOTONIC, &tstart);
smg_comms_c_wrappers 177 for (i = 0;i < nruns; i++) {
smg_comms_c_wrappers 178 gen_random_prime(noctets, prime);
smg_comms_c_wrappers 179 }
smg_comms_c_wrappers 180 clock_gettime(CLOCK_MONOTONIC, &tend);
smg_comms_c_wrappers 181
smg_comms_c_wrappers 182 diff = tend.tv_sec-tstart.tv_sec;
smg_comms_c_wrappers 183
smg_comms_c_wrappers 184 printf("TOTAL: %ld seconds\n", diff);
smg_comms_c_wrappers 185 printf("Average: %f seconds to generate one random prime of %d octets length\n", diff / (1.0*nruns), noctets);
smg_comms_c_wrappers 186 mpi_free(prime);
smg_comms_c_wrappers 187 close(entropy_source);
smg_comms_c_wrappers 188 }
smg_comms_c_wrappers 189
smg_comms_c_wrappers 190 /* Test encryption+decryption on noctets of random data, using sk
smg_comms_c_wrappers 191 * Output is written to file.
smg_comms_c_wrappers 192 */
smg_comms_c_wrappers 193 void test_rsa_keys( RSA_secret_key *sk, unsigned int noctets, FILE *file ) {
smg_comms_c_wrappers 194 RSA_public_key pk;
smg_comms_c_wrappers 195 MPI test = mpi_alloc ( mpi_nlimb_hint_from_nbytes (noctets) );
smg_comms_c_wrappers 196 MPI out1 = mpi_alloc ( mpi_nlimb_hint_from_nbytes (noctets) );
smg_comms_c_wrappers 197 MPI out2 = mpi_alloc ( mpi_nlimb_hint_from_nbytes (noctets) );
smg_comms_c_wrappers 198
smg_comms_c_wrappers 199 pk.n = mpi_copy(sk->n);
smg_comms_c_wrappers 200 pk.e = mpi_copy(sk->e);
smg_comms_c_wrappers 201 unsigned char *p;
smg_comms_c_wrappers 202 p = xmalloc(noctets);
smg_comms_c_wrappers 203
smg_comms_c_wrappers 204 fprintf(file, "TEST encrypt/decrypt on %d octets of random data\n", noctets);
smg_comms_c_wrappers 205 fflush(file);
smg_comms_c_wrappers 206 if (get_random_octets( noctets, p) == noctets) {
smg_comms_c_wrappers 207 mpi_set_buffer( test, p, noctets, 0 );
smg_comms_c_wrappers 208
smg_comms_c_wrappers 209 fprintf(file, "TEST data:\n");
smg_comms_c_wrappers 210 mpi_print(file, test, 1);
smg_comms_c_wrappers 211 fprintf(file, "\n");
smg_comms_c_wrappers 212 fflush(file);
smg_comms_c_wrappers 213
smg_comms_c_wrappers 214 public_rsa( out1, test, &pk );
smg_comms_c_wrappers 215 secret_rsa( out2, out1, sk );
smg_comms_c_wrappers 216
smg_comms_c_wrappers 217 fprintf(file, "ENCRYPTED with PUBLIC key data:\n");
smg_comms_c_wrappers 218 mpi_print(file, out1, 1);
smg_comms_c_wrappers 219 fprintf(file, "\n");
smg_comms_c_wrappers 220 fflush(file);
smg_comms_c_wrappers 221
smg_comms_c_wrappers 222 fprintf(file, "DECRYPTED with SECRET key:\n");
smg_comms_c_wrappers 223 mpi_print(file, out2, 1);
smg_comms_c_wrappers 224 fprintf(file, "\n");
smg_comms_c_wrappers 225 fflush(file);
smg_comms_c_wrappers 226
smg_comms_c_wrappers 227 if( mpi_cmp( test, out2 ) )
smg_comms_c_wrappers 228 fprintf(file, "FAILED: RSA operation: public(secret) failed\n");
smg_comms_c_wrappers 229 else
smg_comms_c_wrappers 230 fprintf(file, "PASSED: RSA operation: public(secret) passed\n");
smg_comms_c_wrappers 231 fflush(file);
smg_comms_c_wrappers 232
smg_comms_c_wrappers 233 secret_rsa( out1, test, sk );
smg_comms_c_wrappers 234 public_rsa( out2, out1, &pk );
smg_comms_c_wrappers 235 if( mpi_cmp( test, out2 ) )
smg_comms_c_wrappers 236 fprintf(file, "FAILED: RSA operation: secret(public) failed\n");
smg_comms_c_wrappers 237 else
smg_comms_c_wrappers 238 fprintf(file, "PASSED: RSA operation: secret(public) passed\n");
smg_comms_c_wrappers 239 }
smg_comms_c_wrappers 240 else
smg_comms_c_wrappers 241 fprintf(file, "FAILED: not enough bits returned from entropy source\n");
smg_comms_c_wrappers 242
smg_comms_c_wrappers 243 fflush(file);
smg_comms_c_wrappers 244 xfree(p);
smg_comms_c_wrappers 245 mpi_free( pk.n);
smg_comms_c_wrappers 246 mpi_free( pk.e);
smg_comms_c_wrappers 247
smg_comms_c_wrappers 248 mpi_free( test );
smg_comms_c_wrappers 249 mpi_free( out1 );
smg_comms_c_wrappers 250 mpi_free( out2 );
smg_comms_c_wrappers 251 }
smg_comms_c_wrappers 252
smg_comms_c_wrappers 253 void test_rsa( int nruns, FILE *fkeys, FILE *fout) {
smg_comms_c_wrappers 254 RSA_secret_key sk;
smg_comms_c_wrappers 255 int noctets = KEY_LENGTH_OCTETS;
smg_comms_c_wrappers 256 int noctets_pq = noctets / 2;
smg_comms_c_wrappers 257 int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
smg_comms_c_wrappers 258 int nlimbs_pq = mpi_nlimb_hint_from_nbytes(noctets_pq);
smg_comms_c_wrappers 259 int i;
smg_comms_c_wrappers 260
smg_comms_c_wrappers 261 sk.n = mpi_alloc(nlimbs);
smg_comms_c_wrappers 262 sk.e = mpi_alloc(nlimbs);
smg_comms_c_wrappers 263 sk.d = mpi_alloc(nlimbs);
smg_comms_c_wrappers 264 sk.p = mpi_alloc(nlimbs_pq);
smg_comms_c_wrappers 265 sk.q = mpi_alloc(nlimbs_pq);
smg_comms_c_wrappers 266 sk.u = mpi_alloc(nlimbs_pq);
smg_comms_c_wrappers 267
smg_comms_c_wrappers 268 printf("TEST RSA key generation and use with %d runs\n", nruns);
smg_comms_c_wrappers 269 fflush(stdout);
smg_comms_c_wrappers 270
smg_comms_c_wrappers 271 for (i = 0;i < nruns; i++) {
smg_comms_c_wrappers 272 gen_keypair(&sk);
smg_comms_c_wrappers 273 printf(".");
smg_comms_c_wrappers 274 fflush(stdout);
smg_comms_c_wrappers 275
smg_comms_c_wrappers 276 mpi_print(fkeys, sk.n, 1);
smg_comms_c_wrappers 277 fwrite("\n", sizeof(char), 1, fkeys);
smg_comms_c_wrappers 278
smg_comms_c_wrappers 279 mpi_print(fkeys, sk.e, 1);
smg_comms_c_wrappers 280 fwrite("\n", sizeof(char), 1, fkeys);
smg_comms_c_wrappers 281
smg_comms_c_wrappers 282 mpi_print(fkeys, sk.d, 1);
smg_comms_c_wrappers 283 fwrite("\n", sizeof(char), 1, fkeys);
smg_comms_c_wrappers 284
smg_comms_c_wrappers 285 mpi_print(fkeys, sk.p, 1);
smg_comms_c_wrappers 286 fwrite("\n", sizeof(char), 1, fkeys);
smg_comms_c_wrappers 287
smg_comms_c_wrappers 288 mpi_print(fkeys, sk.q, 1);
smg_comms_c_wrappers 289 fwrite("\n", sizeof(char), 1, fkeys);
smg_comms_c_wrappers 290
smg_comms_c_wrappers 291 mpi_print(fkeys, sk.u, 1);
smg_comms_c_wrappers 292 fwrite("\n", sizeof(char), 1, fkeys);
smg_comms_c_wrappers 293
smg_comms_c_wrappers 294 test_rsa_keys(&sk, noctets_pq, fout);
smg_comms_c_wrappers 295 printf("*");
smg_comms_c_wrappers 296 fflush(stdout);
smg_comms_c_wrappers 297 }
smg_comms_c_wrappers 298
smg_comms_c_wrappers 299 mpi_free(sk.n);
smg_comms_c_wrappers 300 mpi_free(sk.e);
smg_comms_c_wrappers 301 mpi_free(sk.d);
smg_comms_c_wrappers 302 mpi_free(sk.p);
smg_comms_c_wrappers 303 mpi_free(sk.q);
smg_comms_c_wrappers 304 mpi_free(sk.u);
smg_comms_c_wrappers 305
smg_comms_c_wrappers 306 }
smg_comms_c_wrappers 307
smg_comms_c_wrappers 308 void test_rsa_exp() {
smg_comms_c_wrappers 309 MPI msg = mpi_alloc(0);
smg_comms_c_wrappers 310 MPI expected = mpi_alloc(0);
smg_comms_c_wrappers 311 MPI result;
smg_comms_c_wrappers 312
smg_comms_c_wrappers 313 RSA_public_key pk;
smg_comms_c_wrappers 314 pk.n = mpi_alloc(0);
smg_comms_c_wrappers 315 pk.e = mpi_alloc(0);
smg_comms_c_wrappers 316
smg_comms_c_wrappers 317 printf("TEST verify of rsa exponentiation on input data: \n");
smg_comms_c_wrappers 318
smg_comms_c_wrappers 319 mpi_fromstr(msg, "0x\
smg_comms_c_wrappers 320 5B6A8A0ACF4F4DB3F82EAC2D20255E4DF3E4B7C799603210766F26EF87C8980E737579\
smg_comms_c_wrappers 321 EC08E6505A51D19654C26D806BAF1B62F9C032E0B13D02AF99F7313BFCFD68DA46836E\
smg_comms_c_wrappers 322 CA529D7360948550F982C6476C054A97FD01635AB44BFBDBE2A90BE06F7984AC8534C3\
smg_comms_c_wrappers 323 8613747F340C18176E6D5F0C10246A2FCE3A668EACB6165C2052497CA2EE483F4FD8D0\
smg_comms_c_wrappers 324 6A9911BD97E9B6720521D872BD08FF8DA11A1B8DB147F252E4E69AE6201D3B374B171D\
smg_comms_c_wrappers 325 F445EF2BF509D468FD57CEB5840349B14C6E2AAA194D9531D238B85B8F0DD352D1E596\
smg_comms_c_wrappers 326 71539B429849E5D965E438BF9EFFC338DF9AADF304C4130D5A05E006ED855F37A06242\
smg_comms_c_wrappers 327 28097EF92F6E78CAE0CB97");
smg_comms_c_wrappers 328
smg_comms_c_wrappers 329 mpi_fromstr(expected, "0x\
smg_comms_c_wrappers 330 1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
smg_comms_c_wrappers 331 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
smg_comms_c_wrappers 332 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
smg_comms_c_wrappers 333 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
smg_comms_c_wrappers 334 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003051300\
smg_comms_c_wrappers 335 D0609608648016503040203050004406255509399A3AF322C486C770C5F7F6E05E18FC\
smg_comms_c_wrappers 336 3E2219A03CA56C7501426A597187468B2F71B4A198C807171B73D0E7DBC3EEF6EA6AFF\
smg_comms_c_wrappers 337 693DE58E18FF84395BE");
smg_comms_c_wrappers 338 result = mpi_alloc( mpi_get_nlimbs(expected) );
smg_comms_c_wrappers 339
smg_comms_c_wrappers 340 mpi_fromstr(pk.n, "0x\
smg_comms_c_wrappers 341 CDD49A674BAF76D3B73E25BC6DF66EF3ABEDDCA461D3CCB6416793E3437C7806562694\
smg_comms_c_wrappers 342 73C2212D5FD5EED17AA067FEC001D8E76EC901EDEDF960304F891BD3CAD7F9A335D1A2\
smg_comms_c_wrappers 343 EC37EABEFF3FBE6D3C726DC68E599EBFE5456EF19813398CD7D548D746A30AA47D4293\
smg_comms_c_wrappers 344 968BFBAFCBF65A90DFFC87816FEE2A01E1DC699F4DDABB84965514C0D909D54FDA7062\
smg_comms_c_wrappers 345 A2037B50B771C153D5429BA4BA335EAB840F9551E9CD9DF8BB4A6DC3ED1318FF3969F7\
smg_comms_c_wrappers 346 B99D9FB90CAB968813F8AD4F9A069C9639A74D70A659C69C29692567CE863B88E191CC\
smg_comms_c_wrappers 347 9535B91B417D0AF14BE09C78B53AF9C5F494BCF2C60349FFA93C81E817AC682F0055A6\
smg_comms_c_wrappers 348 07BB56D6A281C1A04CEFE1");
smg_comms_c_wrappers 349
smg_comms_c_wrappers 350 mpi_fromstr( pk.e, "0x10001");
smg_comms_c_wrappers 351
smg_comms_c_wrappers 352 mpi_print( stdout, msg, 1);
smg_comms_c_wrappers 353 printf("\n");
smg_comms_c_wrappers 354
smg_comms_c_wrappers 355 public_rsa( result, msg, &pk);
smg_comms_c_wrappers 356 if ( mpi_cmp( result, expected) != 0 )
smg_comms_c_wrappers 357 printf( "FAILED\n");
smg_comms_c_wrappers 358 else
smg_comms_c_wrappers 359 printf( "PASSED\n");
smg_comms_c_wrappers 360
smg_comms_c_wrappers 361 printf("Expected:\n");
smg_comms_c_wrappers 362 mpi_print( stdout, expected, 1);
smg_comms_c_wrappers 363 printf("\n");
smg_comms_c_wrappers 364
smg_comms_c_wrappers 365 printf("Obtained:\n");
smg_comms_c_wrappers 366 mpi_print( stdout, result, 1);
smg_comms_c_wrappers 367 printf("\n");
smg_comms_c_wrappers 368
smg_comms_c_wrappers 369 mpi_free( pk.n );
smg_comms_c_wrappers 370 mpi_free( pk.e );
smg_comms_c_wrappers 371 mpi_free( msg );
smg_comms_c_wrappers 372 mpi_free( expected );
smg_comms_c_wrappers 373 mpi_free( result );
smg_comms_c_wrappers 374 }
smg_comms_c_wrappers 375
smg_comms_c_wrappers 376 void time_rsa_gen( int nruns ) {
smg_comms_c_wrappers 377 struct timespec tstart, tend;
smg_comms_c_wrappers 378 long int diff;
smg_comms_c_wrappers 379 int i;
smg_comms_c_wrappers 380
smg_comms_c_wrappers 381 RSA_secret_key sk;
smg_comms_c_wrappers 382 int noctets = KEY_LENGTH_OCTETS;
smg_comms_c_wrappers 383 int noctets_pq = noctets / 2;
smg_comms_c_wrappers 384 int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
smg_comms_c_wrappers 385 int nlimbs_pq = mpi_nlimb_hint_from_nbytes(noctets_pq);
smg_comms_c_wrappers 386 sk.n = mpi_alloc(nlimbs);
smg_comms_c_wrappers 387 sk.e = mpi_alloc(nlimbs);
smg_comms_c_wrappers 388 sk.d = mpi_alloc(nlimbs);
smg_comms_c_wrappers 389 sk.p = mpi_alloc(nlimbs_pq);
smg_comms_c_wrappers 390 sk.q = mpi_alloc(nlimbs_pq);
smg_comms_c_wrappers 391 sk.u = mpi_alloc(nlimbs_pq);
smg_comms_c_wrappers 392
smg_comms_c_wrappers 393 clock_gettime(CLOCK_MONOTONIC, &tstart);
smg_comms_c_wrappers 394 for (i = 0;i < nruns; i++) {
smg_comms_c_wrappers 395 gen_keypair(&sk);
smg_comms_c_wrappers 396 }
smg_comms_c_wrappers 397 clock_gettime(CLOCK_MONOTONIC, &tend);
smg_comms_c_wrappers 398
smg_comms_c_wrappers 399 diff = tend.tv_sec-tstart.tv_sec;
smg_comms_c_wrappers 400
smg_comms_c_wrappers 401 printf("TOTAL: %ld seconds for generating %d key pairs\n", diff, nruns);
smg_comms_c_wrappers 402 printf("Average (%d runs): %f seconds per TMSR RSA key pair.\n",
smg_comms_c_wrappers 403 nruns, diff / (1.0*nruns));
smg_comms_c_wrappers 404 mpi_free(sk.n);
smg_comms_c_wrappers 405 mpi_free(sk.e);
smg_comms_c_wrappers 406 mpi_free(sk.d);
smg_comms_c_wrappers 407 mpi_free(sk.p);
smg_comms_c_wrappers 408 mpi_free(sk.q);
smg_comms_c_wrappers 409 mpi_free(sk.u);
smg_comms_c_wrappers 410 }
smg_comms_c_wrappers 411
smg_comms_c_wrappers 412 void test_oaep_encr_decr( int nruns ) {
smg_comms_c_wrappers 413 /* a set of RSA keys previously generated with eucrypt */
smg_comms_c_wrappers 414 RSA_public_key pk;
smg_comms_c_wrappers 415 pk.n = mpi_alloc(0);
smg_comms_c_wrappers 416 pk.e = mpi_alloc(0);
smg_comms_c_wrappers 417
smg_comms_c_wrappers 418 RSA_secret_key sk;
smg_comms_c_wrappers 419 sk.n = mpi_alloc(0);
smg_comms_c_wrappers 420 sk.e = mpi_alloc(0);
smg_comms_c_wrappers 421 sk.d = mpi_alloc(0);
smg_comms_c_wrappers 422 sk.p = mpi_alloc(0);
smg_comms_c_wrappers 423 sk.q = mpi_alloc(0);
smg_comms_c_wrappers 424 sk.u = mpi_alloc(0);
smg_comms_c_wrappers 425
smg_comms_c_wrappers 426 mpi_fromstr(sk.n, "0x\
smg_comms_c_wrappers 427 CD2C025323BEA46FFF2FA8D7A9D39817EA713421F4AE03FA8120641193892A70BFECF5\
smg_comms_c_wrappers 428 83101635A432110D3DDE6339E3CC7ECC0AD91C026FCACE832DD3888A6FCA7BCE56C390\
smg_comms_c_wrappers 429 5A5AC8C7BC921DA675E4B62489B254EB34659D547D71165BC998983A81937BD251AEE1\
smg_comms_c_wrappers 430 2D985EC387D5376F5DCC5EF7EC530FBD6FD2AA7285EE1AF3335EA73163F0954F30402E\
smg_comms_c_wrappers 431 D7B374EE84A97B1849B0674B0DA0A2050BD79B71ABB1559F3A9CFDB8557DED7BC90CF2\
smg_comms_c_wrappers 432 09E8A847E9C226140845B7D03842162E7DA5DD16326CB1F71A248D841FE9076A09911F\
smg_comms_c_wrappers 433 2F4F5E3EA44EA8DE40332BF00406990BCCF61C322A03C456EF3A98B341E0BDBC1088CE\
smg_comms_c_wrappers 434 683E78510E76B72C2BCC1EE9AEDD80FFF18ABFC5923B2F36B581C25114AB2DF9F6C2B1\
smg_comms_c_wrappers 435 9481703FD19E313DCD7ACE15FA11B27D25BCE5388C180A7E21167FB87750599E1ED7C7\
smg_comms_c_wrappers 436 50F4A844E1DC2270C62D19671CF8F4C25B81E366B09FC850AE642136D204A9160AEECE\
smg_comms_c_wrappers 437 575B57378AA439E9DD46DC990288CD54BAA35EEE1C02456CD39458A6F1CBF012DCEDF4\
smg_comms_c_wrappers 438 27CCF3F3F53645658FC49C9C9D7F2856DB571D92B967AB5845514E0054DDB49099F5DD\
smg_comms_c_wrappers 439 04A6F6F5C5CE642276834B932881AEB648D1F25E9223971F56E249EF40CF7D80F22621\
smg_comms_c_wrappers 440 CDD0260E9E7D23746960ADB52CF2987584FB1DE95A69A39E5CB12B76E0F5C1A0529C0C\
smg_comms_c_wrappers 441 065D2E35720810F7C7983180B9A9EA0E00C11B79DC3D");
smg_comms_c_wrappers 442
smg_comms_c_wrappers 443 mpi_fromstr(sk.e, "0x\
smg_comms_c_wrappers 444 DD4856B4EE3D099A8604AE392D8EFEC094CDF01546A28BE87CB484F999E8E75CDFCD01\
smg_comms_c_wrappers 445 D04D455A6A9254C60BD28C0B03611FC3E751CC27EF768C0B401C4FD2B27C092834A6F2\
smg_comms_c_wrappers 446 49A145C4EDC47A3B3D363EC352462C945334D160AF9AA72202862912493AC6190AA3A6\
smg_comms_c_wrappers 447 149D4D8B9996BA7927D3D0D2AD00D30FD630CF464E6CAF9CF49355B9A70E05DB7AE915\
smg_comms_c_wrappers 448 F9F602772F8D11E5FCDFC7709210F248052615967090CC1F43D410C83724AA5912B2F0\
smg_comms_c_wrappers 449 52E6B39449A89A97C79C92DC8CB8DEEFCF248C1E1D2FC5BFE85165ECA31839CAA9CEB3\
smg_comms_c_wrappers 450 3A92EBDC0EB3BAC0F810938BB173C7DA21DCBB2220D44CBA0FD40A2C868FC93AC5243E\
smg_comms_c_wrappers 451 C137C27B0A76D65634EBB3");
smg_comms_c_wrappers 452
smg_comms_c_wrappers 453 mpi_fromstr(sk.d, "0x\
smg_comms_c_wrappers 454 7C8A6FA1199D99DCA45E9BDF567CA49D02B237340D7E999150BC4883AE29DEC5158521\
smg_comms_c_wrappers 455 B338F35DC883792356BDDBB3C8B3030A6DD4C6522599A3254E751F9BA1CB1061C5633C\
smg_comms_c_wrappers 456 81BBFACF6FCD64502614102DFED3F3FA284066C342D5E00953B415915331E30812E5FB\
smg_comms_c_wrappers 457 CD6680ADCCDEE40B8376A3A225F2E160EA59C7566804526D73BB660A648A3EF9802313\
smg_comms_c_wrappers 458 B2F841E8458B2AAACE7AACF31083E8F3F630298138393BC88BBD7D4AA4334949651D25\
smg_comms_c_wrappers 459 365B10DBF4A4A08E20A6CC74BFDD37C1C38E2ADC2A283DF06590DF06B46F67F6ACA67F\
smg_comms_c_wrappers 460 AC464C795261659A2F9558802D0BBAA05FD1E1AF2CDC70654723DF7EFAEA148B8CDBEB\
smg_comms_c_wrappers 461 C89EA2320AB9BBB1BC4311475DF3D91446F02EF192368DFEBAC598CCFD4407DEC58FDC\
smg_comms_c_wrappers 462 1A94CCDD6E5FBA9C52164ACEA8AEE633E557BCCEACB7A1AF656C379482D784A120A725\
smg_comms_c_wrappers 463 32F9B2B35173D505F21D5AD4CB9511BC836DC923730B70291B70290A216CA3B21CFF79\
smg_comms_c_wrappers 464 E895C35F4F7AF80E1BD9ED2773BD26919A76E4298D169160593E0335BE2A2A2D2E8516\
smg_comms_c_wrappers 465 948F657E1B1260E18808A9D463C108535FB60B3B28F711C81E5DE24F40214134A53CE5\
smg_comms_c_wrappers 466 9A952C8970A1D771EBEFFA2F4359DCF157995B3F1950DE3C6EC41B7FF837148F55F323\
smg_comms_c_wrappers 467 372AF3F20CE8B8038E750C23D8F5041FA951327859B0E47483F0A47103EF808C72C251\
smg_comms_c_wrappers 468 006FA526245291C8C84C12D2EF63FB2301EA3EEDA42B");
smg_comms_c_wrappers 469
smg_comms_c_wrappers 470 mpi_fromstr(sk.p, "0x\
smg_comms_c_wrappers 471 E236732452039C14EC1D3B8095BDDCFB7625CE27B1EA5394CF4ED09D3CEECAA4FC0BF6\
smg_comms_c_wrappers 472 2F7CE975E0C8929CE84B0259D773EA038396479BF15DA065BA70E549B248D77B4B23ED\
smg_comms_c_wrappers 473 A267308510DBEE2FD44E35D880EE7CFB81E0646AA8630165BD8988C3A8776D9E704C20\
smg_comms_c_wrappers 474 AA25CA0A3C32F27F592D5FD363B04DD57D8C61FFDCDFCCC59E2913DE0EE47769180340\
smg_comms_c_wrappers 475 E1EA5A803AA2301A010FF553A380F002601F0853FCACDB82D76FE2FACBCD6E5F294439\
smg_comms_c_wrappers 476 0799EA5AE9D7880D4E1D4AE146DC1D4E8495B9DD30E57E883923C5FC26682B7142D35C\
smg_comms_c_wrappers 477 D8A0FC561FE725A6CF419B15341F40FE0C31132CBD81DD8E50697BD1EBFFA16B522E16\
smg_comms_c_wrappers 478 F5B49A03B707218C7DA60B");
smg_comms_c_wrappers 479
smg_comms_c_wrappers 480 mpi_fromstr(sk.q, "0x\
smg_comms_c_wrappers 481 E830482A3C4F5C3A7E59C10FF8BA760DB1C6D55880B796FFDA4A82E0B60E974E81D04B\
smg_comms_c_wrappers 482 2A4AD417823EBFB4E8EFB13782943562B19B6C4A680E3BA0C8E37B5023470F4F1AC1F8\
smg_comms_c_wrappers 483 A0B10672EF75CD58BCD45E6B14503B8A6A70AFE79F6201AF56E7364A1C742BE1453FD2\
smg_comms_c_wrappers 484 24FDC9D66522EAF4466A084BCB9E46D455A2946E94CBF028770F38D0B741C2CC59308F\
smg_comms_c_wrappers 485 71D8C2B4B9C928E0AE8D68DEB48A3E9EFD84A10301EBD55F8221CA32FC567B306B2A8E\
smg_comms_c_wrappers 486 116350AFB995859FDF4378C5CFD06901494E8CFA5D8FAC564D6531FA8A2E4761F5EFBA\
smg_comms_c_wrappers 487 F78750B6F4662BE9EA4C2FAD67AF73EEB36B41FC15CB678810C19A51DF23555695C4C1\
smg_comms_c_wrappers 488 546F3FACA39CAA7BB8DBD7");
smg_comms_c_wrappers 489
smg_comms_c_wrappers 490 mpi_fromstr(sk.u, "0x\
smg_comms_c_wrappers 491 846232322775C1CD7D5569DC59E2F3E61A885AE2E9C4A4F8CB3ACBE8C3A5441E5FE348\
smg_comms_c_wrappers 492 A2A8AC9C2998FBF282222BF508AA1ECF66A76AEDD2D9C97028BFD3F6CA0542E38A5312\
smg_comms_c_wrappers 493 603C70B95650CE73F80FDD729988FBDB5595A5BF8A007EA34E54994A697906CE56354C\
smg_comms_c_wrappers 494 E00DF10EB711DEC274A62494E3D350D88736CF67A477FB600AC9F1D6580727585092BF\
smg_comms_c_wrappers 495 5EBC092CC4D6CF75769051033A1197103BE269942F372168A53771746FBA18ED6972D5\
smg_comms_c_wrappers 496 0B935A9B1D6B5B3DD50CD89A27FE93C10924E9103FACF7B4C5724A046C3D3B50CC1C78\
smg_comms_c_wrappers 497 5F5C8E00DBE1D6561F120F5294C170914BC10F978ED4356EED67A9F3A60D70AFE540FC\
smg_comms_c_wrappers 498 5373CBAE3D0A7FD1C87273");
smg_comms_c_wrappers 499
smg_comms_c_wrappers 500 /* copy the public key components */
smg_comms_c_wrappers 501 pk.n = mpi_copy( sk.n );
smg_comms_c_wrappers 502 pk.e = mpi_copy( sk.e );
smg_comms_c_wrappers 503
smg_comms_c_wrappers 504 /* some plain text message */
smg_comms_c_wrappers 505 MPI msg = mpi_alloc(0);
smg_comms_c_wrappers 506 mpi_fromstr(msg, "0x\
smg_comms_c_wrappers 507 5B6A8A0ACF4F4DB3F82EAC2D20255E4DF3E4B7C799603210766F26EF87C8980E737579\
smg_comms_c_wrappers 508 EC08E6505A51D19654C26D806BAF1B62F9C032E0B13D02AF99F7313BFCFD68DA46836E\
smg_comms_c_wrappers 509 CA529D7360948550F982C6476C054A97FD01635AB44BFBDBE2A90BE06F7984AC8534C3\
smg_comms_c_wrappers 510 28097EF92F6E78CAE0CB97");
smg_comms_c_wrappers 511
smg_comms_c_wrappers 512 /* actual testing */
smg_comms_c_wrappers 513 printf("TEST verify oaep_encr_decr on message: \n");
smg_comms_c_wrappers 514 mpi_print( stdout, msg, 1);
smg_comms_c_wrappers 515 printf("\n");
smg_comms_c_wrappers 516
smg_comms_c_wrappers 517 int nlimbs_n = mpi_nlimb_hint_from_nbytes( KEY_LENGTH_OCTETS);
smg_comms_c_wrappers 518 MPI encr = mpi_alloc( nlimbs_n );
smg_comms_c_wrappers 519 MPI decr = mpi_alloc( nlimbs_n );
smg_comms_c_wrappers 520 int success;
smg_comms_c_wrappers 521
smg_comms_c_wrappers 522 adainit();
smg_comms_c_wrappers 523 rsa_oaep_encrypt( encr, msg, &pk );
smg_comms_c_wrappers 524 rsa_oaep_decrypt( decr, encr, &sk, &success );
smg_comms_c_wrappers 525
smg_comms_c_wrappers 526 if (success <= 0 ||
smg_comms_c_wrappers 527 mpi_cmp(encr, msg) == 0 ||
smg_comms_c_wrappers 528 mpi_cmp(msg, decr) != 0)
smg_comms_c_wrappers 529 printf("FAILED: success flag is %d\n", success);
smg_comms_c_wrappers 530 else
smg_comms_c_wrappers 531 printf("PASSED\n");
smg_comms_c_wrappers 532
smg_comms_c_wrappers 533 /* attempt to decrypt corrupted block */
smg_comms_c_wrappers 534 mpi_clear( decr );
smg_comms_c_wrappers 535 rsa_oaep_decrypt( decr, pk.n, &sk, &success);
smg_comms_c_wrappers 536 if (success > 0)
smg_comms_c_wrappers 537 printf("FAILED: attempt to decrypt non-/corrupted oaep block\n");
smg_comms_c_wrappers 538 else
smg_comms_c_wrappers 539 printf("PASSED: attempt to decrypt non-/corrupted oaep block\n");
smg_comms_c_wrappers 540 adafinal();
smg_comms_c_wrappers 541
smg_comms_c_wrappers 542 /* clean up */
smg_comms_c_wrappers 543 mpi_free( sk.n );
smg_comms_c_wrappers 544 mpi_free( sk.e );
smg_comms_c_wrappers 545 mpi_free( sk.d );
smg_comms_c_wrappers 546 mpi_free( sk.p );
smg_comms_c_wrappers 547 mpi_free( sk.q );
smg_comms_c_wrappers 548 mpi_free( sk.u );
smg_comms_c_wrappers 549
smg_comms_c_wrappers 550 mpi_free( pk.n );
smg_comms_c_wrappers 551 mpi_free( pk.e );
smg_comms_c_wrappers 552
smg_comms_c_wrappers 553 mpi_free( msg );
smg_comms_c_wrappers 554 mpi_free( encr );
smg_comms_c_wrappers 555 mpi_free( decr );
smg_comms_c_wrappers 556 }
smg_comms_c_wrappers 557
smg_comms_c_wrappers 558 void test_mpi_buffer() {
smg_comms_c_wrappers 559 unsigned int noctets = 10;
smg_comms_c_wrappers 560 int nlimbs = mpi_nlimb_hint_from_nbytes( noctets );
smg_comms_c_wrappers 561 MPI m = mpi_alloc( nlimbs );
smg_comms_c_wrappers 562 unsigned char *setbuffer = xmalloc( noctets );
smg_comms_c_wrappers 563 unsigned char *getbuffer;
smg_comms_c_wrappers 564 unsigned int i, sign, mpilen, nerrors;
smg_comms_c_wrappers 565
smg_comms_c_wrappers 566 for (i=0; i< noctets; i++)
smg_comms_c_wrappers 567 setbuffer[i] = i;
smg_comms_c_wrappers 568
smg_comms_c_wrappers 569 mpi_set_buffer( m, setbuffer, noctets, 0);
smg_comms_c_wrappers 570
smg_comms_c_wrappers 571 getbuffer = mpi_get_buffer( m, &mpilen, &sign );
smg_comms_c_wrappers 572
smg_comms_c_wrappers 573 if (mpilen == noctets -1 ) {
smg_comms_c_wrappers 574 nerrors = 0;
smg_comms_c_wrappers 575 for (i=0;i<noctets-1;i++)
smg_comms_c_wrappers 576 if (setbuffer[i+1] != getbuffer[i])
smg_comms_c_wrappers 577 nerrors = nerrors + 1;
smg_comms_c_wrappers 578 if (nerrors == 0) {
smg_comms_c_wrappers 579 printf("WARNING: 0-led octet discarded by mpi_set_buffer!\n");
smg_comms_c_wrappers 580 printf("Value ret by mpi_get_buffer != value given to set_buffer!\n");
smg_comms_c_wrappers 581 }
smg_comms_c_wrappers 582 else
smg_comms_c_wrappers 583 printf("FAIL: got different lengths and %d different values!\n", nerrors);
smg_comms_c_wrappers 584 }
smg_comms_c_wrappers 585 else if (mpilen != noctets)
smg_comms_c_wrappers 586 printf("FAIL: mpilen is %d; noctets is %d\n", mpilen, noctets);
smg_comms_c_wrappers 587 else
smg_comms_c_wrappers 588 {
smg_comms_c_wrappers 589 nerrors = 0;
smg_comms_c_wrappers 590 for (i=0;i<noctets-1;i++) {
smg_comms_c_wrappers 591 if (setbuffer[i]!=getbuffer[i])
smg_comms_c_wrappers 592 nerrors= nerrors+1;
smg_comms_c_wrappers 593 }
smg_comms_c_wrappers 594 if (nerrors>0)
smg_comms_c_wrappers 595 printf("FAIL: got %d different values!\n", nerrors);
smg_comms_c_wrappers 596 else printf("PASSED: mpi_get/set_buffer\n");
smg_comms_c_wrappers 597 }
smg_comms_c_wrappers 598
smg_comms_c_wrappers 599 mpi_free(m);
smg_comms_c_wrappers 600 xfree(setbuffer);
smg_comms_c_wrappers 601 xfree(getbuffer);
smg_comms_c_wrappers 602 }
smg_comms_c_wrappers 603
smg_comms_c_wrappers 604 void test_dirty_float_rng( int nruns ) {
smg_comms_c_wrappers 605 int i, status;
smg_comms_c_wrappers 606 float dirty;
smg_comms_c_wrappers 607
smg_comms_c_wrappers 608 printf("Running test for smg rng dirty float with %d runs\n", nruns);
smg_comms_c_wrappers 609 for (i=0; i<nruns; i++) {
smg_comms_c_wrappers 610 status = rng_dirty_float( &dirty );
smg_comms_c_wrappers 611 printf("Run %d: %f status %s\n", i+1, dirty, status>0 ? "OK" : "FAIL");
smg_comms_c_wrappers 612 }
smg_comms_c_wrappers 613 }
smg_comms_c_wrappers 614
smg_comms_c_wrappers 615 void test_ieee_float_rng( int nruns ) {
smg_comms_c_wrappers 616 int i, status;
smg_comms_c_wrappers 617 float ieee;
smg_comms_c_wrappers 618
smg_comms_c_wrappers 619 printf("Running test for smg rng ieee 745/1985 float with %d runs\n", nruns);
smg_comms_c_wrappers 620 for (i=0; i<nruns; i++) {
smg_comms_c_wrappers 621 status = rng_float_754_1985( &ieee );
smg_comms_c_wrappers 622 printf("Run %d: %f status %s\n", i+1, ieee, status>0 ? "OK" : "FAIL");
smg_comms_c_wrappers 623 }
smg_comms_c_wrappers 624 }
smg_comms_c_wrappers 625
smg_comms_c_wrappers 626 void test_uint32_rng( int nruns ) {
smg_comms_c_wrappers 627 int i, status;
smg_comms_c_wrappers 628 uint32_t n;
smg_comms_c_wrappers 629
smg_comms_c_wrappers 630 printf("Running test for smg rng unsigned int32 with %d runs\n", nruns);
smg_comms_c_wrappers 631 for (i=0; i<nruns; i++) {
smg_comms_c_wrappers 632 status = rng_uint32( &n );
smg_comms_c_wrappers 633 printf("Run %d: %"PRIu32" status %s\n", i+1, n, status>0 ? "OK" : "FAIL");
smg_comms_c_wrappers 634 }
smg_comms_c_wrappers 635 }
smg_comms_c_wrappers 636
smg_comms_c_wrappers 637 void test_uint64_rng( int nruns ) {
smg_comms_c_wrappers 638 int i, status;
smg_comms_c_wrappers 639 uint64_t n;
smg_comms_c_wrappers 640
smg_comms_c_wrappers 641 printf("Running test for smg rng unsigned int64 with %d runs\n", nruns);
smg_comms_c_wrappers 642 for (i=0; i<nruns; i++) {
smg_comms_c_wrappers 643 status = rng_uint64( &n );
smg_comms_c_wrappers 644 printf("Run %d: %"PRIu64" status %s\n", i+1, n, status>0 ? "OK" : "FAIL");
smg_comms_c_wrappers 645 }
smg_comms_c_wrappers 646 }
smg_comms_c_wrappers 647
smg_comms_c_wrappers 648
smg_comms_c_wrappers 649 int main(int ac, char **av)
smg_comms_c_wrappers 650 {
smg_comms_c_wrappers 651 int nruns;
smg_comms_c_wrappers 652 int id;
smg_comms_c_wrappers 653 FILE *fk;
smg_comms_c_wrappers 654 FILE *fout;
smg_comms_c_wrappers 655
smg_comms_c_wrappers 656 if (ac<2) {
smg_comms_c_wrappers 657 printf("Usage: %s number_of_runs/octets [testID]\n", av[0]);
smg_comms_c_wrappers 658 return -1;
smg_comms_c_wrappers 659 }
smg_comms_c_wrappers 660 nruns = atoi(av[1]);
smg_comms_c_wrappers 661
smg_comms_c_wrappers 662 if (ac < 3)
smg_comms_c_wrappers 663 id = -1;
smg_comms_c_wrappers 664 else
smg_comms_c_wrappers 665 id = atoi(av[2]);
smg_comms_c_wrappers 666
smg_comms_c_wrappers 667 switch ( id ) {
smg_comms_c_wrappers 668 case 0:
smg_comms_c_wrappers 669 printf("Timing entropy source...\n");
smg_comms_c_wrappers 670 time_entropy_source(nruns, 4096);
smg_comms_c_wrappers 671 break;
smg_comms_c_wrappers 672 case 1:
smg_comms_c_wrappers 673 test_entropy_output(nruns, "entropy_source_output.txt");
smg_comms_c_wrappers 674 break;
smg_comms_c_wrappers 675 case 2:
smg_comms_c_wrappers 676 /* tests on miller-rabin */
smg_comms_c_wrappers 677 /* a few primes (decimal): 65537, 116447, 411949103, 20943302231 */
smg_comms_c_wrappers 678 test_is_composite(nruns, "0x10001", 0);
smg_comms_c_wrappers 679 test_is_composite(nruns, "0x1C6DF", 0);
smg_comms_c_wrappers 680 test_is_composite(nruns, "0x188DD82F", 0);
smg_comms_c_wrappers 681 test_is_composite(nruns, "0x4E0516E57", 0);
smg_comms_c_wrappers 682 /* a few mersenne primes (decimal): 2^13 - 1 = 8191, 2^17 - 1 = 131071, 2^31 - 1 = 2147483647 */
smg_comms_c_wrappers 683 test_is_composite(nruns, "0x1FFF", 0);
smg_comms_c_wrappers 684 test_is_composite(nruns, "0x1FFFF", 0);
smg_comms_c_wrappers 685 test_is_composite(nruns, "0x7FFFFFFF", 0);
smg_comms_c_wrappers 686 /* a few carmichael numbers, in decimal: 561, 60977817398996785 */
smg_comms_c_wrappers 687 test_is_composite(nruns, "0x231", 1);
smg_comms_c_wrappers 688 test_is_composite(nruns, "0xD8A300793EEF31", 1);
smg_comms_c_wrappers 689 /* an even number */
smg_comms_c_wrappers 690 test_is_composite(nruns, "0x15A9E672864B1E", 1);
smg_comms_c_wrappers 691 /* a phuctor-found non-prime public exponent: 170141183460469231731687303715884105731 */
smg_comms_c_wrappers 692 test_is_composite(nruns, "0x80000000000000000000000000000003", 1);
smg_comms_c_wrappers 693 break;
smg_comms_c_wrappers 694 case 3:
smg_comms_c_wrappers 695 time_mr(nruns);
smg_comms_c_wrappers 696 break;
smg_comms_c_wrappers 697 case 4:
smg_comms_c_wrappers 698 test_rpng(nruns);
smg_comms_c_wrappers 699 break;
smg_comms_c_wrappers 700 case 5:
smg_comms_c_wrappers 701 time_rpng(nruns);
smg_comms_c_wrappers 702 break;
smg_comms_c_wrappers 703 case 6:
smg_comms_c_wrappers 704 fk = fopen("keys.asc", "a");
smg_comms_c_wrappers 705 if ( fk == NULL )
smg_comms_c_wrappers 706 err("Failed to open file keys.asc!");
smg_comms_c_wrappers 707 fout = fopen("check_keys.asc", "a");
smg_comms_c_wrappers 708 if ( fout == NULL ) {
smg_comms_c_wrappers 709 fclose(fk);
smg_comms_c_wrappers 710 err("Failed to open file keys_check.asc!");
smg_comms_c_wrappers 711 }
smg_comms_c_wrappers 712 test_rsa(nruns, fk, fout);
smg_comms_c_wrappers 713 fclose(fk);
smg_comms_c_wrappers 714 fclose(fout);
smg_comms_c_wrappers 715 break;
smg_comms_c_wrappers 716 case 7:
smg_comms_c_wrappers 717 test_rsa_exp();
smg_comms_c_wrappers 718 break;
smg_comms_c_wrappers 719 case 8:
smg_comms_c_wrappers 720 time_rsa_gen(nruns);
smg_comms_c_wrappers 721 break;
smg_comms_c_wrappers 722 case 9:
smg_comms_c_wrappers 723 test_oaep_encr_decr(nruns);
smg_comms_c_wrappers 724 break;
smg_comms_c_wrappers 725 case 10:
smg_comms_c_wrappers 726 test_mpi_buffer();
smg_comms_c_wrappers 727 break;
smg_comms_c_wrappers 728 case 11:
smg_comms_c_wrappers 729 test_dirty_float_rng(nruns);
smg_comms_c_wrappers 730 break;
smg_comms_c_wrappers 731 case 12:
smg_comms_c_wrappers 732 test_ieee_float_rng(nruns);
smg_comms_c_wrappers 733 break;
smg_comms_c_wrappers 734 case 13:
smg_comms_c_wrappers 735 test_uint32_rng(nruns);
smg_comms_c_wrappers 736 break;
smg_comms_c_wrappers 737 case 14:
smg_comms_c_wrappers 738 test_uint64_rng(nruns);
smg_comms_c_wrappers 739 break;
smg_comms_c_wrappers 740 default:
smg_comms_c_wrappers 741 printf("Current test ids:\n");
smg_comms_c_wrappers 742 printf("0 for timing entropy source\n");
smg_comms_c_wrappers 743 printf("1 for entropy output test\n");
smg_comms_c_wrappers 744 printf("2 for is_composite (Miller-Rabin) test\n");
smg_comms_c_wrappers 745 printf("3 for timing Miller-Rabin\n");
smg_comms_c_wrappers 746 printf("4 for random prime number generator test\n");
smg_comms_c_wrappers 747 printf("5 for timing random prime number generator\n");
smg_comms_c_wrappers 748 printf("6 for testing rsa key pair generation and use; \
smg_comms_c_wrappers 749 writes to keys.asc and check_keys.asc\n");
smg_comms_c_wrappers 750 printf("7 for testing rsa exponentiation (fixed data)\n");
smg_comms_c_wrappers 751 printf("8 for timing rsa key pair generator\n");
smg_comms_c_wrappers 752 printf("9 for oaep encrypt/decrypt\n");
smg_comms_c_wrappers 753 printf("10 for testing mpi_set/get_buffer\n");
smg_comms_c_wrappers 754 printf("11 for testing smg_rng dirty float\n");
smg_comms_c_wrappers 755 printf("12 for testing smg_rng ieee 745/1985 float\n");
smg_comms_c_wrappers 756 printf("13 for testing smg_rng uint32 \n");
smg_comms_c_wrappers 757 printf("14 for testing smg_rng uint64 \n");
smg_comms_c_wrappers 758 }
smg_comms_c_wrappers 759
smg_comms_c_wrappers 760 return 0;
smg_comms_c_wrappers 761 }