]>
git.saurik.com Git - apple/xnu.git/blob - bsd/crypto/blowfish/bf_cbc_m.c
2 * heavily modified to accept mbuf, by Jun-ichiro itojun Itoh
3 * <itojun@itojun.org>, 1997.
5 /* crypto/bf/bf_cbc.c */
6 /* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
9 * This package is an SSL implementation written
10 * by Eric Young (eay@mincom.oz.au).
11 * The implementation was written so as to conform with Netscapes SSL.
13 * This library is free for commercial and non-commercial use as long as
14 * the following conditions are aheared to. The following conditions
15 * apply to all code found in this distribution, be it the RC4, RSA,
16 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
17 * included with this distribution is covered by the same copyright terms
18 * except that the holder is Tim Hudson (tjh@mincom.oz.au).
20 * Copyright remains Eric Young's, and as such any Copyright notices in
21 * the code are not to be removed.
22 * If this package is used in a product, Eric Young should be given attribution
23 * as the author of the parts of the library used.
24 * This can be in the form of a textual message at program startup or
25 * in documentation (online or textual) provided with the package.
27 * Redistribution and use in source and binary forms, with or without
28 * modification, are permitted provided that the following conditions
30 * 1. Redistributions of source code must retain the copyright
31 * notice, this list of conditions and the following disclaimer.
32 * 2. Redistributions in binary form must reproduce the above copyright
33 * notice, this list of conditions and the following disclaimer in the
34 * documentation and/or other materials provided with the distribution.
35 * 3. All advertising materials mentioning features or use of this software
36 * must display the following acknowledgement:
37 * "This product includes cryptographic software written by
38 * Eric Young (eay@mincom.oz.au)"
39 * The word 'cryptographic' can be left out if the rouines from the library
40 * being used are not cryptographic related :-).
41 * 4. If you include any Windows specific code (or a derivative thereof) from
42 * the apps directory (application code) you must include an acknowledgement:
43 * "This product includes software written by Tim Hudson (tjh@mincom.oz.au)"
45 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 * The licence and distribution terms for any publically available version or
58 * derivative of this code cannot be changed. i.e. this code cannot simply be
59 * copied and put under another distribution licence
60 * [including the GNU Public Licence.]
63 #include <sys/param.h>
64 #include <sys/malloc.h>
66 #include <sys/systm.h>
68 #include <crypto/blowfish/blowfish.h>
69 #include <crypto/blowfish/bf_locl.h>
71 #define panic(x) {printf(x); return;}
73 void BF_cbc_encrypt_m(m0
, skip
, length
, key
, iv
, mode
)
81 u_int8_t inbuf
[8], outbuf
[8];
84 register BF_LONG tin0
, tin1
;
85 register BF_LONG tout0
, tout1
;
89 if (m0
->m_pkthdr
.len
< skip
) {
90 printf("mbuf length < skip\n");
93 if (m0
->m_pkthdr
.len
< length
) {
94 printf("mbuf length < encrypt length\n");
97 if (m0
->m_pkthdr
.len
< skip
+ length
) {
98 printf("mbuf length < skip + encrypt length\n");
102 printf("length is not multiple of 8\n");
109 /* skip over the header */
112 panic("mbuf chain?\n");
113 if (m
->m_len
<= skip
) {
124 tin0
= tin1
= tout0
= tout1
= 0;
127 if (mode
== BF_ENCRYPT
) {
135 panic("mbuf chain?\n");
138 * copy the source into input buffer.
139 * don't update off or m, since we need to use them * later.
141 if (off
+ 8 <= m
->m_len
)
142 bcopy(mtod(m
, u_int8_t
*) + off
, &inbuf
[0], 8);
151 p
= mtod(n
, u_int8_t
*) + noff
;
154 while (in
- &inbuf
[0] < 8) {
156 panic("mbuf chain?\n");
164 } while (n
&& ! n
->m_len
);
167 p
= mtod(n
, u_int8_t
*) + noff
;
178 tin0
^= tout0
; tin
[0] = tin0
;
179 tin1
^= tout1
; tin
[1] = tin1
;
180 BF_encrypt(tin
, key
, BF_ENCRYPT
);
181 tout0
= tin
[0]; l2n(tout0
, out
);
182 tout1
= tin
[1]; l2n(tout1
, out
);
185 * copy the output buffer into the result.
186 * need to update off and m.
188 if (off
+ 8 < m
->m_len
) {
189 bcopy(&outbuf
[0], mtod(m
, u_int8_t
*) + off
, 8);
191 } else if (off
+ 8 == m
->m_len
) {
192 bcopy(&outbuf
[0], mtod(m
, u_int8_t
*) + off
, 8);
195 } while (m
&& ! m
->m_len
);
205 p
= mtod(n
, u_int8_t
*) + noff
;
208 while (out
- &outbuf
[0] < 8) {
210 panic("mbuf chain?");
217 } while (n
&& ! n
->m_len
);
220 p
= mtod(n
, u_int8_t
*) + noff
;
231 } else if (mode
== BF_DECRYPT
) {
232 register BF_LONG xor0
, xor1
;
241 panic("mbuf chain?\n");
244 * copy the source into input buffer.
245 * don't update off or m, since we need to use them * later.
247 if (off
+ 8 <= m
->m_len
)
248 bcopy(mtod(m
, u_int8_t
*) + off
, &inbuf
[0], 8);
257 p
= mtod(n
, u_int8_t
*) + noff
;
260 while (in
- &inbuf
[0] < 8) {
262 panic("mbuf chain?\n");
269 } while (n
&& ! n
->m_len
);
272 p
= mtod(n
, u_int8_t
*) + noff
;
280 n2l(in
, tin0
); tin
[0] = tin0
;
281 n2l(in
, tin1
); tin
[1] = tin1
;
282 BF_encrypt(tin
, key
, BF_DECRYPT
);
283 tout0
= tin
[0] ^ xor0
;
284 tout1
= tin
[1] ^ xor1
;
292 * copy the output buffer into the result.
293 * need to update off and m.
295 if (off
+ 8 < m
->m_len
) {
296 bcopy(&outbuf
[0], mtod(m
, u_int8_t
*) + off
, 8);
298 } else if (off
+ 8 == m
->m_len
) {
299 bcopy(&outbuf
[0], mtod(m
, u_int8_t
*) + off
, 8);
302 } while (m
&& ! m
->m_len
);
312 p
= mtod(n
, u_int8_t
*) + noff
;
315 while (out
- &outbuf
[0] < 8) {
317 panic("mbuf chain?\n");
324 } while (n
&& ! n
->m_len
);
327 p
= mtod(n
, u_int8_t
*) + noff
;