Project

General

Profile

gost.s

mouse, 08/08/2013 01:22 PM

 
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