OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
crypto
des
ede_cbcm_enc.c
Go to the documentation of this file.
1
/* ede_cbcm_enc.c */
2
/* Written by Ben Laurie <
[email protected]
> for the OpenSSL
3
* project 13 Feb 1999.
4
*/
5
/* ====================================================================
6
* Copyright (c) 1999 The OpenSSL Project. All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
*
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
14
*
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in
17
* the documentation and/or other materials provided with the
18
* distribution.
19
*
20
* 3. All advertising materials mentioning features or use of this
21
* software must display the following acknowledgment:
22
* "This product includes software developed by the OpenSSL Project
23
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24
*
25
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
* endorse or promote products derived from this software without
27
* prior written permission. For written permission, please contact
28
*
[email protected]
.
29
*
30
* 5. Products derived from this software may not be called "OpenSSL"
31
* nor may "OpenSSL" appear in their names without prior written
32
* permission of the OpenSSL Project.
33
*
34
* 6. Redistributions of any form whatsoever must retain the following
35
* acknowledgment:
36
* "This product includes software developed by the OpenSSL Project
37
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38
*
39
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
* OF THE POSSIBILITY OF SUCH DAMAGE.
51
* ====================================================================
52
*
53
* This product includes cryptographic software written by Eric Young
54
* (
[email protected]
). This product includes software written by Tim
55
* Hudson (
[email protected]
).
56
*
57
*/
58
59
/*
60
61
This is an implementation of Triple DES Cipher Block Chaining with Output
62
Feedback Masking, by Coppersmith, Johnson and Matyas, (IBM and Certicom).
63
64
Note that there is a known attack on this by Biham and Knudsen but it takes
65
a lot of work:
66
67
http://www.cs.technion.ac.il/users/wwwb/cgi-bin/tr-get.cgi/1998/CS/CS0928.ps.gz
68
69
*/
70
71
#include <
openssl/opensslconf.h
>
/* To see if OPENSSL_NO_DESCBCM is defined */
72
73
#ifndef OPENSSL_NO_DESCBCM
74
#include "
des_locl.h
"
75
76
void
DES_ede3_cbcm_encrypt
(
const
unsigned
char
*in,
unsigned
char
*out,
77
long
length
,
DES_key_schedule
*ks1,
DES_key_schedule
*ks2,
78
DES_key_schedule
*ks3,
DES_cblock
*ivec1,
DES_cblock
*ivec2,
79
int
enc
)
80
{
81
register
DES_LONG tin0,tin1;
82
register
DES_LONG tout0,tout1,xor0,xor1,m0,m1;
83
register
long
l=
length
;
84
DES_LONG tin[2];
85
unsigned
char
*iv1,*iv2;
86
87
iv1 = &(*ivec1)[0];
88
iv2 = &(*ivec2)[0];
89
90
if
(enc)
91
{
92
c2l
(iv1,m0);
93
c2l
(iv1,m1);
94
c2l
(iv2,tout0);
95
c2l
(iv2,tout1);
96
for
(l-=8; l>=-7; l-=8)
97
{
98
tin[0]=m0;
99
tin[1]=m1;
100
DES_encrypt1
(tin,ks3,1);
101
m0=tin[0];
102
m1=tin[1];
103
104
if
(l < 0)
105
{
106
c2ln
(in,tin0,tin1,l+8);
107
}
108
else
109
{
110
c2l
(in,tin0);
111
c2l
(in,tin1);
112
}
113
tin0^=tout0;
114
tin1^=tout1;
115
116
tin[0]=tin0;
117
tin[1]=tin1;
118
DES_encrypt1
(tin,ks1,1);
119
tin[0]^=m0;
120
tin[1]^=m1;
121
DES_encrypt1
(tin,ks2,0);
122
tin[0]^=m0;
123
tin[1]^=m1;
124
DES_encrypt1
(tin,ks1,1);
125
tout0=tin[0];
126
tout1=tin[1];
127
128
l2c
(tout0,out);
129
l2c
(tout1,out);
130
}
131
iv1=&(*ivec1)[0];
132
l2c
(m0,iv1);
133
l2c
(m1,iv1);
134
135
iv2=&(*ivec2)[0];
136
l2c
(tout0,iv2);
137
l2c
(tout1,iv2);
138
}
139
else
140
{
141
register
DES_LONG t0,t1;
142
143
c2l
(iv1,m0);
144
c2l
(iv1,m1);
145
c2l
(iv2,xor0);
146
c2l
(iv2,xor1);
147
for
(l-=8; l>=-7; l-=8)
148
{
149
tin[0]=m0;
150
tin[1]=m1;
151
DES_encrypt1
(tin,ks3,1);
152
m0=tin[0];
153
m1=tin[1];
154
155
c2l
(in,tin0);
156
c2l
(in,tin1);
157
158
t0=tin0;
159
t1=tin1;
160
161
tin[0]=tin0;
162
tin[1]=tin1;
163
DES_encrypt1
(tin,ks1,0);
164
tin[0]^=m0;
165
tin[1]^=m1;
166
DES_encrypt1
(tin,ks2,1);
167
tin[0]^=m0;
168
tin[1]^=m1;
169
DES_encrypt1
(tin,ks1,0);
170
tout0=tin[0];
171
tout1=tin[1];
172
173
tout0^=xor0;
174
tout1^=xor1;
175
if
(l < 0)
176
{
177
l2cn
(tout0,tout1,out,l+8);
178
}
179
else
180
{
181
l2c
(tout0,out);
182
l2c
(tout1,out);
183
}
184
xor0=t0;
185
xor1=t1;
186
}
187
188
iv1=&(*ivec1)[0];
189
l2c
(m0,iv1);
190
l2c
(m1,iv1);
191
192
iv2=&(*ivec2)[0];
193
l2c
(xor0,iv2);
194
l2c
(xor1,iv2);
195
}
196
tin0=tin1=tout0=tout1=xor0=xor1=0;
197
tin[0]=tin[1]=0;
198
}
199
#endif
Generated on Thu Jan 10 2013 09:53:35 for OpenSSL by
1.8.2