• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (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  */
9 
10 #include "des_local.h"
11 
12 /*
13  * The input and output encrypted as though 64bit cfb mode is being used.
14  * The extra state information to record how much of the 64bit block we have
15  * used is contained in *num;
16  */
17 
DES_ede3_cfb64_encrypt(const unsigned char * in,unsigned char * out,long length,DES_key_schedule * ks1,DES_key_schedule * ks2,DES_key_schedule * ks3,DES_cblock * ivec,int * num,int enc)18 void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out,
19                             long length, DES_key_schedule *ks1,
20                             DES_key_schedule *ks2, DES_key_schedule *ks3,
21                             DES_cblock *ivec, int *num, int enc)
22 {
23     register DES_LONG v0, v1;
24     register long l = length;
25     register int n = *num;
26     DES_LONG ti[2];
27     unsigned char *iv, c, cc;
28 
29     iv = &(*ivec)[0];
30     if (enc) {
31         while (l--) {
32             if (n == 0) {
33                 c2l(iv, v0);
34                 c2l(iv, v1);
35 
36                 ti[0] = v0;
37                 ti[1] = v1;
38                 DES_encrypt3(ti, ks1, ks2, ks3);
39                 v0 = ti[0];
40                 v1 = ti[1];
41 
42                 iv = &(*ivec)[0];
43                 l2c(v0, iv);
44                 l2c(v1, iv);
45                 iv = &(*ivec)[0];
46             }
47             c = *(in++) ^ iv[n];
48             *(out++) = c;
49             iv[n] = c;
50             n = (n + 1) & 0x07;
51         }
52     } else {
53         while (l--) {
54             if (n == 0) {
55                 c2l(iv, v0);
56                 c2l(iv, v1);
57 
58                 ti[0] = v0;
59                 ti[1] = v1;
60                 DES_encrypt3(ti, ks1, ks2, ks3);
61                 v0 = ti[0];
62                 v1 = ti[1];
63 
64                 iv = &(*ivec)[0];
65                 l2c(v0, iv);
66                 l2c(v1, iv);
67                 iv = &(*ivec)[0];
68             }
69             cc = *(in++);
70             c = iv[n];
71             iv[n] = cc;
72             *(out++) = c ^ cc;
73             n = (n + 1) & 0x07;
74         }
75     }
76     v0 = v1 = ti[0] = ti[1] = c = cc = 0;
77     *num = n;
78 }
79 
80 /*
81  * This is compatible with the single key CFB-r for DES, even thought that's
82  * not what EVP needs.
83  */
84 
DES_ede3_cfb_encrypt(const unsigned char * in,unsigned char * out,int numbits,long length,DES_key_schedule * ks1,DES_key_schedule * ks2,DES_key_schedule * ks3,DES_cblock * ivec,int enc)85 void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out,
86                           int numbits, long length, DES_key_schedule *ks1,
87                           DES_key_schedule *ks2, DES_key_schedule *ks3,
88                           DES_cblock *ivec, int enc)
89 {
90     register DES_LONG d0, d1, v0, v1;
91     register unsigned long l = length, n = ((unsigned int)numbits + 7) / 8;
92     register int num = numbits, i;
93     DES_LONG ti[2];
94     unsigned char *iv;
95     unsigned char ovec[16];
96 
97     if (num > 64)
98         return;
99     iv = &(*ivec)[0];
100     c2l(iv, v0);
101     c2l(iv, v1);
102     if (enc) {
103         while (l >= n) {
104             l -= n;
105             ti[0] = v0;
106             ti[1] = v1;
107             DES_encrypt3(ti, ks1, ks2, ks3);
108             c2ln(in, d0, d1, n);
109             in += n;
110             d0 ^= ti[0];
111             d1 ^= ti[1];
112             l2cn(d0, d1, out, n);
113             out += n;
114             /*
115              * 30-08-94 - eay - changed because l>>32 and l<<32 are bad under
116              * gcc :-(
117              */
118             if (num == 32) {
119                 v0 = v1;
120                 v1 = d0;
121             } else if (num == 64) {
122                 v0 = d0;
123                 v1 = d1;
124             } else {
125                 iv = &ovec[0];
126                 l2c(v0, iv);
127                 l2c(v1, iv);
128                 l2c(d0, iv);
129                 l2c(d1, iv);
130                 /* shift ovec left most of the bits... */
131                 memmove(ovec, ovec + num / 8, 8 + (num % 8 ? 1 : 0));
132                 /* now the remaining bits */
133                 if (num % 8 != 0)
134                     for (i = 0; i < 8; ++i) {
135                         ovec[i] <<= num % 8;
136                         ovec[i] |= ovec[i + 1] >> (8 - num % 8);
137                     }
138                 iv = &ovec[0];
139                 c2l(iv, v0);
140                 c2l(iv, v1);
141             }
142         }
143     } else {
144         while (l >= n) {
145             l -= n;
146             ti[0] = v0;
147             ti[1] = v1;
148             DES_encrypt3(ti, ks1, ks2, ks3);
149             c2ln(in, d0, d1, n);
150             in += n;
151             /*
152              * 30-08-94 - eay - changed because l>>32 and l<<32 are bad under
153              * gcc :-(
154              */
155             if (num == 32) {
156                 v0 = v1;
157                 v1 = d0;
158             } else if (num == 64) {
159                 v0 = d0;
160                 v1 = d1;
161             } else {
162                 iv = &ovec[0];
163                 l2c(v0, iv);
164                 l2c(v1, iv);
165                 l2c(d0, iv);
166                 l2c(d1, iv);
167                 /* shift ovec left most of the bits... */
168                 memmove(ovec, ovec + num / 8, 8 + (num % 8 ? 1 : 0));
169                 /* now the remaining bits */
170                 if (num % 8 != 0)
171                     for (i = 0; i < 8; ++i) {
172                         ovec[i] <<= num % 8;
173                         ovec[i] |= ovec[i + 1] >> (8 - num % 8);
174                     }
175                 iv = &ovec[0];
176                 c2l(iv, v0);
177                 c2l(iv, v1);
178             }
179             d0 ^= ti[0];
180             d1 ^= ti[1];
181             l2cn(d0, d1, out, n);
182             out += n;
183         }
184     }
185     iv = &(*ivec)[0];
186     l2c(v0, iv);
187     l2c(v1, iv);
188     v0 = v1 = d0 = d1 = ti[0] = ti[1] = 0;
189 }
190