Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/lib/krb5/crypto-des3.c
34889 views
1
/*
2
* Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
4
* All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
*
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
*
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
*
17
* 3. Neither the name of the Institute nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
* SUCH DAMAGE.
32
*/
33
34
#include "krb5_locl.h"
35
36
/*
37
*
38
*/
39
40
static void
41
DES3_random_key(krb5_context context,
42
krb5_keyblock *key)
43
{
44
DES_cblock *k = key->keyvalue.data;
45
do {
46
krb5_generate_random_block(k, 3 * sizeof(DES_cblock));
47
DES_set_odd_parity(&k[0]);
48
DES_set_odd_parity(&k[1]);
49
DES_set_odd_parity(&k[2]);
50
} while(DES_is_weak_key(&k[0]) ||
51
DES_is_weak_key(&k[1]) ||
52
DES_is_weak_key(&k[2]));
53
}
54
55
56
#ifdef DES3_OLD_ENCTYPE
57
static struct _krb5_key_type keytype_des3 = {
58
ETYPE_OLD_DES3_CBC_SHA1,
59
"des3",
60
168,
61
24,
62
sizeof(struct _krb5_evp_schedule),
63
DES3_random_key,
64
_krb5_evp_schedule,
65
_krb5_des3_salt,
66
_krb5_DES3_random_to_key,
67
_krb5_evp_cleanup,
68
EVP_des_ede3_cbc
69
};
70
#endif
71
72
static struct _krb5_key_type keytype_des3_derived = {
73
ETYPE_OLD_DES3_CBC_SHA1,
74
"des3",
75
168,
76
24,
77
sizeof(struct _krb5_evp_schedule),
78
DES3_random_key,
79
_krb5_evp_schedule,
80
_krb5_des3_salt_derived,
81
_krb5_DES3_random_to_key,
82
_krb5_evp_cleanup,
83
EVP_des_ede3_cbc
84
};
85
86
#ifdef DES3_OLD_ENCTYPE
87
static krb5_error_code
88
RSA_MD5_DES3_checksum(krb5_context context,
89
struct _krb5_key_data *key,
90
const void *data,
91
size_t len,
92
unsigned usage,
93
Checksum *C)
94
{
95
return _krb5_des_checksum(context, EVP_md5(), key, data, len, C);
96
}
97
98
static krb5_error_code
99
RSA_MD5_DES3_verify(krb5_context context,
100
struct _krb5_key_data *key,
101
const void *data,
102
size_t len,
103
unsigned usage,
104
Checksum *C)
105
{
106
return _krb5_des_verify(context, EVP_md5(), key, data, len, C);
107
}
108
109
struct _krb5_checksum_type _krb5_checksum_rsa_md5_des3 = {
110
CKSUMTYPE_RSA_MD5_DES3,
111
"rsa-md5-des3",
112
64,
113
24,
114
F_KEYED | F_CPROOF | F_VARIANT,
115
RSA_MD5_DES3_checksum,
116
RSA_MD5_DES3_verify
117
};
118
#endif
119
120
struct _krb5_checksum_type _krb5_checksum_hmac_sha1_des3 = {
121
CKSUMTYPE_HMAC_SHA1_DES3,
122
"hmac-sha1-des3",
123
64,
124
20,
125
F_KEYED | F_CPROOF | F_DERIVED,
126
_krb5_SP_HMAC_SHA1_checksum,
127
NULL
128
};
129
130
#ifdef DES3_OLD_ENCTYPE
131
struct _krb5_encryption_type _krb5_enctype_des3_cbc_md5 = {
132
ETYPE_DES3_CBC_MD5,
133
"des3-cbc-md5",
134
8,
135
8,
136
8,
137
&keytype_des3,
138
&_krb5_checksum_rsa_md5,
139
&_krb5_checksum_rsa_md5_des3,
140
0,
141
_krb5_evp_encrypt,
142
0,
143
NULL
144
};
145
#endif
146
147
struct _krb5_encryption_type _krb5_enctype_des3_cbc_sha1 = {
148
ETYPE_DES3_CBC_SHA1,
149
"des3-cbc-sha1",
150
8,
151
8,
152
8,
153
&keytype_des3_derived,
154
&_krb5_checksum_sha1,
155
&_krb5_checksum_hmac_sha1_des3,
156
F_DERIVED,
157
_krb5_evp_encrypt,
158
0,
159
NULL
160
};
161
162
#ifdef DES3_OLD_ENCTYPE
163
struct _krb5_encryption_type _krb5_enctype_old_des3_cbc_sha1 = {
164
ETYPE_OLD_DES3_CBC_SHA1,
165
"old-des3-cbc-sha1",
166
8,
167
8,
168
8,
169
&keytype_des3,
170
&_krb5_checksum_sha1,
171
&_krb5_checksum_hmac_sha1_des3,
172
0,
173
_krb5_evp_encrypt,
174
0,
175
NULL
176
};
177
#endif
178
179
struct _krb5_encryption_type _krb5_enctype_des3_cbc_none = {
180
ETYPE_DES3_CBC_NONE,
181
"des3-cbc-none",
182
8,
183
8,
184
0,
185
&keytype_des3_derived,
186
&_krb5_checksum_none,
187
NULL,
188
F_PSEUDO,
189
_krb5_evp_encrypt,
190
0,
191
NULL
192
};
193
194
void
195
_krb5_DES3_random_to_key(krb5_context context,
196
krb5_keyblock *key,
197
const void *data,
198
size_t size)
199
{
200
unsigned char *x = key->keyvalue.data;
201
const u_char *q = data;
202
DES_cblock *k;
203
int i, j;
204
205
memset(key->keyvalue.data, 0, key->keyvalue.length);
206
for (i = 0; i < 3; ++i) {
207
unsigned char foo;
208
for (j = 0; j < 7; ++j) {
209
unsigned char b = q[7 * i + j];
210
211
x[8 * i + j] = b;
212
}
213
foo = 0;
214
for (j = 6; j >= 0; --j) {
215
foo |= q[7 * i + j] & 1;
216
foo <<= 1;
217
}
218
x[8 * i + 7] = foo;
219
}
220
k = key->keyvalue.data;
221
for (i = 0; i < 3; i++) {
222
DES_set_odd_parity(&k[i]);
223
if(DES_is_weak_key(&k[i]))
224
_krb5_xor(&k[i], (const unsigned char*)"\0\0\0\0\0\0\0\xf0");
225
}
226
}
227
228