aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_context.py
blob: 1073fc0b09627bd20faa418e93439f0715d432ff (plain)
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
import ast
from unittest import TestCase

from pyecsca.ec.context import (local, DefaultContext, OpResult, NullContext, getcontext,
                                setcontext,
                                resetcontext)
from pyecsca.ec.coordinates import AffineCoordinateModel
from pyecsca.ec.mod import Mod
from pyecsca.ec.mult import LTRMultiplier
from pyecsca.ec.point import Point
from .curves import get_secp128r1


class OpResultTests(TestCase):

    def test_repr(self):
        for op, char in zip((ast.Add(), ast.Sub(), ast.Mult(), ast.Div()), "+-*/"):
            res = OpResult("X1", Mod(0, 5), op, Mod(2, 5), Mod(3, 5))
            self.assertEqual(str(res), "X1")
            self.assertEqual(repr(res), "X1 = 2{}3".format(char))


class ContextTests(TestCase):

    def setUp(self):
        self.secp128r1 = get_secp128r1()
        self.base = self.secp128r1.generator
        self.coords = self.secp128r1.curve.coordinate_model
        self.mult = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
                                  self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])

    def test_null(self):
        with local() as ctx:
            self.mult.multiply(59, self.base)
        self.assertIsInstance(ctx, NullContext)

    def test_default(self):
        token = setcontext(DefaultContext())
        self.addCleanup(resetcontext, token)

        with local(DefaultContext()) as ctx:
            self.mult.multiply(59, self.base)
        self.assertEqual(len(ctx.actions), 10)
        self.assertEqual(len(getcontext().actions), 0)

    def test_execute(self):
        with self.assertRaises(ValueError):
            getcontext().execute(self.coords.formulas["z"], self.base, self.base)
        with self.assertRaises(ValueError):
            getcontext().execute(self.coords.formulas["z"],
                                 Point(AffineCoordinateModel(self.secp128r1.curve.model),
                                       x=Mod(1, 5), y=Mod(2, 5)))

    def test_repr(self):
        with local(DefaultContext()) as default:
            self.mult.multiply(59, self.base)
        str(default)
        str(default.actions)
        with local(NullContext()) as null:
            self.mult.multiply(59, self.base)
        str(null)