• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%ifidn __OUTPUT_FORMAT__,obj
2section	code	use32 class=code align=64
3%elifidn __OUTPUT_FORMAT__,win32
4$@feat.00 equ 1
5section	.text	code align=64
6%else
7section	.text	code
8%endif
9global	_Camellia_EncryptBlock_Rounds
10align	16
11_Camellia_EncryptBlock_Rounds:
12L$_Camellia_EncryptBlock_Rounds_begin:
13	push	ebp
14	push	ebx
15	push	esi
16	push	edi
17	mov	eax,DWORD [20+esp]
18	mov	esi,DWORD [24+esp]
19	mov	edi,DWORD [28+esp]
20	mov	ebx,esp
21	sub	esp,28
22	and	esp,-64
23	lea	ecx,[edi-127]
24	sub	ecx,esp
25	neg	ecx
26	and	ecx,960
27	sub	esp,ecx
28	add	esp,4
29	shl	eax,6
30	lea	eax,[eax*1+edi]
31	mov	DWORD [20+esp],ebx
32	mov	DWORD [16+esp],eax
33	call	L$000pic_point
34L$000pic_point:
35	pop	ebp
36	lea	ebp,[(L$Camellia_SBOX-L$000pic_point)+ebp]
37	mov	eax,DWORD [esi]
38	mov	ebx,DWORD [4+esi]
39	mov	ecx,DWORD [8+esi]
40	bswap	eax
41	mov	edx,DWORD [12+esi]
42	bswap	ebx
43	bswap	ecx
44	bswap	edx
45	call	__x86_Camellia_encrypt
46	mov	esp,DWORD [20+esp]
47	bswap	eax
48	mov	esi,DWORD [32+esp]
49	bswap	ebx
50	bswap	ecx
51	bswap	edx
52	mov	DWORD [esi],eax
53	mov	DWORD [4+esi],ebx
54	mov	DWORD [8+esi],ecx
55	mov	DWORD [12+esi],edx
56	pop	edi
57	pop	esi
58	pop	ebx
59	pop	ebp
60	ret
61global	_Camellia_EncryptBlock
62align	16
63_Camellia_EncryptBlock:
64L$_Camellia_EncryptBlock_begin:
65	mov	eax,128
66	sub	eax,DWORD [4+esp]
67	mov	eax,3
68	adc	eax,0
69	mov	DWORD [4+esp],eax
70	jmp	NEAR L$_Camellia_EncryptBlock_Rounds_begin
71global	_Camellia_encrypt
72align	16
73_Camellia_encrypt:
74L$_Camellia_encrypt_begin:
75	push	ebp
76	push	ebx
77	push	esi
78	push	edi
79	mov	esi,DWORD [20+esp]
80	mov	edi,DWORD [28+esp]
81	mov	ebx,esp
82	sub	esp,28
83	and	esp,-64
84	mov	eax,DWORD [272+edi]
85	lea	ecx,[edi-127]
86	sub	ecx,esp
87	neg	ecx
88	and	ecx,960
89	sub	esp,ecx
90	add	esp,4
91	shl	eax,6
92	lea	eax,[eax*1+edi]
93	mov	DWORD [20+esp],ebx
94	mov	DWORD [16+esp],eax
95	call	L$001pic_point
96L$001pic_point:
97	pop	ebp
98	lea	ebp,[(L$Camellia_SBOX-L$001pic_point)+ebp]
99	mov	eax,DWORD [esi]
100	mov	ebx,DWORD [4+esi]
101	mov	ecx,DWORD [8+esi]
102	bswap	eax
103	mov	edx,DWORD [12+esi]
104	bswap	ebx
105	bswap	ecx
106	bswap	edx
107	call	__x86_Camellia_encrypt
108	mov	esp,DWORD [20+esp]
109	bswap	eax
110	mov	esi,DWORD [24+esp]
111	bswap	ebx
112	bswap	ecx
113	bswap	edx
114	mov	DWORD [esi],eax
115	mov	DWORD [4+esi],ebx
116	mov	DWORD [8+esi],ecx
117	mov	DWORD [12+esi],edx
118	pop	edi
119	pop	esi
120	pop	ebx
121	pop	ebp
122	ret
123align	16
124__x86_Camellia_encrypt:
125	xor	eax,DWORD [edi]
126	xor	ebx,DWORD [4+edi]
127	xor	ecx,DWORD [8+edi]
128	xor	edx,DWORD [12+edi]
129	mov	esi,DWORD [16+edi]
130	mov	DWORD [4+esp],eax
131	mov	DWORD [8+esp],ebx
132	mov	DWORD [12+esp],ecx
133	mov	DWORD [16+esp],edx
134align	16
135L$002loop:
136	xor	eax,esi
137	xor	ebx,DWORD [20+edi]
138	movzx	esi,ah
139	mov	edx,DWORD [2052+esi*8+ebp]
140	movzx	esi,al
141	xor	edx,DWORD [4+esi*8+ebp]
142	shr	eax,16
143	movzx	esi,bl
144	mov	ecx,DWORD [esi*8+ebp]
145	movzx	esi,ah
146	xor	edx,DWORD [esi*8+ebp]
147	movzx	esi,bh
148	xor	ecx,DWORD [4+esi*8+ebp]
149	shr	ebx,16
150	movzx	eax,al
151	xor	edx,DWORD [2048+eax*8+ebp]
152	movzx	esi,bh
153	mov	eax,DWORD [16+esp]
154	xor	ecx,edx
155	ror	edx,8
156	xor	ecx,DWORD [2048+esi*8+ebp]
157	movzx	esi,bl
158	mov	ebx,DWORD [12+esp]
159	xor	edx,eax
160	xor	ecx,DWORD [2052+esi*8+ebp]
161	mov	esi,DWORD [24+edi]
162	xor	edx,ecx
163	mov	DWORD [16+esp],edx
164	xor	ecx,ebx
165	mov	DWORD [12+esp],ecx
166	xor	ecx,esi
167	xor	edx,DWORD [28+edi]
168	movzx	esi,ch
169	mov	ebx,DWORD [2052+esi*8+ebp]
170	movzx	esi,cl
171	xor	ebx,DWORD [4+esi*8+ebp]
172	shr	ecx,16
173	movzx	esi,dl
174	mov	eax,DWORD [esi*8+ebp]
175	movzx	esi,ch
176	xor	ebx,DWORD [esi*8+ebp]
177	movzx	esi,dh
178	xor	eax,DWORD [4+esi*8+ebp]
179	shr	edx,16
180	movzx	ecx,cl
181	xor	ebx,DWORD [2048+ecx*8+ebp]
182	movzx	esi,dh
183	mov	ecx,DWORD [8+esp]
184	xor	eax,ebx
185	ror	ebx,8
186	xor	eax,DWORD [2048+esi*8+ebp]
187	movzx	esi,dl
188	mov	edx,DWORD [4+esp]
189	xor	ebx,ecx
190	xor	eax,DWORD [2052+esi*8+ebp]
191	mov	esi,DWORD [32+edi]
192	xor	ebx,eax
193	mov	DWORD [8+esp],ebx
194	xor	eax,edx
195	mov	DWORD [4+esp],eax
196	xor	eax,esi
197	xor	ebx,DWORD [36+edi]
198	movzx	esi,ah
199	mov	edx,DWORD [2052+esi*8+ebp]
200	movzx	esi,al
201	xor	edx,DWORD [4+esi*8+ebp]
202	shr	eax,16
203	movzx	esi,bl
204	mov	ecx,DWORD [esi*8+ebp]
205	movzx	esi,ah
206	xor	edx,DWORD [esi*8+ebp]
207	movzx	esi,bh
208	xor	ecx,DWORD [4+esi*8+ebp]
209	shr	ebx,16
210	movzx	eax,al
211	xor	edx,DWORD [2048+eax*8+ebp]
212	movzx	esi,bh
213	mov	eax,DWORD [16+esp]
214	xor	ecx,edx
215	ror	edx,8
216	xor	ecx,DWORD [2048+esi*8+ebp]
217	movzx	esi,bl
218	mov	ebx,DWORD [12+esp]
219	xor	edx,eax
220	xor	ecx,DWORD [2052+esi*8+ebp]
221	mov	esi,DWORD [40+edi]
222	xor	edx,ecx
223	mov	DWORD [16+esp],edx
224	xor	ecx,ebx
225	mov	DWORD [12+esp],ecx
226	xor	ecx,esi
227	xor	edx,DWORD [44+edi]
228	movzx	esi,ch
229	mov	ebx,DWORD [2052+esi*8+ebp]
230	movzx	esi,cl
231	xor	ebx,DWORD [4+esi*8+ebp]
232	shr	ecx,16
233	movzx	esi,dl
234	mov	eax,DWORD [esi*8+ebp]
235	movzx	esi,ch
236	xor	ebx,DWORD [esi*8+ebp]
237	movzx	esi,dh
238	xor	eax,DWORD [4+esi*8+ebp]
239	shr	edx,16
240	movzx	ecx,cl
241	xor	ebx,DWORD [2048+ecx*8+ebp]
242	movzx	esi,dh
243	mov	ecx,DWORD [8+esp]
244	xor	eax,ebx
245	ror	ebx,8
246	xor	eax,DWORD [2048+esi*8+ebp]
247	movzx	esi,dl
248	mov	edx,DWORD [4+esp]
249	xor	ebx,ecx
250	xor	eax,DWORD [2052+esi*8+ebp]
251	mov	esi,DWORD [48+edi]
252	xor	ebx,eax
253	mov	DWORD [8+esp],ebx
254	xor	eax,edx
255	mov	DWORD [4+esp],eax
256	xor	eax,esi
257	xor	ebx,DWORD [52+edi]
258	movzx	esi,ah
259	mov	edx,DWORD [2052+esi*8+ebp]
260	movzx	esi,al
261	xor	edx,DWORD [4+esi*8+ebp]
262	shr	eax,16
263	movzx	esi,bl
264	mov	ecx,DWORD [esi*8+ebp]
265	movzx	esi,ah
266	xor	edx,DWORD [esi*8+ebp]
267	movzx	esi,bh
268	xor	ecx,DWORD [4+esi*8+ebp]
269	shr	ebx,16
270	movzx	eax,al
271	xor	edx,DWORD [2048+eax*8+ebp]
272	movzx	esi,bh
273	mov	eax,DWORD [16+esp]
274	xor	ecx,edx
275	ror	edx,8
276	xor	ecx,DWORD [2048+esi*8+ebp]
277	movzx	esi,bl
278	mov	ebx,DWORD [12+esp]
279	xor	edx,eax
280	xor	ecx,DWORD [2052+esi*8+ebp]
281	mov	esi,DWORD [56+edi]
282	xor	edx,ecx
283	mov	DWORD [16+esp],edx
284	xor	ecx,ebx
285	mov	DWORD [12+esp],ecx
286	xor	ecx,esi
287	xor	edx,DWORD [60+edi]
288	movzx	esi,ch
289	mov	ebx,DWORD [2052+esi*8+ebp]
290	movzx	esi,cl
291	xor	ebx,DWORD [4+esi*8+ebp]
292	shr	ecx,16
293	movzx	esi,dl
294	mov	eax,DWORD [esi*8+ebp]
295	movzx	esi,ch
296	xor	ebx,DWORD [esi*8+ebp]
297	movzx	esi,dh
298	xor	eax,DWORD [4+esi*8+ebp]
299	shr	edx,16
300	movzx	ecx,cl
301	xor	ebx,DWORD [2048+ecx*8+ebp]
302	movzx	esi,dh
303	mov	ecx,DWORD [8+esp]
304	xor	eax,ebx
305	ror	ebx,8
306	xor	eax,DWORD [2048+esi*8+ebp]
307	movzx	esi,dl
308	mov	edx,DWORD [4+esp]
309	xor	ebx,ecx
310	xor	eax,DWORD [2052+esi*8+ebp]
311	mov	esi,DWORD [64+edi]
312	xor	ebx,eax
313	mov	DWORD [8+esp],ebx
314	xor	eax,edx
315	mov	DWORD [4+esp],eax
316	add	edi,64
317	cmp	edi,DWORD [20+esp]
318	je	NEAR L$003done
319	and	esi,eax
320	mov	edx,DWORD [16+esp]
321	rol	esi,1
322	mov	ecx,edx
323	xor	ebx,esi
324	or	ecx,DWORD [12+edi]
325	mov	DWORD [8+esp],ebx
326	xor	ecx,DWORD [12+esp]
327	mov	esi,DWORD [4+edi]
328	mov	DWORD [12+esp],ecx
329	or	esi,ebx
330	and	ecx,DWORD [8+edi]
331	xor	eax,esi
332	rol	ecx,1
333	mov	DWORD [4+esp],eax
334	xor	edx,ecx
335	mov	esi,DWORD [16+edi]
336	mov	DWORD [16+esp],edx
337	jmp	NEAR L$002loop
338align	8
339L$003done:
340	mov	ecx,eax
341	mov	edx,ebx
342	mov	eax,DWORD [12+esp]
343	mov	ebx,DWORD [16+esp]
344	xor	eax,esi
345	xor	ebx,DWORD [4+edi]
346	xor	ecx,DWORD [8+edi]
347	xor	edx,DWORD [12+edi]
348	ret
349global	_Camellia_DecryptBlock_Rounds
350align	16
351_Camellia_DecryptBlock_Rounds:
352L$_Camellia_DecryptBlock_Rounds_begin:
353	push	ebp
354	push	ebx
355	push	esi
356	push	edi
357	mov	eax,DWORD [20+esp]
358	mov	esi,DWORD [24+esp]
359	mov	edi,DWORD [28+esp]
360	mov	ebx,esp
361	sub	esp,28
362	and	esp,-64
363	lea	ecx,[edi-127]
364	sub	ecx,esp
365	neg	ecx
366	and	ecx,960
367	sub	esp,ecx
368	add	esp,4
369	shl	eax,6
370	mov	DWORD [16+esp],edi
371	lea	edi,[eax*1+edi]
372	mov	DWORD [20+esp],ebx
373	call	L$004pic_point
374L$004pic_point:
375	pop	ebp
376	lea	ebp,[(L$Camellia_SBOX-L$004pic_point)+ebp]
377	mov	eax,DWORD [esi]
378	mov	ebx,DWORD [4+esi]
379	mov	ecx,DWORD [8+esi]
380	bswap	eax
381	mov	edx,DWORD [12+esi]
382	bswap	ebx
383	bswap	ecx
384	bswap	edx
385	call	__x86_Camellia_decrypt
386	mov	esp,DWORD [20+esp]
387	bswap	eax
388	mov	esi,DWORD [32+esp]
389	bswap	ebx
390	bswap	ecx
391	bswap	edx
392	mov	DWORD [esi],eax
393	mov	DWORD [4+esi],ebx
394	mov	DWORD [8+esi],ecx
395	mov	DWORD [12+esi],edx
396	pop	edi
397	pop	esi
398	pop	ebx
399	pop	ebp
400	ret
401global	_Camellia_DecryptBlock
402align	16
403_Camellia_DecryptBlock:
404L$_Camellia_DecryptBlock_begin:
405	mov	eax,128
406	sub	eax,DWORD [4+esp]
407	mov	eax,3
408	adc	eax,0
409	mov	DWORD [4+esp],eax
410	jmp	NEAR L$_Camellia_DecryptBlock_Rounds_begin
411global	_Camellia_decrypt
412align	16
413_Camellia_decrypt:
414L$_Camellia_decrypt_begin:
415	push	ebp
416	push	ebx
417	push	esi
418	push	edi
419	mov	esi,DWORD [20+esp]
420	mov	edi,DWORD [28+esp]
421	mov	ebx,esp
422	sub	esp,28
423	and	esp,-64
424	mov	eax,DWORD [272+edi]
425	lea	ecx,[edi-127]
426	sub	ecx,esp
427	neg	ecx
428	and	ecx,960
429	sub	esp,ecx
430	add	esp,4
431	shl	eax,6
432	mov	DWORD [16+esp],edi
433	lea	edi,[eax*1+edi]
434	mov	DWORD [20+esp],ebx
435	call	L$005pic_point
436L$005pic_point:
437	pop	ebp
438	lea	ebp,[(L$Camellia_SBOX-L$005pic_point)+ebp]
439	mov	eax,DWORD [esi]
440	mov	ebx,DWORD [4+esi]
441	mov	ecx,DWORD [8+esi]
442	bswap	eax
443	mov	edx,DWORD [12+esi]
444	bswap	ebx
445	bswap	ecx
446	bswap	edx
447	call	__x86_Camellia_decrypt
448	mov	esp,DWORD [20+esp]
449	bswap	eax
450	mov	esi,DWORD [24+esp]
451	bswap	ebx
452	bswap	ecx
453	bswap	edx
454	mov	DWORD [esi],eax
455	mov	DWORD [4+esi],ebx
456	mov	DWORD [8+esi],ecx
457	mov	DWORD [12+esi],edx
458	pop	edi
459	pop	esi
460	pop	ebx
461	pop	ebp
462	ret
463align	16
464__x86_Camellia_decrypt:
465	xor	eax,DWORD [edi]
466	xor	ebx,DWORD [4+edi]
467	xor	ecx,DWORD [8+edi]
468	xor	edx,DWORD [12+edi]
469	mov	esi,DWORD [edi-8]
470	mov	DWORD [4+esp],eax
471	mov	DWORD [8+esp],ebx
472	mov	DWORD [12+esp],ecx
473	mov	DWORD [16+esp],edx
474align	16
475L$006loop:
476	xor	eax,esi
477	xor	ebx,DWORD [edi-4]
478	movzx	esi,ah
479	mov	edx,DWORD [2052+esi*8+ebp]
480	movzx	esi,al
481	xor	edx,DWORD [4+esi*8+ebp]
482	shr	eax,16
483	movzx	esi,bl
484	mov	ecx,DWORD [esi*8+ebp]
485	movzx	esi,ah
486	xor	edx,DWORD [esi*8+ebp]
487	movzx	esi,bh
488	xor	ecx,DWORD [4+esi*8+ebp]
489	shr	ebx,16
490	movzx	eax,al
491	xor	edx,DWORD [2048+eax*8+ebp]
492	movzx	esi,bh
493	mov	eax,DWORD [16+esp]
494	xor	ecx,edx
495	ror	edx,8
496	xor	ecx,DWORD [2048+esi*8+ebp]
497	movzx	esi,bl
498	mov	ebx,DWORD [12+esp]
499	xor	edx,eax
500	xor	ecx,DWORD [2052+esi*8+ebp]
501	mov	esi,DWORD [edi-16]
502	xor	edx,ecx
503	mov	DWORD [16+esp],edx
504	xor	ecx,ebx
505	mov	DWORD [12+esp],ecx
506	xor	ecx,esi
507	xor	edx,DWORD [edi-12]
508	movzx	esi,ch
509	mov	ebx,DWORD [2052+esi*8+ebp]
510	movzx	esi,cl
511	xor	ebx,DWORD [4+esi*8+ebp]
512	shr	ecx,16
513	movzx	esi,dl
514	mov	eax,DWORD [esi*8+ebp]
515	movzx	esi,ch
516	xor	ebx,DWORD [esi*8+ebp]
517	movzx	esi,dh
518	xor	eax,DWORD [4+esi*8+ebp]
519	shr	edx,16
520	movzx	ecx,cl
521	xor	ebx,DWORD [2048+ecx*8+ebp]
522	movzx	esi,dh
523	mov	ecx,DWORD [8+esp]
524	xor	eax,ebx
525	ror	ebx,8
526	xor	eax,DWORD [2048+esi*8+ebp]
527	movzx	esi,dl
528	mov	edx,DWORD [4+esp]
529	xor	ebx,ecx
530	xor	eax,DWORD [2052+esi*8+ebp]
531	mov	esi,DWORD [edi-24]
532	xor	ebx,eax
533	mov	DWORD [8+esp],ebx
534	xor	eax,edx
535	mov	DWORD [4+esp],eax
536	xor	eax,esi
537	xor	ebx,DWORD [edi-20]
538	movzx	esi,ah
539	mov	edx,DWORD [2052+esi*8+ebp]
540	movzx	esi,al
541	xor	edx,DWORD [4+esi*8+ebp]
542	shr	eax,16
543	movzx	esi,bl
544	mov	ecx,DWORD [esi*8+ebp]
545	movzx	esi,ah
546	xor	edx,DWORD [esi*8+ebp]
547	movzx	esi,bh
548	xor	ecx,DWORD [4+esi*8+ebp]
549	shr	ebx,16
550	movzx	eax,al
551	xor	edx,DWORD [2048+eax*8+ebp]
552	movzx	esi,bh
553	mov	eax,DWORD [16+esp]
554	xor	ecx,edx
555	ror	edx,8
556	xor	ecx,DWORD [2048+esi*8+ebp]
557	movzx	esi,bl
558	mov	ebx,DWORD [12+esp]
559	xor	edx,eax
560	xor	ecx,DWORD [2052+esi*8+ebp]
561	mov	esi,DWORD [edi-32]
562	xor	edx,ecx
563	mov	DWORD [16+esp],edx
564	xor	ecx,ebx
565	mov	DWORD [12+esp],ecx
566	xor	ecx,esi
567	xor	edx,DWORD [edi-28]
568	movzx	esi,ch
569	mov	ebx,DWORD [2052+esi*8+ebp]
570	movzx	esi,cl
571	xor	ebx,DWORD [4+esi*8+ebp]
572	shr	ecx,16
573	movzx	esi,dl
574	mov	eax,DWORD [esi*8+ebp]
575	movzx	esi,ch
576	xor	ebx,DWORD [esi*8+ebp]
577	movzx	esi,dh
578	xor	eax,DWORD [4+esi*8+ebp]
579	shr	edx,16
580	movzx	ecx,cl
581	xor	ebx,DWORD [2048+ecx*8+ebp]
582	movzx	esi,dh
583	mov	ecx,DWORD [8+esp]
584	xor	eax,ebx
585	ror	ebx,8
586	xor	eax,DWORD [2048+esi*8+ebp]
587	movzx	esi,dl
588	mov	edx,DWORD [4+esp]
589	xor	ebx,ecx
590	xor	eax,DWORD [2052+esi*8+ebp]
591	mov	esi,DWORD [edi-40]
592	xor	ebx,eax
593	mov	DWORD [8+esp],ebx
594	xor	eax,edx
595	mov	DWORD [4+esp],eax
596	xor	eax,esi
597	xor	ebx,DWORD [edi-36]
598	movzx	esi,ah
599	mov	edx,DWORD [2052+esi*8+ebp]
600	movzx	esi,al
601	xor	edx,DWORD [4+esi*8+ebp]
602	shr	eax,16
603	movzx	esi,bl
604	mov	ecx,DWORD [esi*8+ebp]
605	movzx	esi,ah
606	xor	edx,DWORD [esi*8+ebp]
607	movzx	esi,bh
608	xor	ecx,DWORD [4+esi*8+ebp]
609	shr	ebx,16
610	movzx	eax,al
611	xor	edx,DWORD [2048+eax*8+ebp]
612	movzx	esi,bh
613	mov	eax,DWORD [16+esp]
614	xor	ecx,edx
615	ror	edx,8
616	xor	ecx,DWORD [2048+esi*8+ebp]
617	movzx	esi,bl
618	mov	ebx,DWORD [12+esp]
619	xor	edx,eax
620	xor	ecx,DWORD [2052+esi*8+ebp]
621	mov	esi,DWORD [edi-48]
622	xor	edx,ecx
623	mov	DWORD [16+esp],edx
624	xor	ecx,ebx
625	mov	DWORD [12+esp],ecx
626	xor	ecx,esi
627	xor	edx,DWORD [edi-44]
628	movzx	esi,ch
629	mov	ebx,DWORD [2052+esi*8+ebp]
630	movzx	esi,cl
631	xor	ebx,DWORD [4+esi*8+ebp]
632	shr	ecx,16
633	movzx	esi,dl
634	mov	eax,DWORD [esi*8+ebp]
635	movzx	esi,ch
636	xor	ebx,DWORD [esi*8+ebp]
637	movzx	esi,dh
638	xor	eax,DWORD [4+esi*8+ebp]
639	shr	edx,16
640	movzx	ecx,cl
641	xor	ebx,DWORD [2048+ecx*8+ebp]
642	movzx	esi,dh
643	mov	ecx,DWORD [8+esp]
644	xor	eax,ebx
645	ror	ebx,8
646	xor	eax,DWORD [2048+esi*8+ebp]
647	movzx	esi,dl
648	mov	edx,DWORD [4+esp]
649	xor	ebx,ecx
650	xor	eax,DWORD [2052+esi*8+ebp]
651	mov	esi,DWORD [edi-56]
652	xor	ebx,eax
653	mov	DWORD [8+esp],ebx
654	xor	eax,edx
655	mov	DWORD [4+esp],eax
656	sub	edi,64
657	cmp	edi,DWORD [20+esp]
658	je	NEAR L$007done
659	and	esi,eax
660	mov	edx,DWORD [16+esp]
661	rol	esi,1
662	mov	ecx,edx
663	xor	ebx,esi
664	or	ecx,DWORD [4+edi]
665	mov	DWORD [8+esp],ebx
666	xor	ecx,DWORD [12+esp]
667	mov	esi,DWORD [12+edi]
668	mov	DWORD [12+esp],ecx
669	or	esi,ebx
670	and	ecx,DWORD [edi]
671	xor	eax,esi
672	rol	ecx,1
673	mov	DWORD [4+esp],eax
674	xor	edx,ecx
675	mov	esi,DWORD [edi-8]
676	mov	DWORD [16+esp],edx
677	jmp	NEAR L$006loop
678align	8
679L$007done:
680	mov	ecx,eax
681	mov	edx,ebx
682	mov	eax,DWORD [12+esp]
683	mov	ebx,DWORD [16+esp]
684	xor	ecx,esi
685	xor	edx,DWORD [12+edi]
686	xor	eax,DWORD [edi]
687	xor	ebx,DWORD [4+edi]
688	ret
689global	_Camellia_Ekeygen
690align	16
691_Camellia_Ekeygen:
692L$_Camellia_Ekeygen_begin:
693	push	ebp
694	push	ebx
695	push	esi
696	push	edi
697	sub	esp,16
698	mov	ebp,DWORD [36+esp]
699	mov	esi,DWORD [40+esp]
700	mov	edi,DWORD [44+esp]
701	mov	eax,DWORD [esi]
702	mov	ebx,DWORD [4+esi]
703	mov	ecx,DWORD [8+esi]
704	mov	edx,DWORD [12+esi]
705	bswap	eax
706	bswap	ebx
707	bswap	ecx
708	bswap	edx
709	mov	DWORD [edi],eax
710	mov	DWORD [4+edi],ebx
711	mov	DWORD [8+edi],ecx
712	mov	DWORD [12+edi],edx
713	cmp	ebp,128
714	je	NEAR L$0081st128
715	mov	eax,DWORD [16+esi]
716	mov	ebx,DWORD [20+esi]
717	cmp	ebp,192
718	je	NEAR L$0091st192
719	mov	ecx,DWORD [24+esi]
720	mov	edx,DWORD [28+esi]
721	jmp	NEAR L$0101st256
722align	4
723L$0091st192:
724	mov	ecx,eax
725	mov	edx,ebx
726	not	ecx
727	not	edx
728align	4
729L$0101st256:
730	bswap	eax
731	bswap	ebx
732	bswap	ecx
733	bswap	edx
734	mov	DWORD [32+edi],eax
735	mov	DWORD [36+edi],ebx
736	mov	DWORD [40+edi],ecx
737	mov	DWORD [44+edi],edx
738	xor	eax,DWORD [edi]
739	xor	ebx,DWORD [4+edi]
740	xor	ecx,DWORD [8+edi]
741	xor	edx,DWORD [12+edi]
742align	4
743L$0081st128:
744	call	L$011pic_point
745L$011pic_point:
746	pop	ebp
747	lea	ebp,[(L$Camellia_SBOX-L$011pic_point)+ebp]
748	lea	edi,[(L$Camellia_SIGMA-L$Camellia_SBOX)+ebp]
749	mov	esi,DWORD [edi]
750	mov	DWORD [esp],eax
751	mov	DWORD [4+esp],ebx
752	mov	DWORD [8+esp],ecx
753	mov	DWORD [12+esp],edx
754	xor	eax,esi
755	xor	ebx,DWORD [4+edi]
756	movzx	esi,ah
757	mov	edx,DWORD [2052+esi*8+ebp]
758	movzx	esi,al
759	xor	edx,DWORD [4+esi*8+ebp]
760	shr	eax,16
761	movzx	esi,bl
762	mov	ecx,DWORD [esi*8+ebp]
763	movzx	esi,ah
764	xor	edx,DWORD [esi*8+ebp]
765	movzx	esi,bh
766	xor	ecx,DWORD [4+esi*8+ebp]
767	shr	ebx,16
768	movzx	eax,al
769	xor	edx,DWORD [2048+eax*8+ebp]
770	movzx	esi,bh
771	mov	eax,DWORD [12+esp]
772	xor	ecx,edx
773	ror	edx,8
774	xor	ecx,DWORD [2048+esi*8+ebp]
775	movzx	esi,bl
776	mov	ebx,DWORD [8+esp]
777	xor	edx,eax
778	xor	ecx,DWORD [2052+esi*8+ebp]
779	mov	esi,DWORD [8+edi]
780	xor	edx,ecx
781	mov	DWORD [12+esp],edx
782	xor	ecx,ebx
783	mov	DWORD [8+esp],ecx
784	xor	ecx,esi
785	xor	edx,DWORD [12+edi]
786	movzx	esi,ch
787	mov	ebx,DWORD [2052+esi*8+ebp]
788	movzx	esi,cl
789	xor	ebx,DWORD [4+esi*8+ebp]
790	shr	ecx,16
791	movzx	esi,dl
792	mov	eax,DWORD [esi*8+ebp]
793	movzx	esi,ch
794	xor	ebx,DWORD [esi*8+ebp]
795	movzx	esi,dh
796	xor	eax,DWORD [4+esi*8+ebp]
797	shr	edx,16
798	movzx	ecx,cl
799	xor	ebx,DWORD [2048+ecx*8+ebp]
800	movzx	esi,dh
801	mov	ecx,DWORD [4+esp]
802	xor	eax,ebx
803	ror	ebx,8
804	xor	eax,DWORD [2048+esi*8+ebp]
805	movzx	esi,dl
806	mov	edx,DWORD [esp]
807	xor	ebx,ecx
808	xor	eax,DWORD [2052+esi*8+ebp]
809	mov	esi,DWORD [16+edi]
810	xor	ebx,eax
811	mov	DWORD [4+esp],ebx
812	xor	eax,edx
813	mov	DWORD [esp],eax
814	mov	ecx,DWORD [8+esp]
815	mov	edx,DWORD [12+esp]
816	mov	esi,DWORD [44+esp]
817	xor	eax,DWORD [esi]
818	xor	ebx,DWORD [4+esi]
819	xor	ecx,DWORD [8+esi]
820	xor	edx,DWORD [12+esi]
821	mov	esi,DWORD [16+edi]
822	mov	DWORD [esp],eax
823	mov	DWORD [4+esp],ebx
824	mov	DWORD [8+esp],ecx
825	mov	DWORD [12+esp],edx
826	xor	eax,esi
827	xor	ebx,DWORD [20+edi]
828	movzx	esi,ah
829	mov	edx,DWORD [2052+esi*8+ebp]
830	movzx	esi,al
831	xor	edx,DWORD [4+esi*8+ebp]
832	shr	eax,16
833	movzx	esi,bl
834	mov	ecx,DWORD [esi*8+ebp]
835	movzx	esi,ah
836	xor	edx,DWORD [esi*8+ebp]
837	movzx	esi,bh
838	xor	ecx,DWORD [4+esi*8+ebp]
839	shr	ebx,16
840	movzx	eax,al
841	xor	edx,DWORD [2048+eax*8+ebp]
842	movzx	esi,bh
843	mov	eax,DWORD [12+esp]
844	xor	ecx,edx
845	ror	edx,8
846	xor	ecx,DWORD [2048+esi*8+ebp]
847	movzx	esi,bl
848	mov	ebx,DWORD [8+esp]
849	xor	edx,eax
850	xor	ecx,DWORD [2052+esi*8+ebp]
851	mov	esi,DWORD [24+edi]
852	xor	edx,ecx
853	mov	DWORD [12+esp],edx
854	xor	ecx,ebx
855	mov	DWORD [8+esp],ecx
856	xor	ecx,esi
857	xor	edx,DWORD [28+edi]
858	movzx	esi,ch
859	mov	ebx,DWORD [2052+esi*8+ebp]
860	movzx	esi,cl
861	xor	ebx,DWORD [4+esi*8+ebp]
862	shr	ecx,16
863	movzx	esi,dl
864	mov	eax,DWORD [esi*8+ebp]
865	movzx	esi,ch
866	xor	ebx,DWORD [esi*8+ebp]
867	movzx	esi,dh
868	xor	eax,DWORD [4+esi*8+ebp]
869	shr	edx,16
870	movzx	ecx,cl
871	xor	ebx,DWORD [2048+ecx*8+ebp]
872	movzx	esi,dh
873	mov	ecx,DWORD [4+esp]
874	xor	eax,ebx
875	ror	ebx,8
876	xor	eax,DWORD [2048+esi*8+ebp]
877	movzx	esi,dl
878	mov	edx,DWORD [esp]
879	xor	ebx,ecx
880	xor	eax,DWORD [2052+esi*8+ebp]
881	mov	esi,DWORD [32+edi]
882	xor	ebx,eax
883	mov	DWORD [4+esp],ebx
884	xor	eax,edx
885	mov	DWORD [esp],eax
886	mov	ecx,DWORD [8+esp]
887	mov	edx,DWORD [12+esp]
888	mov	esi,DWORD [36+esp]
889	cmp	esi,128
890	jne	NEAR L$0122nd256
891	mov	edi,DWORD [44+esp]
892	lea	edi,[128+edi]
893	mov	DWORD [edi-112],eax
894	mov	DWORD [edi-108],ebx
895	mov	DWORD [edi-104],ecx
896	mov	DWORD [edi-100],edx
897	mov	ebp,eax
898	shl	eax,15
899	mov	esi,ebx
900	shr	esi,17
901	shl	ebx,15
902	or	eax,esi
903	mov	esi,ecx
904	shl	ecx,15
905	mov	DWORD [edi-80],eax
906	shr	esi,17
907	or	ebx,esi
908	shr	ebp,17
909	mov	esi,edx
910	shr	esi,17
911	mov	DWORD [edi-76],ebx
912	shl	edx,15
913	or	ecx,esi
914	or	edx,ebp
915	mov	DWORD [edi-72],ecx
916	mov	DWORD [edi-68],edx
917	mov	ebp,eax
918	shl	eax,15
919	mov	esi,ebx
920	shr	esi,17
921	shl	ebx,15
922	or	eax,esi
923	mov	esi,ecx
924	shl	ecx,15
925	mov	DWORD [edi-64],eax
926	shr	esi,17
927	or	ebx,esi
928	shr	ebp,17
929	mov	esi,edx
930	shr	esi,17
931	mov	DWORD [edi-60],ebx
932	shl	edx,15
933	or	ecx,esi
934	or	edx,ebp
935	mov	DWORD [edi-56],ecx
936	mov	DWORD [edi-52],edx
937	mov	ebp,eax
938	shl	eax,15
939	mov	esi,ebx
940	shr	esi,17
941	shl	ebx,15
942	or	eax,esi
943	mov	esi,ecx
944	shl	ecx,15
945	mov	DWORD [edi-32],eax
946	shr	esi,17
947	or	ebx,esi
948	shr	ebp,17
949	mov	esi,edx
950	shr	esi,17
951	mov	DWORD [edi-28],ebx
952	shl	edx,15
953	or	ecx,esi
954	or	edx,ebp
955	mov	ebp,eax
956	shl	eax,15
957	mov	esi,ebx
958	shr	esi,17
959	shl	ebx,15
960	or	eax,esi
961	mov	esi,ecx
962	shl	ecx,15
963	mov	DWORD [edi-16],eax
964	shr	esi,17
965	or	ebx,esi
966	shr	ebp,17
967	mov	esi,edx
968	shr	esi,17
969	mov	DWORD [edi-12],ebx
970	shl	edx,15
971	or	ecx,esi
972	or	edx,ebp
973	mov	DWORD [edi-8],ecx
974	mov	DWORD [edi-4],edx
975	mov	ebp,ebx
976	shl	ebx,2
977	mov	esi,ecx
978	shr	esi,30
979	shl	ecx,2
980	or	ebx,esi
981	mov	esi,edx
982	shl	edx,2
983	mov	DWORD [32+edi],ebx
984	shr	esi,30
985	or	ecx,esi
986	shr	ebp,30
987	mov	esi,eax
988	shr	esi,30
989	mov	DWORD [36+edi],ecx
990	shl	eax,2
991	or	edx,esi
992	or	eax,ebp
993	mov	DWORD [40+edi],edx
994	mov	DWORD [44+edi],eax
995	mov	ebp,ebx
996	shl	ebx,17
997	mov	esi,ecx
998	shr	esi,15
999	shl	ecx,17
1000	or	ebx,esi
1001	mov	esi,edx
1002	shl	edx,17
1003	mov	DWORD [64+edi],ebx
1004	shr	esi,15
1005	or	ecx,esi
1006	shr	ebp,15
1007	mov	esi,eax
1008	shr	esi,15
1009	mov	DWORD [68+edi],ecx
1010	shl	eax,17
1011	or	edx,esi
1012	or	eax,ebp
1013	mov	DWORD [72+edi],edx
1014	mov	DWORD [76+edi],eax
1015	mov	ebx,DWORD [edi-128]
1016	mov	ecx,DWORD [edi-124]
1017	mov	edx,DWORD [edi-120]
1018	mov	eax,DWORD [edi-116]
1019	mov	ebp,ebx
1020	shl	ebx,15
1021	mov	esi,ecx
1022	shr	esi,17
1023	shl	ecx,15
1024	or	ebx,esi
1025	mov	esi,edx
1026	shl	edx,15
1027	mov	DWORD [edi-96],ebx
1028	shr	esi,17
1029	or	ecx,esi
1030	shr	ebp,17
1031	mov	esi,eax
1032	shr	esi,17
1033	mov	DWORD [edi-92],ecx
1034	shl	eax,15
1035	or	edx,esi
1036	or	eax,ebp
1037	mov	DWORD [edi-88],edx
1038	mov	DWORD [edi-84],eax
1039	mov	ebp,ebx
1040	shl	ebx,30
1041	mov	esi,ecx
1042	shr	esi,2
1043	shl	ecx,30
1044	or	ebx,esi
1045	mov	esi,edx
1046	shl	edx,30
1047	mov	DWORD [edi-48],ebx
1048	shr	esi,2
1049	or	ecx,esi
1050	shr	ebp,2
1051	mov	esi,eax
1052	shr	esi,2
1053	mov	DWORD [edi-44],ecx
1054	shl	eax,30
1055	or	edx,esi
1056	or	eax,ebp
1057	mov	DWORD [edi-40],edx
1058	mov	DWORD [edi-36],eax
1059	mov	ebp,ebx
1060	shl	ebx,15
1061	mov	esi,ecx
1062	shr	esi,17
1063	shl	ecx,15
1064	or	ebx,esi
1065	mov	esi,edx
1066	shl	edx,15
1067	shr	esi,17
1068	or	ecx,esi
1069	shr	ebp,17
1070	mov	esi,eax
1071	shr	esi,17
1072	shl	eax,15
1073	or	edx,esi
1074	or	eax,ebp
1075	mov	DWORD [edi-24],edx
1076	mov	DWORD [edi-20],eax
1077	mov	ebp,ebx
1078	shl	ebx,17
1079	mov	esi,ecx
1080	shr	esi,15
1081	shl	ecx,17
1082	or	ebx,esi
1083	mov	esi,edx
1084	shl	edx,17
1085	mov	DWORD [edi],ebx
1086	shr	esi,15
1087	or	ecx,esi
1088	shr	ebp,15
1089	mov	esi,eax
1090	shr	esi,15
1091	mov	DWORD [4+edi],ecx
1092	shl	eax,17
1093	or	edx,esi
1094	or	eax,ebp
1095	mov	DWORD [8+edi],edx
1096	mov	DWORD [12+edi],eax
1097	mov	ebp,ebx
1098	shl	ebx,17
1099	mov	esi,ecx
1100	shr	esi,15
1101	shl	ecx,17
1102	or	ebx,esi
1103	mov	esi,edx
1104	shl	edx,17
1105	mov	DWORD [16+edi],ebx
1106	shr	esi,15
1107	or	ecx,esi
1108	shr	ebp,15
1109	mov	esi,eax
1110	shr	esi,15
1111	mov	DWORD [20+edi],ecx
1112	shl	eax,17
1113	or	edx,esi
1114	or	eax,ebp
1115	mov	DWORD [24+edi],edx
1116	mov	DWORD [28+edi],eax
1117	mov	ebp,ebx
1118	shl	ebx,17
1119	mov	esi,ecx
1120	shr	esi,15
1121	shl	ecx,17
1122	or	ebx,esi
1123	mov	esi,edx
1124	shl	edx,17
1125	mov	DWORD [48+edi],ebx
1126	shr	esi,15
1127	or	ecx,esi
1128	shr	ebp,15
1129	mov	esi,eax
1130	shr	esi,15
1131	mov	DWORD [52+edi],ecx
1132	shl	eax,17
1133	or	edx,esi
1134	or	eax,ebp
1135	mov	DWORD [56+edi],edx
1136	mov	DWORD [60+edi],eax
1137	mov	eax,3
1138	jmp	NEAR L$013done
1139align	16
1140L$0122nd256:
1141	mov	esi,DWORD [44+esp]
1142	mov	DWORD [48+esi],eax
1143	mov	DWORD [52+esi],ebx
1144	mov	DWORD [56+esi],ecx
1145	mov	DWORD [60+esi],edx
1146	xor	eax,DWORD [32+esi]
1147	xor	ebx,DWORD [36+esi]
1148	xor	ecx,DWORD [40+esi]
1149	xor	edx,DWORD [44+esi]
1150	mov	esi,DWORD [32+edi]
1151	mov	DWORD [esp],eax
1152	mov	DWORD [4+esp],ebx
1153	mov	DWORD [8+esp],ecx
1154	mov	DWORD [12+esp],edx
1155	xor	eax,esi
1156	xor	ebx,DWORD [36+edi]
1157	movzx	esi,ah
1158	mov	edx,DWORD [2052+esi*8+ebp]
1159	movzx	esi,al
1160	xor	edx,DWORD [4+esi*8+ebp]
1161	shr	eax,16
1162	movzx	esi,bl
1163	mov	ecx,DWORD [esi*8+ebp]
1164	movzx	esi,ah
1165	xor	edx,DWORD [esi*8+ebp]
1166	movzx	esi,bh
1167	xor	ecx,DWORD [4+esi*8+ebp]
1168	shr	ebx,16
1169	movzx	eax,al
1170	xor	edx,DWORD [2048+eax*8+ebp]
1171	movzx	esi,bh
1172	mov	eax,DWORD [12+esp]
1173	xor	ecx,edx
1174	ror	edx,8
1175	xor	ecx,DWORD [2048+esi*8+ebp]
1176	movzx	esi,bl
1177	mov	ebx,DWORD [8+esp]
1178	xor	edx,eax
1179	xor	ecx,DWORD [2052+esi*8+ebp]
1180	mov	esi,DWORD [40+edi]
1181	xor	edx,ecx
1182	mov	DWORD [12+esp],edx
1183	xor	ecx,ebx
1184	mov	DWORD [8+esp],ecx
1185	xor	ecx,esi
1186	xor	edx,DWORD [44+edi]
1187	movzx	esi,ch
1188	mov	ebx,DWORD [2052+esi*8+ebp]
1189	movzx	esi,cl
1190	xor	ebx,DWORD [4+esi*8+ebp]
1191	shr	ecx,16
1192	movzx	esi,dl
1193	mov	eax,DWORD [esi*8+ebp]
1194	movzx	esi,ch
1195	xor	ebx,DWORD [esi*8+ebp]
1196	movzx	esi,dh
1197	xor	eax,DWORD [4+esi*8+ebp]
1198	shr	edx,16
1199	movzx	ecx,cl
1200	xor	ebx,DWORD [2048+ecx*8+ebp]
1201	movzx	esi,dh
1202	mov	ecx,DWORD [4+esp]
1203	xor	eax,ebx
1204	ror	ebx,8
1205	xor	eax,DWORD [2048+esi*8+ebp]
1206	movzx	esi,dl
1207	mov	edx,DWORD [esp]
1208	xor	ebx,ecx
1209	xor	eax,DWORD [2052+esi*8+ebp]
1210	mov	esi,DWORD [48+edi]
1211	xor	ebx,eax
1212	mov	DWORD [4+esp],ebx
1213	xor	eax,edx
1214	mov	DWORD [esp],eax
1215	mov	ecx,DWORD [8+esp]
1216	mov	edx,DWORD [12+esp]
1217	mov	edi,DWORD [44+esp]
1218	lea	edi,[128+edi]
1219	mov	DWORD [edi-112],eax
1220	mov	DWORD [edi-108],ebx
1221	mov	DWORD [edi-104],ecx
1222	mov	DWORD [edi-100],edx
1223	mov	ebp,eax
1224	shl	eax,30
1225	mov	esi,ebx
1226	shr	esi,2
1227	shl	ebx,30
1228	or	eax,esi
1229	mov	esi,ecx
1230	shl	ecx,30
1231	mov	DWORD [edi-48],eax
1232	shr	esi,2
1233	or	ebx,esi
1234	shr	ebp,2
1235	mov	esi,edx
1236	shr	esi,2
1237	mov	DWORD [edi-44],ebx
1238	shl	edx,30
1239	or	ecx,esi
1240	or	edx,ebp
1241	mov	DWORD [edi-40],ecx
1242	mov	DWORD [edi-36],edx
1243	mov	ebp,eax
1244	shl	eax,30
1245	mov	esi,ebx
1246	shr	esi,2
1247	shl	ebx,30
1248	or	eax,esi
1249	mov	esi,ecx
1250	shl	ecx,30
1251	mov	DWORD [32+edi],eax
1252	shr	esi,2
1253	or	ebx,esi
1254	shr	ebp,2
1255	mov	esi,edx
1256	shr	esi,2
1257	mov	DWORD [36+edi],ebx
1258	shl	edx,30
1259	or	ecx,esi
1260	or	edx,ebp
1261	mov	DWORD [40+edi],ecx
1262	mov	DWORD [44+edi],edx
1263	mov	ebp,ebx
1264	shl	ebx,19
1265	mov	esi,ecx
1266	shr	esi,13
1267	shl	ecx,19
1268	or	ebx,esi
1269	mov	esi,edx
1270	shl	edx,19
1271	mov	DWORD [128+edi],ebx
1272	shr	esi,13
1273	or	ecx,esi
1274	shr	ebp,13
1275	mov	esi,eax
1276	shr	esi,13
1277	mov	DWORD [132+edi],ecx
1278	shl	eax,19
1279	or	edx,esi
1280	or	eax,ebp
1281	mov	DWORD [136+edi],edx
1282	mov	DWORD [140+edi],eax
1283	mov	ebx,DWORD [edi-96]
1284	mov	ecx,DWORD [edi-92]
1285	mov	edx,DWORD [edi-88]
1286	mov	eax,DWORD [edi-84]
1287	mov	ebp,ebx
1288	shl	ebx,15
1289	mov	esi,ecx
1290	shr	esi,17
1291	shl	ecx,15
1292	or	ebx,esi
1293	mov	esi,edx
1294	shl	edx,15
1295	mov	DWORD [edi-96],ebx
1296	shr	esi,17
1297	or	ecx,esi
1298	shr	ebp,17
1299	mov	esi,eax
1300	shr	esi,17
1301	mov	DWORD [edi-92],ecx
1302	shl	eax,15
1303	or	edx,esi
1304	or	eax,ebp
1305	mov	DWORD [edi-88],edx
1306	mov	DWORD [edi-84],eax
1307	mov	ebp,ebx
1308	shl	ebx,15
1309	mov	esi,ecx
1310	shr	esi,17
1311	shl	ecx,15
1312	or	ebx,esi
1313	mov	esi,edx
1314	shl	edx,15
1315	mov	DWORD [edi-64],ebx
1316	shr	esi,17
1317	or	ecx,esi
1318	shr	ebp,17
1319	mov	esi,eax
1320	shr	esi,17
1321	mov	DWORD [edi-60],ecx
1322	shl	eax,15
1323	or	edx,esi
1324	or	eax,ebp
1325	mov	DWORD [edi-56],edx
1326	mov	DWORD [edi-52],eax
1327	mov	ebp,ebx
1328	shl	ebx,30
1329	mov	esi,ecx
1330	shr	esi,2
1331	shl	ecx,30
1332	or	ebx,esi
1333	mov	esi,edx
1334	shl	edx,30
1335	mov	DWORD [16+edi],ebx
1336	shr	esi,2
1337	or	ecx,esi
1338	shr	ebp,2
1339	mov	esi,eax
1340	shr	esi,2
1341	mov	DWORD [20+edi],ecx
1342	shl	eax,30
1343	or	edx,esi
1344	or	eax,ebp
1345	mov	DWORD [24+edi],edx
1346	mov	DWORD [28+edi],eax
1347	mov	ebp,ecx
1348	shl	ecx,2
1349	mov	esi,edx
1350	shr	esi,30
1351	shl	edx,2
1352	or	ecx,esi
1353	mov	esi,eax
1354	shl	eax,2
1355	mov	DWORD [80+edi],ecx
1356	shr	esi,30
1357	or	edx,esi
1358	shr	ebp,30
1359	mov	esi,ebx
1360	shr	esi,30
1361	mov	DWORD [84+edi],edx
1362	shl	ebx,2
1363	or	eax,esi
1364	or	ebx,ebp
1365	mov	DWORD [88+edi],eax
1366	mov	DWORD [92+edi],ebx
1367	mov	ecx,DWORD [edi-80]
1368	mov	edx,DWORD [edi-76]
1369	mov	eax,DWORD [edi-72]
1370	mov	ebx,DWORD [edi-68]
1371	mov	ebp,ecx
1372	shl	ecx,15
1373	mov	esi,edx
1374	shr	esi,17
1375	shl	edx,15
1376	or	ecx,esi
1377	mov	esi,eax
1378	shl	eax,15
1379	mov	DWORD [edi-80],ecx
1380	shr	esi,17
1381	or	edx,esi
1382	shr	ebp,17
1383	mov	esi,ebx
1384	shr	esi,17
1385	mov	DWORD [edi-76],edx
1386	shl	ebx,15
1387	or	eax,esi
1388	or	ebx,ebp
1389	mov	DWORD [edi-72],eax
1390	mov	DWORD [edi-68],ebx
1391	mov	ebp,ecx
1392	shl	ecx,30
1393	mov	esi,edx
1394	shr	esi,2
1395	shl	edx,30
1396	or	ecx,esi
1397	mov	esi,eax
1398	shl	eax,30
1399	mov	DWORD [edi-16],ecx
1400	shr	esi,2
1401	or	edx,esi
1402	shr	ebp,2
1403	mov	esi,ebx
1404	shr	esi,2
1405	mov	DWORD [edi-12],edx
1406	shl	ebx,30
1407	or	eax,esi
1408	or	ebx,ebp
1409	mov	DWORD [edi-8],eax
1410	mov	DWORD [edi-4],ebx
1411	mov	DWORD [64+edi],edx
1412	mov	DWORD [68+edi],eax
1413	mov	DWORD [72+edi],ebx
1414	mov	DWORD [76+edi],ecx
1415	mov	ebp,edx
1416	shl	edx,17
1417	mov	esi,eax
1418	shr	esi,15
1419	shl	eax,17
1420	or	edx,esi
1421	mov	esi,ebx
1422	shl	ebx,17
1423	mov	DWORD [96+edi],edx
1424	shr	esi,15
1425	or	eax,esi
1426	shr	ebp,15
1427	mov	esi,ecx
1428	shr	esi,15
1429	mov	DWORD [100+edi],eax
1430	shl	ecx,17
1431	or	ebx,esi
1432	or	ecx,ebp
1433	mov	DWORD [104+edi],ebx
1434	mov	DWORD [108+edi],ecx
1435	mov	edx,DWORD [edi-128]
1436	mov	eax,DWORD [edi-124]
1437	mov	ebx,DWORD [edi-120]
1438	mov	ecx,DWORD [edi-116]
1439	mov	ebp,eax
1440	shl	eax,13
1441	mov	esi,ebx
1442	shr	esi,19
1443	shl	ebx,13
1444	or	eax,esi
1445	mov	esi,ecx
1446	shl	ecx,13
1447	mov	DWORD [edi-32],eax
1448	shr	esi,19
1449	or	ebx,esi
1450	shr	ebp,19
1451	mov	esi,edx
1452	shr	esi,19
1453	mov	DWORD [edi-28],ebx
1454	shl	edx,13
1455	or	ecx,esi
1456	or	edx,ebp
1457	mov	DWORD [edi-24],ecx
1458	mov	DWORD [edi-20],edx
1459	mov	ebp,eax
1460	shl	eax,15
1461	mov	esi,ebx
1462	shr	esi,17
1463	shl	ebx,15
1464	or	eax,esi
1465	mov	esi,ecx
1466	shl	ecx,15
1467	mov	DWORD [edi],eax
1468	shr	esi,17
1469	or	ebx,esi
1470	shr	ebp,17
1471	mov	esi,edx
1472	shr	esi,17
1473	mov	DWORD [4+edi],ebx
1474	shl	edx,15
1475	or	ecx,esi
1476	or	edx,ebp
1477	mov	DWORD [8+edi],ecx
1478	mov	DWORD [12+edi],edx
1479	mov	ebp,eax
1480	shl	eax,17
1481	mov	esi,ebx
1482	shr	esi,15
1483	shl	ebx,17
1484	or	eax,esi
1485	mov	esi,ecx
1486	shl	ecx,17
1487	mov	DWORD [48+edi],eax
1488	shr	esi,15
1489	or	ebx,esi
1490	shr	ebp,15
1491	mov	esi,edx
1492	shr	esi,15
1493	mov	DWORD [52+edi],ebx
1494	shl	edx,17
1495	or	ecx,esi
1496	or	edx,ebp
1497	mov	DWORD [56+edi],ecx
1498	mov	DWORD [60+edi],edx
1499	mov	ebp,ebx
1500	shl	ebx,2
1501	mov	esi,ecx
1502	shr	esi,30
1503	shl	ecx,2
1504	or	ebx,esi
1505	mov	esi,edx
1506	shl	edx,2
1507	mov	DWORD [112+edi],ebx
1508	shr	esi,30
1509	or	ecx,esi
1510	shr	ebp,30
1511	mov	esi,eax
1512	shr	esi,30
1513	mov	DWORD [116+edi],ecx
1514	shl	eax,2
1515	or	edx,esi
1516	or	eax,ebp
1517	mov	DWORD [120+edi],edx
1518	mov	DWORD [124+edi],eax
1519	mov	eax,4
1520L$013done:
1521	lea	edx,[144+edi]
1522	add	esp,16
1523	pop	edi
1524	pop	esi
1525	pop	ebx
1526	pop	ebp
1527	ret
1528global	_Camellia_set_key
1529align	16
1530_Camellia_set_key:
1531L$_Camellia_set_key_begin:
1532	push	ebx
1533	mov	ecx,DWORD [8+esp]
1534	mov	ebx,DWORD [12+esp]
1535	mov	edx,DWORD [16+esp]
1536	mov	eax,-1
1537	test	ecx,ecx
1538	jz	NEAR L$014done
1539	test	edx,edx
1540	jz	NEAR L$014done
1541	mov	eax,-2
1542	cmp	ebx,256
1543	je	NEAR L$015arg_ok
1544	cmp	ebx,192
1545	je	NEAR L$015arg_ok
1546	cmp	ebx,128
1547	jne	NEAR L$014done
1548align	4
1549L$015arg_ok:
1550	push	edx
1551	push	ecx
1552	push	ebx
1553	call	L$_Camellia_Ekeygen_begin
1554	add	esp,12
1555	mov	DWORD [edx],eax
1556	xor	eax,eax
1557align	4
1558L$014done:
1559	pop	ebx
1560	ret
1561align	64
1562L$Camellia_SIGMA:
1563dd	2694735487,1003262091,3061508184,1286239154,3337565999,3914302142,1426019237,4057165596,283453434,3731369245,2958461122,3018244605,0,0,0,0
1564align	64
1565L$Camellia_SBOX:
1566dd	1886416896,1886388336
1567dd	2189591040,741081132
1568dd	741092352,3014852787
1569dd	3974949888,3233808576
1570dd	3014898432,3840147684
1571dd	656877312,1465319511
1572dd	3233857536,3941204202
1573dd	3857048832,2930639022
1574dd	3840205824,589496355
1575dd	2240120064,1802174571
1576dd	1465341696,1162149957
1577dd	892679424,2779054245
1578dd	3941263872,3991732461
1579dd	202116096,1330577487
1580dd	2930683392,488439837
1581dd	1094795520,2459041938
1582dd	589505280,2256928902
1583dd	4025478912,2947481775
1584dd	1802201856,2088501372
1585dd	2475922176,522125343
1586dd	1162167552,1044250686
1587dd	421075200,3705405660
1588dd	2779096320,1583218782
1589dd	555819264,185270283
1590dd	3991792896,2795896998
1591dd	235802112,960036921
1592dd	1330597632,3587506389
1593dd	1313754624,1566376029
1594dd	488447232,3654877401
1595dd	1701143808,1515847770
1596dd	2459079168,1364262993
1597dd	3183328512,1819017324
1598dd	2256963072,2341142667
1599dd	3099113472,2593783962
1600dd	2947526400,4227531003
1601dd	2408550144,2964324528
1602dd	2088532992,1953759348
1603dd	3958106880,724238379
1604dd	522133248,4042260720
1605dd	3469659648,2223243396
1606dd	1044266496,3755933919
1607dd	808464384,3419078859
1608dd	3705461760,875823156
1609dd	1600085760,1987444854
1610dd	1583242752,1835860077
1611dd	3318072576,2846425257
1612dd	185273088,3520135377
1613dd	437918208,67371012
1614dd	2795939328,336855060
1615dd	3789676800,976879674
1616dd	960051456,3739091166
1617dd	3402287616,286326801
1618dd	3587560704,842137650
1619dd	1195853568,2627469468
1620dd	1566399744,1397948499
1621dd	1027423488,4075946226
1622dd	3654932736,4278059262
1623dd	16843008,3486449871
1624dd	1515870720,3284336835
1625dd	3604403712,2054815866
1626dd	1364283648,606339108
1627dd	1448498688,3907518696
1628dd	1819044864,1616904288
1629dd	1296911616,1768489065
1630dd	2341178112,2863268010
1631dd	218959104,2694840480
1632dd	2593823232,2711683233
1633dd	1717986816,1650589794
1634dd	4227595008,1414791252
1635dd	3435973632,505282590
1636dd	2964369408,3772776672
1637dd	757935360,1684275300
1638dd	1953788928,269484048
1639dd	303174144,0
1640dd	724249344,2745368739
1641dd	538976256,1970602101
1642dd	4042321920,2324299914
1643dd	2981212416,3873833190
1644dd	2223277056,151584777
1645dd	2576980224,3722248413
1646dd	3755990784,2273771655
1647dd	1280068608,2206400643
1648dd	3419130624,3452764365
1649dd	3267543552,2425356432
1650dd	875836416,1936916595
1651dd	2122219008,4143317238
1652dd	1987474944,2644312221
1653dd	84215040,3216965823
1654dd	1835887872,1381105746
1655dd	3082270464,3638034648
1656dd	2846468352,3368550600
1657dd	825307392,3334865094
1658dd	3520188672,2172715137
1659dd	387389184,1869545583
1660dd	67372032,320012307
1661dd	3621246720,1667432547
1662dd	336860160,3924361449
1663dd	1482184704,2812739751
1664dd	976894464,2677997727
1665dd	1633771776,3166437564
1666dd	3739147776,690552873
1667dd	454761216,4193845497
1668dd	286331136,791609391
1669dd	471604224,3031695540
1670dd	842150400,2021130360
1671dd	252645120,101056518
1672dd	2627509248,3890675943
1673dd	370546176,1903231089
1674dd	1397969664,3570663636
1675dd	404232192,2880110763
1676dd	4076007936,2290614408
1677dd	572662272,2374828173
1678dd	4278124032,1920073842
1679dd	1145324544,3115909305
1680dd	3486502656,4177002744
1681dd	2998055424,2896953516
1682dd	3284386560,909508662
1683dd	3048584448,707395626
1684dd	2054846976,1010565180
1685dd	2442236160,4059103473
1686dd	606348288,1077936192
1687dd	134744064,3553820883
1688dd	3907577856,3149594811
1689dd	2829625344,1128464451
1690dd	1616928768,353697813
1691dd	4244438016,2913796269
1692dd	1768515840,2004287607
1693dd	1347440640,2155872384
1694dd	2863311360,2189557890
1695dd	3503345664,3974889708
1696dd	2694881280,656867367
1697dd	2105376000,3856990437
1698dd	2711724288,2240086149
1699dd	2307492096,892665909
1700dd	1650614784,202113036
1701dd	2543294208,1094778945
1702dd	1414812672,4025417967
1703dd	1532713728,2475884691
1704dd	505290240,421068825
1705dd	2509608192,555810849
1706dd	3772833792,235798542
1707dd	4294967040,1313734734
1708dd	1684300800,1701118053
1709dd	3537031680,3183280317
1710dd	269488128,3099066552
1711dd	3301229568,2408513679
1712dd	0,3958046955
1713dd	1212696576,3469607118
1714dd	2745410304,808452144
1715dd	4160222976,1600061535
1716dd	1970631936,3318022341
1717dd	3688618752,437911578
1718dd	2324335104,3789619425
1719dd	50529024,3402236106
1720dd	3873891840,1195835463
1721dd	3671775744,1027407933
1722dd	151587072,16842753
1723dd	1061109504,3604349142
1724dd	3722304768,1448476758
1725dd	2492765184,1296891981
1726dd	2273806080,218955789
1727dd	1549556736,1717960806
1728dd	2206434048,3435921612
1729dd	33686016,757923885
1730dd	3452816640,303169554
1731dd	1246382592,538968096
1732dd	2425393152,2981167281
1733dd	858993408,2576941209
1734dd	1936945920,1280049228
1735dd	1734829824,3267494082
1736dd	4143379968,2122186878
1737dd	4092850944,84213765
1738dd	2644352256,3082223799
1739dd	2139062016,825294897
1740dd	3217014528,387383319
1741dd	3806519808,3621191895
1742dd	1381126656,1482162264
1743dd	2610666240,1633747041
1744dd	3638089728,454754331
1745dd	640034304,471597084
1746dd	3368601600,252641295
1747dd	926365440,370540566
1748dd	3334915584,404226072
1749dd	993737472,572653602
1750dd	2172748032,1145307204
1751dd	2526451200,2998010034
1752dd	1869573888,3048538293
1753dd	1263225600,2442199185
1754dd	320017152,134742024
1755dd	3200171520,2829582504
1756dd	1667457792,4244373756
1757dd	774778368,1347420240
1758dd	3924420864,3503292624
1759dd	2038003968,2105344125
1760dd	2812782336,2307457161
1761dd	2358021120,2543255703
1762dd	2678038272,1532690523
1763dd	1852730880,2509570197
1764dd	3166485504,4294902015
1765dd	2391707136,3536978130
1766dd	690563328,3301179588
1767dd	4126536960,1212678216
1768dd	4193908992,4160159991
1769dd	3065427456,3688562907
1770dd	791621376,50528259
1771dd	4261281024,3671720154
1772dd	3031741440,1061093439
1773dd	1499027712,2492727444
1774dd	2021160960,1549533276
1775dd	2560137216,33685506
1776dd	101058048,1246363722
1777dd	1785358848,858980403
1778dd	3890734848,1734803559
1779dd	1179010560,4092788979
1780dd	1903259904,2139029631
1781dd	3132799488,3806462178
1782dd	3570717696,2610626715
1783dd	623191296,640024614
1784dd	2880154368,926351415
1785dd	1111638528,993722427
1786dd	2290649088,2526412950
1787dd	2728567296,1263206475
1788dd	2374864128,3200123070
1789dd	4210752000,774766638
1790dd	1920102912,2037973113
1791dd	117901056,2357985420
1792dd	3115956480,1852702830
1793dd	1431655680,2391670926
1794dd	4177065984,4126474485
1795dd	4008635904,3065381046
1796dd	2896997376,4261216509
1797dd	168430080,1499005017
1798dd	909522432,2560098456
1799dd	1229539584,1785331818
1800dd	707406336,1178992710
1801dd	1751672832,3132752058
1802dd	1010580480,623181861
1803dd	943208448,1111621698
1804dd	4059164928,2728525986
1805dd	2762253312,4210688250
1806dd	1077952512,117899271
1807dd	673720320,1431634005
1808dd	3553874688,4008575214
1809dd	2071689984,168427530
1810dd	3149642496,1229520969
1811dd	3385444608,1751646312
1812dd	1128481536,943194168
1813dd	3250700544,2762211492
1814dd	353703168,673710120
1815dd	3823362816,2071658619
1816dd	2913840384,3385393353
1817dd	4109693952,3250651329
1818dd	2004317952,3823304931
1819dd	3351758592,4109631732
1820dd	2155905024,3351707847
1821dd	2661195264,2661154974
1822dd	14737632,939538488
1823dd	328965,1090535745
1824dd	5789784,369104406
1825dd	14277081,1979741814
1826dd	6776679,3640711641
1827dd	5131854,2466288531
1828dd	8487297,1610637408
1829dd	13355979,4060148466
1830dd	13224393,1912631922
1831dd	723723,3254829762
1832dd	11447982,2868947883
1833dd	6974058,2583730842
1834dd	14013909,1962964341
1835dd	1579032,100664838
1836dd	6118749,1459640151
1837dd	8553090,2684395680
1838dd	4605510,2432733585
1839dd	14671839,4144035831
1840dd	14079702,3036722613
1841dd	2565927,3372272073
1842dd	9079434,2717950626
1843dd	3289650,2348846220
1844dd	4934475,3523269330
1845dd	4342338,2415956112
1846dd	14408667,4127258358
1847dd	1842204,117442311
1848dd	10395294,2801837991
1849dd	10263708,654321447
1850dd	3815994,2382401166
1851dd	13290186,2986390194
1852dd	2434341,1224755529
1853dd	8092539,3724599006
1854dd	855309,1124090691
1855dd	7434609,1543527516
1856dd	6250335,3607156695
1857dd	2039583,3338717127
1858dd	16316664,1040203326
1859dd	14145495,4110480885
1860dd	4079166,2399178639
1861dd	10329501,1728079719
1862dd	8158332,520101663
1863dd	6316128,402659352
1864dd	12171705,1845522030
1865dd	12500670,2936057775
1866dd	12369084,788541231
1867dd	9145227,3791708898
1868dd	1447446,2231403909
1869dd	3421236,218107149
1870dd	5066061,1392530259
1871dd	12829635,4026593520
1872dd	7500402,2617285788
1873dd	9803157,1694524773
1874dd	11250603,3925928682
1875dd	9342606,2734728099
1876dd	12237498,2919280302
1877dd	8026746,2650840734
1878dd	11776947,3959483628
1879dd	131586,2147516544
1880dd	11842740,754986285
1881dd	11382189,1795189611
1882dd	10658466,2818615464
1883dd	11316396,721431339
1884dd	14211288,905983542
1885dd	10132122,2785060518
1886dd	1513239,3305162181
1887dd	1710618,2248181382
1888dd	3487029,1291865421
1889dd	13421772,855651123
1890dd	16250871,4244700669
1891dd	10066329,1711302246
1892dd	6381921,1476417624
1893dd	5921370,2516620950
1894dd	15263976,973093434
1895dd	2368548,150997257
1896dd	5658198,2499843477
1897dd	4210752,268439568
1898dd	14803425,2013296760
1899dd	6513507,3623934168
1900dd	592137,1107313218
1901dd	3355443,3422604492
1902dd	12566463,4009816047
1903dd	10000536,637543974
1904dd	9934743,3842041317
1905dd	8750469,1627414881
1906dd	6842472,436214298
1907dd	16579836,1056980799
1908dd	15527148,989870907
1909dd	657930,2181071490
1910dd	14342874,3053500086
1911dd	7303023,3674266587
1912dd	5460819,3556824276
1913dd	6447714,2550175896
1914dd	10724259,3892373736
1915dd	3026478,2332068747
1916dd	526344,33554946
1917dd	11513775,3942706155
1918dd	2631720,167774730
1919dd	11579568,738208812
1920dd	7631988,486546717
1921dd	12763842,2952835248
1922dd	12434877,1862299503
1923dd	3552822,2365623693
1924dd	2236962,2281736328
1925dd	3684408,234884622
1926dd	6579300,419436825
1927dd	1973790,2264958855
1928dd	3750201,1308642894
1929dd	2894892,184552203
1930dd	10921638,2835392937
1931dd	3158064,201329676
1932dd	15066597,2030074233
1933dd	4473924,285217041
1934dd	16645629,2130739071
1935dd	8947848,570434082
1936dd	10461087,3875596263
1937dd	6645093,1493195097
1938dd	8882055,3774931425
1939dd	7039851,3657489114
1940dd	16053492,1023425853
1941dd	2302755,3355494600
1942dd	4737096,301994514
1943dd	1052688,67109892
1944dd	13750737,1946186868
1945dd	5329233,1409307732
1946dd	12632256,805318704
1947dd	16382457,2113961598
1948dd	13816530,3019945140
1949dd	10526880,671098920
1950dd	5592405,1426085205
1951dd	10592673,1744857192
1952dd	4276545,1342197840
1953dd	16448250,3187719870
1954dd	4408131,3489714384
1955dd	1250067,3288384708
1956dd	12895428,822096177
1957dd	3092271,3405827019
1958dd	11053224,704653866
1959dd	11974326,2902502829
1960dd	3947580,251662095
1961dd	2829099,3389049546
1962dd	12698049,1879076976
1963dd	16777215,4278255615
1964dd	13158600,838873650
1965dd	10855845,1761634665
1966dd	2105376,134219784
1967dd	9013641,1644192354
1968dd	0,0
1969dd	9474192,603989028
1970dd	4671303,3506491857
1971dd	15724527,4211145723
1972dd	15395562,3120609978
1973dd	12040119,3976261101
1974dd	1381653,1157645637
1975dd	394758,2164294017
1976dd	13487565,1929409395
1977dd	11908533,1828744557
1978dd	1184274,2214626436
1979dd	8289918,2667618207
1980dd	12303291,3993038574
1981dd	2697513,1241533002
1982dd	986895,3271607235
1983dd	12105912,771763758
1984dd	460551,3238052289
1985dd	263172,16777473
1986dd	10197915,3858818790
1987dd	9737364,620766501
1988dd	2171169,1207978056
1989dd	6710886,2566953369
1990dd	15132390,3103832505
1991dd	13553358,3003167667
1992dd	15592941,2063629179
1993dd	15198183,4177590777
1994dd	3881787,3456159438
1995dd	16711422,3204497343
1996dd	8355711,3741376479
1997dd	12961221,1895854449
1998dd	10790052,687876393
1999dd	3618615,3439381965
2000dd	11645361,1811967084
2001dd	5000268,318771987
2002dd	9539985,1677747300
2003dd	7237230,2600508315
2004dd	9276813,1660969827
2005dd	7763574,2634063261
2006dd	197379,3221274816
2007dd	2960685,1258310475
2008dd	14606046,3070277559
2009dd	9868950,2768283045
2010dd	2500134,2298513801
2011dd	8224125,1593859935
2012dd	13027014,2969612721
2013dd	6052956,385881879
2014dd	13882323,4093703412
2015dd	15921906,3154164924
2016dd	5197647,3540046803
2017dd	1644825,1174423110
2018dd	4144959,3472936911
2019dd	14474460,922761015
2020dd	7960953,1577082462
2021dd	1907997,1191200583
2022dd	5395026,2483066004
2023dd	15461355,4194368250
2024dd	15987699,4227923196
2025dd	7171437,1526750043
2026dd	6184542,2533398423
2027dd	16514043,4261478142
2028dd	6908265,1509972570
2029dd	11711154,2885725356
2030dd	15790320,1006648380
2031dd	3223857,1275087948
2032dd	789516,50332419
2033dd	13948116,889206069
2034dd	13619151,4076925939
2035dd	9211020,587211555
2036dd	14869218,3087055032
2037dd	7697781,1560304989
2038dd	11119017,1778412138
2039dd	4868682,2449511058
2040dd	5723991,3573601749
2041dd	8684676,553656609
2042dd	1118481,1140868164
2043dd	4539717,1358975313
2044dd	1776411,3321939654
2045dd	16119285,2097184125
2046dd	15000804,956315961
2047dd	921102,2197848963
2048dd	7566195,3691044060
2049dd	11184810,2852170410
2050dd	15856113,2080406652
2051dd	14540253,1996519287
2052dd	5855577,1442862678
2053dd	1315860,83887365
2054dd	7105644,452991771
2055dd	9605778,2751505572
2056dd	5526612,352326933
2057dd	13684944,872428596
2058dd	7895160,503324190
2059dd	7368816,469769244
2060dd	14935011,4160813304
2061dd	4802889,1375752786
2062dd	8421504,536879136
2063dd	5263440,335549460
2064dd	10987431,3909151209
2065dd	16185078,3170942397
2066dd	7829367,3707821533
2067dd	9671571,3825263844
2068dd	8816262,2701173153
2069dd	8618883,3758153952
2070dd	2763306,2315291274
2071dd	13092807,4043370993
2072dd	5987163,3590379222
2073dd	15329769,2046851706
2074dd	15658734,3137387451
2075dd	9408399,3808486371
2076dd	65793,1073758272
2077dd	4013373,1325420367
2078global	_Camellia_cbc_encrypt
2079align	16
2080_Camellia_cbc_encrypt:
2081L$_Camellia_cbc_encrypt_begin:
2082	push	ebp
2083	push	ebx
2084	push	esi
2085	push	edi
2086	mov	ecx,DWORD [28+esp]
2087	cmp	ecx,0
2088	je	NEAR L$016enc_out
2089	pushfd
2090	cld
2091	mov	eax,DWORD [24+esp]
2092	mov	ebx,DWORD [28+esp]
2093	mov	edx,DWORD [36+esp]
2094	mov	ebp,DWORD [40+esp]
2095	lea	esi,[esp-64]
2096	and	esi,-64
2097	lea	edi,[edx-127]
2098	sub	edi,esi
2099	neg	edi
2100	and	edi,960
2101	sub	esi,edi
2102	mov	edi,DWORD [44+esp]
2103	xchg	esp,esi
2104	add	esp,4
2105	mov	DWORD [20+esp],esi
2106	mov	DWORD [24+esp],eax
2107	mov	DWORD [28+esp],ebx
2108	mov	DWORD [32+esp],ecx
2109	mov	DWORD [36+esp],edx
2110	mov	DWORD [40+esp],ebp
2111	call	L$017pic_point
2112L$017pic_point:
2113	pop	ebp
2114	lea	ebp,[(L$Camellia_SBOX-L$017pic_point)+ebp]
2115	mov	esi,32
2116align	4
2117L$018prefetch_sbox:
2118	mov	eax,DWORD [ebp]
2119	mov	ebx,DWORD [32+ebp]
2120	mov	ecx,DWORD [64+ebp]
2121	mov	edx,DWORD [96+ebp]
2122	lea	ebp,[128+ebp]
2123	dec	esi
2124	jnz	NEAR L$018prefetch_sbox
2125	mov	eax,DWORD [36+esp]
2126	sub	ebp,4096
2127	mov	esi,DWORD [24+esp]
2128	mov	edx,DWORD [272+eax]
2129	cmp	edi,0
2130	je	NEAR L$019DECRYPT
2131	mov	ecx,DWORD [32+esp]
2132	mov	edi,DWORD [40+esp]
2133	shl	edx,6
2134	lea	edx,[edx*1+eax]
2135	mov	DWORD [16+esp],edx
2136	test	ecx,4294967280
2137	jz	NEAR L$020enc_tail
2138	mov	eax,DWORD [edi]
2139	mov	ebx,DWORD [4+edi]
2140align	4
2141L$021enc_loop:
2142	mov	ecx,DWORD [8+edi]
2143	mov	edx,DWORD [12+edi]
2144	xor	eax,DWORD [esi]
2145	xor	ebx,DWORD [4+esi]
2146	xor	ecx,DWORD [8+esi]
2147	bswap	eax
2148	xor	edx,DWORD [12+esi]
2149	bswap	ebx
2150	mov	edi,DWORD [36+esp]
2151	bswap	ecx
2152	bswap	edx
2153	call	__x86_Camellia_encrypt
2154	mov	esi,DWORD [24+esp]
2155	mov	edi,DWORD [28+esp]
2156	bswap	eax
2157	bswap	ebx
2158	bswap	ecx
2159	mov	DWORD [edi],eax
2160	bswap	edx
2161	mov	DWORD [4+edi],ebx
2162	mov	DWORD [8+edi],ecx
2163	mov	DWORD [12+edi],edx
2164	mov	ecx,DWORD [32+esp]
2165	lea	esi,[16+esi]
2166	mov	DWORD [24+esp],esi
2167	lea	edx,[16+edi]
2168	mov	DWORD [28+esp],edx
2169	sub	ecx,16
2170	test	ecx,4294967280
2171	mov	DWORD [32+esp],ecx
2172	jnz	NEAR L$021enc_loop
2173	test	ecx,15
2174	jnz	NEAR L$020enc_tail
2175	mov	esi,DWORD [40+esp]
2176	mov	ecx,DWORD [8+edi]
2177	mov	edx,DWORD [12+edi]
2178	mov	DWORD [esi],eax
2179	mov	DWORD [4+esi],ebx
2180	mov	DWORD [8+esi],ecx
2181	mov	DWORD [12+esi],edx
2182	mov	esp,DWORD [20+esp]
2183	popfd
2184L$016enc_out:
2185	pop	edi
2186	pop	esi
2187	pop	ebx
2188	pop	ebp
2189	ret
2190	pushfd
2191align	4
2192L$020enc_tail:
2193	mov	eax,edi
2194	mov	edi,DWORD [28+esp]
2195	push	eax
2196	mov	ebx,16
2197	sub	ebx,ecx
2198	cmp	edi,esi
2199	je	NEAR L$022enc_in_place
2200align	4
2201dd	2767451785
2202	jmp	NEAR L$023enc_skip_in_place
2203L$022enc_in_place:
2204	lea	edi,[ecx*1+edi]
2205L$023enc_skip_in_place:
2206	mov	ecx,ebx
2207	xor	eax,eax
2208align	4
2209dd	2868115081
2210	pop	edi
2211	mov	esi,DWORD [28+esp]
2212	mov	eax,DWORD [edi]
2213	mov	ebx,DWORD [4+edi]
2214	mov	DWORD [32+esp],16
2215	jmp	NEAR L$021enc_loop
2216align	16
2217L$019DECRYPT:
2218	shl	edx,6
2219	lea	edx,[edx*1+eax]
2220	mov	DWORD [16+esp],eax
2221	mov	DWORD [36+esp],edx
2222	cmp	esi,DWORD [28+esp]
2223	je	NEAR L$024dec_in_place
2224	mov	edi,DWORD [40+esp]
2225	mov	DWORD [44+esp],edi
2226align	4
2227L$025dec_loop:
2228	mov	eax,DWORD [esi]
2229	mov	ebx,DWORD [4+esi]
2230	mov	ecx,DWORD [8+esi]
2231	bswap	eax
2232	mov	edx,DWORD [12+esi]
2233	bswap	ebx
2234	mov	edi,DWORD [36+esp]
2235	bswap	ecx
2236	bswap	edx
2237	call	__x86_Camellia_decrypt
2238	mov	edi,DWORD [44+esp]
2239	mov	esi,DWORD [32+esp]
2240	bswap	eax
2241	bswap	ebx
2242	bswap	ecx
2243	xor	eax,DWORD [edi]
2244	bswap	edx
2245	xor	ebx,DWORD [4+edi]
2246	xor	ecx,DWORD [8+edi]
2247	xor	edx,DWORD [12+edi]
2248	sub	esi,16
2249	jc	NEAR L$026dec_partial
2250	mov	DWORD [32+esp],esi
2251	mov	esi,DWORD [24+esp]
2252	mov	edi,DWORD [28+esp]
2253	mov	DWORD [edi],eax
2254	mov	DWORD [4+edi],ebx
2255	mov	DWORD [8+edi],ecx
2256	mov	DWORD [12+edi],edx
2257	mov	DWORD [44+esp],esi
2258	lea	esi,[16+esi]
2259	mov	DWORD [24+esp],esi
2260	lea	edi,[16+edi]
2261	mov	DWORD [28+esp],edi
2262	jnz	NEAR L$025dec_loop
2263	mov	edi,DWORD [44+esp]
2264L$027dec_end:
2265	mov	esi,DWORD [40+esp]
2266	mov	eax,DWORD [edi]
2267	mov	ebx,DWORD [4+edi]
2268	mov	ecx,DWORD [8+edi]
2269	mov	edx,DWORD [12+edi]
2270	mov	DWORD [esi],eax
2271	mov	DWORD [4+esi],ebx
2272	mov	DWORD [8+esi],ecx
2273	mov	DWORD [12+esi],edx
2274	jmp	NEAR L$028dec_out
2275align	4
2276L$026dec_partial:
2277	lea	edi,[44+esp]
2278	mov	DWORD [edi],eax
2279	mov	DWORD [4+edi],ebx
2280	mov	DWORD [8+edi],ecx
2281	mov	DWORD [12+edi],edx
2282	lea	ecx,[16+esi]
2283	mov	esi,edi
2284	mov	edi,DWORD [28+esp]
2285dd	2767451785
2286	mov	edi,DWORD [24+esp]
2287	jmp	NEAR L$027dec_end
2288align	4
2289L$024dec_in_place:
2290L$029dec_in_place_loop:
2291	lea	edi,[44+esp]
2292	mov	eax,DWORD [esi]
2293	mov	ebx,DWORD [4+esi]
2294	mov	ecx,DWORD [8+esi]
2295	mov	edx,DWORD [12+esi]
2296	mov	DWORD [edi],eax
2297	mov	DWORD [4+edi],ebx
2298	mov	DWORD [8+edi],ecx
2299	bswap	eax
2300	mov	DWORD [12+edi],edx
2301	bswap	ebx
2302	mov	edi,DWORD [36+esp]
2303	bswap	ecx
2304	bswap	edx
2305	call	__x86_Camellia_decrypt
2306	mov	edi,DWORD [40+esp]
2307	mov	esi,DWORD [28+esp]
2308	bswap	eax
2309	bswap	ebx
2310	bswap	ecx
2311	xor	eax,DWORD [edi]
2312	bswap	edx
2313	xor	ebx,DWORD [4+edi]
2314	xor	ecx,DWORD [8+edi]
2315	xor	edx,DWORD [12+edi]
2316	mov	DWORD [esi],eax
2317	mov	DWORD [4+esi],ebx
2318	mov	DWORD [8+esi],ecx
2319	mov	DWORD [12+esi],edx
2320	lea	esi,[16+esi]
2321	mov	DWORD [28+esp],esi
2322	lea	esi,[44+esp]
2323	mov	eax,DWORD [esi]
2324	mov	ebx,DWORD [4+esi]
2325	mov	ecx,DWORD [8+esi]
2326	mov	edx,DWORD [12+esi]
2327	mov	DWORD [edi],eax
2328	mov	DWORD [4+edi],ebx
2329	mov	DWORD [8+edi],ecx
2330	mov	DWORD [12+edi],edx
2331	mov	esi,DWORD [24+esp]
2332	lea	esi,[16+esi]
2333	mov	DWORD [24+esp],esi
2334	mov	ecx,DWORD [32+esp]
2335	sub	ecx,16
2336	jc	NEAR L$030dec_in_place_partial
2337	mov	DWORD [32+esp],ecx
2338	jnz	NEAR L$029dec_in_place_loop
2339	jmp	NEAR L$028dec_out
2340align	4
2341L$030dec_in_place_partial:
2342	mov	edi,DWORD [28+esp]
2343	lea	esi,[44+esp]
2344	lea	edi,[ecx*1+edi]
2345	lea	esi,[16+ecx*1+esi]
2346	neg	ecx
2347dd	2767451785
2348align	4
2349L$028dec_out:
2350	mov	esp,DWORD [20+esp]
2351	popfd
2352	pop	edi
2353	pop	esi
2354	pop	ebx
2355	pop	ebp
2356	ret
2357db	67,97,109,101,108,108,105,97,32,102,111,114,32,120,56,54
2358db	32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
2359db	115,108,46,111,114,103,62,0
2360