00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #include "sizes.h"
00024 #include "mceliece.h"
00025 #include "params.h"
00026 #include "precomp.h"
00027
00028 __inline unsigned long long rdtsc()
00029 {
00030 unsigned long long x;
00031 __asm__ volatile (".byte 0x0f, 0x31" :"=A" (x));
00032 return x;
00033 }
00034
00035 int check(unsigned char * cleartext, unsigned char * plaintext, int r) {
00036 int i, j;
00037
00038 for (i = 0; CLEARTEXT_LENGTH - 8 * i >= 8 ; ++i)
00039 if (cleartext[i] != plaintext[i]) {
00040 fprintf(stderr, "encrypted/decrypted data mismatch at byte %d\n", i);
00041 fprintf(stderr, "message seed is %d\n", r);
00042 for (j = i; j < CLEARTEXT_BYTES; ++j)
00043 fprintf(stderr, "%02x", cleartext[j]);
00044 fprintf(stderr, "\n");
00045 for (j = i; j < CLEARTEXT_BYTES; ++j)
00046 fprintf(stderr, "%02x", plaintext[j]);
00047 fprintf(stderr, "\n");
00048 return -1;
00049 }
00050 j = CLEARTEXT_LENGTH - 8 * i;
00051 if (j > 0) {
00052 if ((cleartext[i] ^ plaintext[i]) & ((1 << j) - 1)) {
00053 fprintf(stderr, "encrypted/decrypted data mismatch at byte %d\n", i);
00054 fprintf(stderr, "message seed is %d\n", r);
00055 fprintf(stderr, "%02x\n", cleartext[j] & ((1 << j) - 1));
00056 fprintf(stderr, "%02x\n", plaintext[j] & ((1 << j) - 1));
00057 return -1;
00058 }
00059 }
00060 return 1;
00061 }
00062
00063 int main(int argc, char ** argv) {
00064 unsigned char sk[SECRETKEY_BYTES], pk[PUBLICKEY_BYTES];
00065 unsigned char cleartext[CLEARTEXT_BYTES], plaintext[CLEARTEXT_BYTES], ciphertext[CIPHERTEXT_BYTES];
00066 unsigned r, r1;
00067 int i, j, n;
00068 unsigned long long tmp_enc, tmp_dec, total_enc, total_dec;
00069
00070 FILE *fichier;
00071
00072 n = (argc > 1) ? atoi(argv[1]) : 1;
00073 r1 = (argc > 2) ? atoi(argv[2]) : ((unsigned) rdtsc());
00074 r1 &= 0x7fffffff;
00075 r = (argc > 3) ? atoi(argv[3]) : ((unsigned) rdtsc());
00076 r &= 0x7fffffff;
00077 printf("seed for key: %d\n", r1);
00078 printf("seed for message: %d\n", r);
00079
00080 srandom(r1);
00081 keypair(sk, pk);
00082 total_enc = total_dec = 0;
00083
00084 for (j = 0; j < n; ++j) {
00085 srandom(r + j);
00086 for (i = 0; i < CLEARTEXT_BYTES; ++i)
00087 cleartext[i] = random() & 0xff;
00088 tmp_enc = rdtsc();
00089 if (encrypt_block(ciphertext, cleartext, pk) < 0) {
00090 fprintf(stderr, "fail to encrypt in attempt %d of %d\n", j + 1, n);
00091 exit(0);
00092 }
00093 tmp_enc = rdtsc() - tmp_enc;
00094 total_enc += tmp_enc;
00095 tmp_dec = rdtsc();
00096 if (decrypt_block(plaintext, ciphertext, sk) < 0) {
00097 fprintf(stderr, "fail to decrypt in attempt %d of %d\n", j + 1, n);
00098 exit(0);
00099 }
00100 tmp_dec = rdtsc() - tmp_dec;
00101 total_dec += tmp_dec;
00102 if (check(cleartext, plaintext, r + j) < 0)
00103 exit(0);
00104 }
00105
00106 fichier = fopen("plotdata", "a");
00107 printf("running time is printed in file plotdata\n");
00108
00109 fprintf(fichier, "%d\t %d\t %lld\t %lld\n", LOG_LENGTH, ERROR_WEIGHT, 8 * total_enc / n / CLEARTEXT_LENGTH, 8 * total_dec / n / CLEARTEXT_LENGTH);
00110 fclose(fichier);
00111
00112 return 0;
00113 }
00114
00115
00116
00117
00118
00119
00120