1
|
.include "HDL50001_pcf.inc"
|
2
|
|
3
|
.alias SP 39
|
4
|
.alias IDX 4
|
5
|
.alias AA 0
|
6
|
.alias BB 1
|
7
|
.alias KI 2
|
8
|
.alias ENC 3 /* запрошена операция шифрования или расшифровывания */
|
9
|
|
10
|
.global gost_encdec
|
11
|
|
12
|
.data
|
13
|
|
14
|
Sblock:
|
15
|
/* Определяем тестовые S-блоки в соответствии с ГОСТ Р 34.11-94 */
|
16
|
.quad 0x35F7C1B6E08D29A4
|
17
|
.quad 0x95701832AFD6C4BE
|
18
|
.quad 0xB9067CFE243AD185
|
19
|
.quad 0x352BC64EF9801AD7
|
20
|
.quad 0x2B30E9A48DF517B6
|
21
|
.quad 0xEFC95863D1270AB4
|
22
|
.quad 0xC2867EA095F314BD
|
23
|
.quad 0xC8B6E3294A750DF1
|
24
|
|
25
|
Keys:
|
26
|
.long 0x1EADBEAF
|
27
|
.long 0x2EADBEAF
|
28
|
.long 0x3EADBEAF
|
29
|
.long 0x4EADBEAF
|
30
|
.long 0x5EADBEAF
|
31
|
.long 0x6EADBEAF
|
32
|
.long 0x7EADBEAF
|
33
|
Keys_last:
|
34
|
.long 0x8EADBEAF
|
35
|
|
36
|
.text
|
37
|
|
38
|
gost_encdec:
|
39
|
enc := rdl #SP, 4
|
40
|
rdl #SP, 8
|
41
|
rdl #SP, 12
|
42
|
|
43
|
setl #ENC, @3
|
44
|
setl #AA, @3
|
45
|
setl #BB, @3
|
46
|
|
47
|
getl Sblock
|
48
|
setl #32, @1
|
49
|
|
50
|
je @enc, gost_enc.prologue
|
51
|
jne @enc, gost_dec.prologue
|
52
|
complete
|
53
|
|
54
|
gost_enc.prologue:
|
55
|
setl #IDX, 0
|
56
|
jmp load_key1_24
|
57
|
complete
|
58
|
|
59
|
gost_dec.prologue:
|
60
|
setl #IDX, 32
|
61
|
jmp load_key25_32
|
62
|
complete
|
63
|
|
64
|
load_key1_24:
|
65
|
kp := getl Keys
|
66
|
getl #IDX
|
67
|
|
68
|
and @1, 7 /* Ограничиваем Ki пределами [0..7] */
|
69
|
mull @1, 4 /* Смещение до Ki */
|
70
|
addl @kp, @1 /* Ki = kp + i*4 */
|
71
|
rdl @1
|
72
|
setl #KI, @1
|
73
|
|
74
|
jmp round
|
75
|
complete
|
76
|
|
77
|
load_key25_32:
|
78
|
kp := getl Keys_last
|
79
|
i := getl #IDX
|
80
|
|
81
|
subl @i, 25 /* Ограничиваем Ki пределами [7..0] */
|
82
|
mull @1, 4 /* Смещение до Ki */
|
83
|
subl @kp, @1 /* Отсчитываем ключ с конца: Ki = kp - i*4 */
|
84
|
rdl @1
|
85
|
setl #KI, @1
|
86
|
|
87
|
jmp round
|
88
|
complete
|
89
|
|
90
|
round:
|
91
|
/* Сохраняем в коммутатор 8 значений Sblock */
|
92
|
s0 := rdq #32
|
93
|
s1 := rdq #32, 8
|
94
|
s2 := rdq #32, 16
|
95
|
s3 := rdq #32, 24
|
96
|
s4 := rdq #32, 32
|
97
|
s5 := rdq #32, 40
|
98
|
s6 := rdq #32, 48
|
99
|
s7 := rdq #32, 56
|
100
|
|
101
|
getl #KI
|
102
|
getl #AA
|
103
|
axk := xor @1, @2 /* Сложение Ai + Ki по mod 2 */
|
104
|
|
105
|
/* Разбиваем на 4-х битную подпоследовательность */
|
106
|
slrl @axk, 4
|
107
|
slrl @axk, 8
|
108
|
slrl @axk, 12
|
109
|
slrl @axk, 16
|
110
|
slrl @axk, 20
|
111
|
slrl @axk, 24
|
112
|
slrl @axk, 28
|
113
|
/* Получаем индекс для каждой подпоследовательности */
|
114
|
and @axk, 0xf
|
115
|
and @8, 0xf
|
116
|
and @8, 0xf
|
117
|
and @8, 0xf
|
118
|
and @8, 0xf
|
119
|
and @8, 0xf
|
120
|
and @8, 0xf
|
121
|
and @8, 0xf
|
122
|
mull @8, 4
|
123
|
mull @8, 4
|
124
|
mull @8, 4
|
125
|
mull @8, 4
|
126
|
mull @8, 4
|
127
|
mull @8, 4
|
128
|
mull @8, 4
|
129
|
mull @8, 4
|
130
|
/* Получаем значение по индексу */
|
131
|
slrq @s0, @8
|
132
|
slrq @s1, @8
|
133
|
slrq @s2, @8
|
134
|
slrq @s3, @8
|
135
|
slrq @s4, @8
|
136
|
slrq @s5, @8
|
137
|
slrq @s6, @8
|
138
|
slrq @s7, @8
|
139
|
and @8, 0xf
|
140
|
and @8, 0xf
|
141
|
and @8, 0xf
|
142
|
and @8, 0xf
|
143
|
and @8, 0xf
|
144
|
and @8, 0xf
|
145
|
and @8, 0xf
|
146
|
and @8, 0xf
|
147
|
/* Склеиваем подпоследовательности */
|
148
|
slll @7, 4
|
149
|
slll @7, 8
|
150
|
slll @7, 12
|
151
|
slll @7, 16
|
152
|
slll @7, 20
|
153
|
slll @7, 24
|
154
|
slll @7, 28
|
155
|
or @15, @7
|
156
|
or @1, @7
|
157
|
or @1, @7
|
158
|
or @1, @7
|
159
|
or @1, @7
|
160
|
or @1, @7
|
161
|
or @1, @7
|
162
|
|
163
|
roll @1, 11 /* Циклический сдвиг влево на 11 бит */
|
164
|
getl #BB
|
165
|
xor @1, @2 /* Bi ^ f(Ai,Ki) */
|
166
|
setl #BB, #AA /* Bi+1 = Ai */
|
167
|
setl #AA, @2 /* Ai+1 = Bi ^ f(Ai,Ki) */
|
168
|
|
169
|
/* HACK */
|
170
|
getl #IDX
|
171
|
subl @1, 1
|
172
|
/* addl @1, 1 */
|
173
|
setl #IDX, @1
|
174
|
|
175
|
subl @2, 25
|
176
|
/* subl @3, 33 */
|
177
|
subl @3, 1
|
178
|
jl @2, load_key1_24
|
179
|
jge @3, load_key25_32
|
180
|
/* je @3, return */
|
181
|
js @6, return
|
182
|
complete
|
183
|
|
184
|
return:
|
185
|
getl #AA
|
186
|
getl #BB
|
187
|
rdl #SP
|
188
|
jmp @1
|
189
|
complete
|