xref: /openssl/crypto/des/ncbc_enc.c (revision 706457b7)
1 /*
2  * Copyright 1998-2016 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  * #included by:
12  *    cbc_enc.c  (DES_cbc_encrypt)
13  *    des_enc.c  (DES_ncbc_encrypt)
14  */
15 
16 #include "des_local.h"
17 
18 #ifdef CBC_ENC_C__DONT_UPDATE_IV
DES_cbc_encrypt(const unsigned char * in,unsigned char * out,long length,DES_key_schedule * _schedule,DES_cblock * ivec,int enc)19 void DES_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
20                      DES_key_schedule *_schedule, DES_cblock *ivec, int enc)
21 #else
22 void DES_ncbc_encrypt(const unsigned char *in, unsigned char *out,
23                       long length, DES_key_schedule *_schedule,
24                       DES_cblock *ivec, int enc)
25 #endif
26 {
27     register DES_LONG tin0, tin1;
28     register DES_LONG tout0, tout1, xor0, xor1;
29     register long l = length;
30     DES_LONG tin[2];
31     unsigned char *iv;
32 
33     iv = &(*ivec)[0];
34 
35     if (enc) {
36         c2l(iv, tout0);
37         c2l(iv, tout1);
38         for (l -= 8; l >= 0; l -= 8) {
39             c2l(in, tin0);
40             c2l(in, tin1);
41             tin0 ^= tout0;
42             tin[0] = tin0;
43             tin1 ^= tout1;
44             tin[1] = tin1;
45             DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
46             tout0 = tin[0];
47             l2c(tout0, out);
48             tout1 = tin[1];
49             l2c(tout1, out);
50         }
51         if (l != -8) {
52             c2ln(in, tin0, tin1, l + 8);
53             tin0 ^= tout0;
54             tin[0] = tin0;
55             tin1 ^= tout1;
56             tin[1] = tin1;
57             DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
58             tout0 = tin[0];
59             l2c(tout0, out);
60             tout1 = tin[1];
61             l2c(tout1, out);
62         }
63 #ifndef CBC_ENC_C__DONT_UPDATE_IV
64         iv = &(*ivec)[0];
65         l2c(tout0, iv);
66         l2c(tout1, iv);
67 #endif
68     } else {
69         c2l(iv, xor0);
70         c2l(iv, xor1);
71         for (l -= 8; l >= 0; l -= 8) {
72             c2l(in, tin0);
73             tin[0] = tin0;
74             c2l(in, tin1);
75             tin[1] = tin1;
76             DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
77             tout0 = tin[0] ^ xor0;
78             tout1 = tin[1] ^ xor1;
79             l2c(tout0, out);
80             l2c(tout1, out);
81             xor0 = tin0;
82             xor1 = tin1;
83         }
84         if (l != -8) {
85             c2l(in, tin0);
86             tin[0] = tin0;
87             c2l(in, tin1);
88             tin[1] = tin1;
89             DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
90             tout0 = tin[0] ^ xor0;
91             tout1 = tin[1] ^ xor1;
92             l2cn(tout0, tout1, out, l + 8);
93 #ifndef CBC_ENC_C__DONT_UPDATE_IV
94             xor0 = tin0;
95             xor1 = tin1;
96 #endif
97         }
98 #ifndef CBC_ENC_C__DONT_UPDATE_IV
99         iv = &(*ivec)[0];
100         l2c(xor0, iv);
101         l2c(xor1, iv);
102 #endif
103     }
104     tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
105     tin[0] = tin[1] = 0;
106 }
107