aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/test_client.py
blob: 804fd7c080651c673b3a1d56830be63e70b41c80 (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
from os.path import join
from unittest import TestCase

from click.testing import CliRunner
from pyecsca.ec.curves import get_params
from pyecsca.ec.mod import Mod

from pyecsca.codegen.builder import build_impl
from pyecsca.codegen.client import (encode_data, decode_data, encode_scalar, cmd_init_prng,
                                    cmd_set_params, cmd_set_pubkey, cmd_set_privkey,
                                    cmd_scalar_mult,
                                    cmd_ecdh, cmd_ecdsa_sign, cmd_ecdsa_verify, cmd_generate,
                                    cmd_debug, main)


class EncodingTests(TestCase):

    def test_encode_decode(self):
        data = {"a": encode_scalar(0xcafebabe),
                "b": {
                    "c": encode_scalar(Mod(1, 3)),
                    "d": bytes([0x2])
                }}
        encoded = encode_data(None, data)
        result = decode_data(encoded)
        self.assertEqual(data, result)


class CommandTest(TestCase):

    def setUp(self):
        self.curve = get_params("secg", "secp128r1", "projective")
        self.model = self.curve.curve.model
        self.coords = self.curve.curve.coordinate_model

    def test_init_prng(self):
        cmd_init_prng(bytes([0xca, 0xfe, 0xba, 0xbe]))

    def test_set_curve(self):
        cmd_set_params(self.curve)

    def test_generate(self):
        cmd_generate()

    def test_set_pubkey(self):
        cmd_set_pubkey(self.curve.generator)

    def test_set_privkey(self):
        cmd_set_privkey(0x123456789)

    def test_scalar_mult(self):
        cmd_scalar_mult(0x123456789)

    def test_ecdh(self):
        cmd_ecdh(self.curve.generator)

    def test_ecdsa_sign(self):
        cmd_ecdsa_sign(b"something")

    def test_ecdsa_verify(self):
        cmd_ecdsa_verify(b"something", b"signature")

    def test_debug(self):
        cmd_debug()


class ClientTests(TestCase):

    def test_generate(self):
        runner = CliRunner()
        with runner.isolated_filesystem() as tmpdir:
            runner.invoke(build_impl,
                          ["--platform", "HOST", "shortw", "projective",
                           "add-1998-cmo", "dbl-1998-cmo", "z", "ltr(complete=False)", "."])
            result = runner.invoke(main,
                                   ["--platform", "HOST", "--fw",
                                    join(tmpdir, "pyecsca-codegen-HOST.elf"),
                                    "shortw", "projective", "gen", "secg/secp128r1"])
            self.assertEqual(result.exit_code, 0)


    def test_ecdh(self):
        runner = CliRunner()
        with runner.isolated_filesystem() as tmpdir:
            runner.invoke(build_impl,
                          ["--platform", "HOST", "shortw", "projective",
                           "add-1998-cmo", "dbl-1998-cmo", "z", "ltr(complete=False)", "."])
            result = runner.invoke(main,
                                   ["--platform", "HOST", "--fw",
                                    join(tmpdir, "pyecsca-codegen-HOST.elf"),
                                    "shortw", "projective", "ecdh", "secg/secp128r1",
                                    "122835813094999453922649270086793500655,326514220558629293368386081113307347349"])
            self.assertEqual(result.exit_code, 0)
            result = runner.invoke(main,
                                   ["--platform", "HOST", "--fw",
                                    join(tmpdir, "pyecsca-codegen-HOST.elf"),
                                    "shortw", "projective", "ecdh", "secg/secp128r1",
                                    "045c69512b630addd5b6d347b7bce517eff5a459f98f015c6906ccfed3cf0bf995"])
            self.assertEqual(result.exit_code, 0)
            result = runner.invoke(main,
                                   ["--platform", "HOST", "--fw",
                                    join(tmpdir, "pyecsca-codegen-HOST.elf"),
                                    "shortw", "projective", "ecdh", "secg/secp128r1",
                                    "something"])
            self.assertEqual(result.exit_code, 2)