]> AND Private Git Repository - Cipher_code.git/blob - IDA_new/gf-complete/tools/gf_methods.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/Cipher_code
[Cipher_code.git] / IDA_new / gf-complete / tools / gf_methods.c
1 /*
2  * GF-Complete: A Comprehensive Open Source Library for Galois Field Arithmetic
3  * James S. Plank, Ethan L. Miller, Kevin M. Greenan,
4  * Benjamin A. Arnold, John A. Burnum, Adam W. Disney, Allen C. McBride.
5  *
6  * gf_methods.c
7  *
8  * Lists supported methods (incomplete w.r.t. GROUP and COMPOSITE)
9  */
10
11 #include <stdio.h>
12 #include <stdint.h>
13 #include <string.h>
14 #include <stdlib.h>
15
16 #include "gf_complete.h"
17 #include "gf_method.h"
18 #include "gf_int.h"
19
20 #define BNMULTS (8)
21 static char *BMULTS[BNMULTS] = { "CARRY_FREE", "GROUP48", 
22                                "TABLE", "LOG", "SPLIT4", "SPLIT8", "SPLIT88", "COMPOSITE" };
23 #define NMULTS (17)
24 static char *MULTS[NMULTS] = { "SHIFT", "CARRY_FREE", "CARRY_FREE_GK", "GROUP44", "GROUP48", "BYTWO_p", "BYTWO_b",
25                                "TABLE", "LOG", "LOG_ZERO", "LOG_ZERO_EXT", "SPLIT2",
26                                "SPLIT4", "SPLIT8", "SPLIT16", "SPLIT88", "COMPOSITE" };
27
28 /* Make sure CAUCHY is last */
29
30 #define NREGIONS (7) 
31 static char *REGIONS[NREGIONS] = { "DOUBLE", "QUAD", "LAZY", "SIMD", "NOSIMD",
32                                    "ALTMAP", "CAUCHY" };
33
34 #define BNREGIONS (4) 
35 static char *BREGIONS[BNREGIONS] = { "DOUBLE", "QUAD", "ALTMAP", "CAUCHY" };
36
37 #define NDIVS (2)
38 static char *divides[NDIVS] = { "MATRIX", "EUCLID" }; 
39
40 void usage(char *s)
41 {
42    fprintf(stderr, "usage: gf_methods w -BADC -LXUMDRB\n");
43    fprintf(stderr, "\n");
44    fprintf(stderr, "       w can be 1-32, 64, 128\n");
45    fprintf(stderr, "\n");
46    fprintf(stderr, "       -B lists basic methods that are useful\n");
47    fprintf(stderr, "       -A does a nearly exhaustive listing\n");
48    fprintf(stderr, "       -D adds EUCLID and MATRIX division\n");
49    fprintf(stderr, "       -C adds CAUCHY when possible\n");
50    fprintf(stderr, "       Combinations are fine.\n");
51    fprintf(stderr, "\n");
52    fprintf(stderr, "       -L Simply lists methods\n");
53    fprintf(stderr, "       -X List methods and functions selected (compile with DEBUG_FUNCTIONS)\n");
54    fprintf(stderr, "       -U Produces calls to gf_unit\n");
55    fprintf(stderr, "       -M Produces calls to time_tool.sh for single multiplications\n");
56    fprintf(stderr, "       -D Produces calls to time_tool.sh for single divisions\n");
57    fprintf(stderr, "       -R Produces calls to time_tool.sh for region multiplications\n");
58    fprintf(stderr, "       -B Produces calls to time_tool.sh for the fastest region multiplications\n");
59    fprintf(stderr, "       Cannot combine L, U, T.\n");
60    if (s != NULL) {
61      fprintf(stderr, "\n");
62      fprintf(stderr, "%s\n", s);
63    }
64    exit(1);
65 }
66
67 void print_methods(gf_t *gf)
68 {
69 #ifdef DEBUG_FUNCTIONS
70     gf_internal_t *h = (gf_internal_t*) gf->scratch;
71
72     printf("multiply = %s\n", h->multiply);
73     printf("divide = %s\n", h->divide);
74     printf("inverse = %s\n", h->inverse);
75     printf("multiply_region = %s\n", h->multiply_region);
76     printf("extract_word = %s\n", h->extract_word);
77 #endif
78 }
79
80 int main(int argc, char *argv[])
81 {
82   int m, r, d, w, i, sa, j, k, reset, ok;
83   int nregions;
84   int nmults;
85   char **regions;
86   char **mults;
87   int exhaustive = 0;
88   int divide = 0;
89   int cauchy = 0;
90   int listing;
91   char *gf_argv[50], *x;
92   gf_t gf;
93   char ls[10];
94   char * w_str;
95
96   if (argc != 4) usage(NULL);
97   w = atoi(argv[1]);
98   ok = (w >= 1 && w <= 32);
99   if (w == 64) ok = 1;
100   if (w == 128) ok = 1;
101   if (!ok) usage("Bad w");
102   
103   if (argv[2][0] != '-' || argv[3][0] != '-' || strlen(argv[2]) == 1 || strlen(argv[3]) != 2) {
104     usage(NULL);
105   }
106   for (i = 1; argv[2][i] != '\0'; i++) {
107     switch(argv[2][i]) {
108       case 'B': exhaustive = 0; break;
109       case 'A': exhaustive = 1; break;
110       case 'D': divide = 1; break;
111       case 'C': cauchy = 1; break;
112       default: usage("Bad -BADC");
113     }
114   }
115
116   if (strchr("LXUMDRB", argv[3][1]) == NULL) { usage("Bad -LXUMDRB"); }
117   listing = argv[3][1];
118
119   if (listing == 'U') {
120     w_str = "../test/gf_unit %d A -1";
121   } else if (listing == 'L' || listing == 'X') {
122     w_str = "w=%d:";
123   } else {
124     w_str = strdup("sh time_tool.sh X %d");
125     x = strchr(w_str, 'X');
126     *x = listing;
127   }
128
129   gf_argv[0] = "-";
130   if (create_gf_from_argv(&gf, w, 1, gf_argv, 0) > 0) {
131     printf(w_str, w);
132     printf(" - \n");
133     gf_free(&gf, 1);
134   } else if (_gf_errno == GF_E_DEFAULT) {
135     fprintf(stderr, "Unlabeled failed method: w=%d: -\n", 2);
136     exit(1);
137   }
138
139   nregions = (exhaustive) ? NREGIONS : BNREGIONS;
140   if (!cauchy) nregions--;
141   regions = (exhaustive) ? REGIONS : BREGIONS;
142   mults = (exhaustive) ? MULTS : BMULTS;
143   nmults = (exhaustive) ? NMULTS : BNMULTS;
144
145
146   for (m = 0; m < nmults; m++) {
147     sa = 0;
148     gf_argv[sa++] = "-m";
149     if (strcmp(mults[m], "GROUP44") == 0) {
150       gf_argv[sa++] = "GROUP";
151       gf_argv[sa++] = "4";
152       gf_argv[sa++] = "4";
153     } else if (strcmp(mults[m], "GROUP48") == 0) {
154       gf_argv[sa++] = "GROUP";
155       gf_argv[sa++] = "4";
156       gf_argv[sa++] = "8";
157     } else if (strcmp(mults[m], "SPLIT2") == 0) {
158       gf_argv[sa++] = "SPLIT";
159       sprintf(ls, "%d", w);
160       gf_argv[sa++] = ls;
161       gf_argv[sa++] = "2";
162     } else if (strcmp(mults[m], "SPLIT4") == 0) {
163       gf_argv[sa++] = "SPLIT";
164       sprintf(ls, "%d", w);
165       gf_argv[sa++] = ls;
166       gf_argv[sa++] = "4";
167     } else if (strcmp(mults[m], "SPLIT8") == 0) {
168       gf_argv[sa++] = "SPLIT";
169       sprintf(ls, "%d", w);
170       gf_argv[sa++] = ls;
171       gf_argv[sa++] = "8";
172     } else if (strcmp(mults[m], "SPLIT16") == 0) {
173       gf_argv[sa++] = "SPLIT";
174       sprintf(ls, "%d", w);
175       gf_argv[sa++] = ls;
176       gf_argv[sa++] = "16";
177     } else if (strcmp(mults[m], "SPLIT88") == 0) {
178       gf_argv[sa++] = "SPLIT";
179       gf_argv[sa++] = "8";
180       gf_argv[sa++] = "8";
181     } else if (strcmp(mults[m], "COMPOSITE") == 0) {
182       gf_argv[sa++] = "COMPOSITE";
183       gf_argv[sa++] = "2";
184       gf_argv[sa++] = "-";
185     } else {
186       gf_argv[sa++] = mults[m];
187     }
188     reset = sa;
189
190
191     for (r = 0; r < (1 << nregions); r++) {
192       sa = reset;
193       for (k = 0; k < nregions; k++) {
194         if (r & (1 << k)) {
195           gf_argv[sa++] = "-r";
196           gf_argv[sa++] = regions[k];
197         }
198       }
199       gf_argv[sa++] = "-";
200
201       /* printf("Hmmmm. %s", gf_argv[0]);
202       for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
203       printf("\n");  */
204   
205       if (create_gf_from_argv(&gf, w, sa, gf_argv, 0) > 0) {
206         printf(w_str, w);
207         for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
208         printf("\n");
209         if (listing == 'X')
210           print_methods(&gf);
211         gf_free(&gf, 1);
212       } else if (_gf_errno == GF_E_DEFAULT) {
213         fprintf(stderr, "Unlabeled failed method: w=%d:", w);
214         for (j = 0; j < sa; j++) fprintf(stderr, " %s", gf_argv[j]);
215         fprintf(stderr, "\n");
216         exit(1);
217       }
218       sa--;
219       if (divide) {
220         for (d = 0; d < NDIVS; d++) {
221           gf_argv[sa++] = "-d";
222           gf_argv[sa++] = divides[d];
223           /*          printf("w=%d:", w);
224                       for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
225                       printf("\n"); */
226           gf_argv[sa++] = "-";
227           if (create_gf_from_argv(&gf, w, sa, gf_argv, 0) > 0) {
228             printf(w_str, w);
229             for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
230             printf("\n");
231             if (listing == 'X')
232               print_methods(&gf);
233             gf_free(&gf, 1);
234           } else if (_gf_errno == GF_E_DEFAULT) {
235             fprintf(stderr, "Unlabeled failed method: w=%d:", w);
236             for (j = 0; j < sa; j++) fprintf(stderr, " %s", gf_argv[j]);
237             fprintf(stderr, "\n");
238             exit(1);
239           } 
240           sa-=3;
241         }
242       }
243     }
244   }
245   return 0;
246 }