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