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 <string.h>
00024 #include "sizes.h"
00025 #include "mceliece.h"
00026
00027 int main(int argc, char ** argv) {
00028 int m, t;
00029 unsigned char sk[SECRETKEY_BYTES];
00030 unsigned char message[MESSAGE_BYTES], ciphertext[CIPHERTEXT_BYTES];
00031 int n;
00032 int size_n, fail;
00033 FILE * fichier, * output;
00034
00035 if (argc <= 3) {
00036 printf("syntax: %s secret_key_file ciphertext_file output_file\n", argv[0]);
00037 exit(0);
00038 }
00039
00040 fichier = fopen(argv[1], "r");
00041 fread(&m, sizeof(int), 1, fichier);
00042 fread(&t, sizeof(int), 1, fichier);
00043 if ((m != EXT_DEGREE) || (t != NB_ERRORS)) {
00044 fprintf(stderr, "invalid secret key file (m,t)=(%d,%d) instead of (%d,%d)\n", m, t, EXT_DEGREE, NB_ERRORS);
00045 exit(0);
00046 }
00047 fread(sk, 1, SECRETKEY_BYTES, fichier);
00048 fclose(fichier);
00049
00050 fichier = fopen(argv[2], "r");
00051 fread(ciphertext, 1, CIPHERTEXT_BYTES, fichier);
00052 if (decrypt_block_ss(message, ciphertext, sk) < 0) {
00053 fclose(fichier);
00054 fprintf(stderr, "not a valid encrypted file!\n");
00055 exit(0);
00056 }
00057 else {
00058 fail = 0;
00059 output = fopen(argv[3], "w");
00060 size_n = sizeof (n);
00061 memcpy(&n, message, size_n);
00062 fwrite(message + size_n, 1, MESSAGE_BYTES - size_n, output);
00063 n -= MESSAGE_BYTES - size_n;
00064
00065 while (n > MESSAGE_BYTES) {
00066 fread(ciphertext, 1, CIPHERTEXT_BYTES, fichier);
00067 if (decrypt_block_ss(message, ciphertext, sk) < 0) {
00068 fail = 1;
00069 break;
00070 }
00071 fwrite(message, 1, MESSAGE_BYTES, output);
00072 n -= MESSAGE_BYTES;
00073 }
00074 }
00075
00076 if (!fail) {
00077 fread(ciphertext, 1, CIPHERTEXT_BYTES, fichier);
00078 if (decrypt_block_ss(message, ciphertext, sk) < 0)
00079 fail = 1;
00080 else
00081 fwrite(message, 1, n, output);
00082 }
00083
00084 if (fail)
00085 fprintf(stderr, "invalid data in the encrypted file!\n");
00086
00087 fclose(output);
00088 fclose(fichier);
00089
00090 return 0;
00091 }