Deleted Added
full compact
crypto.c (78536) crypto.c (90929)
1/*
1/*
2 * Copyright (c) 1997 - 2001 Kungliga Tekniska H�gskolan
2 * Copyright (c) 1997 - 2002 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

--- 16 unchanged lines hidden (view full) ---

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"
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

--- 16 unchanged lines hidden (view full) ---

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"
35RCSID("$Id: crypto.c,v 1.50 2001/05/14 06:14:45 assar Exp $");
36/* RCSID("$FreeBSD: head/crypto/heimdal/lib/krb5/crypto.c 78536 2001-06-21 02:21:57Z assar $"); */
35RCSID("$Id: crypto.c,v 1.60 2002/01/06 23:12:51 assar Exp $");
36/* RCSID("$FreeBSD: head/crypto/heimdal/lib/krb5/crypto.c 90929 2002-02-19 15:50:30Z nectar $"); */
37
38#undef CRYPTO_DEBUG
39#ifdef CRYPTO_DEBUG
40static void krb5_crypto_debug(krb5_context, int, size_t, krb5_keyblock*);
41#endif
42
43
44struct key_data {

--- 107 unchanged lines hidden (view full) ---

152
153static void
154DES_schedule(krb5_context context,
155 struct key_data *key)
156{
157 des_set_key(key->key->keyvalue.data, key->schedule->data);
158}
159
37
38#undef CRYPTO_DEBUG
39#ifdef CRYPTO_DEBUG
40static void krb5_crypto_debug(krb5_context, int, size_t, krb5_keyblock*);
41#endif
42
43
44struct key_data {

--- 107 unchanged lines hidden (view full) ---

152
153static void
154DES_schedule(krb5_context context,
155 struct key_data *key)
156{
157 des_set_key(key->key->keyvalue.data, key->schedule->data);
158}
159
160static void
161DES_string_to_key_int(unsigned char *data, size_t length, des_cblock *key)
162{
163 des_key_schedule schedule;
164 int i;
165 int reverse = 0;
166 unsigned char *p;
167
168 unsigned char swap[] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
169 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf };
170 memset(key, 0, 8);
171
172 p = (unsigned char*)key;
173 for (i = 0; i < length; i++) {
174 unsigned char tmp = data[i];
175 if (!reverse)
176 *p++ ^= (tmp << 1);
177 else
178 *--p ^= (swap[tmp & 0xf] << 4) | swap[(tmp & 0xf0) >> 4];
179 if((i % 8) == 7)
180 reverse = !reverse;
181 }
182 des_set_odd_parity(key);
183 if(des_is_weak_key(key))
184 (*key)[7] ^= 0xF0;
185 des_set_key(key, schedule);
186 des_cbc_cksum((void*)data, key, length, schedule, key);
187 memset(schedule, 0, sizeof(schedule));
188 des_set_odd_parity(key);
189}
190
160static krb5_error_code
161DES_string_to_key(krb5_context context,
162 krb5_enctype enctype,
163 krb5_data password,
164 krb5_salt salt,
165 krb5_keyblock *key)
166{
191static krb5_error_code
192DES_string_to_key(krb5_context context,
193 krb5_enctype enctype,
194 krb5_data password,
195 krb5_salt salt,
196 krb5_keyblock *key)
197{
167 char *s;
198 unsigned char *s;
168 size_t len;
169 des_cblock tmp;
170
199 size_t len;
200 des_cblock tmp;
201
171 len = password.length + salt.saltvalue.length + 1;
202 len = password.length + salt.saltvalue.length;
172 s = malloc(len);
203 s = malloc(len);
173 if(s == NULL) {
204 if(len > 0 && s == NULL) {
174 krb5_set_error_string(context, "malloc: out of memory");
175 return ENOMEM;
176 }
177 memcpy(s, password.data, password.length);
178 memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length);
205 krb5_set_error_string(context, "malloc: out of memory");
206 return ENOMEM;
207 }
208 memcpy(s, password.data, password.length);
209 memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length);
179 s[len - 1] = '\0';
180 des_string_to_key(s, &tmp);
210 DES_string_to_key_int(s, len, &tmp);
181 key->keytype = enctype;
182 krb5_data_copy(&key->keyvalue, tmp, sizeof(tmp));
183 memset(&tmp, 0, sizeof(tmp));
184 memset(s, 0, len);
185 free(s);
186 return 0;
187}
188

--- 55 unchanged lines hidden (view full) ---

244 for (i = pw.length; i < pw.length + len; ++i)
245 password[i] = tolower((unsigned char)password[i]);
246 }
247 passlen = min(sizeof(password), pw.length + cell.length);
248 memcpy(&ivec, "kerberos", 8);
249 memcpy(&temp_key, "kerberos", 8);
250 des_set_odd_parity (&temp_key);
251 des_set_key (&temp_key, schedule);
211 key->keytype = enctype;
212 krb5_data_copy(&key->keyvalue, tmp, sizeof(tmp));
213 memset(&tmp, 0, sizeof(tmp));
214 memset(s, 0, len);
215 free(s);
216 return 0;
217}
218

--- 55 unchanged lines hidden (view full) ---

