1e71b7053SJung-uk Kim#! /usr/bin/env perl 217f01e99SJung-uk Kim# Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. 3e71b7053SJung-uk Kim# 4*b077aed3SPierre Pronchery# Licensed under the Apache License 2.0 (the "License"). You may not use 5e71b7053SJung-uk Kim# this file except in compliance with the License. You can obtain a copy 6e71b7053SJung-uk Kim# in the file LICENSE in the source distribution or at 7e71b7053SJung-uk Kim# https://www.openssl.org/source/license.html 8e71b7053SJung-uk Kim 974664626SKris Kennaway 101f13597dSJung-uk Kim$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 111f13597dSJung-uk Kimpush(@INC,"${dir}","${dir}../../perlasm"); 1274664626SKris Kennawayrequire "x86asm.pl"; 1374664626SKris Kennawayrequire "cbc.pl"; 1474664626SKris Kennaway 15*b077aed3SPierre Pronchery$output = pop and open STDOUT,">$output"; 16e71b7053SJung-uk Kim 17e71b7053SJung-uk Kim&asm_init($ARGV[0]); 1874664626SKris Kennaway 1974664626SKris Kennaway$RC5_MAX_ROUNDS=16; 2074664626SKris Kennaway$RC5_32_OFF=($RC5_MAX_ROUNDS+2)*4; 2174664626SKris Kennaway$A="edi"; 2274664626SKris Kennaway$B="esi"; 2374664626SKris Kennaway$S="ebp"; 2474664626SKris Kennaway$tmp1="eax"; 2574664626SKris Kennaway$r="ebx"; 2674664626SKris Kennaway$tmpc="ecx"; 2774664626SKris Kennaway$tmp4="edx"; 2874664626SKris Kennaway 2974664626SKris Kennaway&RC5_32_encrypt("RC5_32_encrypt",1); 3074664626SKris Kennaway&RC5_32_encrypt("RC5_32_decrypt",0); 3174664626SKris Kennaway&cbc("RC5_32_cbc_encrypt","RC5_32_encrypt","RC5_32_decrypt",0,4,5,3,-1,-1); 3274664626SKris Kennaway&asm_finish(); 3374664626SKris Kennaway 3417f01e99SJung-uk Kimclose STDOUT or die "error closing STDOUT: $!"; 35e71b7053SJung-uk Kim 3674664626SKris Kennawaysub RC5_32_encrypt 3774664626SKris Kennaway { 3874664626SKris Kennaway local($name,$enc)=@_; 3974664626SKris Kennaway 4074664626SKris Kennaway &function_begin_B($name,""); 4174664626SKris Kennaway 4274664626SKris Kennaway &comment(""); 4374664626SKris Kennaway 4474664626SKris Kennaway &push("ebp"); 4574664626SKris Kennaway &push("esi"); 4674664626SKris Kennaway &push("edi"); 4774664626SKris Kennaway &mov($tmp4,&wparam(0)); 4874664626SKris Kennaway &mov($S,&wparam(1)); 4974664626SKris Kennaway 5074664626SKris Kennaway &comment("Load the 2 words"); 5174664626SKris Kennaway &mov($A,&DWP(0,$tmp4,"",0)); 5274664626SKris Kennaway &mov($B,&DWP(4,$tmp4,"",0)); 5374664626SKris Kennaway 5474664626SKris Kennaway &push($r); 5574664626SKris Kennaway &mov($r, &DWP(0,$S,"",0)); 5674664626SKris Kennaway 5774664626SKris Kennaway # encrypting part 5874664626SKris Kennaway 5974664626SKris Kennaway if ($enc) 6074664626SKris Kennaway { 6174664626SKris Kennaway &add($A, &DWP(4+0,$S,"",0)); 6274664626SKris Kennaway &add($B, &DWP(4+4,$S,"",0)); 6374664626SKris Kennaway 6474664626SKris Kennaway for ($i=0; $i<$RC5_MAX_ROUNDS; $i++) 6574664626SKris Kennaway { 6674664626SKris Kennaway &xor($A, $B); 6774664626SKris Kennaway &mov($tmp1, &DWP(12+$i*8,$S,"",0)); 6874664626SKris Kennaway &mov($tmpc, $B); 6974664626SKris Kennaway &rotl($A, &LB("ecx")); 7074664626SKris Kennaway &add($A, $tmp1); 7174664626SKris Kennaway 7274664626SKris Kennaway &xor($B, $A); 7374664626SKris Kennaway &mov($tmp1, &DWP(16+$i*8,$S,"",0)); 7474664626SKris Kennaway &mov($tmpc, $A); 7574664626SKris Kennaway &rotl($B, &LB("ecx")); 7674664626SKris Kennaway &add($B, $tmp1); 7774664626SKris Kennaway if (($i == 7) || ($i == 11)) 7874664626SKris Kennaway { 7974664626SKris Kennaway &cmp($r, $i+1); 8074664626SKris Kennaway &je(&label("rc5_exit")); 8174664626SKris Kennaway } 8274664626SKris Kennaway } 8374664626SKris Kennaway } 8474664626SKris Kennaway else 8574664626SKris Kennaway { 8674664626SKris Kennaway &cmp($r, 12); 8774664626SKris Kennaway &je(&label("rc5_dec_12")); 8874664626SKris Kennaway &cmp($r, 8); 8974664626SKris Kennaway &je(&label("rc5_dec_8")); 9074664626SKris Kennaway for ($i=$RC5_MAX_ROUNDS; $i > 0; $i--) 9174664626SKris Kennaway { 9274664626SKris Kennaway &set_label("rc5_dec_$i") if ($i == 12) || ($i == 8); 9374664626SKris Kennaway &mov($tmp1, &DWP($i*8+8,$S,"",0)); 9474664626SKris Kennaway &sub($B, $tmp1); 9574664626SKris Kennaway &mov($tmpc, $A); 9674664626SKris Kennaway &rotr($B, &LB("ecx")); 9774664626SKris Kennaway &xor($B, $A); 9874664626SKris Kennaway 9974664626SKris Kennaway &mov($tmp1, &DWP($i*8+4,$S,"",0)); 10074664626SKris Kennaway &sub($A, $tmp1); 10174664626SKris Kennaway &mov($tmpc, $B); 10274664626SKris Kennaway &rotr($A, &LB("ecx")); 10374664626SKris Kennaway &xor($A, $B); 10474664626SKris Kennaway } 10574664626SKris Kennaway &sub($B, &DWP(4+4,$S,"",0)); 10674664626SKris Kennaway &sub($A, &DWP(4+0,$S,"",0)); 10774664626SKris Kennaway } 10874664626SKris Kennaway 10974664626SKris Kennaway &set_label("rc5_exit"); 11074664626SKris Kennaway &mov(&DWP(0,$tmp4,"",0),$A); 11174664626SKris Kennaway &mov(&DWP(4,$tmp4,"",0),$B); 11274664626SKris Kennaway 11374664626SKris Kennaway &pop("ebx"); 11474664626SKris Kennaway &pop("edi"); 11574664626SKris Kennaway &pop("esi"); 11674664626SKris Kennaway &pop("ebp"); 11774664626SKris Kennaway &ret(); 11874664626SKris Kennaway &function_end_B($name); 11974664626SKris Kennaway } 12074664626SKris Kennaway 12174664626SKris Kennaway 122