github.com/cloudflare/circl@v1.5.0/dh/sidh/internal/templates/gen.go (about)

     1  // The following directive is necessary to make the package coherent:
     2  
     3  //go:build ignore
     4  // +build ignore
     5  
     6  // This program generates contributors.go. It can be invoked by running
     7  // go generate
     8  package main
     9  
    10  import (
    11  	"bytes"
    12  	"fmt"
    13  	"go/format"
    14  	"os"
    15  	"strings"
    16  	"text/template"
    17  )
    18  
    19  var p34 = map[string]struct {
    20  	pow_strategy string
    21  	mul_strategy string
    22  	mul_initial  int
    23  }{
    24  	"P434": {
    25  		pow_strategy: "[]uint8{3, 10, 7, 5, 6, 5, 3, 8, 4, 7, 5, 6, 4, 5, 9, 6, 3, 11, 5, 5, 2, 8, 4, 7, 7, 8, 5, 6, 4, 8, 5, 2, 10, 6, 5, 4, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1}",
    26  		mul_strategy: "[]uint8{2, 15, 9, 8, 14, 12, 2, 8, 5, 15, 8, 15, 6, 6, 3, 2, 0, 10, 9, 13, 1, 12, 3, 7, 1, 10, 8, 11, 2, 15, 14, 1, 11, 12, 14, 3, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0}",
    27  		mul_initial:  8,
    28  	},
    29  	"P503": {
    30  		pow_strategy: "[]uint8{12, 5, 5, 2, 7, 11, 3, 8, 4, 11, 4, 7, 5, 6, 3, 7, 5, 7, 2, 12, 5, 6, 4, 6, 8, 6, 4, 7, 5, 5, 8, 5, 8, 5, 5, 8, 9, 3, 6, 2, 10, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3}",
    31  		mul_strategy: "[]uint8{12, 11, 10, 0, 1, 8, 3, 7, 1, 8, 3, 6, 7, 14, 2, 14, 14, 9, 0, 13, 9, 15, 5, 12, 7, 13, 7, 15, 6, 7, 9, 0, 5, 7, 6, 8, 8, 3, 7, 0, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3}",
    32  		mul_initial:  0,
    33  	},
    34  	"P751": {
    35  		pow_strategy: "[]uint8{5, 7, 6, 2, 10, 4, 6, 9, 8, 5, 9, 4, 7, 5, 5, 4, 8, 3, 9, 5, 5, 4, 10, 4, 6, 6, 6, 5, 8, 9, 3, 4, 9, 4, 5, 6, 6, 2, 9, 4, 5, 5, 5, 7, 7, 9, 4, 6, 4, 8, 5, 8, 6, 6, 2, 9, 7, 4, 8, 8, 8, 4, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2}",
    36  		mul_strategy: "[]uint8{15, 11, 10, 0, 15, 3, 3, 3, 4, 4, 9, 7, 11, 11, 5, 3, 12, 2, 10, 8, 5, 2, 8, 3, 5, 4, 11, 4, 0, 9, 2, 1, 12, 7, 5, 14, 15, 0, 14, 5, 6, 4, 5, 13, 6, 9, 7, 15, 1, 14, 11, 15, 12, 5, 0, 10, 9, 7, 7, 10, 14, 6, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1}",
    37  		mul_initial:  13,
    38  	},
    39  }
    40  
    41  // P434 optimized implementation for
    42  // ARM64 is not ported yet
    43  var opt_arm = map[string]bool{
    44  	"P434": false,
    45  	"P503": true,
    46  	"P751": true,
    47  }
    48  
    49  // Generates an 'fileNameBase.go' from 'fileNameBase.gotemp' file
    50  // for a given finite 'field'. Maps placeholders to 'values'.
    51  func gen(field, fileNameBase string, values interface{}) {
    52  	// Template files are located in ../templates and have
    53  	// extension .gotemp
    54  	templateFile := "../templates/" + fileNameBase + ".gotemp"
    55  	t, err := template.ParseFiles(templateFile)
    56  	if err != nil {
    57  		panic(fmt.Sprintf("Cannot open template file %s", templateFile))
    58  	}
    59  	var buf bytes.Buffer
    60  	err = t.Execute(&buf, values)
    61  	if err != nil {
    62  		panic("bad template execution")
    63  	}
    64  
    65  	// Formating output code
    66  	code, err := format.Source(buf.Bytes())
    67  	if err != nil {
    68  		panic("error formating code")
    69  	}
    70  
    71  	// name of the output .go file
    72  	outFileName := fileNameBase + ".go"
    73  	out, err := os.Create(outFileName)
    74  	if err != nil {
    75  		panic("Cannot open file")
    76  	}
    77  	_, err = out.Write(code)
    78  	if err != nil {
    79  		panic("error writing code")
    80  	}
    81  
    82  	err = out.Close()
    83  	if err != nil {
    84  		panic("Cant close generated file")
    85  	}
    86  }
    87  
    88  func main() {
    89  	field := os.Args[1]
    90  
    91  	s := struct {
    92  		FIELD            string
    93  		PACKAGE          string
    94  		P34_POW_STRATEGY string
    95  		P34_MUL_STRATEGY string
    96  		P34_INITIAL_MUL  int
    97  		OPT_ARM          bool
    98  	}{
    99  		FIELD:            field,
   100  		PACKAGE:          strings.ToLower(field),
   101  		P34_POW_STRATEGY: p34[field].pow_strategy,
   102  		P34_MUL_STRATEGY: p34[field].mul_strategy,
   103  		P34_INITIAL_MUL:  p34[field].mul_initial,
   104  		OPT_ARM:          opt_arm[field],
   105  	}
   106  
   107  	targets := map[string]interface{}{
   108  		"arith_decl":    s,
   109  		"arith_generic": s,
   110  		"curve":         s,
   111  		"fp2":           s,
   112  		"core":          s,
   113  
   114  		// tests
   115  		"arith_test": s,
   116  		"fp2_test":   s,
   117  		"curve_test": s,
   118  	}
   119  
   120  	for v, s := range targets {
   121  		gen(field, v, s)
   122  	}
   123  }