| 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 | } |