]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/cast/c_enc.c
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
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
10 #include <openssl/cast.h>
11 #include "cast_local.h"
13 void CAST_encrypt(CAST_LONG
*data
, const CAST_KEY
*key
)
22 E_CAST(0, k
, l
, r
, +, ^, -);
23 E_CAST(1, k
, r
, l
, ^, -, +);
24 E_CAST(2, k
, l
, r
, -, +, ^);
25 E_CAST(3, k
, r
, l
, +, ^, -);
26 E_CAST(4, k
, l
, r
, ^, -, +);
27 E_CAST(5, k
, r
, l
, -, +, ^);
28 E_CAST(6, k
, l
, r
, +, ^, -);
29 E_CAST(7, k
, r
, l
, ^, -, +);
30 E_CAST(8, k
, l
, r
, -, +, ^);
31 E_CAST(9, k
, r
, l
, +, ^, -);
32 E_CAST(10, k
, l
, r
, ^, -, +);
33 E_CAST(11, k
, r
, l
, -, +, ^);
34 if (!key
->short_key
) {
35 E_CAST(12, k
, l
, r
, +, ^, -);
36 E_CAST(13, k
, r
, l
, ^, -, +);
37 E_CAST(14, k
, l
, r
, -, +, ^);
38 E_CAST(15, k
, r
, l
, +, ^, -);
41 data
[1] = l
& 0xffffffffL
;
42 data
[0] = r
& 0xffffffffL
;
45 void CAST_decrypt(CAST_LONG
*data
, const CAST_KEY
*key
)
54 if (!key
->short_key
) {
55 E_CAST(15, k
, l
, r
, +, ^, -);
56 E_CAST(14, k
, r
, l
, -, +, ^);
57 E_CAST(13, k
, l
, r
, ^, -, +);
58 E_CAST(12, k
, r
, l
, +, ^, -);
60 E_CAST(11, k
, l
, r
, -, +, ^);
61 E_CAST(10, k
, r
, l
, ^, -, +);
62 E_CAST(9, k
, l
, r
, +, ^, -);
63 E_CAST(8, k
, r
, l
, -, +, ^);
64 E_CAST(7, k
, l
, r
, ^, -, +);
65 E_CAST(6, k
, r
, l
, +, ^, -);
66 E_CAST(5, k
, l
, r
, -, +, ^);
67 E_CAST(4, k
, r
, l
, ^, -, +);
68 E_CAST(3, k
, l
, r
, +, ^, -);
69 E_CAST(2, k
, r
, l
, -, +, ^);
70 E_CAST(1, k
, l
, r
, ^, -, +);
71 E_CAST(0, k
, r
, l
, +, ^, -);
73 data
[1] = l
& 0xffffffffL
;
74 data
[0] = r
& 0xffffffffL
;
77 void CAST_cbc_encrypt(const unsigned char *in
, unsigned char *out
,
78 long length
, const CAST_KEY
*ks
, unsigned char *iv
,
81 register CAST_LONG tin0
, tin1
;
82 register CAST_LONG tout0
, tout1
, xor0
, xor1
;
83 register long l
= length
;
90 for (l
-= 8; l
>= 0; l
-= 8) {
97 CAST_encrypt(tin
, ks
);
104 n2ln(in
, tin0
, tin1
, l
+ 8);
109 CAST_encrypt(tin
, ks
);
121 for (l
-= 8; l
>= 0; l
-= 8) {
126 CAST_decrypt(tin
, ks
);
127 tout0
= tin
[0] ^ xor0
;
128 tout1
= tin
[1] ^ xor1
;
139 CAST_decrypt(tin
, ks
);
140 tout0
= tin
[0] ^ xor0
;
141 tout1
= tin
[1] ^ xor1
;
142 l2nn(tout0
, tout1
, out
, l
+ 8);
149 tin0
= tin1
= tout0
= tout1
= xor0
= xor1
= 0;