1e1051a39Sopenharmony_ci#! /usr/bin/env perl 2e1051a39Sopenharmony_ci# Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci# 4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci# this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci$L="edi"; 11e1051a39Sopenharmony_ci$R="esi"; 12e1051a39Sopenharmony_ci 13e1051a39Sopenharmony_cisub DES_encrypt3 14e1051a39Sopenharmony_ci { 15e1051a39Sopenharmony_ci local($name,$enc)=@_; 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_ci &function_begin_B($name,""); 18e1051a39Sopenharmony_ci &push("ebx"); 19e1051a39Sopenharmony_ci &mov("ebx",&wparam(0)); 20e1051a39Sopenharmony_ci 21e1051a39Sopenharmony_ci &push("ebp"); 22e1051a39Sopenharmony_ci &push("esi"); 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ci &push("edi"); 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ci &comment(""); 27e1051a39Sopenharmony_ci &comment("Load the data words"); 28e1051a39Sopenharmony_ci &mov($L,&DWP(0,"ebx","",0)); 29e1051a39Sopenharmony_ci &mov($R,&DWP(4,"ebx","",0)); 30e1051a39Sopenharmony_ci &stack_push(3); 31e1051a39Sopenharmony_ci 32e1051a39Sopenharmony_ci &comment(""); 33e1051a39Sopenharmony_ci &comment("IP"); 34e1051a39Sopenharmony_ci &IP_new($L,$R,"edx",0); 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_ci # put them back 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ci if ($enc) 39e1051a39Sopenharmony_ci { 40e1051a39Sopenharmony_ci &mov(&DWP(4,"ebx","",0),$R); 41e1051a39Sopenharmony_ci &mov("eax",&wparam(1)); 42e1051a39Sopenharmony_ci &mov(&DWP(0,"ebx","",0),"edx"); 43e1051a39Sopenharmony_ci &mov("edi",&wparam(2)); 44e1051a39Sopenharmony_ci &mov("esi",&wparam(3)); 45e1051a39Sopenharmony_ci } 46e1051a39Sopenharmony_ci else 47e1051a39Sopenharmony_ci { 48e1051a39Sopenharmony_ci &mov(&DWP(4,"ebx","",0),$R); 49e1051a39Sopenharmony_ci &mov("esi",&wparam(1)); 50e1051a39Sopenharmony_ci &mov(&DWP(0,"ebx","",0),"edx"); 51e1051a39Sopenharmony_ci &mov("edi",&wparam(2)); 52e1051a39Sopenharmony_ci &mov("eax",&wparam(3)); 53e1051a39Sopenharmony_ci } 54e1051a39Sopenharmony_ci &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); 55e1051a39Sopenharmony_ci &mov(&swtmp(1), "eax"); 56e1051a39Sopenharmony_ci &mov(&swtmp(0), "ebx"); 57e1051a39Sopenharmony_ci &call("DES_encrypt2"); 58e1051a39Sopenharmony_ci &mov(&swtmp(2), (DWC(($enc)?"0":"1"))); 59e1051a39Sopenharmony_ci &mov(&swtmp(1), "edi"); 60e1051a39Sopenharmony_ci &mov(&swtmp(0), "ebx"); 61e1051a39Sopenharmony_ci &call("DES_encrypt2"); 62e1051a39Sopenharmony_ci &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); 63e1051a39Sopenharmony_ci &mov(&swtmp(1), "esi"); 64e1051a39Sopenharmony_ci &mov(&swtmp(0), "ebx"); 65e1051a39Sopenharmony_ci &call("DES_encrypt2"); 66e1051a39Sopenharmony_ci 67e1051a39Sopenharmony_ci &stack_pop(3); 68e1051a39Sopenharmony_ci &mov($L,&DWP(0,"ebx","",0)); 69e1051a39Sopenharmony_ci &mov($R,&DWP(4,"ebx","",0)); 70e1051a39Sopenharmony_ci 71e1051a39Sopenharmony_ci &comment(""); 72e1051a39Sopenharmony_ci &comment("FP"); 73e1051a39Sopenharmony_ci &FP_new($L,$R,"eax",0); 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ci &mov(&DWP(0,"ebx","",0),"eax"); 76e1051a39Sopenharmony_ci &mov(&DWP(4,"ebx","",0),$R); 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci &pop("edi"); 79e1051a39Sopenharmony_ci &pop("esi"); 80e1051a39Sopenharmony_ci &pop("ebp"); 81e1051a39Sopenharmony_ci &pop("ebx"); 82e1051a39Sopenharmony_ci &ret(); 83e1051a39Sopenharmony_ci &function_end_B($name); 84e1051a39Sopenharmony_ci } 85e1051a39Sopenharmony_ci 86e1051a39Sopenharmony_ci 87