xref: /openssl/crypto/des/xcbc_enc.c (revision 33388b44)
1 /*
2  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (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 /*
11  * DES low level APIs are deprecated for public use, but still ok for internal
12  * use.
13  */
14 #include "internal/deprecated.h"
15 
16 #include "des_local.h"
17 
18 /* RSA's DESX */
19 
DES_xcbc_encrypt(const unsigned char * in,unsigned char * out,long length,DES_key_schedule * schedule,DES_cblock * ivec,const_DES_cblock * inw,const_DES_cblock * outw,int enc)20 void DES_xcbc_encrypt(const unsigned char *in, unsigned char *out,
21                       long length, DES_key_schedule *schedule,
22                       DES_cblock *ivec, const_DES_cblock *inw,
23                       const_DES_cblock *outw, int enc)
24 {
25     register DES_LONG tin0, tin1;
26     register DES_LONG tout0, tout1, xor0, xor1;
27     register DES_LONG inW0, inW1, outW0, outW1;
28     register const unsigned char *in2;
29     register long l = length;
30     DES_LONG tin[2];
31     unsigned char *iv;
32 
33     in2 = &(*inw)[0];
34     c2l(in2, inW0);
35     c2l(in2, inW1);
36     in2 = &(*outw)[0];
37     c2l(in2, outW0);
38     c2l(in2, outW1);
39 
40     iv = &(*ivec)[0];
41 
42     if (enc) {
43         c2l(iv, tout0);
44         c2l(iv, tout1);
45         for (l -= 8; l >= 0; l -= 8) {
46             c2l(in, tin0);
47             c2l(in, tin1);
48             tin0 ^= tout0 ^ inW0;
49             tin[0] = tin0;
50             tin1 ^= tout1 ^ inW1;
51             tin[1] = tin1;
52             DES_encrypt1(tin, schedule, DES_ENCRYPT);
53             tout0 = tin[0] ^ outW0;
54             l2c(tout0, out);
55             tout1 = tin[1] ^ outW1;
56             l2c(tout1, out);
57         }
58         if (l != -8) {
59             c2ln(in, tin0, tin1, l + 8);
60             tin0 ^= tout0 ^ inW0;
61             tin[0] = tin0;
62             tin1 ^= tout1 ^ inW1;
63             tin[1] = tin1;
64             DES_encrypt1(tin, schedule, DES_ENCRYPT);
65             tout0 = tin[0] ^ outW0;
66             l2c(tout0, out);
67             tout1 = tin[1] ^ outW1;
68             l2c(tout1, out);
69         }
70         iv = &(*ivec)[0];
71         l2c(tout0, iv);
72         l2c(tout1, iv);
73     } else {
74         c2l(iv, xor0);
75         c2l(iv, xor1);
76         for (l -= 8; l > 0; l -= 8) {
77             c2l(in, tin0);
78             tin[0] = tin0 ^ outW0;
79             c2l(in, tin1);
80             tin[1] = tin1 ^ outW1;
81             DES_encrypt1(tin, schedule, DES_DECRYPT);
82             tout0 = tin[0] ^ xor0 ^ inW0;
83             tout1 = tin[1] ^ xor1 ^ inW1;
84             l2c(tout0, out);
85             l2c(tout1, out);
86             xor0 = tin0;
87             xor1 = tin1;
88         }
89         if (l != -8) {
90             c2l(in, tin0);
91             tin[0] = tin0 ^ outW0;
92             c2l(in, tin1);
93             tin[1] = tin1 ^ outW1;
94             DES_encrypt1(tin, schedule, DES_DECRYPT);
95             tout0 = tin[0] ^ xor0 ^ inW0;
96             tout1 = tin[1] ^ xor1 ^ inW1;
97             l2cn(tout0, tout1, out, l + 8);
98             xor0 = tin0;
99             xor1 = tin1;
100         }
101 
102         iv = &(*ivec)[0];
103         l2c(xor0, iv);
104         l2c(xor1, iv);
105     }
106     tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
107     inW0 = inW1 = outW0 = outW1 = 0;
108     tin[0] = tin[1] = 0;
109 }
110