66#define Read32Bits(value,p) \
69 (value)|=(*p++) << 8; \
70 (value)|=(*p++) << 16; \
71 (value)|=(*p++) << 24; \
73#define SerpentBlocksize 32
74#define Write32Bits(p,value) \
76 *p++=(unsigned char) (value); \
77 *p++=(unsigned char) ((value) >> 8); \
78 *p++=(unsigned char) ((value) >> 16); \
79 *p++=(unsigned char) ((value) >> 24); \
108 (void) memset(serpent_info,0,
sizeof(*serpent_info));
110 serpent_info->
timestamp=time((time_t *) NULL);
112 return(serpent_info);
144static inline unsigned int Trunc32(
unsigned int x)
146 return((
unsigned int) (x & 0xffffffffUL));
149static inline unsigned int RotateRight(
unsigned int x,
unsigned int n)
151 return(
Trunc32((x >> n) | (x << (32-n))));
155 const unsigned char *ciphertext,
unsigned char *plaintext)
157#define DecipherSbox0(alpha,beta,gamma,delta,epsilon) \
159 beta^=alpha; epsilon=delta; delta|=beta; epsilon^=beta; \
160 alpha=(~alpha); gamma^=delta; delta^=alpha; alpha&=beta; \
161 alpha^=gamma; gamma&=delta; delta^=epsilon; gamma^=delta; \
162 beta^=delta; delta&=alpha; beta^=alpha; alpha^=gamma; epsilon^=delta; \
164#define DecipherSbox1(alpha,beta,gamma,delta,epsilon) \
166 beta^=delta; epsilon=alpha; alpha^=gamma; gamma=(~gamma); \
167 epsilon|=beta; epsilon^=delta; delta&=beta; beta^=gamma; \
168 gamma&=epsilon; epsilon^=beta; beta|=delta; delta^=alpha; \
169 gamma^=alpha; alpha|=epsilon; gamma^=epsilon; beta^=alpha; epsilon^=beta; \
171#define DecipherSbox2(alpha,beta,gamma,delta,epsilon) \
173 gamma^=beta; epsilon=delta; delta=(~delta); delta|=gamma; \
174 gamma^=epsilon; epsilon^=alpha; delta^=beta; beta|=gamma; \
175 gamma^=alpha; beta^=epsilon; epsilon|=delta; gamma^=delta; \
176 epsilon^=gamma; gamma&=beta; gamma^=delta; delta^=epsilon; epsilon^=alpha; \
178#define DecipherSbox3(alpha,beta,gamma,delta,epsilon) \
180 gamma^=beta; epsilon=beta; beta&=gamma; beta^=alpha; \
181 alpha|=epsilon; epsilon^=delta; alpha^=delta; delta|=beta; \
182 beta^=gamma; beta^=delta; alpha^=gamma; gamma^=delta; delta&=beta; \
183 beta^=alpha; alpha&=gamma; epsilon^=delta; delta^=alpha; alpha^=beta; \
185#define DecipherSbox4(alpha,beta,gamma,delta,epsilon) \
187 gamma^=delta; epsilon=alpha; alpha&=beta; alpha^=gamma; \
188 gamma|=delta; epsilon=(~epsilon); beta^=alpha; alpha^=gamma; \
189 gamma&=epsilon; gamma^=alpha; alpha|=epsilon; alpha^=delta; \
190 delta&=gamma; epsilon^=delta; delta^=beta; beta&=alpha; \
191 epsilon^=beta; alpha^=delta; \
193#define DecipherSbox5(alpha,beta,gamma,delta,epsilon) \
195 epsilon=beta; beta|=gamma; gamma^=epsilon; beta^=delta; \
196 delta&=epsilon; gamma^=delta; delta|=alpha; alpha=(~alpha); \
197 delta^=gamma; gamma|=alpha; epsilon^=beta; gamma^=epsilon; \
198 epsilon&=alpha; alpha^=beta; beta^=delta; alpha&=gamma; \
199 gamma^=delta; alpha^=gamma; gamma^=epsilon; epsilon^=delta; \
201#define DecipherSbox6(alpha,beta,gamma,delta,epsilon) \
203 alpha^=gamma; epsilon=alpha; alpha&=delta; gamma^=delta; \
204 alpha^=gamma; delta^=beta; gamma|=epsilon; gamma^=delta; \
205 delta&=alpha; alpha=(~alpha); delta^=beta; beta&=gamma; \
206 epsilon^=alpha; delta^=epsilon; epsilon^=gamma; alpha^=beta; gamma^=alpha; \
208#define DecipherSbox7(alpha,beta,gamma,delta,epsilon) \
210 epsilon=delta; delta&=alpha; alpha^=gamma; gamma|=epsilon; \
211 epsilon^=beta; alpha=(~alpha); beta|=delta; epsilon^=alpha; \
212 alpha&=gamma; alpha^=beta; beta&=gamma; delta^=gamma; \
213 epsilon^=delta; gamma&=delta; delta|=alpha; beta^=epsilon; \
214 delta^=epsilon; epsilon&=alpha; epsilon^=gamma; \
216#define DecipherK(alpha,beta,gamma,delta,epsilon,i) \
218 MixKey(alpha,beta,gamma,delta,i) \
219 alpha=RotateRight(alpha,5); gamma=RotateRight(gamma,22); \
220 alpha^=delta; gamma^=delta; epsilon=beta << 7; alpha^=beta; \
221 beta=RotateRight(beta,1); gamma^=epsilon; delta=RotateRight(delta,7); \
222 epsilon=alpha << 3; beta^=alpha; delta^=epsilon; \
223 alpha=RotateRight(alpha,13); beta^=gamma; delta^=gamma; \
224 gamma=RotateRight(gamma,3); \
226#define MixKey(alpha,beta,gamma,delta,i) \
228 alpha^=crypt_key[4*(i)+0]; beta^=crypt_key[4*(i)+1]; \
229 gamma^=crypt_key[4*(i)+2]; delta^=crypt_key[4*(i)+3]; \
251 p=(
const unsigned char *) ciphertext;
257 MixKey(alpha,beta,gamma,delta,32);
259 DecipherK(beta,delta,alpha,epsilon,gamma,31);
261 DecipherK(alpha,gamma,epsilon,beta,delta,30);
263 DecipherK(gamma,delta,alpha,epsilon,beta,29);
265 DecipherK(gamma,alpha,beta,epsilon,delta,28);
267 DecipherK(beta,gamma,delta,epsilon,alpha,27);
269 DecipherK(gamma,alpha,epsilon,delta,beta,26);
271 DecipherK(beta,alpha,epsilon,delta,gamma,25);
273 DecipherK(epsilon,gamma,alpha,beta,delta,24);
275 DecipherK(gamma,beta,epsilon,delta,alpha,23);
277 DecipherK(epsilon,alpha,delta,gamma,beta,22);
279 DecipherK(alpha,beta,epsilon,delta,gamma,21);
281 DecipherK(alpha,epsilon,gamma,delta,beta,20);
283 DecipherK(gamma,alpha,beta,delta,epsilon,19);
285 DecipherK(alpha,epsilon,delta,beta,gamma,18);
287 DecipherK(gamma,epsilon,delta,beta,alpha,17);
289 DecipherK(delta,alpha,epsilon,gamma,beta,16);
291 DecipherK(alpha,gamma,delta,beta,epsilon,15);
293 DecipherK(delta,epsilon,beta,alpha,gamma,14);
295 DecipherK(epsilon,gamma,delta,beta,alpha,13);
297 DecipherK(epsilon,delta,alpha,beta,gamma,12);
299 DecipherK(alpha,epsilon,gamma,beta,delta,11);
301 DecipherK(epsilon,delta,beta,gamma,alpha,10);
303 DecipherK(alpha,delta,beta,gamma,epsilon,9);
305 DecipherK(beta,epsilon,delta,alpha,gamma,8);
307 DecipherK(epsilon,alpha,beta,gamma,delta,7);
309 DecipherK(beta,delta,gamma,epsilon,alpha,6);
311 DecipherK(delta,alpha,beta,gamma,epsilon,5);
313 DecipherK(delta,beta,epsilon,gamma,alpha,4);
315 DecipherK(epsilon,delta,alpha,gamma,beta,3);
317 DecipherK(delta,beta,gamma,alpha,epsilon,2);
319 DecipherK(epsilon,beta,gamma,alpha,delta,1);
321 MixKey(gamma,delta,beta,epsilon,0);
322 q=(
unsigned char *) plaintext;
364 serpent_info->
signature=(~WizardSignature);
366 return(serpent_info);
398static inline unsigned int RotateLeft(
unsigned int x,
unsigned int n)
400 return(
Trunc32((x << n) | (x >> (32-n))));
404 const unsigned char *plaintext,
unsigned char *ciphertext)
406#define EncipherK(alpha,beta,gamma,delta,epsilon,i) \
408 alpha=RotateLeft(alpha,13); gamma=RotateLeft(gamma,3); \
409 beta^=alpha; epsilon=alpha << 3; delta^=gamma; beta^=gamma; \
410 beta=RotateLeft(beta,1); delta^=epsilon; delta=RotateLeft(delta,7); \
411 epsilon=beta << 7; alpha^=beta; gamma^=delta; alpha^=delta; \
412 gamma^=epsilon; delta^=crypt_key[4*(i)+3]; beta^=crypt_key[4*(i)+1]; \
413 alpha=RotateLeft(alpha,5); gamma=RotateLeft(gamma,22); \
414 alpha^=crypt_key[4*(i)+0]; gamma^=crypt_key[4*(i)+2]; \
416#define EncipherSbox0(alpha,beta,gamma,delta,epsilon) \
418 epsilon=delta; delta|=alpha; alpha^=epsilon; epsilon^=gamma; \
419 epsilon=(~epsilon); delta^=beta; beta&=alpha; beta^=epsilon; \
420 gamma^=alpha; alpha^=delta; epsilon|=alpha; alpha^=gamma; \
421 gamma&=beta; delta^=gamma; beta=(~beta); gamma^=epsilon; beta^=gamma; \
423#define EncipherSbox1(alpha,beta,gamma,delta,epsilon) \
425 epsilon=beta; beta^=alpha; alpha^=delta; delta=~delta; \
426 epsilon&=beta; alpha|=beta; delta^=gamma; alpha^=delta; \
427 beta^=delta; delta^=epsilon; beta|=epsilon; epsilon^=gamma; \
428 gamma&=alpha; gamma^=beta; beta|=alpha; alpha=(~alpha); \
429 alpha^=gamma; epsilon^=beta; \
431#define EncipherSbox2(alpha,beta,gamma,delta,epsilon) \
433 delta=(~delta); beta^=alpha; epsilon=alpha; alpha&=gamma; \
434 alpha^=delta; delta|=epsilon; gamma^=beta; delta^=beta; \
435 beta&=alpha; alpha^=gamma; gamma&=delta; delta|=beta; \
436 alpha=(~alpha); delta^=alpha; epsilon^=alpha; alpha^=gamma; beta|=gamma; \
438#define EncipherSbox3(alpha,beta,gamma,delta,epsilon) \
440 epsilon=beta; beta^=delta; delta|=alpha; epsilon&=alpha; \
441 alpha^=gamma; gamma^=beta; beta&=delta; gamma^=delta; \
442 alpha|=epsilon; epsilon^=delta; beta^=alpha; alpha&=delta; \
443 delta&=epsilon; delta^=gamma; epsilon|=beta; gamma&=beta; \
444 epsilon^=delta; alpha^=delta; delta^=gamma; \
446#define EncipherSbox4(alpha,beta,gamma,delta,epsilon) \
448 epsilon=delta; delta&=alpha; alpha^=epsilon; delta^=gamma; \
449 gamma|=epsilon; alpha^=beta; epsilon^=delta; gamma|=alpha; \
450 gamma^=beta; beta&=alpha; beta^=epsilon; epsilon&=gamma; \
451 gamma^=delta; epsilon^=alpha; delta|=beta; beta=(~beta); delta^=alpha; \
453#define EncipherSbox5(alpha,beta,gamma,delta,epsilon) \
455 epsilon=beta; beta|=alpha; gamma^=beta; delta=(~delta); \
456 epsilon^=alpha; alpha^=gamma; beta&=epsilon; epsilon|=delta; \
457 epsilon^=alpha; alpha&=delta; beta^=delta; delta^=gamma; \
458 alpha^=beta; gamma&=epsilon; beta^=gamma; gamma&=alpha; delta^=gamma; \
460#define EncipherSbox6(alpha,beta,gamma,delta,epsilon) \
462 epsilon=beta; delta^=alpha; beta^=gamma; gamma^=alpha; \
463 alpha&=delta; beta|=delta; epsilon=(~epsilon); alpha^=beta; \
464 beta^=gamma; delta^=epsilon; epsilon^=alpha; gamma&=alpha; \
465 epsilon^=beta; gamma^=delta; delta&=beta; delta^=alpha; beta^=gamma; \
467#define EncipherSbox7(alpha,beta,gamma,delta,epsilon) \
469 beta=(~beta); epsilon=beta; alpha=(~alpha); beta&=gamma; \
470 beta^=delta; delta|=epsilon; epsilon^=gamma; gamma^=delta; \
471 delta^=alpha; alpha|=beta; gamma&=alpha; alpha^=epsilon; \
472 epsilon^=delta; delta&=alpha; epsilon^=beta; gamma^=epsilon; \
473 delta^=beta; epsilon|=alpha; epsilon^=beta; \
495 p=(
const unsigned char *) plaintext;
501 MixKey(alpha,beta,gamma,delta,0);
503 EncipherK(gamma,beta,delta,alpha,epsilon,1);
505 EncipherK(epsilon,delta,alpha,gamma,beta,2);
507 EncipherK(beta,delta,epsilon,gamma,alpha,3);
509 EncipherK(gamma,alpha,delta,beta,epsilon,4);
511 EncipherK(alpha,delta,beta,epsilon,gamma,5);
513 EncipherK(gamma,alpha,delta,epsilon,beta,6);
515 EncipherK(delta,beta,alpha,epsilon,gamma,7);
517 EncipherK(gamma,alpha,epsilon,delta,beta,8);
519 EncipherK(epsilon,alpha,delta,gamma,beta,9);
521 EncipherK(beta,delta,gamma,epsilon,alpha,10);
523 EncipherK(alpha,delta,beta,epsilon,gamma,11);
525 EncipherK(epsilon,gamma,delta,alpha,beta,12);
527 EncipherK(gamma,delta,alpha,beta,epsilon,13);
529 EncipherK(epsilon,gamma,delta,beta,alpha,14);
531 EncipherK(delta,alpha,gamma,beta,epsilon,15);
533 EncipherK(epsilon,gamma,beta,delta,alpha,16);
535 EncipherK(beta,gamma,delta,epsilon,alpha,17);
537 EncipherK(alpha,delta,epsilon,beta,gamma,18);
539 EncipherK(gamma,delta,alpha,beta,epsilon,19);
541 EncipherK(beta,epsilon,delta,gamma,alpha,20);
543 EncipherK(epsilon,delta,gamma,alpha,beta,21);
545 EncipherK(beta,epsilon,delta,alpha,gamma,22);
547 EncipherK(delta,gamma,epsilon,alpha,beta,23);
549 EncipherK(beta,epsilon,alpha,delta,gamma,24);
551 EncipherK(alpha,epsilon,delta,beta,gamma,25);
553 EncipherK(gamma,delta,beta,alpha,epsilon,26);
555 EncipherK(epsilon,delta,gamma,alpha,beta,27);
557 EncipherK(alpha,beta,delta,epsilon,gamma,28);
559 EncipherK(beta,delta,epsilon,gamma,alpha,29);
561 EncipherK(alpha,beta,delta,gamma,epsilon,30);
563 EncipherK(delta,epsilon,beta,gamma,alpha,31);
565 MixKey(alpha,beta,gamma,delta,32);
566 q=(
unsigned char * ) ciphertext;
639#define ChurnKey(alpha,beta,gamma,delta,i,j) \
641 beta^=delta; beta^=gamma; beta^=alpha; beta^=0x9e3779b9UL ^ i; \
642 beta=RotateLeft(beta,11); crypt_key[j]=beta; \
644#define LoadKey(alpha,beta,gamma,delta,i) \
646 alpha=crypt_key[i]; beta=crypt_key[(i)+1]; \
647 gamma=crypt_key[(i)+2]; delta=crypt_key[(i)+3]; \
649#define MaximumSerpentKeyLength 32
650#define StoreKey(alpha,beta,gamma,delta,i) \
652 crypt_key[i]=alpha; crypt_key[(i)+1]=beta; \
653 crypt_key[(i)+2]=gamma; crypt_key[(i)+3]=delta; \
684 p=(
unsigned char *) crypt_key;
692 p=(
unsigned char *) crypt_key;
699 p=(
unsigned char *) crypt_key;
701 ChurnKey(rho,alpha,epsilon,gamma,0,0);
705 ChurnKey(rho,gamma,beta,epsilon,2,2);
707 ChurnKey(rho,delta,gamma,alpha,3,3);
709 ChurnKey(rho,epsilon,delta,beta,4,4);
711 ChurnKey(rho,alpha,epsilon,gamma,5,5);
715 ChurnKey(rho,gamma,beta,epsilon,7,7);
716 ChurnKey(crypt_key[0],delta,gamma,alpha,8,8);
717 ChurnKey(crypt_key[1],epsilon,delta,beta,9,9);
718 ChurnKey(crypt_key[2],alpha,epsilon,gamma,10,10);
719 ChurnKey(crypt_key[3],beta,alpha,delta,11,11);
720 ChurnKey(crypt_key[4],gamma,beta,epsilon,12,12);
721 ChurnKey(crypt_key[5],delta,gamma,alpha,13,13);
722 ChurnKey(crypt_key[6],epsilon,delta,beta,14,14);
723 ChurnKey(crypt_key[7],alpha,epsilon,gamma,15,15);
724 ChurnKey(crypt_key[8],beta,alpha,delta,16,16);
725 ChurnKey(crypt_key[9],gamma,beta,epsilon,17,17);
726 ChurnKey(crypt_key[10],delta,gamma,alpha,18,18);
727 ChurnKey(crypt_key[11],epsilon,delta,beta,19,19);
728 ChurnKey(crypt_key[12],alpha,epsilon,gamma,20,20);
729 ChurnKey(crypt_key[13],beta,alpha,delta,21,21);
730 ChurnKey(crypt_key[14],gamma,beta,epsilon,22,22);
731 ChurnKey(crypt_key[15],delta,gamma,alpha,23,23);
732 ChurnKey(crypt_key[16],epsilon,delta,beta,24,24);
733 ChurnKey(crypt_key[17],alpha,epsilon,gamma,25,25);
734 ChurnKey(crypt_key[18],beta,alpha,delta,26,26);
735 ChurnKey(crypt_key[19],gamma,beta,epsilon,27,27);
736 ChurnKey(crypt_key[20],delta,gamma,alpha,28,28);
737 ChurnKey(crypt_key[21],epsilon,delta,beta,29,29);
738 ChurnKey(crypt_key[22],alpha,epsilon,gamma,30,30);
739 ChurnKey(crypt_key[23],beta,alpha,delta,31,31);
741 ChurnKey(crypt_key[-26],gamma,beta,epsilon,32,-18);
742 ChurnKey(crypt_key[-25],delta,gamma,alpha,33,-17);
743 ChurnKey(crypt_key[-24],epsilon,delta,beta,34,-16);
744 ChurnKey(crypt_key[-23],alpha,epsilon,gamma,35,-15);
745 ChurnKey(crypt_key[-22],beta,alpha,delta,36,-14);
746 ChurnKey(crypt_key[-21],gamma,beta,epsilon,37,-13);
747 ChurnKey(crypt_key[-20],delta,gamma,alpha,38,-12);
748 ChurnKey(crypt_key[-19],epsilon,delta,beta,39,-11);
749 ChurnKey(crypt_key[-18],alpha,epsilon,gamma,40,-10);
750 ChurnKey(crypt_key[-17],beta,alpha,delta,41,-9);
751 ChurnKey(crypt_key[-16],gamma,beta,epsilon,42,-8);
752 ChurnKey(crypt_key[-15],delta,gamma,alpha,43,-7);
753 ChurnKey(crypt_key[-14],epsilon,delta,beta,44,-6);
754 ChurnKey(crypt_key[-13],alpha,epsilon,gamma,45,-5);
755 ChurnKey(crypt_key[-12],beta,alpha,delta,46,-4);
756 ChurnKey(crypt_key[-11],gamma,beta,epsilon,47,-3);
757 ChurnKey(crypt_key[-10],delta,gamma,alpha,48,-2);
758 ChurnKey(crypt_key[-9],epsilon,delta,beta,49,-1);
759 ChurnKey(crypt_key[-8],alpha,epsilon,gamma,50,0);
760 ChurnKey(crypt_key[-7],beta,alpha,delta,51,1);
761 ChurnKey(crypt_key[-6],gamma,beta,epsilon,52,2);
762 ChurnKey(crypt_key[-5],delta,gamma,alpha,53,3);
763 ChurnKey(crypt_key[-4],epsilon,delta,beta,54,4);
764 ChurnKey(crypt_key[-3],alpha,epsilon,gamma,55,5);
765 ChurnKey(crypt_key[-2],beta,alpha,delta,56,6);
766 ChurnKey(crypt_key[-1],gamma,beta,epsilon,57,7);
767 ChurnKey(crypt_key[0],delta,gamma,alpha,58,8);
768 ChurnKey(crypt_key[1],epsilon,delta,beta,59,9);
769 ChurnKey(crypt_key[2],alpha,epsilon,gamma,60,10);
770 ChurnKey(crypt_key[3],beta,alpha,delta,61,11);
771 ChurnKey(crypt_key[4],gamma,beta,epsilon,62,12);
772 ChurnKey(crypt_key[5],delta,gamma,alpha,63,13);
773 ChurnKey(crypt_key[6],epsilon,delta,beta,64,14);
774 ChurnKey(crypt_key[7],alpha,epsilon,gamma,65,15);
775 ChurnKey(crypt_key[8],beta,alpha,delta,66,16);
776 ChurnKey(crypt_key[9],gamma,beta,epsilon,67,17);
777 ChurnKey(crypt_key[10],delta,gamma,alpha,68,18);
778 ChurnKey(crypt_key[11],epsilon,delta,beta,69,19);
779 ChurnKey(crypt_key[12],alpha,epsilon,gamma,70,20);
780 ChurnKey(crypt_key[13],beta,alpha,delta,71,21);
781 ChurnKey(crypt_key[14],gamma,beta,epsilon,72,22);
782 ChurnKey(crypt_key[15],delta,gamma,alpha,73,23);
783 ChurnKey(crypt_key[16],epsilon,delta,beta,74,24);
784 ChurnKey(crypt_key[17],alpha,epsilon,gamma,75,25);
785 ChurnKey(crypt_key[18],beta,alpha,delta,76,26);
786 ChurnKey(crypt_key[19],gamma,beta,epsilon,77,27);
787 ChurnKey(crypt_key[20],delta,gamma,alpha,78,28);
788 ChurnKey(crypt_key[21],epsilon,delta,beta,79,29);
789 ChurnKey(crypt_key[22],alpha,epsilon,gamma,80,30);
790 ChurnKey(crypt_key[23],beta,alpha,delta,81,31);
792 ChurnKey(crypt_key[-26],gamma,beta,epsilon,82,-18);
793 ChurnKey(crypt_key[-25],delta,gamma,alpha,83,-17);
794 ChurnKey(crypt_key[-24],epsilon,delta,beta,84,-16);
795 ChurnKey(crypt_key[-23],alpha,epsilon,gamma,85,-15);
796 ChurnKey(crypt_key[-22],beta,alpha,delta,86,-14);
797 ChurnKey(crypt_key[-21],gamma,beta,epsilon,87,-13);
798 ChurnKey(crypt_key[-20],delta,gamma,alpha,88,-12);
799 ChurnKey(crypt_key[-19],epsilon,delta,beta,89,-11);
800 ChurnKey(crypt_key[-18],alpha,epsilon,gamma,90,-10);
801 ChurnKey(crypt_key[-17],beta,alpha,delta,91,-9);
802 ChurnKey(crypt_key[-16],gamma,beta,epsilon,92,-8);
803 ChurnKey(crypt_key[-15],delta,gamma,alpha,93,-7);
804 ChurnKey(crypt_key[-14],epsilon,delta,beta,94,-6);
805 ChurnKey(crypt_key[-13],alpha,epsilon,gamma,95,-5);
806 ChurnKey(crypt_key[-12],beta,alpha,delta,96,-4);
807 ChurnKey(crypt_key[-11],gamma,beta,epsilon,97,-3);
808 ChurnKey(crypt_key[-10],delta,gamma,alpha,98,-2);
809 ChurnKey(crypt_key[-9],epsilon,delta,beta,99,-1);
810 ChurnKey(crypt_key[-8],alpha,epsilon,gamma,100,0);
811 ChurnKey(crypt_key[-7],beta,alpha,delta,101,1);
812 ChurnKey(crypt_key[-6],gamma,beta,epsilon,102,2);
813 ChurnKey(crypt_key[-5],delta,gamma,alpha,103,3);
814 ChurnKey(crypt_key[-4],epsilon,delta,beta,104,4);
815 ChurnKey(crypt_key[-3],alpha,epsilon,gamma,105,5);
816 ChurnKey(crypt_key[-2],beta,alpha,delta,106,6);
817 ChurnKey(crypt_key[-1],gamma,beta,epsilon,107,7);
818 ChurnKey(crypt_key[0],delta,gamma,alpha,108,8);
819 ChurnKey(crypt_key[1],epsilon,delta,beta,109,9);
820 ChurnKey(crypt_key[2],alpha,epsilon,gamma,110,10);
821 ChurnKey(crypt_key[3],beta,alpha,delta,111,11);
822 ChurnKey(crypt_key[4],gamma,beta,epsilon,112,12);
823 ChurnKey(crypt_key[5],delta,gamma,alpha,113,13);
824 ChurnKey(crypt_key[6],epsilon,delta,beta,114,14);
825 ChurnKey(crypt_key[7],alpha,epsilon,gamma,115,15);
826 ChurnKey(crypt_key[8],beta,alpha,delta,116,16);
827 ChurnKey(crypt_key[9],gamma,beta,epsilon,117,17);
828 ChurnKey(crypt_key[10],delta,gamma,alpha,118,18);
829 ChurnKey(crypt_key[11],epsilon,delta,beta,119,19);
830 ChurnKey(crypt_key[12],alpha,epsilon,gamma,120,20);
831 ChurnKey(crypt_key[13],beta,alpha,delta,121,21);
832 ChurnKey(crypt_key[14],gamma,beta,epsilon,122,22);
833 ChurnKey(crypt_key[15],delta,gamma,alpha,123,23);
834 ChurnKey(crypt_key[16],epsilon,delta,beta,124,24);
835 ChurnKey(crypt_key[17],alpha,epsilon,gamma,125,25);
836 ChurnKey(crypt_key[18],beta,alpha,delta,126,26);
837 ChurnKey(crypt_key[19],gamma,beta,epsilon,127,27);
838 ChurnKey(crypt_key[20],delta,gamma,alpha,128,28);
839 ChurnKey(crypt_key[21],epsilon,delta,beta,129,29);
840 ChurnKey(crypt_key[22],alpha,epsilon,gamma,130,30);
841 ChurnKey(crypt_key[23],beta,alpha,delta,131,31);
846 StoreKey(beta,gamma,epsilon,delta,28);
847 LoadKey(beta,gamma,epsilon,delta,24);
849 StoreKey(gamma,epsilon,delta,alpha,24);
850 LoadKey(gamma,epsilon,delta,alpha,20);
852 StoreKey(beta,gamma,epsilon,alpha,20);
853 LoadKey(beta,gamma,epsilon,alpha,16);
855 StoreKey(epsilon,delta,gamma,alpha,16);
856 LoadKey(epsilon,delta,gamma,alpha,12);
858 StoreKey(beta,gamma,alpha,epsilon,12);
859 LoadKey(beta,gamma,alpha,epsilon,8);
861 StoreKey(alpha,gamma,epsilon,beta,8);
862 LoadKey(alpha,gamma,epsilon,beta,4);
864 StoreKey(delta,epsilon,beta,alpha,4);
865 LoadKey(delta,epsilon,beta,alpha,0);
867 StoreKey(gamma,epsilon,delta,alpha,0);
868 LoadKey(gamma,epsilon,delta,alpha,-4);
870 StoreKey(alpha,beta,epsilon,gamma,-4);
871 LoadKey(alpha,beta,epsilon,gamma,-8);
873 StoreKey(beta,epsilon,gamma,delta,-8);
874 LoadKey(beta,epsilon,gamma,delta,-12);
876 StoreKey(alpha,beta,epsilon,delta,-12);
877 LoadKey(alpha,beta,epsilon,delta,-16);
879 StoreKey(epsilon,gamma,beta,delta,-16);
880 LoadKey(epsilon,gamma,beta,delta,-20);
882 StoreKey(alpha,beta,delta,epsilon,-20);
883 LoadKey(alpha,beta,delta,epsilon,-24);
885 StoreKey(delta,beta,epsilon,alpha,-24);
886 LoadKey(delta,beta,epsilon,alpha,-28);
889 StoreKey(gamma,epsilon,alpha,delta,22);
890 LoadKey(gamma,epsilon,alpha,delta,18);
892 StoreKey(beta,epsilon,gamma,delta,18);
893 LoadKey(beta,epsilon,gamma,delta,14);
895 StoreKey(delta,alpha,epsilon,beta,14);
896 LoadKey(delta,alpha,epsilon,beta,10);
898 StoreKey(alpha,epsilon,beta,gamma,10);
899 LoadKey(alpha,epsilon,beta,gamma,6);
901 StoreKey(delta,alpha,epsilon,gamma,6);
902 LoadKey(delta,alpha,epsilon,gamma,2);
904 StoreKey(epsilon,beta,alpha,gamma,2);
905 LoadKey(epsilon,beta,alpha,gamma,-2);
907 StoreKey(delta,alpha,gamma,epsilon,-2);
908 LoadKey(delta,alpha,gamma,epsilon,-6);
910 StoreKey(gamma,alpha,epsilon,delta,-6);
911 LoadKey(gamma,alpha,epsilon,delta,-10);
913 StoreKey(beta,epsilon,delta,gamma,-10);
914 LoadKey(beta,epsilon,delta,gamma,-14);
916 StoreKey(alpha,epsilon,beta,gamma,-14);
917 LoadKey(alpha,epsilon,beta,gamma,-18);
919 StoreKey(gamma,delta,epsilon,alpha,-18);
920 LoadKey(gamma,delta,epsilon,alpha,-22);
923 StoreKey(delta,epsilon,alpha,beta,28);
924 LoadKey(delta,epsilon,alpha,beta,24);
926 StoreKey(gamma,delta,epsilon,beta,24);
927 LoadKey(gamma,delta,epsilon,beta,20);
929 StoreKey(epsilon,alpha,delta,beta,20);
930 LoadKey(epsilon,alpha,delta,beta,16);
932 StoreKey(gamma,delta,beta,epsilon,16);
933 LoadKey(gamma,delta,beta,epsilon,12);
935 StoreKey(beta,delta,epsilon,gamma,12);
936 LoadKey(beta,delta,epsilon,gamma,8);
938 StoreKey(alpha,epsilon,gamma,beta,8);
939 LoadKey(alpha,epsilon,gamma,beta,4);
941 StoreKey(delta,epsilon,alpha,beta,4);
942 LoadKey(delta,epsilon,alpha,beta,0);
944 StoreKey(beta,gamma,epsilon,delta,0);
#define WizardAssert(domain, predicate)
#define ThrowWizardFatalError(domain, error)
WizardBooleanType LogWizardEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
#define GetWizardModule()
WizardExport void * AcquireWizardMemory(const size_t size)
WizardExport void * RelinquishWizardMemory(void *memory)
#define EncipherSbox6(alpha, beta, gamma, delta, epsilon)
#define Write32Bits(p, value)
#define EncipherSbox4(alpha, beta, gamma, delta, epsilon)
#define EncipherSbox5(alpha, beta, gamma, delta, epsilon)
#define DecipherSbox5(alpha, beta, gamma, delta, epsilon)
#define DecipherSbox6(alpha, beta, gamma, delta, epsilon)
WizardExport void DecipherSerpentBlock(SerpentInfo *serpent_info, const unsigned char *ciphertext, unsigned char *plaintext)
#define EncipherSbox3(alpha, beta, gamma, delta, epsilon)
#define DecipherSbox0(alpha, beta, gamma, delta, epsilon)
#define EncipherK(alpha, beta, gamma, delta, epsilon, i)
#define DecipherSbox4(alpha, beta, gamma, delta, epsilon)
#define DecipherSbox3(alpha, beta, gamma, delta, epsilon)
#define StoreKey(alpha, beta, gamma, delta, i)
WizardExport void EncipherSerpentBlock(SerpentInfo *serpent_info, const unsigned char *plaintext, unsigned char *ciphertext)
#define MixKey(alpha, beta, gamma, delta, i)
#define EncipherSbox7(alpha, beta, gamma, delta, epsilon)
WizardExport SerpentInfo * AcquireSerpentInfo(void)
#define DecipherSbox7(alpha, beta, gamma, delta, epsilon)
#define EncipherSbox1(alpha, beta, gamma, delta, epsilon)
#define EncipherSbox0(alpha, beta, gamma, delta, epsilon)
WizardExport void SetSerpentKey(SerpentInfo *serpent_info, const StringInfo *key)
WizardExport unsigned int GetSerpentBlocksize(const SerpentInfo *serpent_info)
#define DecipherSbox2(alpha, beta, gamma, delta, epsilon)
#define MaximumSerpentKeyLength
#define EncipherSbox2(alpha, beta, gamma, delta, epsilon)
#define ChurnKey(alpha, beta, gamma, delta, i, j)
#define LoadKey(alpha, beta, gamma, delta, i)
WizardExport SerpentInfo * DestroySerpentInfo(SerpentInfo *serpent_info)
#define DecipherSbox1(alpha, beta, gamma, delta, epsilon)
#define DecipherK(alpha, beta, gamma, delta, epsilon, i)
#define Read32Bits(value, p)
static unsigned int RotateLeft(unsigned int x, unsigned int n)
#define RotateRight(x, n)
WizardExport size_t GetStringInfoLength(const StringInfo *string_info)
WizardExport unsigned char * GetStringInfoDatum(const StringInfo *string_info)
unsigned int crypt_key[132]