Coverage Report

Created: 2018-08-29 13:53

/src/openssl/crypto/cast/c_enc.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the OpenSSL license (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
#include <openssl/cast.h>
11
#include "cast_lcl.h"
12
13
void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key)
14
0
{
15
0
    CAST_LONG l, r, t;
16
0
    const CAST_LONG *k;
17
0
18
0
    k = &(key->data[0]);
19
0
    l = data[0];
20
0
    r = data[1];
21
0
22
0
    E_CAST(0, k, l, r, +, ^, -);
23
0
    E_CAST(1, k, r, l, ^, -, +);
24
0
    E_CAST(2, k, l, r, -, +, ^);
25
0
    E_CAST(3, k, r, l, +, ^, -);
26
0
    E_CAST(4, k, l, r, ^, -, +);
27
0
    E_CAST(5, k, r, l, -, +, ^);
28
0
    E_CAST(6, k, l, r, +, ^, -);
29
0
    E_CAST(7, k, r, l, ^, -, +);
30
0
    E_CAST(8, k, l, r, -, +, ^);
31
0
    E_CAST(9, k, r, l, +, ^, -);
32
0
    E_CAST(10, k, l, r, ^, -, +);
33
0
    E_CAST(11, k, r, l, -, +, ^);
34
0
    if (!key->short_key) {
35
0
        E_CAST(12, k, l, r, +, ^, -);
36
0
        E_CAST(13, k, r, l, ^, -, +);
37
0
        E_CAST(14, k, l, r, -, +, ^);
38
0
        E_CAST(15, k, r, l, +, ^, -);
39
0
    }
40
0
41
0
    data[1] = l & 0xffffffffL;
42
0
    data[0] = r & 0xffffffffL;
43
0
}
44
45
void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key)
46
0
{
47
0
    CAST_LONG l, r, t;
48
0
    const CAST_LONG *k;
49
0
50
0
    k = &(key->data[0]);
51
0
    l = data[0];
52
0
    r = data[1];
53
0
54
0
    if (!key->short_key) {
55
0
        E_CAST(15, k, l, r, +, ^, -);
56
0
        E_CAST(14, k, r, l, -, +, ^);
57
0
        E_CAST(13, k, l, r, ^, -, +);
58
0
        E_CAST(12, k, r, l, +, ^, -);
59
0
    }
60
0
    E_CAST(11, k, l, r, -, +, ^);
61
0
    E_CAST(10, k, r, l, ^, -, +);
62
0
    E_CAST(9, k, l, r, +, ^, -);
63
0
    E_CAST(8, k, r, l, -, +, ^);
64
0
    E_CAST(7, k, l, r, ^, -, +);
65
0
    E_CAST(6, k, r, l, +, ^, -);
66
0
    E_CAST(5, k, l, r, -, +, ^);
67
0
    E_CAST(4, k, r, l, ^, -, +);
68
0
    E_CAST(3, k, l, r, +, ^, -);
69
0
    E_CAST(2, k, r, l, -, +, ^);
70
0
    E_CAST(1, k, l, r, ^, -, +);
71
0
    E_CAST(0, k, r, l, +, ^, -);
72
0
73
0
    data[1] = l & 0xffffffffL;
74
0
    data[0] = r & 0xffffffffL;
75
0
}
76
77
void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out,
78
                      long length, const CAST_KEY *ks, unsigned char *iv,
79
                      int enc)
80
0
{
81
0
    register CAST_LONG tin0, tin1;
82
0
    register CAST_LONG tout0, tout1, xor0, xor1;
83
0
    register long l = length;
84
0
    CAST_LONG tin[2];
85
0
86
0
    if (enc) {
87
0
        n2l(iv, tout0);
88
0
        n2l(iv, tout1);
89
0
        iv -= 8;
90
0
        for (l -= 8; l >= 0; l -= 8) {
91
0
            n2l(in, tin0);
92
0
            n2l(in, tin1);
93
0
            tin0 ^= tout0;
94
0
            tin1 ^= tout1;
95
0
            tin[0] = tin0;
96
0
            tin[1] = tin1;
97
0
            CAST_encrypt(tin, ks);
98
0
            tout0 = tin[0];
99
0
            tout1 = tin[1];
100
0
            l2n(tout0, out);
101
0
            l2n(tout1, out);
102
0
        }
103
0
        if (l != -8) {
104
0
            n2ln(in, tin0, tin1, l + 8);
105
0
            tin0 ^= tout0;
106
0
            tin1 ^= tout1;
107
0
            tin[0] = tin0;
108
0
            tin[1] = tin1;
109
0
            CAST_encrypt(tin, ks);
110
0
            tout0 = tin[0];
111
0
            tout1 = tin[1];
112
0
            l2n(tout0, out);
113
0
            l2n(tout1, out);
114
0
        }
115
0
        l2n(tout0, iv);
116
0
        l2n(tout1, iv);
117
0
    } else {
118
0
        n2l(iv, xor0);
119
0
        n2l(iv, xor1);
120
0
        iv -= 8;
121
0
        for (l -= 8; l >= 0; l -= 8) {
122
0
            n2l(in, tin0);
123
0
            n2l(in, tin1);
124
0
            tin[0] = tin0;
125
0
            tin[1] = tin1;
126
0
            CAST_decrypt(tin, ks);
127
0
            tout0 = tin[0] ^ xor0;
128
0
            tout1 = tin[1] ^ xor1;
129
0
            l2n(tout0, out);
130
0
            l2n(tout1, out);
131
0
            xor0 = tin0;
132
0
            xor1 = tin1;
133
0
        }
134
0
        if (l != -8) {
135
0
            n2l(in, tin0);
136
0
            n2l(in, tin1);
137
0
            tin[0] = tin0;
138
0
            tin[1] = tin1;
139
0
            CAST_decrypt(tin, ks);
140
0
            tout0 = tin[0] ^ xor0;
141
0
            tout1 = tin[1] ^ xor1;
142
0
            l2nn(tout0, tout1, out, l + 8);
143
0
            xor0 = tin0;
144
0
            xor1 = tin1;
145
0
        }
146
0
        l2n(xor0, iv);
147
0
        l2n(xor1, iv);
148
0
    }
149
0
    tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
150
0
    tin[0] = tin[1] = 0;
151
0
}