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 <math.h>
00024 #include "precomp.h"
00025 #include "workfactor.h"
00026
00027 int main(int argc, char ** argv) {
00028 int m, t, r, len, i;
00029 FILE * fichier;
00030 precomp_t p, q;
00031 double * res, * res2, wf;
00032
00033 m = t = 0;
00034 if (argc > 2) {
00035 m = atoi(argv[1]);
00036 t = atoi(argv[2]);
00037 }
00038
00039 if ((m <= 0) || (t <= 0)) {
00040 fprintf(stderr, "Usage: %s m t [len]\n", argv[0]);
00041 fprintf(stderr, "all arguments are positive integers, with 5 < m <= 16, and 0 < t < 2^m/m\n");
00042 fprintf(stderr, "Look at the documentation for more information on the arguments\n");
00043 exit(0);
00044 }
00045
00046 if (m * t > (1 << m)) {
00047 fprintf(stderr, "Wrong parameters for Goppa codes!\nThe error weight is %d and should not exceed %d in length %d\n", t, (1 << m) / m, 1 << m);
00048 exit(0);
00049 }
00050
00051 p = precomp_build(m, t, 0);
00052 res = dicho_self_info_bounds(p);
00053 len = floor(res[0]);
00054
00055 if (argc > 3) {
00056 len = atoi(argv[3]);
00057 if (len > res[1]) {
00058 fprintf(stderr, "Encoding %d bits in words of length %d and weight %d is impossible!\n", len, 1 << m, t);
00059 exit(0);
00060 }
00061 if (len > res[0]) {
00062 printf("Warning: constant weight length %d might be too high\n\t lower and upper bounds are %g and %g\n", len, res[0], res[1]);
00063 }
00064 }
00065
00066 for (r = 1; r < m - log2(t); ++r) {
00067 q = precomp_build(m, t, r);
00068 res2 = dicho_self_info_bounds(q);
00069 if (len > floor(res2[0]))
00070 break;
00071 clear_precomp(p);
00072 free(res);
00073 p = q;
00074 res = res2;
00075 }
00076 if (r < m - log2(t)) {
00077 clear_precomp(q);
00078 free(res2);
00079 }
00080 --r;
00081 len = floor(res[0]);
00082
00083 printf("Generating pararemeters for McEliece encryption scheme\n");
00084 printf("Extension degree\t %d\n", m);
00085 printf("Error weight\t\t %d\n", t);
00086 printf("Number of encoded bits\t %d\n", len);
00087 printf("Words of length %d and weight %d are generated,\n", 1 << p.m, p.t);
00088 if (t != p.t)
00089 printf("0's and 1's are reversed and ");
00090 if (r > 0 )
00091 printf("%d bit%s added to each position.\n", r, (r > 1) ? "s are" : " is");
00092 printf("Security loss is %g\n", log_binomial_d(1 << m, t) - len);
00093 wf = workfactor(1 << m, (1 << m) - m * t, t);
00094 printf("Final security: %g bits\n", wf - log_binomial_d(1 << m, t) + len);
00095
00096
00097 fichier = fopen("params.h", "w");
00098
00099 fprintf(fichier, "#define LOG_LENGTH %d\n", m);
00100 fprintf(fichier, "#define ERROR_WEIGHT %d\n\n", t);
00101
00102 fprintf(fichier, "#define REDUC %d\n", r);
00103 fprintf(fichier, "#define ERROR_SIZE %d\n", len);
00104 fprintf(fichier, "// rounded down from %g\n", res[0]);
00105 fprintf(fichier, "// log_2(binomial(2^%d,%d)) = %g\n", m, t, log_binomial_d(1 << m, t));
00106 fprintf(fichier, "// log_2(binomial(2^%d,%d)) + %d * %d = %g\n", m - r, t, r, t, r * t + log_binomial_d(1 << (m - r), t));
00107 fprintf(fichier, "// security loss is %g\n", log_binomial_d(1 << m, t) - len);
00108 fprintf(fichier, "// final security is %g\n", wf - log_binomial_d(1 << m, t) + len);
00109
00110 fclose(fichier);
00111
00112 fichier = fopen("cwdata.c", "w");
00113 write_precomp(p, fichier);
00114 fclose(fichier);
00115
00116 return 0;
00117 }