Reduce inputs before the RSAZ code.
[openssl.git] / crypto / des / xcbc_enc.c
1 /*
2  * Copyright 1995-2016 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_locl.h"
11
12 /* RSA's DESX */
13
14 void DES_xcbc_encrypt(const unsigned char *in, unsigned char *out,
15                       long length, DES_key_schedule *schedule,
16                       DES_cblock *ivec, const_DES_cblock *inw,
17                       const_DES_cblock *outw, int enc)
18 {
19     register DES_LONG tin0, tin1;
20     register DES_LONG tout0, tout1, xor0, xor1;
21     register DES_LONG inW0, inW1, outW0, outW1;
22     register const unsigned char *in2;
23     register long l = length;
24     DES_LONG tin[2];
25     unsigned char *iv;
26
27     in2 = &(*inw)[0];
28     c2l(in2, inW0);
29     c2l(in2, inW1);
30     in2 = &(*outw)[0];
31     c2l(in2, outW0);
32     c2l(in2, outW1);
33
34     iv = &(*ivec)[0];
35
36     if (enc) {
37         c2l(iv, tout0);
38         c2l(iv, tout1);
39         for (l -= 8; l >= 0; l -= 8) {
40             c2l(in, tin0);
41             c2l(in, tin1);
42             tin0 ^= tout0 ^ inW0;
43             tin[0] = tin0;
44             tin1 ^= tout1 ^ inW1;
45             tin[1] = tin1;
46             DES_encrypt1(tin, schedule, DES_ENCRYPT);
47             tout0 = tin[0] ^ outW0;
48             l2c(tout0, out);
49             tout1 = tin[1] ^ outW1;
50             l2c(tout1, out);
51         }
52         if (l != -8) {
53             c2ln(in, tin0, tin1, l + 8);
54             tin0 ^= tout0 ^ inW0;
55             tin[0] = tin0;
56             tin1 ^= tout1 ^ inW1;
57             tin[1] = tin1;
58             DES_encrypt1(tin, schedule, DES_ENCRYPT);
59             tout0 = tin[0] ^ outW0;
60             l2c(tout0, out);
61             tout1 = tin[1] ^ outW1;
62             l2c(tout1, out);
63         }
64         iv = &(*ivec)[0];
65         l2c(tout0, iv);
66         l2c(tout1, iv);
67     } else {
68         c2l(iv, xor0);
69         c2l(iv, xor1);
70         for (l -= 8; l > 0; l -= 8) {
71             c2l(in, tin0);
72             tin[0] = tin0 ^ outW0;
73             c2l(in, tin1);
74             tin[1] = tin1 ^ outW1;
75             DES_encrypt1(tin, schedule, DES_DECRYPT);
76             tout0 = tin[0] ^ xor0 ^ inW0;
77             tout1 = tin[1] ^ xor1 ^ inW1;
78             l2c(tout0, out);
79             l2c(tout1, out);
80             xor0 = tin0;
81             xor1 = tin1;
82         }
83         if (l != -8) {
84             c2l(in, tin0);
85             tin[0] = tin0 ^ outW0;
86             c2l(in, tin1);
87             tin[1] = tin1 ^ outW1;
88             DES_encrypt1(tin, schedule, DES_DECRYPT);
89             tout0 = tin[0] ^ xor0 ^ inW0;
90             tout1 = tin[1] ^ xor1 ^ inW1;
91             l2cn(tout0, tout1, out, l + 8);
92             xor0 = tin0;
93             xor1 = tin1;
94         }
95
96         iv = &(*ivec)[0];
97         l2c(xor0, iv);
98         l2c(xor1, iv);
99     }
100     tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
101     inW0 = inW1 = outW0 = outW1 = 0;
102     tin[0] = tin[1] = 0;
103 }