-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.s
271 lines (227 loc) · 7.14 KB
/
main.s
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
; ==============================================================================
; file main.s
; author [email protected]
;
; Copyright © 2023 Tropic Square s.r.o. (https://tropicsquare.com/)
; This work is subject to the license terms of the LICENSE.txt file in the root
; directory of this source tree.
; If a copy of the LICENSE file was not distributed with this work, you can
; obtain one at (https://tropicsquare.com/license).
;
; ==============================================================================
;
; Top source of Application Firmware
;
; - ECC Key Ops
; - X25519 Ops
; - ECDSA Ops
; - EdDSA Sequence
;
; ==============================================================================
; Defines
; ==============================================================================
; DEFINES START
;
; Enable ECC key rerandomization in Flash
;.define ECC_KEY_RERANDOMIZE
;
; Indlude debug operations
.define DEBUG_OPS
;
; Use SPECT_INOUT_SRC[7:4]
; When disabled, SPECT_INOUT_SRC[7:4] is ignored, and efectively forced to 0x4.
.define IN_SRC_EN
;
; Use SPECT_INOUT_SRC[3:0]
; When disabled, SPECT_INOUT_SRC[3:0] is ignored, and efectively forced to 0x5.
.define OUT_SRC_EN
;
; DEFINES END
; ==============================================================================
; Constants Includes
; ==============================================================================
.include mem_layouts/mem_layouts_includes.s
.include constants/spect_ops_constants.s ; Generated from spect_ops_config.yml
.include constants/spect_descriptors_constants.s
.include constants/l3_result_const.s
.include constants/spect_ops_status.s
; ==============================================================================
; Op ID decoding
; ==============================================================================
_start:
LD r0, ca_spect_cfg_word
ADDI r0, r0, 0 ; force bits [255:32] to 0
MOVI r4, 0xFF
AND r1, r0, r4 ; mask SPECT_OP_ID to r1[7:0]
ANDI r4, r1, 0xF0 ; get only op type id
; Load DST template
LD r5, ca_dst_template
op_id_check_clear:
CMPI r1, clear_id
BRZ op_clear
op_id_check_ecc_key:
CMPI r4, ecc_key_id
BRZ op_ecc_key
op_id_check_x25519:
CMPI r4, x25519_id
BRZ op_x25519
op_id_check_eddsa:
CMPI r4, eddsa_id
BRZ op_eddsa
op_id_check_ecdsa:
CMPI r4, ecdsa_id
BRZ op_ecdsa
.ifdef DEBUG_OPS
od_id_check_dbg:
CMPI r1, x25519_dbg_id
BRZ op_x25519_dbg
CMPI r1, eddsa_set_context_dbg_id
BRZ op_eddsa_set_context_dbg
CMPI r1, ecdsa_sign_dbg_id
BRZ op_ecdsa_dbg
JMP invalid_op_id
.endif
; ==============================================================================
op_ecc_key:
; Compose DST for ecc_key ops
ORI r5, r5, gfp_gen_dst_ecc_key
ROL8 r5, r5
ST r5, ca_gfp_gen_dst
CMPI r1, ecc_key_gen_id
BRZ op_ecc_key_gen_store
CMPI r1, ecc_key_store_id
BRZ op_ecc_key_gen_store
CMPI r1, ecc_key_read_id
BRZ op_ecc_key_read
CMPI r1, ecc_key_erase_id
BRZ op_ecc_key_erase
JMP invalid_op_id
; ==============================================================================
op_x25519:
; Compose GF(p) gen DST for x25519 ops
ORI r5, r5, gfp_gen_dst_x25519
ROL8 r5, r5
ST r5, ca_gfp_gen_dst
CMPI r1, x25519_kpair_gen_id
BRZ op_x25519_kpair_gen
CMPI r1, x25519_sc_et_eh_id
BRZ op_x25519_sc_et_eh
CMPI r1, x25519_sc_et_sh_id
BRZ op_x25519_sc_et_sh
CMPI r1, x25519_sc_st_eh_id
BRZ op_x25519_sc_st_eh
JMP invalid_op_id
; ==============================================================================
op_eddsa:
; Compose GF(p) gen DST for eddsa ops
ORI r5, r5, gfp_gen_dst_eddsa
ROL8 r5, r5
ST r5, ca_gfp_gen_dst
CMPI r1, eddsa_set_context_id
BRZ op_eddsa_set_context
CMPI r1, eddsa_nonce_init_id
BRZ op_eddsa_nonce_init
CMPI r1, eddsa_nonce_update_id
BRZ op_eddsa_nonce_update
CMPI r1, eddsa_nonce_finish_id
BRZ op_eddsa_nonce_finish
CMPI r1, eddsa_R_part_id
BRZ op_eddsa_R_part
CMPI r1, eddsa_e_at_once_id
BRZ op_eddsa_e_at_once
CMPI r1, eddsa_e_prep_id
BRZ op_eddsa_e_prep
CMPI r1, eddsa_e_update_id
BRZ op_eddsa_e_update
CMPI r1, eddsa_e_finish_id
BRZ op_eddsa_e_finish
CMPI r1, eddsa_finish_id
BRZ op_eddsa_finish
JMP invalid_op_id
; ==============================================================================
op_ecdsa:
; Compose GF(p) gen DST for ecdsa ops
ORI r5, r5, gfp_gen_dst_ecdsa
ROL8 r5, r5
ST r5, ca_gfp_gen_dst
CMPI r1, ecdsa_sign_id
BRZ op_ecdsa_sign
JMP invalid_op_id
; ==============================================================================
invalid_op_id:
MOVI r2, l3_result_invalid_cmd
CALL get_output_base
STR r2, r0
MOVI r1, 0
MOVI r0, ret_op_id_err
JMP set_res_word
; ==============================================================================
; Routines for geting fields from SPECT_CFG_WORD
; ==============================================================================
get_input_base:
.ifdef IN_SRC_EN
LD r0, ca_spect_cfg_word
MOVI r1, 0xF0
ROL8 r1, r1
AND r0, r0, r1
.else
.ifdef DEBUG_OPS
LD r0, ca_spect_cfg_word
MOVI r1, 0x80
AND r0, r0, r1 ; mask SPECT_OP_ID[7:4]
BRZ get_input_base_app ; current op is a application op, force 0x4
; else it is debug op, force 0x0
MOVI r0, 0
RET
get_input_base_app:
.endif
MOVI r0, 0x40
ROL8 r0, r0
.endif
RET
get_output_base:
.ifdef OUT_SRC_EN
LD r0, ca_spect_cfg_word
MOVI r1, 0xF0
ROL8 r1, r1
LSL r0, r0
LSL r0, r0
LSL r0, r0
LSL r0, r0
AND r0, r0, r1
.else
.ifdef DEBUG_OPS
LD r0, ca_spect_cfg_word
MOVI r1, 0x80
AND r0, r0, r1 ; mask SPECT_OP_ID[7:4]
BRZ get_output_base_app ; current op is a application op, force 0x5
; else it is debug op, force 0x1
MOVI r0, 0x10
ROL8 r0, r0
RET
get_output_base_app:
.endif
MOVI r0, 0x50
ROL8 r0, r0
.endif
RET
get_data_in_size:
LD r0, ca_spect_cfg_word
ROR8 r0, r0
ROR8 r0, r0
MOVI r1, 0xFF
ROL8 r1, r1
ORI r1, r1, 0xFF
AND r0, r0, r1
RET
; ==============================================================================
; Routine for setting SPECT_RES_WORD field
; ==============================================================================
set_res_word:
ROL8 r1, r1
ROL8 r1, r1
ADD r0, r0, r1
ST r0, ca_spect_res_word
END
; ==============================================================================
.include routines_includes.s