cast-586.pl 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #! /usr/bin/env perl
  2. # Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
  3. #
  4. # Licensed under the Apache License 2.0 (the "License"). You may not use
  5. # this file except in compliance with the License. You can obtain a copy
  6. # in the file LICENSE in the source distribution or at
  7. # https://www.openssl.org/source/license.html
  8. # This flag makes the inner loop one cycle longer, but generates
  9. # code that runs %30 faster on the pentium pro/II, 44% faster
  10. # of PIII, while only %7 slower on the pentium.
  11. # By default, this flag is on.
  12. $ppro=1;
  13. $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
  14. push(@INC,"${dir}","${dir}../../perlasm");
  15. require "x86asm.pl";
  16. require "cbc.pl";
  17. $output=pop and open STDOUT,">$output";
  18. &asm_init($ARGV[0],$ARGV[$#ARGV] eq "386");
  19. $CAST_ROUNDS=16;
  20. $L="edi";
  21. $R="esi";
  22. $K="ebp";
  23. $tmp1="ecx";
  24. $tmp2="ebx";
  25. $tmp3="eax";
  26. $tmp4="edx";
  27. $S1="CAST_S_table0";
  28. $S2="CAST_S_table1";
  29. $S3="CAST_S_table2";
  30. $S4="CAST_S_table3";
  31. @F1=("add","xor","sub");
  32. @F2=("xor","sub","add");
  33. @F3=("sub","add","xor");
  34. &CAST_encrypt("CAST_encrypt",1);
  35. &CAST_encrypt("CAST_decrypt",0);
  36. &cbc("CAST_cbc_encrypt","CAST_encrypt","CAST_decrypt",1,4,5,3,-1,-1);
  37. &asm_finish();
  38. close STDOUT or die "error closing STDOUT: $!";
  39. sub CAST_encrypt {
  40. local($name,$enc)=@_;
  41. local($win_ex)=<<"EOF";
  42. EXTERN _CAST_S_table0:DWORD
  43. EXTERN _CAST_S_table1:DWORD
  44. EXTERN _CAST_S_table2:DWORD
  45. EXTERN _CAST_S_table3:DWORD
  46. EOF
  47. &main::external_label(
  48. "CAST_S_table0",
  49. "CAST_S_table1",
  50. "CAST_S_table2",
  51. "CAST_S_table3",
  52. );
  53. &function_begin_B($name,$win_ex);
  54. &comment("");
  55. &push("ebp");
  56. &push("ebx");
  57. &mov($tmp2,&wparam(0));
  58. &mov($K,&wparam(1));
  59. &push("esi");
  60. &push("edi");
  61. &comment("Load the 2 words");
  62. &mov($L,&DWP(0,$tmp2,"",0));
  63. &mov($R,&DWP(4,$tmp2,"",0));
  64. &comment('Get short key flag');
  65. &mov($tmp3,&DWP(128,$K,"",0));
  66. if($enc) {
  67. &push($tmp3);
  68. } else {
  69. &or($tmp3,$tmp3);
  70. &jnz(&label('cast_dec_skip'));
  71. }
  72. &xor($tmp3, $tmp3);
  73. # encrypting part
  74. if ($enc) {
  75. &E_CAST( 0,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  76. &E_CAST( 1,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  77. &E_CAST( 2,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  78. &E_CAST( 3,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  79. &E_CAST( 4,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  80. &E_CAST( 5,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  81. &E_CAST( 6,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  82. &E_CAST( 7,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  83. &E_CAST( 8,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  84. &E_CAST( 9,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  85. &E_CAST(10,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  86. &E_CAST(11,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  87. &comment('test short key flag');
  88. &pop($tmp4);
  89. &or($tmp4,$tmp4);
  90. &jnz(&label('cast_enc_done'));
  91. &E_CAST(12,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  92. &E_CAST(13,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  93. &E_CAST(14,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  94. &E_CAST(15,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  95. } else {
  96. &E_CAST(15,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  97. &E_CAST(14,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  98. &E_CAST(13,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  99. &E_CAST(12,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  100. &set_label('cast_dec_skip');
  101. &E_CAST(11,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  102. &E_CAST(10,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  103. &E_CAST( 9,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  104. &E_CAST( 8,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  105. &E_CAST( 7,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  106. &E_CAST( 6,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  107. &E_CAST( 5,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  108. &E_CAST( 4,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  109. &E_CAST( 3,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  110. &E_CAST( 2,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
  111. &E_CAST( 1,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
  112. &E_CAST( 0,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
  113. }
  114. &set_label('cast_enc_done') if $enc;
  115. # Why the nop? - Ben 17/1/99
  116. &nop();
  117. &mov($tmp3,&wparam(0));
  118. &mov(&DWP(4,$tmp3,"",0),$L);
  119. &mov(&DWP(0,$tmp3,"",0),$R);
  120. &function_end($name);
  121. }
  122. sub E_CAST {
  123. local($i,$S,$L,$R,$K,$OP1,$OP2,$OP3,$tmp1,$tmp2,$tmp3,$tmp4)=@_;
  124. # Ri needs to have 16 pre added.
  125. &comment("round $i");
  126. &mov( $tmp4, &DWP($i*8,$K,"",1));
  127. &mov( $tmp1, &DWP($i*8+4,$K,"",1));
  128. &$OP1( $tmp4, $R);
  129. &rotl( $tmp4, &LB($tmp1));
  130. if ($ppro) {
  131. &xor( $tmp1, $tmp1);
  132. &mov( $tmp2, 0xff);
  133. &movb( &LB($tmp1), &HB($tmp4)); # A
  134. &and( $tmp2, $tmp4);
  135. &shr( $tmp4, 16); #
  136. &xor( $tmp3, $tmp3);
  137. } else {
  138. &mov( $tmp2, $tmp4); # B
  139. &movb( &LB($tmp1), &HB($tmp4)); # A # BAD BAD BAD
  140. &shr( $tmp4, 16); #
  141. &and( $tmp2, 0xff);
  142. }
  143. &movb( &LB($tmp3), &HB($tmp4)); # C # BAD BAD BAD
  144. &and( $tmp4, 0xff); # D
  145. &mov( $tmp1, &DWP($S1,"",$tmp1,4));
  146. &mov( $tmp2, &DWP($S2,"",$tmp2,4));
  147. &$OP2( $tmp1, $tmp2);
  148. &mov( $tmp2, &DWP($S3,"",$tmp3,4));
  149. &$OP3( $tmp1, $tmp2);
  150. &mov( $tmp2, &DWP($S4,"",$tmp4,4));
  151. &$OP1( $tmp1, $tmp2);
  152. # XXX
  153. &xor( $L, $tmp1);
  154. # XXX
  155. }