1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
from dataclasses import dataclass
from enum import Enum
from typing import List, Type
import click
from public import public
from pyecsca.ec.coordinates import CoordinateModel
from pyecsca.ec.formula import Formula
from pyecsca.ec.model import CurveModel
from pyecsca.ec.mult import (ScalarMultiplier, LTRMultiplier, RTLMultiplier, CoronMultiplier,
LadderMultiplier, SimpleLadderMultiplier, DifferentialLadderMultiplier,
WindowNAFMultiplier, BinaryNAFMultiplier)
@public
class EnumDefine(Enum):
def __str__(self):
return self.value
def __repr__(self):
return self.value
@classmethod
def names(cls):
return list(e.name for e in cls)
@public
class Platform(EnumDefine):
"""Platform to build for."""
HOST = "HOST"
XMEGA = "CW308_XMEGA"
STM32F0 = "CW308_STM32F0"
STM32F3 = "CW308_STM32F3"
@public
class Multiplication(EnumDefine):
"""Base multiplication algorithm to use."""
TOOM_COOK = "MUL_TOOM_COOK"
KARATSUBA = "MUL_KARATSUBA"
COMBA = "MUL_COMBA"
BASE = "MUL_BASE"
@public
class Squaring(EnumDefine):
"""Base squaring algorithm to use."""
TOOM_COOK = "SQR_TOOM_COOK"
KARATSUBA = "SQR_KARATSUBA"
COMBA = "SQR_COMBA"
BASE = "SQR_BASE"
@public
class Reduction(EnumDefine):
"""Modular reduction method used."""
BARRETT = "RED_BARRETT"
MONTGOMERY = "RED_MONTGOMERY"
BASE = "RED_BASE"
@public
class HashType(EnumDefine):
"""Hash algorithm used in ECDH and ECDSA."""
NONE = "HASH_NONE"
SHA1 = "HASH_SHA1"
SHA224 = "HASH_SHA224"
SHA256 = "HASH_SHA256"
SHA384 = "HASH_SHA384"
SHA512 = "HASH_SHA512"
@public
class RandomMod(EnumDefine):
"""Method of sampling a uniform integer modulo order."""
SAMPLE = "MOD_RAND_SAMPLE"
REDUCE = "MOD_RAND_REDUCE"
@public
@dataclass
class Configuration(object):
platform: Platform
hash_type: HashType
mod_rand: RandomMod
mult: Multiplication # TODO: Use this
sqr: Squaring # TODO: Use this
red: Reduction # TODO: Use this
model: CurveModel
coords: CoordinateModel
formulas: List[Formula]
scalarmult: ScalarMultiplier
keygen: bool
ecdh: bool
ecdsa: bool
MULTIPLIERS = [
{
"name": ("ltr", "LTRMultiplier"),
"class": LTRMultiplier
},
{
"name": ("rtl", "RTLMultiplier"),
"class": RTLMultiplier
},
{
"name": ("coron", "CoronMultiplier"),
"class": CoronMultiplier
},
{
"name": ("ldr", "LadderMultiplier"),
"class": LadderMultiplier
},
{
"name": ("simple-ldr", "SimpleLadderMultiplier"),
"class": SimpleLadderMultiplier
},
{
"name": ("diff-ldr", "DifferentialLadderMultiplier"),
"class": DifferentialLadderMultiplier
},
{
"name": ("naf", "bnaf", "BinaryNAFMultiplier"),
"class": BinaryNAFMultiplier
},
{
"name": ("wnaf", "WindowNAFMultiplier"),
"class": WindowNAFMultiplier
}
]
@public
def wrap_enum(enum_class: Type[EnumDefine]):
def callback(ctx, param, value):
try:
res = getattr(enum_class, value)
return res
except Exception:
raise click.BadParameter(
"Cannot create {} enum from {}.".format(enum_class.__name__, value))
return callback
|