aboutsummaryrefslogtreecommitdiffhomepage
path: root/pyecsca/codegen/common.py
blob: e29fa007ad3a58ec976d85cb23718a86d468e39b (plain) (blame)
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