274 for (i = pw.length; i < pw.length + len; ++i)
275 password[i] = tolower((unsigned char)password[i]);
276 }
277 passlen = min(sizeof(password), pw.length + cell.length);
278 memcpy(&ivec, "kerberos", 8);
279 memcpy(&temp_key, "kerberos", 8);
280 des_set_odd_parity (&temp_key);
281 des_set_key (&temp_key, schedule);
252 des_cbc_cksum ((des_cblock *)password, &ivec, passlen, schedule, &ivec);
282 des_cbc_cksum (password, &ivec, passlen, schedule, &ivec);
253
254 memcpy(&temp_key, &ivec, 8);
255 des_set_odd_parity (&temp_key);
256 des_set_key (&temp_key, schedule);
283
284 memcpy(&temp_key, &ivec, 8);
285 des_set_odd_parity (&temp_key);
286 des_set_key (&temp_key, schedule);
257 des_cbc_cksum ((des_cblock *)password, key, passlen, schedule, &ivec);
287 des_cbc_cksum (password, key, passlen, schedule, &ivec);
258 memset(&schedule, 0, sizeof(schedule));
259 memset(&temp_key, 0, sizeof(temp_key));
260 memset(&ivec, 0, sizeof(ivec));
261 memset(password, 0, sizeof(password));
262
263 des_set_odd_parity (key);
264}
265

--- 89 unchanged lines hidden (view full) ---

355 for(i = 0; i < 3; i++){
356 memcpy(keys + i, tmp + i * 8, sizeof(keys[i]));
357 des_set_odd_parity(keys + i);
358 if(des_is_weak_key(keys + i))
359 xor(keys + i, (unsigned char*)"\0\0\0\0\0\0\0\xf0");
360 des_set_key(keys + i, s[i]);
361 }
362 memset(&ivec, 0, sizeof(ivec));
288 memset(&schedule, 0, sizeof(schedule));
289 memset(&temp_key, 0, sizeof(temp_key));
290 memset(&ivec, 0, sizeof(ivec));
291 memset(password, 0, sizeof(password));
292
293 des_set_odd_parity (key);
294}
295

--- 89 unchanged lines hidden (view full) ---

