chiark / gitweb /
Normal basis support (translates to poly basis internally). Rewrite
[catacomb] / ec-gentab.awk
1 #! /usr/bin/awk -f
2 #
3 # $Id: ec-gentab.awk,v 1.1 2004/04/01 21:28:41 mdw Exp $
4
5 function banner(name,  s, i)
6 {
7   s = "/*----- " name " ";
8   while (length(s) < 75) s = s "-";
9   return (s "*/");
10 }
11
12 function fix(name)
13 {
14   gsub(/[^0-9A-Za-z_]+/, "_", name);
15   return (name);
16 }
17
18 BEGIN {
19   print "/* -*-c-*-";
20   print " *";
21   print " * Table of elliptic curves [generated]";
22   print " */";
23   print "";
24   print "#include \"ectab.h\"";
25   print "";
26   print "#define N(x) (sizeof(x)/sizeof(*x))";
27   print "#define MP(x) { x, x + N(x), N(x), 0, MP_CONST, 0 }";
28   print "#define NOMP { 0, 0, 0, 0, 0 }";
29   print "";
30   print banner("Curve data");
31   print "";
32
33   d_i = 0;
34   name = "";
35 }
36
37 function putmp(x,  d)
38 {
39   if (!(x in data)) {
40     print "curve " name ": missing " x >"/dev/stderr";
41     exit 1;
42   }
43   d = data[x];
44   if (!(d in cache)) {
45     n = "c_" fix(name) "_" x;
46     print "static mpw " n "[] = {";
47     system("./mpdump " d);
48     print "};";
49     print "";
50     cache[d] = n;
51   }
52   mp[x] = cache[d];
53 }
54
55 function flush()
56 {
57   if (name == "") return;
58   print "/* --- Curve " name " --- */";
59   delete mp;
60   print "";
61   putmp("p");
62   if (type == "binnorm") putmp("beta");
63   putmp("a");
64   putmp("b");
65   putmp("r");
66   putmp("h");
67   putmp("gx");
68   putmp("gy");
69   print "static ecdata c_" fix(name) " = {";
70   print "  FTAG_" toupper(type) ",";
71   print "  MP(" mp["p"] "),"
72   if (type == "binnorm")
73     print "  MP(" mp["beta"] "),";
74   else
75     print "  NOMP,";
76   print "  MP(" mp["a"] "),"
77   print "  MP(" mp["b"] "),"
78   print "  MP(" mp["r"] "),"
79   print "  MP(" mp["h"] "),"
80   print "  MP(" mp["gx"] "),"
81   print "  MP(" mp["gy"] ")"
82   print "};";
83   print "";
84   dname[d_i++] = name;
85   d[name] = name;
86   r[name] = "c_" fix(name);
87   name = "";
88 }
89
90 /^[ \t]*(#|$)/ { next; }
91
92 $1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; }
93
94 $1 == "curve" { flush(); delete data; name = $2; type = $3; next; }
95
96 { data[$1] = $2; next; }
97
98 END {
99   flush();
100   print banner("Main table");
101   print "";
102   print "const ecentry ectab[] = {";
103   for (i = 0; i < d_i; i++) {
104     name = dname[i];
105     rname = d[name];
106     if (!rname in r) {
107       print "curve " rname " not found (alias from " name ")" >"/dev/stderr";
108       exit 1;
109     }
110     print "  { \"" name "\", &" r[rname] " },";
111   }
112   print "  { 0, 0 }";
113   print "};"
114   print "";
115   print banner("That's all, folks");
116 }