1int64 x
2int64 arg2
3int64 arg3
4int64 arg4
5
6input x
7input arg2
8input arg3
9input arg4
10
11int64 i
12int64 a
13int64 m
14int64 out
15int64 bytes
16stack64 ctarget
17stack512 tmp
18
19stack64 bytes_stack
20stack64 out_stack
21stack64 m_stack
22stack64 x_stack
23
24int64 z0
25int64 z1
26int64 z2
27int64 z3
28int64 z4
29int64 z5
30int64 z6
31int64 z7
32int64 z8
33int64 z9
34int64 z10
35int64 z11
36int64 z12
37int64 z13
38int64 z14
39int64 z15
40
41int64 u0
42int64 u1
43int64 u2
44int64 u3
45int64 u4
46int64 u5
47int64 u6
48int64 u7
49int64 u8
50int64 u9
51int64 u10
52int64 u11
53int64 u12
54int64 u13
55int64 u14
56int64 u15
57
58int64 y0
59int64 y1
60int64 y2
61int64 y3
62int64 y4
63int64 y5
64int64 y6
65int64 y7
66int64 y8
67int64 y9
68int64 y10
69int64 y11
70int64 y12
71int64 y13
72int64 y14
73int64 y15
74
75int64 x0
76int64 x1
77int64 x2
78int64 x3
79int64 x4
80int64 x5
81int64 x6
82int64 x7
83int64 x8
84int64 x9
85int64 x10
86int64 x11
87int64 x12
88int64 x13
89int64 x14
90int64 x15
91
92int64 q0
93int64 q1
94int64 q2
95int64 q3
96int64 q4
97int64 q5
98int64 q6
99int64 q7
100int64 q8
101int64 q9
102int64 q10
103int64 q11
104int64 q12
105int64 q13
106int64 q14
107int64 q15
108
109int64 m0
110int64 m1
111int64 m2
112int64 m3
113int64 m4
114int64 m5
115int64 m6
116int64 m7
117int64 m8
118int64 m9
119int64 m10
120int64 m11
121int64 m12
122int64 m13
123int64 m14
124int64 m15
125
126enter ECRYPT_init
127leave
128
129
130enter ECRYPT_ivsetup
131  x6 = *(uint32 *) (arg2 + 0)
132  x8 = 0
133  x7 = *(uint32 *) (arg2 + 4)
134  x9 = 0
135  x += 24
136  *(swapendian int32 *) x = x6
137  x += 4
138  *(swapendian int32 *) x = x7
139  x += 4
140  *(int32 *) (x + 0) = x8
141  x += 4
142  *(int32 *) (x + 0) = x9
143leave
144
145
146enter ECRYPT_keysetup
147
148                 unsigned>? arg3 - 128
149goto kbits256 if unsigned>
150
151kbits128:
152
153  x1 = *(uint32 *) (arg2 + 0)
154  x0 = 1634760805 & 0xfffffc00
155  x2 = *(uint32 *) (arg2 + 4)
156  x5 = 824206446 & 0xfffffc00
157  x3 = *(uint32 *) (arg2 + 8)
158  x10 = 2036477238 & 0xfffffc00
159  x4 = *(uint32 *) (arg2 + 12)
160  x15 = 1797285236 & 0xfffffc00
161  x11 = *(uint32 *) (arg2 + 0)
162  x0 |= 1634760805 & 0x3ff
163  x12 = *(uint32 *) (arg2 + 4)
164  x5 |= 824206446 & 0x3ff
165  x13 = *(uint32 *) (arg2 + 8)
166  x10 |= 2036477238 & 0x3ff
167  x14 = *(uint32 *) (arg2 + 12)
168  x15 |= 1797285236 & 0x3ff
169
170goto storekey
171
172kbits256:
173
174  x1 = *(uint32 *) (arg2 + 0)
175  x0 = 1634760805 & 0xfffffc00
176  x2 = *(uint32 *) (arg2 + 4)
177  x5 = 857760878 & 0xfffffc00
178  x3 = *(uint32 *) (arg2 + 8)
179  x10 = 2036477234 & 0xfffffc00
180  x4 = *(uint32 *) (arg2 + 12)
181  x15 = 1797285236 & 0xfffffc00
182  x11 = *(uint32 *) (arg2 + 16)
183  x0 |= 1634760805 & 0x3ff
184  x12 = *(uint32 *) (arg2 + 20)
185  x5 |= 857760878 & 0x3ff
186  x13 = *(uint32 *) (arg2 + 24)
187  x10 |= 2036477234 & 0x3ff
188  x14 = *(uint32 *) (arg2 + 28)
189  x15 |= 1797285236 & 0x3ff
190
191storekey:
192
193  *(int32 *) (x + 0) = x0
194  x += 4
195  *(swapendian int32 *) x = x1
196  x += 4
197  *(swapendian int32 *) x = x2
198  x += 4
199  *(swapendian int32 *) x = x3
200  x += 4
201  *(swapendian int32 *) x = x4
202  x += 4
203  *(int32 *) (x + 0) = x5
204  x += 20
205  *(int32 *) (x + 0) = x10
206  x += 4
207  *(swapendian int32 *) x = x11
208  x += 4
209  *(swapendian int32 *) x = x12
210  x += 4
211  *(swapendian int32 *) x = x13
212  x += 4
213  *(swapendian int32 *) x = x14
214  x += 4
215  *(int32 *) (x + 0) = x15
216
217leave
218
219
220enter ECRYPT_keystream_bytes
221
222bytes = arg3
223m = arg2
224out = arg2
225
226              unsigned>? bytes - 0
227goto done if !unsigned>
228
229  a = 0
230  i = bytes
231  zeroloop:
232    *(int8 *) (out + 0) = a
233    out += 1
234                   unsigned>? i -= 1
235  goto zeroloop if unsigned>
236  out -= bytes
237
238goto bytesatleast1
239
240enter ECRYPT_decrypt_bytes
241
242bytes = arg4
243m = arg2
244out = arg3
245
246              unsigned>? bytes - 0
247goto done if !unsigned>
248goto bytesatleast1
249
250enter ECRYPT_encrypt_bytes
251
252bytes = arg4
253m = arg2
254out = arg3
255
256              unsigned>? bytes - 0
257goto done if !unsigned>
258bytesatleast1:
259
260                          unsigned<? bytes - 64
261  goto bytesatleast64 if !unsigned<
262
263    ctarget = out
264    out = &tmp
265    i = 0
266    mcopyloop:
267      a = *(int8 *) (m + i)
268      *(int8 *) (out + i) = a
269      i += 1
270                      unsigned<? i - bytes
271    goto mcopyloop if unsigned<
272    m = &tmp
273
274  bytesatleast64:
275
276    x0 = *(uint32 *) (x + 0)
277    x1 = *(uint32 *) (x + 4)
278    x2 = *(uint32 *) (x + 8)
279    x3 = *(uint32 *) (x + 12)
280    x4 = *(uint32 *) (x + 16)
281    x5 = *(uint32 *) (x + 20)
282    x6 = *(uint32 *) (x + 24)
283    x7 = *(uint32 *) (x + 28)
284    x8 = *(uint32 *) (x + 32)
285    x9 = *(uint32 *) (x + 36)
286    x10 = *(uint32 *) (x + 40)
287    x11 = *(uint32 *) (x + 44)
288    x12 = *(uint32 *) (x + 48)
289    x13 = *(uint32 *) (x + 52)
290    x14 = *(uint32 *) (x + 56)
291    x15 = *(uint32 *) (x + 60)
292
293    i = 20
294
295    bytes_stack = bytes
296    out_stack = out
297    m_stack = m
298    x_stack = x
299
300    mainloop:
301
302
303
304y4 = x0 + x12
305		y9 = x5 + x1
306z4 = (uint32) y4 << 7
307				y14 = x10 + x6
308y4 = (uint32) y4 >> 25
309						y3 = x15 + x11
310		z9 = (uint32) y9 << 7
311y4 |= z4
312		y9 = (uint32) y9 >> 25
313x4 ^= y4
314				z14 = (uint32) y14 << 7
315		y9 |= z9
316				y14 = (uint32) y14 >> 25
317y8 = x4 + x0
318						z3 = (uint32) y3 << 7
319		x9 ^= y9
320						y3 = (uint32) y3 >> 25
321				y14 |= z14
322z8 = (uint32) y8 << 9
323		y13 = x9 + x5
324y8 = (uint32) y8 >> 23
325				x14 ^= y14
326						y3 |= z3
327				y2 = x14 + x10
328		z13 = (uint32) y13 << 9
329						x3 ^= y3
330		y13 = (uint32) y13 >> 23
331y8 |= z8
332				z2 = (uint32) y2 << 9
333						y7 = x3 + x15
334				y2 = (uint32) y2 >> 23
335x8 ^= y8
336		y13 |= z13
337y12 = x8 + x4
338						z7 = (uint32) y7 << 9
339		x13 ^= y13
340						y7 = (uint32) y7 >> 23
341				y2 |= z2
342z12 = (uint32) y12 << 13
343		y1 = x13 + x9
344y12 = (uint32) y12 >> 19
345				x2 ^= y2
346						y7 |= z7
347				y6 = x2 + x14
348		z1 = (uint32) y1 << 13
349						x7 ^= y7
350		y1 = (uint32) y1 >> 19
351y12 |= z12
352				z6 = (uint32) y6 << 13
353						y11 = x7 + x3
354				y6 = (uint32) y6 >> 19
355x12 ^= y12
356		y1 |= z1
357y0 = x12 + x8
358						z11 = (uint32) y11 << 13
359		x1 ^= y1
360						y11 = (uint32) y11 >> 19
361				y6 |= z6
362z0 = (uint32) y0 << 18
363		y5 = x1 + x13
364y0 = (uint32) y0 >> 14
365				x6 ^= y6
366						y11 |= z11
367				y10 = x6 + x2
368		z5 = (uint32) y5 << 18
369						x11 ^= y11
370		y5 = (uint32) y5 >> 14
371y0 |= z0
372				z10 = (uint32) y10 << 18
373						y15 = x11 + x7
374				y10 = (uint32) y10 >> 14
375x0 ^= y0
376		y5 |= z5
377u1 = x0 + x3
378						z15 = (uint32) y15 << 18
379		x5 ^= y5
380						y15 = (uint32) y15 >> 14
381				y10 |= z10
382z1 = (uint32) u1 << 7
383		u6 = x5 + x4
384u1 = (uint32) u1 >> 25
385				x10 ^= y10
386						y15 |= z15
387				u11 = x10 + x9
388		z6 = (uint32) u6 << 7
389						x15 ^= y15
390		u6 = (uint32) u6 >> 25
391u1 |= z1
392				z11 = (uint32) u11 << 7
393						u12 = x15 + x14
394				u11 = (uint32) u11 >> 25
395		u6 |= z6
396x1 ^= u1
397						z12 = (uint32) u12 << 7
398		x6 ^= u6
399						u12 = (uint32) u12 >> 25
400				u11 |= z11
401u2 = x1 + x0
402		u7 = x6 + x5
403z2 = (uint32) u2 << 9
404				x11 ^= u11
405u2 = (uint32) u2 >> 23
406						u12 |= z12
407		z7 = (uint32) u7 << 9
408				u8 = x11 + x10
409		u7 = (uint32) u7 >> 23
410						x12 ^= u12
411				z8 = (uint32) u8 << 9
412u2 |= z2
413				u8 = (uint32) u8 >> 23
414						u13 = x12 + x15
415		u7 |= z7
416x2 ^= u2
417						z13 = (uint32) u13 << 9
418		x7 ^= u7
419						u13 = (uint32) u13 >> 23
420				u8 |= z8
421u3 = x2 + x1
422		u4 = x7 + x6
423z3 = (uint32) u3 << 13
424				x8 ^= u8
425		z4 = (uint32) u4 << 13
426						u13 |= z13
427u3 = (uint32) u3 >> 19
428				u9 = x8 + x11
429		u4 = (uint32) u4 >> 19
430						x13 ^= u13
431				z9 = (uint32) u9 << 13
432u3 |= z3
433				u9 = (uint32) u9 >> 19
434						u14 = x13 + x12
435		u4 |= z4
436x3 ^= u3
437						z14 = (uint32) u14 << 13
438		x4 ^= u4
439						u14 = (uint32) u14 >> 19
440				u9 |= z9
441u0 = x3 + x2
442		u5 = x4 + x7
443z0 = (uint32) u0 << 18
444				x9 ^= u9
445		z5 = (uint32) u5 << 18
446						u14 |= z14
447u0 = (uint32) u0 >> 14
448				u10 = x9 + x8
449		u5 = (uint32) u5 >> 14
450						x14 ^= u14
451				z10 = (uint32) u10 << 18
452u0 |= z0
453				u10 = (uint32) u10 >> 14
454						u15 = x14 + x13
455		u5 |= z5
456x0 ^= u0
457						z15 = (uint32) u15 << 18
458		x5 ^= u5
459						u15 = (uint32) u15 >> 14
460                 unsigned>? i -= 2
461				u10 |= z10
462						u15 |= z15
463				x10 ^= u10
464						x15 ^= u15
465
466
467goto mainloop if unsigned>
468
469  x = x_stack
470
471  q0 = *(uint32 *) (x + 0)
472  q1 = *(uint32 *) (x + 4)
473  q2 = *(uint32 *) (x + 8)
474  q3 = *(uint32 *) (x + 12)
475  x0 += q0
476  q4 = *(uint32 *) (x + 16)
477  x1 += q1
478  q5 = *(uint32 *) (x + 20)
479  x2 += q2
480  q6 = *(uint32 *) (x + 24)
481  x3 += q3
482  q7 = *(uint32 *) (x + 28)
483  x4 += q4
484  q8 = *(uint32 *) (x + 32)
485  x5 += q5
486  q9 = *(uint32 *) (x + 36)
487  x6 += q6
488  q10 = *(uint32 *) (x + 40)
489  x7 += q7
490  q11 = *(uint32 *) (x + 44)
491  x8 += q8
492  q8 += 1
493  *(uint32 *) (x + 32) = q8
494  q8 = (uint64) q8 >> 32
495  q12 = *(uint32 *) (x + 48)
496  x9 += q9
497  q9 += q8
498  *(uint32 *) (x + 36) = q9
499  q13 = *(uint32 *) (x + 52)
500  x10 += q10
501  q14 = *(uint32 *) (x + 56)
502  x11 += q11
503  q15 = *(uint32 *) (x + 60)
504  x12 += q12
505  x13 += q13
506  x14 += q14
507  x15 += q15
508
509  m = m_stack
510
511  m0 = *(swapendian uint32 *) m
512  m += 4
513  m1 = *(swapendian uint32 *) m
514  m += 4
515  m2 = *(swapendian uint32 *) m
516  m += 4
517  m3 = *(swapendian uint32 *) m
518  m += 4
519  x0 ^= m0
520  m4 = *(swapendian uint32 *) m
521  m += 4
522  x1 ^= m1
523  m5 = *(swapendian uint32 *) m
524  m += 4
525  x2 ^= m2
526  m6 = *(swapendian uint32 *) m
527  m += 4
528  x3 ^= m3
529  m7 = *(swapendian uint32 *) m
530  m += 4
531  x4 ^= m4
532  m8 = *(swapendian uint32 *) m
533  m += 4
534  x5 ^= m5
535  m9 = *(swapendian uint32 *) m
536  m += 4
537  x6 ^= m6
538  m10 = *(swapendian uint32 *) m
539  m += 4
540  x7 ^= m7
541  m11 = *(swapendian uint32 *) m
542  m += 4
543  x8 ^= m8
544  m12 = *(swapendian uint32 *) m
545  m += 4
546  x9 ^= m9
547  m13 = *(swapendian uint32 *) m
548  m += 4
549  x10 ^= m10
550  m14 = *(swapendian uint32 *) m
551  m += 4
552  x11 ^= m11
553  m15 = *(swapendian uint32 *) m
554  m += 4
555  x12 ^= m12
556  x13 ^= m13
557  x14 ^= m14
558  x15 ^= m15
559
560  out = out_stack
561  *(swapendian uint32 *) out = x0
562  out += 4
563  *(swapendian uint32 *) out = x1
564  out += 4
565  *(swapendian uint32 *) out = x2
566  out += 4
567  *(swapendian uint32 *) out = x3
568  out += 4
569  *(swapendian uint32 *) out = x4
570  out += 4
571  *(swapendian uint32 *) out = x5
572  out += 4
573  *(swapendian uint32 *) out = x6
574  out += 4
575  *(swapendian uint32 *) out = x7
576  out += 4
577  *(swapendian uint32 *) out = x8
578  out += 4
579  *(swapendian uint32 *) out = x9
580  out += 4
581  *(swapendian uint32 *) out = x10
582  out += 4
583  *(swapendian uint32 *) out = x11
584  out += 4
585  *(swapendian uint32 *) out = x12
586  out += 4
587  *(swapendian uint32 *) out = x13
588  out += 4
589  *(swapendian uint32 *) out = x14
590  out += 4
591  *(swapendian uint32 *) out = x15
592  out += 4
593
594  bytes = bytes_stack
595                        unsigned>? bytes -= 64
596  goto bytesatleast1 if unsigned>
597  goto done if !unsigned<
598
599    m = ctarget
600    bytes += 64
601    out -= 64
602    i = 0
603    ccopyloop:
604      a = *(int8 *) (out + i)
605      *(int8 *) (m + i) = a
606      i += 1
607                      unsigned<? i - bytes
608    goto ccopyloop if unsigned<
609
610done:
611leave
612