385 for(i = 0; i < 3; i++){
386 memcpy(keys + i, tmp + i * 8, sizeof(keys[i]));
387 des_set_odd_parity(keys + i);
388 if(des_is_weak_key(keys + i))
389 xor(keys + i, (unsigned char*)"\0\0\0\0\0\0\0\xf0");
390 des_set_key(keys + i, s[i]);
391 }
392 memset(&ivec, 0, sizeof(ivec));
363 des_ede3_cbc_encrypt((des_cblock *)tmp,
364 (des_cblock *)tmp, sizeof(tmp),
393 des_ede3_cbc_encrypt(tmp,
394 tmp, sizeof(tmp),
365 s[0], s[1], s[2], &ivec, DES_ENCRYPT);
366 memset(s, 0, sizeof(s));
367 memset(&ivec, 0, sizeof(ivec));
368 for(i = 0; i < 3; i++){
369 memcpy(keys + i, tmp + i * 8, sizeof(keys[i]));
370 des_set_odd_parity(keys + i);
371 if(des_is_weak_key(keys + i))
372 xor(keys + i, (unsigned char*)"\0\0\0\0\0\0\0\xf0");

--- 518 unchanged lines hidden (view full) ---

891 unsigned char *p = cksum->checksum.data;
892
893 krb5_generate_random_block(p, 8);
894 MD4_Init (&md4);
895 MD4_Update (&md4, p, 8);
896 MD4_Update (&md4, data, len);
897 MD4_Final (p + 8, &md4);
898 memset (&ivec, 0, sizeof(ivec));
395 s[0], s[1], s[2], &ivec, DES_ENCRYPT);
396 memset(s, 0, sizeof(s));
397 memset(&ivec, 0, sizeof(ivec));
398 for(i = 0; i < 3; i++){
399 memcpy(keys + i, tmp + i * 8, sizeof(keys[i]));
400 des_set_odd_parity(keys + i);
401 if(des_is_weak_key(keys + i))
402 xor(keys + i, (unsigned char*)"\0\0\0\0\0\0\0\xf0");

--- 518 unchanged lines hidden (view full) ---

921 unsigned char *p = cksum->checksum.data;
922
923 krb5_generate_random_block(p, 8);
924 MD4_Init (&md4);
925 MD4_Update (&md4, p, 8);
926 MD4_Update (&md4, data, len);
927 MD4_Final (p + 8, &md4);
928 memset (&ivec, 0, sizeof(ivec));
899 des_cbc_encrypt((des_cblock*)p,
900 (des_cblock*)p,
929 des_cbc_encrypt(p,
930 p,
901 24,
902 key->schedule->data,
903 &ivec,
904 DES_ENCRYPT);
905}
906
907static krb5_error_code
908RSA_MD4_DES_verify(krb5_context context,

--- 57 unchanged lines hidden (view full) ---

966 unsigned char *p = C->checksum.data;
967
968 krb5_generate_random_block(p, 8);
969 MD5_Init (&md5);
970 MD5_Update (&md5, p, 8);
971 MD5_Update (&md5, data, len);
972 MD5_Final (p + 8, &md5);
973 memset (&ivec, 0, sizeof(ivec));
931 24,
932 key->schedule->data,
933 &ivec,
934 DES_ENCRYPT);
935}
936
937static krb5_error_code
938RSA_MD4_DES_verify(krb5_context context,

--- 57 unchanged lines hidden (view full) ---

996 unsigned char *p = C->checksum.data;
997
998 krb5_generate_random_block(p, 8);
999 MD5_Init (&md5);
1000 MD5_Update (&md5, p, 8);
1001 MD5_Update (&md5, data, len);
1002 MD5_Final (p + 8, &md5);
1003 memset (&ivec, 0, sizeof(ivec));
974 des_cbc_encrypt((des_cblock*)p,
975 (des_cblock*)p,
1004 des_cbc_encrypt(p,
1005 p,
976 24,
977 key->schedule->data,
978 &ivec,
979 DES_ENCRYPT);
980}
981
982static krb5_error_code
983RSA_MD5_DES_verify(krb5_context context,

--- 44 unchanged lines hidden (view full) ---

1028 des_key_schedule *sched = key->schedule->data;
1029
1030 krb5_generate_random_block(p, 8);
1031 MD5_Init (&md5);
1032 MD5_Update (&md5, p, 8);
1033 MD5_Update (&md5, data, len);
1034 MD5_Final (p + 8, &md5);
1035 memset (&ivec, 0, sizeof(ivec));
1006 24,
1007 key->schedule->data,
1008 &ivec,
1009 DES_ENCRYPT);
1010}
1011
1012static krb5_error_code
1013RSA_MD5_DES_verify(krb5_context context,

--- 44 unchanged lines hidden (view full) ---

1058 des_key_schedule *sched = key->schedule->data;
1059
1060 krb5_generate_random_block(p, 8);
1061 MD5_Init (&md5);
1062 MD5_Update (&md5, p, 8);
1063 MD5_Update (&md5, data, len);
1064 MD5_Final (p + 8, &md5);
1065 memset (&ivec, 0, sizeof(ivec));
1036 des_ede3_cbc_encrypt((des_cblock*)p,
1037 (des_cblock*)p,
1066 des_ede3_cbc_encrypt(p,
1067 p,
1038 24,
1039 sched[0], sched[1], sched[2],
1040 &ivec,
1041 DES_ENCRYPT);
1042}
1043
1044static krb5_error_code
1045RSA_MD5_DES3_verify(krb5_context context,

--- 397 unchanged lines hidden (view full) ---

1443 krb5_data_alloc(&result->checksum, ct->checksumsize);
1444 (*ct->checksum)(context, dkey, data, len, usage, result);
1445 return 0;
1446}
1447
1448static krb5_error_code
1449create_checksum(krb5_context context,
1450 krb5_crypto crypto,
1068 24,
1069 sched[0], sched[1], sched[2],
1070 &ivec,
1071 DES_ENCRYPT);
1072}
1073
1074static krb5_error_code
1075RSA_MD5_DES3_verify(krb5_context context,

--- 397 unchanged lines hidden (view full) ---

1473 krb5_data_alloc(&result->checksum, ct->checksumsize);
1474 (*ct->checksum)(context, dkey, data, len, usage, result);
1475 return 0;
1476}
1477
1478static krb5_error_code
1479create_checksum(krb5_context context,
1480 krb5_crypto crypto,
1451 krb5_key_usage usage, /* not krb5_key_usage */
1481 unsigned usage, /* not krb5_key_usage */
1452 krb5_cksumtype type, /* 0 -> pick from crypto */
1453 void *data,
1454 size_t len,
1455 Checksum *result)
1456{
1457 struct checksum_type *ct = NULL;
1458
1459 if (type) {

--- 261 unchanged lines hidden (view full) ---

1721 void *ivec)
1722{
1723 struct checksum_type *c = _find_checksum (CKSUMTYPE_RSA_MD5);
1724 Checksum k1_c, k2_c, k3_c, cksum;
1725 struct key_data ke;
1726 krb5_keyblock kb;
1727 unsigned char t[4];
1728 RC4_KEY rc4_key;
1482 krb5_cksumtype type, /* 0 -> pick from crypto */
1483 void *data,
1484 size_t len,
1485 Checksum *result)
1486{
1487 struct checksum_type *ct = NULL;
1488
1489 if (type) {

--- 261 unchanged lines hidden (view full) ---

1751 void *ivec)
1752{
1753 struct checksum_type *c = _find_checksum (CKSUMTYPE_RSA_MD5);
1754 Checksum k1_c, k2_c, k3_c, cksum;
1755 struct key_data ke;
1756 krb5_keyblock kb;
1757 unsigned char t[4];
1758 RC4_KEY rc4_key;
1729 char *cdata = (char *)data;
1759 unsigned char *cdata = data;
1730 unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
1731
1732 t[0] = (usage >> 0) & 0xFF;
1733 t[1] = (usage >> 8) & 0xFF;
1734 t[2] = (usage >> 16) & 0xFF;
1735 t[3] = (usage >> 24) & 0xFF;
1736
1737 k1_c.checksum.length = sizeof(k1_c_data);

--- 39 unchanged lines hidden (view full) ---

1777 void *ivec)
1778{
1779 struct checksum_type *c = _find_checksum (CKSUMTYPE_RSA_MD5);
1780 Checksum k1_c, k2_c, k3_c, cksum;
1781 struct key_data ke;
1782 krb5_keyblock kb;
1783 unsigned char t[4];
1784 RC4_KEY rc4_key;
1760 unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
1761
1762 t[0] = (usage >> 0) & 0xFF;
1763 t[1] = (usage >> 8) & 0xFF;
1764 t[2] = (usage >> 16) & 0xFF;
1765 t[3] = (usage >> 24) & 0xFF;
1766
1767 k1_c.checksum.length = sizeof(k1_c_data);

--- 39 unchanged lines hidden (view full) ---

1807 void *ivec)
1808{
1809 struct checksum_type *c = _find_checksum (CKSUMTYPE_RSA_MD5);
1810 Checksum k1_c, k2_c, k3_c, cksum;
1811 struct key_data ke;
1812 krb5_keyblock kb;
1813 unsigned char t[4];
1814 RC4_KEY rc4_key;
1785 char *cdata = (char *)data;
1815 unsigned char *cdata = data;
1786 unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
1787 unsigned char cksum_data[16];
1788
1789 t[0] = (usage >> 0) & 0xFF;
1790 t[1] = (usage >> 8) & 0xFF;
1791 t[2] = (usage >> 16) & 0xFF;
1792 t[3] = (usage >> 24) & 0xFF;
1793

--- 151 unchanged lines hidden (view full) ---

1945 DES_CBC_encrypt_null_ivec,
1946};
1947static struct encryption_type enctype_arcfour_hmac_md5 = {
1948 ETYPE_ARCFOUR_HMAC_MD5,
1949 "arcfour-hmac-md5",
1950 1,
1951 8,
1952 &keytype_arcfour,
1816 unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
1817 unsigned char cksum_data[16];
1818
1819 t[0] = (usage >> 0) & 0xFF;
1820 t[1] = (usage >> 8) & 0xFF;
1821 t[2] = (usage >> 16) & 0xFF;
1822 t[3] = (usage >> 24) & 0xFF;
1823

--- 151 unchanged lines hidden (view full) ---

1975 DES_CBC_encrypt_null_ivec,
1976};
1977static struct encryption_type enctype_arcfour_hmac_md5 = {
1978 ETYPE_ARCFOUR_HMAC_MD5,
1979 "arcfour-hmac-md5",
1980 1,
1981 8,
1982 &keytype_arcfour,
1983 &checksum_hmac_md5,
1953 &checksum_hmac_md5_enc,
1984 &checksum_hmac_md5_enc,
1954 &checksum_hmac_md5_enc,
1955 F_SPECIAL,
1956 ARCFOUR_encrypt
1957};
1958static struct encryption_type enctype_des3_cbc_md5 = {
1959 ETYPE_DES3_CBC_MD5,
1960 "des3-cbc-md5",
1961 8,
1962 8,

--- 176 unchanged lines hidden (view full) ---

2139 return 0;
2140}
2141#endif
2142
2143krb5_error_code
2144krb5_keytype_to_enctypes (krb5_context context,
2145 krb5_keytype keytype,
2146 unsigned *len,
1985 F_SPECIAL,
1986 ARCFOUR_encrypt
1987};
1988static struct encryption_type enctype_des3_cbc_md5 = {
1989 ETYPE_DES3_CBC_MD5,
1990 "des3-cbc-md5",
1991 8,
1992 8,

--- 176 unchanged lines hidden (view full) ---

2169 return 0;
2170}
2171#endif
2172
2173krb5_error_code
2174krb5_keytype_to_enctypes (krb5_context context,
2175 krb5_keytype keytype,
2176 unsigned *len,
2147 int **val)
2177 krb5_enctype **val)
2148{
2149 int i;
2150 unsigned n = 0;
2178{
2179 int i;
2180 unsigned n = 0;
2151 int *ret;
2181 krb5_enctype *ret;
2152
2153 for (i = num_etypes - 1; i >= 0; --i) {
2154 if (etypes[i]->keytype->type == keytype
2155 && !(etypes[i]->flags & F_PSEUDO))
2156 ++n;
2157 }
2182
2183 for (i = num_etypes - 1; i >= 0; --i) {
2184 if (etypes[i]->keytype->type == keytype
2185 && !(etypes[i]->flags & F_PSEUDO))
2186 ++n;
2187 }
2158 ret = malloc(n * sizeof(int));
2188 ret = malloc(n * sizeof(*ret));
2159 if (ret == NULL && n != 0) {
2160 krb5_set_error_string(context, "malloc: out of memory");
2161 return ENOMEM;
2162 }
2163 n = 0;
2164 for (i = num_etypes - 1; i >= 0; --i) {
2165 if (etypes[i]->keytype->type == keytype
2166 && !(etypes[i]->flags & F_PSEUDO))

--- 8 unchanged lines hidden (view full) ---

2175 * First take the configured list of etypes for `keytype' if available,
2176 * else, do `krb5_keytype_to_enctypes'.
2177 */
2178
2179krb5_error_code
2180krb5_keytype_to_enctypes_default (krb5_context context,
2181 krb5_keytype keytype,
2182 unsigned *len,
2189 if (ret == NULL && n != 0) {
2190 krb5_set_error_string(context, "malloc: out of memory");
2191 return ENOMEM;
2192 }
2193 n = 0;
2194 for (i = num_etypes - 1; i >= 0; --i) {
2195 if (etypes[i]->keytype->type == keytype
2196 && !(etypes[i]->flags & F_PSEUDO))

--- 8 unchanged lines hidden (view full) ---

2205 * First take the configured list of etypes for `keytype' if available,
2206 * else, do `krb5_keytype_to_enctypes'.
2207 */
2208
2209krb5_error_code
2210krb5_keytype_to_enctypes_default (krb5_context context,
2211 krb5_keytype keytype,
2212 unsigned *len,
2183 int **val)
2213 krb5_enctype **val)
2184{
2185 int i, n;
2214{
2215 int i, n;
2186 int *ret;
2216 krb5_enctype *ret;
2187
2188 if (keytype != KEYTYPE_DES || context->etypes_des == NULL)
2189 return krb5_keytype_to_enctypes (context, keytype, len, val);
2190
2191 for (n = 0; context->etypes_des[n]; ++n)
2192 ;
2193 ret = malloc (n * sizeof(*ret));
2194 if (ret == NULL && n != 0) {

--- 46 unchanged lines hidden (view full) ---

2241encrypt_internal_derived(krb5_context context,
2242 krb5_crypto crypto,
2243 unsigned usage,
2244 void *data,
2245 size_t len,
2246 krb5_data *result,
2247 void *ivec)
2248{
2217
2218 if (keytype != KEYTYPE_DES || context->etypes_des == NULL)
2219 return krb5_keytype_to_enctypes (context, keytype, len, val);
2220
2221 for (n = 0; context->etypes_des[n]; ++n)
2222 ;
2223 ret = malloc (n * sizeof(*ret));
2224 if (ret == NULL && n != 0) {

--- 46 unchanged lines hidden (view full) ---

2271encrypt_internal_derived(krb5_context context,
2272 krb5_crypto crypto,
2273 unsigned usage,
2274 void *data,
2275 size_t len,
2276 krb5_data *result,
2277 void *ivec)
2278{
2249 size_t sz, block_sz, checksum_sz;
2279 size_t sz, block_sz, checksum_sz, total_sz;
2250 Checksum cksum;
2251 unsigned char *p, *q;
2252 krb5_error_code ret;
2253 struct key_data *dkey;
2280 Checksum cksum;
2281 unsigned char *p, *q;
2282 krb5_error_code ret;
2283 struct key_data *dkey;
2254 struct encryption_type *et = crypto->et;
2284 const struct encryption_type *et = crypto->et;
2255
2256 checksum_sz = CHECKSUMSIZE(et->keyed_checksum);
2257
2285
2286 checksum_sz = CHECKSUMSIZE(et->keyed_checksum);
2287
2258 sz = et->confoundersize + /* 4 - length */ len;
2288 sz = et->confoundersize + len;
2259 block_sz = (sz + et->blocksize - 1) &~ (et->blocksize - 1); /* pad */
2289 block_sz = (sz + et->blocksize - 1) &~ (et->blocksize - 1); /* pad */
2260 p = calloc(1, block_sz + checksum_sz);
2261 if(p == NULL)
2290 total_sz = block_sz + checksum_sz;
2291 p = calloc(1, total_sz);
2292 if(p == NULL) {
2293 krb5_set_error_string(context, "malloc: out of memory");
2262 return ENOMEM;
2294 return ENOMEM;
2295 }
2263
2264 q = p;
2265 krb5_generate_random_block(q, et->confoundersize); /* XXX */
2266 q += et->confoundersize;
2267 memcpy(q, data, len);
2268
2269 ret = create_checksum(context,
2270 crypto,
2271 INTEGRITY_USAGE(usage),
2272 et->keyed_checksum->type,
2273 p,
2274 block_sz,
2275 &cksum);
2276 if(ret == 0 && cksum.checksum.length != checksum_sz) {
2277 free_Checksum (&cksum);
2278 krb5_clear_error_string (context);
2279 ret = KRB5_CRYPTO_INTERNAL;
2280 }
2296
2297 q = p;
2298 krb5_generate_random_block(q, et->confoundersize); /* XXX */
2299 q += et->confoundersize;
2300 memcpy(q, data, len);
2301
2302 ret = create_checksum(context,
2303 crypto,
2304 INTEGRITY_USAGE(usage),
2305 et->keyed_checksum->type,
2306 p,
2307 block_sz,
2308 &cksum);
2309 if(ret == 0 && cksum.checksum.length != checksum_sz) {
2310 free_Checksum (&cksum);
2311 krb5_clear_error_string (context);
2312 ret = KRB5_CRYPTO_INTERNAL;
2313 }
2281 if(ret) {
2282 memset(p, 0, block_sz + checksum_sz);
2283 free(p);
2284 return ret;
2285 }
2314 if(ret)
2315 goto fail;
2286 memcpy(p + block_sz, cksum.checksum.data, cksum.checksum.length);
2287 free_Checksum (&cksum);
2288 ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey);
2316 memcpy(p + block_sz, cksum.checksum.data, cksum.checksum.length);
2317 free_Checksum (&cksum);
2318 ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey);
2289 if(ret) {
2290 memset(p, 0, block_sz + checksum_sz);
2291 free(p);
2292 return ret;
2293 }
2319 if(ret)
2320 goto fail;
2294 ret = _key_schedule(context, dkey);
2321 ret = _key_schedule(context, dkey);
2295 if(ret) {
2296 memset(p, 0, block_sz);
2297 free(p);
2298 return ret;
2299 }
2322 if(ret)
2323 goto fail;
2300#ifdef CRYPTO_DEBUG
2301 krb5_crypto_debug(context, 1, block_sz, dkey->key);
2302#endif
2324#ifdef CRYPTO_DEBUG
2325 krb5_crypto_debug(context, 1, block_sz, dkey->key);
2326#endif
2303 (*et->encrypt)(context, dkey, p, block_sz, 1, usage, ivec);
2327 ret = (*et->encrypt)(context, dkey, p, block_sz, 1, usage, ivec);
2328 if (ret)
2329 goto fail;
2304 result->data = p;
2330 result->data = p;
2305 result->length = block_sz + checksum_sz;
2331 result->length = total_sz;
2306 return 0;
2332 return 0;
2333 fail:
2334 memset(p, 0, total_sz);
2335 free(p);
2336 return ret;
2307}
2308
2337}
2338
2339
2309static krb5_error_code
2310encrypt_internal(krb5_context context,
2311 krb5_crypto crypto,
2312 void *data,
2313 size_t len,
2314 krb5_data *result,
2315 void *ivec)
2316{
2317 size_t sz, block_sz, checksum_sz;
2318 Checksum cksum;
2319 unsigned char *p, *q;
2320 krb5_error_code ret;
2340static krb5_error_code
2341encrypt_internal(krb5_context context,
2342 krb5_crypto crypto,
2343 void *data,
2344 size_t len,
2345 krb5_data *result,
2346 void *ivec)
2347{
2348 size_t sz, block_sz, checksum_sz;
2349 Checksum cksum;
2350 unsigned char *p, *q;
2351 krb5_error_code ret;
2321 struct encryption_type *et = crypto->et;
2352 const struct encryption_type *et = crypto->et;
2322
2323 checksum_sz = CHECKSUMSIZE(et->checksum);
2324
2325 sz = et->confoundersize + checksum_sz + len;
2326 block_sz = (sz + et->blocksize - 1) &~ (et->blocksize - 1); /* pad */
2327 p = calloc(1, block_sz);
2328 if(p == NULL) {
2329 krb5_set_error_string(context, "malloc: out of memory");

--- 11 unchanged lines hidden (view full) ---

2341 crypto,
2342 0,
2343 et->checksum->type,
2344 p,
2345 block_sz,
2346 &cksum);
2347 if(ret == 0 && cksum.checksum.length != checksum_sz) {
2348 krb5_clear_error_string (context);
2353
2354 checksum_sz = CHECKSUMSIZE(et->checksum);
2355
2356 sz = et->confoundersize + checksum_sz + len;
2357 block_sz = (sz + et->blocksize - 1) &~ (et->blocksize - 1); /* pad */
2358 p = calloc(1, block_sz);
2359 if(p == NULL) {
2360 krb5_set_error_string(context, "malloc: out of memory");

--- 11 unchanged lines hidden (view full) ---

2372 crypto,
2373 0,
2374 et->checksum->type,
2375 p,
2376 block_sz,
2377 &cksum);
2378 if(ret == 0 && cksum.checksum.length != checksum_sz) {
2379 krb5_clear_error_string (context);
2380 free_Checksum(&cksum);
2349 ret = KRB5_CRYPTO_INTERNAL;
2350 }
2381 ret = KRB5_CRYPTO_INTERNAL;
2382 }
2351 if(ret) {
2352 memset(p, 0, block_sz);
2353 free(p);
2354 free_Checksum(&cksum);
2355 return ret;
2356 }
2383 if(ret)
2384 goto fail;
2357 memcpy(p + et->confoundersize, cksum.checksum.data, cksum.checksum.length);
2358 free_Checksum(&cksum);
2359 ret = _key_schedule(context, &crypto->key);
2385 memcpy(p + et->confoundersize, cksum.checksum.data, cksum.checksum.length);
2386 free_Checksum(&cksum);
2387 ret = _key_schedule(context, &crypto->key);
2360 if(ret) {
2388 if(ret)
2389 goto fail;
2390#ifdef CRYPTO_DEBUG
2391 krb5_crypto_debug(context, 1, block_sz, crypto->key.key);
2392#endif
2393 ret = (*et->encrypt)(context, &crypto->key, p, block_sz, 1, 0, ivec);
2394 if (ret) {
2361 memset(p, 0, block_sz);
2362 free(p);
2363 return ret;
2364 }
2395 memset(p, 0, block_sz);
2396 free(p);
2397 return ret;
2398 }
2365#ifdef CRYPTO_DEBUG
2366 krb5_crypto_debug(context, 1, block_sz, crypto->key.key);
2367#endif
2368 (*et->encrypt)(context, &crypto->key, p, block_sz, 1, 0, ivec);
2369 result->data = p;
2370 result->length = block_sz;
2371 return 0;
2399 result->data = p;
2400 result->length = block_sz;
2401 return 0;
2402 fail:
2403 memset(p, 0, block_sz);
2404 free(p);
2405 return ret;
2372}
2373
2374static krb5_error_code
2375encrypt_internal_special(krb5_context context,
2376 krb5_crypto crypto,
2377 int usage,
2378 void *data,
2379 size_t len,
2380 krb5_data *result,
2381 void *ivec)
2382{
2383 struct encryption_type *et = crypto->et;
2384 size_t cksum_sz = CHECKSUMSIZE(et->checksum);
2385 size_t sz = len + cksum_sz + et->confoundersize;
2386 char *tmp, *p;
2406}
2407
2408static krb5_error_code
2409encrypt_internal_special(krb5_context context,
2410 krb5_crypto crypto,
2411 int usage,
2412 void *data,
2413 size_t len,
2414 krb5_data *result,
2415 void *ivec)
2416{
2417 struct encryption_type *et = crypto->et;
2418 size_t cksum_sz = CHECKSUMSIZE(et->checksum);
2419 size_t sz = len + cksum_sz + et->confoundersize;
2420 char *tmp, *p;
2421 krb5_error_code ret;
2387
2388 tmp = malloc (sz);
2389 if (tmp == NULL) {
2390 krb5_set_error_string(context, "malloc: out of memory");
2391 return ENOMEM;
2392 }
2393 p = tmp;
2394 memset (p, 0, cksum_sz);
2395 p += cksum_sz;
2396 krb5_generate_random_block(p, et->confoundersize);
2397 p += et->confoundersize;
2398 memcpy (p, data, len);
2422
2423 tmp = malloc (sz);
2424 if (tmp == NULL) {
2425 krb5_set_error_string(context, "malloc: out of memory");
2426 return ENOMEM;
2427 }
2428 p = tmp;
2429 memset (p, 0, cksum_sz);
2430 p += cksum_sz;
2431 krb5_generate_random_block(p, et->confoundersize);
2432 p += et->confoundersize;
2433 memcpy (p, data, len);
2399 (*et->encrypt)(context, &crypto->key, tmp, sz, TRUE, usage, ivec);
2434 ret = (*et->encrypt)(context, &crypto->key, tmp, sz, TRUE, usage, ivec);
2435 if (ret) {
2436 memset(tmp, 0, sz);
2437 free(tmp);
2438 return ret;
2439 }
2400 result->data = tmp;
2401 result->length = sz;
2402 return 0;
2403}
2404
2405static krb5_error_code
2406decrypt_internal_derived(krb5_context context,
2407 krb5_crypto crypto,

--- 34 unchanged lines hidden (view full) ---

2442 ret = _key_schedule(context, dkey);
2443 if(ret) {
2444 free(p);
2445 return ret;
2446 }
2447#ifdef CRYPTO_DEBUG
2448 krb5_crypto_debug(context, 0, len, dkey->key);
2449#endif
2440 result->data = tmp;
2441 result->length = sz;
2442 return 0;
2443}
2444
2445static krb5_error_code
2446decrypt_internal_derived(krb5_context context,
2447 krb5_crypto crypto,

--- 34 unchanged lines hidden (view full) ---

2482 ret = _key_schedule(context, dkey);
2483 if(ret) {
2484 free(p);
2485 return ret;
2486 }
2487#ifdef CRYPTO_DEBUG
2488 krb5_crypto_debug(context, 0, len, dkey->key);
2489#endif
2450 (*et->encrypt)(context, dkey, p, len, 0, usage, ivec);
2490 ret = (*et->encrypt)(context, dkey, p, len, 0, usage, ivec);
2491 if (ret) {
2492 free(p);
2493 return ret;
2494 }
2451
2452 cksum.checksum.data = p + len;
2453 cksum.checksum.length = checksum_sz;
2454 cksum.cksumtype = CHECKSUMTYPE(et->keyed_checksum);
2455
2456 ret = verify_checksum(context,
2457 crypto,
2458 INTEGRITY_USAGE(usage),

--- 41 unchanged lines hidden (view full) ---

2500 ret = _key_schedule(context, &crypto->key);
2501 if(ret) {
2502 free(p);
2503 return ret;
2504 }
2505#ifdef CRYPTO_DEBUG
2506 krb5_crypto_debug(context, 0, len, crypto->key.key);
2507#endif
2495
2496 cksum.checksum.data = p + len;
2497 cksum.checksum.length = checksum_sz;
2498 cksum.cksumtype = CHECKSUMTYPE(et->keyed_checksum);
2499
2500 ret = verify_checksum(context,
2501 crypto,
2502 INTEGRITY_USAGE(usage),

--- 41 unchanged lines hidden (view full) ---

2544 ret = _key_schedule(context, &crypto->key);
2545 if(ret) {
2546 free(p);
2547 return ret;
2548 }
2549#ifdef CRYPTO_DEBUG
2550 krb5_crypto_debug(context, 0, len, crypto->key.key);
2551#endif
2508 (*et->encrypt)(context, &crypto->key, p, len, 0, 0, ivec);
2552 ret = (*et->encrypt)(context, &crypto->key, p, len, 0, 0, ivec);
2553 if (ret) {
2554 free(p);
2555 return ret;
2556 }
2509 ret = krb5_data_copy(&cksum.checksum, p + et->confoundersize, checksum_sz);
2510 if(ret) {
2511 free(p);
2512 return ret;
2513 }
2514 memset(p + et->confoundersize, 0, checksum_sz);
2515 cksum.cksumtype = CHECKSUMTYPE(et->checksum);
2516 ret = verify_checksum(context, NULL, 0, p, len, &cksum);

--- 23 unchanged lines hidden (view full) ---

2540 krb5_data *result,
2541 void *ivec)
2542{
2543 struct encryption_type *et = crypto->et;
2544 size_t cksum_sz = CHECKSUMSIZE(et->checksum);
2545 size_t sz = len - cksum_sz - et->confoundersize;
2546 char *cdata = (char *)data;
2547 char *tmp;
2557 ret = krb5_data_copy(&cksum.checksum, p + et->confoundersize, checksum_sz);
2558 if(ret) {
2559 free(p);
2560 return ret;
2561 }
2562 memset(p + et->confoundersize, 0, checksum_sz);
2563 cksum.cksumtype = CHECKSUMTYPE(et->checksum);
2564 ret = verify_checksum(context, NULL, 0, p, len, &cksum);

--- 23 unchanged lines hidden (view full) ---

2588 krb5_data *result,
2589 void *ivec)
2590{
2591 struct encryption_type *et = crypto->et;
2592 size_t cksum_sz = CHECKSUMSIZE(et->checksum);
2593 size_t sz = len - cksum_sz - et->confoundersize;
2594 char *cdata = (char *)data;
2595 char *tmp;
2596 krb5_error_code ret;
2548
2549 tmp = malloc (sz);
2550 if (tmp == NULL) {
2551 krb5_set_error_string(context, "malloc: out of memory");
2552 return ENOMEM;
2553 }
2554
2597
2598 tmp = malloc (sz);
2599 if (tmp == NULL) {
2600 krb5_set_error_string(context, "malloc: out of memory");
2601 return ENOMEM;
2602 }
2603
2555 (*et->encrypt)(context, &crypto->key, data, len, FALSE, usage, ivec);
2604 ret = (*et->encrypt)(context, &crypto->key, data, len, FALSE, usage, ivec);
2605 if (ret) {
2606 free(tmp);
2607 return ret;
2608 }
2556
2557 memcpy (tmp, cdata + cksum_sz + et->confoundersize, sz);
2558
2559 result->data = tmp;
2560 result->length = sz;
2561 return 0;
2562}
2563

--- 87 unchanged lines hidden (view full) ---

2651 return krb5_decrypt(context, crypto, usage,
2652 e->cipher.data, e->cipher.length, result);
2653}
2654
2655/************************************************************
2656 * *
2657 ************************************************************/
2658
2609
2610 memcpy (tmp, cdata + cksum_sz + et->confoundersize, sz);
2611
2612 result->data = tmp;
2613 result->length = sz;
2614 return 0;
2615}
2616

--- 87 unchanged lines hidden (view full) ---

2704 return krb5_decrypt(context, crypto, usage,
2705 e->cipher.data, e->cipher.length, result);
2706}
2707
2708/************************************************************
2709 * *
2710 ************************************************************/
2711
2659#ifdef HAVE_OPENSSL_DES_H
2712#ifdef HAVE_OPENSSL
2660#include <openssl/rand.h>
2661
2662/* From openssl/crypto/rand/rand_lcl.h */
2663#define ENTROPY_NEEDED 20
2664static int
2665seed_something(void)
2666{
2667 int fd = -1;
2713#include <openssl/rand.h>
2714
2715/* From openssl/crypto/rand/rand_lcl.h */
2716#define ENTROPY_NEEDED 20
2717static int
2718seed_something(void)
2719{
2720 int fd = -1;
2668 size_t len;
2669 char buf[1024], seedfile[256];
2670
2671 /* If there is a seed file, load it. But such a file cannot be trusted,
2672 so use 0 for the entropy estimate */
2673 if (RAND_file_name(seedfile, sizeof(seedfile))) {
2674 fd = open(seedfile, O_RDONLY);
2675 if (fd >= 0) {
2676 read(fd, buf, sizeof(buf));
2677 /* Use the full buffer anyway */
2678 RAND_add(buf, sizeof(buf), 0.0);
2679 } else
2680 seedfile[0] = '\0';
2681 } else
2682 seedfile[0] = '\0';
2683
2684 /* Calling RAND_status() will try to use /dev/urandom if it exists so
2685 we do not have to deal with it. */
2686 if (RAND_status() != 1) {
2687 krb5_context context;
2721 char buf[1024], seedfile[256];
2722
2723 /* If there is a seed file, load it. But such a file cannot be trusted,
2724 so use 0 for the entropy estimate */
2725 if (RAND_file_name(seedfile, sizeof(seedfile))) {
2726 fd = open(seedfile, O_RDONLY);
2727 if (fd >= 0) {
2728 read(fd, buf, sizeof(buf));
2729 /* Use the full buffer anyway */
2730 RAND_add(buf, sizeof(buf), 0.0);
2731 } else
2732 seedfile[0] = '\0';
2733 } else
2734 seedfile[0] = '\0';
2735
2736 /* Calling RAND_status() will try to use /dev/urandom if it exists so
2737 we do not have to deal with it. */
2738 if (RAND_status() != 1) {
2739 krb5_context context;
2688 char *p;
2740 const char *p;
2689
2690 /* Try using egd */
2691 if (!krb5_init_context(&context)) {
2692 p = krb5_config_get_string(context, NULL, "libdefaults",
2693 "egd_socket", NULL);
2694 if (p != NULL)
2695 RAND_egd_bytes(p, ENTROPY_NEEDED);
2696 krb5_free_context(context);

--- 299 unchanged lines hidden (view full) ---

2996 const void *str,
2997 size_t len,
2998 krb5_enctype etype,
2999 krb5_keyblock *key)
3000{
3001 struct encryption_type *et = _find_enctype(etype);
3002 krb5_error_code ret;
3003 struct key_data kd;
2741
2742 /* Try using egd */
2743 if (!krb5_init_context(&context)) {
2744 p = krb5_config_get_string(context, NULL, "libdefaults",
2745 "egd_socket", NULL);
2746 if (p != NULL)
2747 RAND_egd_bytes(p, ENTROPY_NEEDED);
2748 krb5_free_context(context);

--- 299 unchanged lines hidden (view full) ---

3048 const void *str,
3049 size_t len,
3050 krb5_enctype etype,
3051 krb5_keyblock *key)
3052{
3053 struct encryption_type *et = _find_enctype(etype);
3054 krb5_error_code ret;
3055 struct key_data kd;
3056 size_t keylen = et->keytype->bits / 8;
3004 u_char *tmp;
3005
3006 if(et == NULL) {
3007 krb5_set_error_string (context, "encryption type %d not supported",
3008 etype);
3009 return KRB5_PROG_ETYPE_NOSUPP;
3010 }
3011 ALLOC(kd.key, 1);
3057 u_char *tmp;
3058
3059 if(et == NULL) {
3060 krb5_set_error_string (context, "encryption type %d not supported",
3061 etype);
3062 return KRB5_PROG_ETYPE_NOSUPP;
3063 }
3064 ALLOC(kd.key, 1);
3065 if(kd.key == NULL) {
3066 krb5_set_error_string (context, "malloc: out of memory");
3067 return ENOMEM;
3068 }
3069 ret = krb5_data_alloc(&kd.key->keyvalue, et->keytype->size);
3070 if(ret) {
3071 free(kd.key);
3072 return ret;
3073 }
3012 kd.key->keytype = etype;
3074 kd.key->keytype = etype;
3013 tmp = malloc (et->keytype->bits / 8);
3014 _krb5_n_fold(str, len, tmp, et->keytype->bits / 8);
3015 krb5_data_alloc(&kd.key->keyvalue, et->keytype->size);
3075 tmp = malloc (keylen);
3076 if(tmp == NULL) {
3077 krb5_free_keyblock(context, kd.key);
3078 krb5_set_error_string (context, "malloc: out of memory");
3079 return ENOMEM;
3080 }
3081 _krb5_n_fold(str, len, tmp, keylen);
3016 kd.schedule = NULL;
3082 kd.schedule = NULL;
3017 DES3_postproc (context, tmp, et->keytype->bits / 8, &kd); /* XXX */
3018 ret = derive_key(context,
3083 DES3_postproc (context, tmp, keylen, &kd); /* XXX */
3084 memset(tmp, 0, keylen);
3085 free(tmp);
3086 ret = derive_key(context,
3019 et,
3020 &kd,
3021 "kerberos", /* XXX well known constant */
3022 strlen("kerberos"));
3023 ret = krb5_copy_keyblock_contents(context, kd.key, key);
3024 free_key_data(context, &kd);
3025 return ret;
3026}

--- 147 unchanged lines hidden ---
3087 et,
3088 &kd,
3089 "kerberos", /* XXX well known constant */
3090 strlen("kerberos"));
3091 ret = krb5_copy_keyblock_contents(context, kd.key, key);
3092 free_key_data(context, &kd);
3093 return ret;
3094}

--- 147 unchanged lines hidden ---