1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci/*-
11e1051a39Sopenharmony_ci * #included by:
12e1051a39Sopenharmony_ci *    cbc_enc.c  (DES_cbc_encrypt)
13e1051a39Sopenharmony_ci *    des_enc.c  (DES_ncbc_encrypt)
14e1051a39Sopenharmony_ci */
15e1051a39Sopenharmony_ci
16e1051a39Sopenharmony_ci#include "des_local.h"
17e1051a39Sopenharmony_ci
18e1051a39Sopenharmony_ci#ifdef CBC_ENC_C__DONT_UPDATE_IV
19e1051a39Sopenharmony_civoid DES_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
20e1051a39Sopenharmony_ci                     DES_key_schedule *_schedule, DES_cblock *ivec, int enc)
21e1051a39Sopenharmony_ci#else
22e1051a39Sopenharmony_civoid DES_ncbc_encrypt(const unsigned char *in, unsigned char *out,
23e1051a39Sopenharmony_ci                      long length, DES_key_schedule *_schedule,
24e1051a39Sopenharmony_ci                      DES_cblock *ivec, int enc)
25e1051a39Sopenharmony_ci#endif
26e1051a39Sopenharmony_ci{
27e1051a39Sopenharmony_ci    register DES_LONG tin0, tin1;
28e1051a39Sopenharmony_ci    register DES_LONG tout0, tout1, xor0, xor1;
29e1051a39Sopenharmony_ci    register long l = length;
30e1051a39Sopenharmony_ci    DES_LONG tin[2];
31e1051a39Sopenharmony_ci    unsigned char *iv;
32e1051a39Sopenharmony_ci
33e1051a39Sopenharmony_ci    iv = &(*ivec)[0];
34e1051a39Sopenharmony_ci
35e1051a39Sopenharmony_ci    if (enc) {
36e1051a39Sopenharmony_ci        c2l(iv, tout0);
37e1051a39Sopenharmony_ci        c2l(iv, tout1);
38e1051a39Sopenharmony_ci        for (l -= 8; l >= 0; l -= 8) {
39e1051a39Sopenharmony_ci            c2l(in, tin0);
40e1051a39Sopenharmony_ci            c2l(in, tin1);
41e1051a39Sopenharmony_ci            tin0 ^= tout0;
42e1051a39Sopenharmony_ci            tin[0] = tin0;
43e1051a39Sopenharmony_ci            tin1 ^= tout1;
44e1051a39Sopenharmony_ci            tin[1] = tin1;
45e1051a39Sopenharmony_ci            DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
46e1051a39Sopenharmony_ci            tout0 = tin[0];
47e1051a39Sopenharmony_ci            l2c(tout0, out);
48e1051a39Sopenharmony_ci            tout1 = tin[1];
49e1051a39Sopenharmony_ci            l2c(tout1, out);
50e1051a39Sopenharmony_ci        }
51e1051a39Sopenharmony_ci        if (l != -8) {
52e1051a39Sopenharmony_ci            c2ln(in, tin0, tin1, l + 8);
53e1051a39Sopenharmony_ci            tin0 ^= tout0;
54e1051a39Sopenharmony_ci            tin[0] = tin0;
55e1051a39Sopenharmony_ci            tin1 ^= tout1;
56e1051a39Sopenharmony_ci            tin[1] = tin1;
57e1051a39Sopenharmony_ci            DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
58e1051a39Sopenharmony_ci            tout0 = tin[0];
59e1051a39Sopenharmony_ci            l2c(tout0, out);
60e1051a39Sopenharmony_ci            tout1 = tin[1];
61e1051a39Sopenharmony_ci            l2c(tout1, out);
62e1051a39Sopenharmony_ci        }
63e1051a39Sopenharmony_ci#ifndef CBC_ENC_C__DONT_UPDATE_IV
64e1051a39Sopenharmony_ci        iv = &(*ivec)[0];
65e1051a39Sopenharmony_ci        l2c(tout0, iv);
66e1051a39Sopenharmony_ci        l2c(tout1, iv);
67e1051a39Sopenharmony_ci#endif
68e1051a39Sopenharmony_ci    } else {
69e1051a39Sopenharmony_ci        c2l(iv, xor0);
70e1051a39Sopenharmony_ci        c2l(iv, xor1);
71e1051a39Sopenharmony_ci        for (l -= 8; l >= 0; l -= 8) {
72e1051a39Sopenharmony_ci            c2l(in, tin0);
73e1051a39Sopenharmony_ci            tin[0] = tin0;
74e1051a39Sopenharmony_ci            c2l(in, tin1);
75e1051a39Sopenharmony_ci            tin[1] = tin1;
76e1051a39Sopenharmony_ci            DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
77e1051a39Sopenharmony_ci            tout0 = tin[0] ^ xor0;
78e1051a39Sopenharmony_ci            tout1 = tin[1] ^ xor1;
79e1051a39Sopenharmony_ci            l2c(tout0, out);
80e1051a39Sopenharmony_ci            l2c(tout1, out);
81e1051a39Sopenharmony_ci            xor0 = tin0;
82e1051a39Sopenharmony_ci            xor1 = tin1;
83e1051a39Sopenharmony_ci        }
84e1051a39Sopenharmony_ci        if (l != -8) {
85e1051a39Sopenharmony_ci            c2l(in, tin0);
86e1051a39Sopenharmony_ci            tin[0] = tin0;
87e1051a39Sopenharmony_ci            c2l(in, tin1);
88e1051a39Sopenharmony_ci            tin[1] = tin1;
89e1051a39Sopenharmony_ci            DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
90e1051a39Sopenharmony_ci            tout0 = tin[0] ^ xor0;
91e1051a39Sopenharmony_ci            tout1 = tin[1] ^ xor1;
92e1051a39Sopenharmony_ci            l2cn(tout0, tout1, out, l + 8);
93e1051a39Sopenharmony_ci#ifndef CBC_ENC_C__DONT_UPDATE_IV
94e1051a39Sopenharmony_ci            xor0 = tin0;
95e1051a39Sopenharmony_ci            xor1 = tin1;
96e1051a39Sopenharmony_ci#endif
97e1051a39Sopenharmony_ci        }
98e1051a39Sopenharmony_ci#ifndef CBC_ENC_C__DONT_UPDATE_IV
99e1051a39Sopenharmony_ci        iv = &(*ivec)[0];
100e1051a39Sopenharmony_ci        l2c(xor0, iv);
101e1051a39Sopenharmony_ci        l2c(xor1, iv);
102e1051a39Sopenharmony_ci#endif
103e1051a39Sopenharmony_ci    }
104e1051a39Sopenharmony_ci    tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
105e1051a39Sopenharmony_ci    tin[0] = tin[1] = 0;
106e1051a39Sopenharmony_ci}
107