Line data Source code
1 : /* crypto/des/ncbc_enc.c */
2 : /*-
3 : * #included by:
4 : * cbc_enc.c (DES_cbc_encrypt)
5 : * des_enc.c (DES_ncbc_encrypt)
6 : */
7 : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
8 : * All rights reserved.
9 : *
10 : * This package is an SSL implementation written
11 : * by Eric Young (eay@cryptsoft.com).
12 : * The implementation was written so as to conform with Netscapes SSL.
13 : *
14 : * This library is free for commercial and non-commercial use as long as
15 : * the following conditions are aheared to. The following conditions
16 : * apply to all code found in this distribution, be it the RC4, RSA,
17 : * lhash, DES, etc., code; not just the SSL code. The SSL documentation
18 : * included with this distribution is covered by the same copyright terms
19 : * except that the holder is Tim Hudson (tjh@cryptsoft.com).
20 : *
21 : * Copyright remains Eric Young's, and as such any Copyright notices in
22 : * the code are not to be removed.
23 : * If this package is used in a product, Eric Young should be given attribution
24 : * as the author of the parts of the library used.
25 : * This can be in the form of a textual message at program startup or
26 : * in documentation (online or textual) provided with the package.
27 : *
28 : * Redistribution and use in source and binary forms, with or without
29 : * modification, are permitted provided that the following conditions
30 : * are met:
31 : * 1. Redistributions of source code must retain the copyright
32 : * notice, this list of conditions and the following disclaimer.
33 : * 2. Redistributions in binary form must reproduce the above copyright
34 : * notice, this list of conditions and the following disclaimer in the
35 : * documentation and/or other materials provided with the distribution.
36 : * 3. All advertising materials mentioning features or use of this software
37 : * must display the following acknowledgement:
38 : * "This product includes cryptographic software written by
39 : * Eric Young (eay@cryptsoft.com)"
40 : * The word 'cryptographic' can be left out if the rouines from the library
41 : * being used are not cryptographic related :-).
42 : * 4. If you include any Windows specific code (or a derivative thereof) from
43 : * the apps directory (application code) you must include an acknowledgement:
44 : * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
45 : *
46 : * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
47 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49 : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56 : * SUCH DAMAGE.
57 : *
58 : * The licence and distribution terms for any publically available version or
59 : * derivative of this code cannot be changed. i.e. this code cannot simply be
60 : * copied and put under another distribution licence
61 : * [including the GNU Public Licence.]
62 : */
63 :
64 : #include "des_locl.h"
65 :
66 : #ifdef CBC_ENC_C__DONT_UPDATE_IV
67 : void DES_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
68 : DES_key_schedule *_schedule, DES_cblock *ivec, int enc)
69 : #else
70 0 : void DES_ncbc_encrypt(const unsigned char *in, unsigned char *out,
71 : long length, DES_key_schedule *_schedule,
72 : DES_cblock *ivec, int enc)
73 : #endif
74 : {
75 : register DES_LONG tin0, tin1;
76 : register DES_LONG tout0, tout1, xor0, xor1;
77 : register long l = length;
78 : DES_LONG tin[2];
79 : unsigned char *iv;
80 :
81 : iv = &(*ivec)[0];
82 :
83 0 : if (enc) {
84 0 : c2l(iv, tout0);
85 0 : c2l(iv, tout1);
86 0 : for (l -= 8; l >= 0; l -= 8) {
87 0 : c2l(in, tin0);
88 0 : c2l(in, tin1);
89 0 : tin0 ^= tout0;
90 0 : tin[0] = tin0;
91 0 : tin1 ^= tout1;
92 0 : tin[1] = tin1;
93 0 : DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
94 0 : tout0 = tin[0];
95 0 : l2c(tout0, out);
96 0 : tout1 = tin[1];
97 0 : l2c(tout1, out);
98 : }
99 0 : if (l != -8) {
100 0 : c2ln(in, tin0, tin1, l + 8);
101 0 : tin0 ^= tout0;
102 0 : tin[0] = tin0;
103 0 : tin1 ^= tout1;
104 0 : tin[1] = tin1;
105 0 : DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
106 0 : tout0 = tin[0];
107 0 : l2c(tout0, out);
108 0 : tout1 = tin[1];
109 0 : l2c(tout1, out);
110 : }
111 : #ifndef CBC_ENC_C__DONT_UPDATE_IV
112 : iv = &(*ivec)[0];
113 0 : l2c(tout0, iv);
114 0 : l2c(tout1, iv);
115 : #endif
116 : } else {
117 0 : c2l(iv, xor0);
118 0 : c2l(iv, xor1);
119 0 : for (l -= 8; l >= 0; l -= 8) {
120 0 : c2l(in, tin0);
121 0 : tin[0] = tin0;
122 0 : c2l(in, tin1);
123 0 : tin[1] = tin1;
124 0 : DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
125 0 : tout0 = tin[0] ^ xor0;
126 0 : tout1 = tin[1] ^ xor1;
127 0 : l2c(tout0, out);
128 0 : l2c(tout1, out);
129 : xor0 = tin0;
130 : xor1 = tin1;
131 : }
132 0 : if (l != -8) {
133 0 : c2l(in, tin0);
134 0 : tin[0] = tin0;
135 0 : c2l(in, tin1);
136 0 : tin[1] = tin1;
137 0 : DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
138 0 : tout0 = tin[0] ^ xor0;
139 0 : tout1 = tin[1] ^ xor1;
140 0 : l2cn(tout0, tout1, out, l + 8);
141 : #ifndef CBC_ENC_C__DONT_UPDATE_IV
142 : xor0 = tin0;
143 : xor1 = tin1;
144 : #endif
145 : }
146 : #ifndef CBC_ENC_C__DONT_UPDATE_IV
147 : iv = &(*ivec)[0];
148 0 : l2c(xor0, iv);
149 0 : l2c(xor1, iv);
150 : #endif
151 : }
152 : tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
153 : tin[0] = tin[1] = 0;
154 0 : }
|