diff options
author | jsing <> | 2014-04-14 17:06:44 +0000 |
---|---|---|
committer | jsing <> | 2014-04-14 17:06:44 +0000 |
commit | c92eea01f6db550066e83439f809146837da9ca7 (patch) | |
tree | e0c6c08ef350fc246ac4d84e9b94b5849597f162 | |
parent | 7c4dfd0ead0256dd6883e0e339e7d7b03eb9cd0c (diff) | |
download | openbsd-c92eea01f6db550066e83439f809146837da9ca7.tar.gz openbsd-c92eea01f6db550066e83439f809146837da9ca7.tar.bz2 openbsd-c92eea01f6db550066e83439f809146837da9ca7.zip |
First pass at applying KNF to the OpenSSL code, which almost makes it
readable. This pass is whitespace only and can readily be verified using
tr and md5.
-rw-r--r-- | src/lib/libssl/src/ssl/kssl.c | 1417 |
1 files changed, 738 insertions, 679 deletions
diff --git a/src/lib/libssl/src/ssl/kssl.c b/src/lib/libssl/src/ssl/kssl.c index a90c90fa6e..2bbe3ab647 100644 --- a/src/lib/libssl/src/ssl/kssl.c +++ b/src/lib/libssl/src/ssl/kssl.c | |||
@@ -87,11 +87,12 @@ | |||
87 | 87 | ||
88 | /* memory allocation functions for non-temporary storage | 88 | /* memory allocation functions for non-temporary storage |
89 | * (e.g. stuff that gets saved into the kssl context) */ | 89 | * (e.g. stuff that gets saved into the kssl context) */ |
90 | static void* kssl_calloc(size_t nmemb, size_t size) | 90 | static void* |
91 | kssl_calloc(size_t nmemb, size_t size) | ||
91 | { | 92 | { |
92 | void* p; | 93 | void* p; |
93 | 94 | ||
94 | p=OPENSSL_malloc(nmemb*size); | 95 | p = OPENSSL_malloc(nmemb*size); |
95 | if (p){ | 96 | if (p){ |
96 | memset(p, 0, nmemb*size); | 97 | memset(p, 0, nmemb*size); |
97 | } | 98 | } |
@@ -105,11 +106,11 @@ static void* kssl_calloc(size_t nmemb, size_t size) | |||
105 | 106 | ||
106 | char | 107 | char |
107 | *kstring(char *string) | 108 | *kstring(char *string) |
108 | { | 109 | { |
109 | static char *null = "[NULL]"; | 110 | static char *null = "[NULL]"; |
110 | 111 | ||
111 | return ((string == NULL)? null: string); | 112 | return ((string == NULL) ? null : string); |
112 | } | 113 | } |
113 | 114 | ||
114 | /* Given KRB5 enctype (basically DES or 3DES), | 115 | /* Given KRB5 enctype (basically DES or 3DES), |
115 | ** return closest match openssl EVP_ encryption algorithm. | 116 | ** return closest match openssl EVP_ encryption algorithm. |
@@ -118,25 +119,25 @@ char | |||
118 | */ | 119 | */ |
119 | const EVP_CIPHER * | 120 | const EVP_CIPHER * |
120 | kssl_map_enc(krb5_enctype enctype) | 121 | kssl_map_enc(krb5_enctype enctype) |
121 | { | 122 | { |
122 | switch (enctype) | 123 | switch (enctype) { |
123 | { | 124 | case ENCTYPE_DES_HMAC_SHA1: /* EVP_des_cbc(); */ |
124 | case ENCTYPE_DES_HMAC_SHA1: /* EVP_des_cbc(); */ | ||
125 | case ENCTYPE_DES_CBC_CRC: | 125 | case ENCTYPE_DES_CBC_CRC: |
126 | case ENCTYPE_DES_CBC_MD4: | 126 | case ENCTYPE_DES_CBC_MD4: |
127 | case ENCTYPE_DES_CBC_MD5: | 127 | case ENCTYPE_DES_CBC_MD5: |
128 | case ENCTYPE_DES_CBC_RAW: | 128 | case ENCTYPE_DES_CBC_RAW: |
129 | return EVP_des_cbc(); | 129 | return EVP_des_cbc(); |
130 | break; | 130 | break; |
131 | case ENCTYPE_DES3_CBC_SHA1: /* EVP_des_ede3_cbc(); */ | 131 | case ENCTYPE_DES3_CBC_SHA1: /* EVP_des_ede3_cbc(); */ |
132 | case ENCTYPE_DES3_CBC_SHA: | 132 | case ENCTYPE_DES3_CBC_SHA: |
133 | case ENCTYPE_DES3_CBC_RAW: | 133 | case ENCTYPE_DES3_CBC_RAW: |
134 | return EVP_des_ede3_cbc(); | 134 | return EVP_des_ede3_cbc(); |
135 | break; | 135 | break; |
136 | default: return NULL; | 136 | default: |
137 | break; | 137 | return NULL; |
138 | } | 138 | break; |
139 | } | 139 | } |
140 | } | ||
140 | 141 | ||
141 | 142 | ||
142 | /* Return true:1 if p "looks like" the start of the real authenticator | 143 | /* Return true:1 if p "looks like" the start of the real authenticator |
@@ -144,31 +145,58 @@ kssl_map_enc(krb5_enctype enctype) | |||
144 | ** "62 xx 30 yy" (APPLICATION-2, SEQUENCE), where xx-yy =~ 2, and | 145 | ** "62 xx 30 yy" (APPLICATION-2, SEQUENCE), where xx-yy =~ 2, and |
145 | ** xx and yy are possibly multi-byte length fields. | 146 | ** xx and yy are possibly multi-byte length fields. |
146 | */ | 147 | */ |
147 | static int kssl_test_confound(unsigned char *p) | 148 | static int |
148 | { | 149 | kssl_test_confound(unsigned char *p) |
150 | { | ||
149 | int len = 2; | 151 | int len = 2; |
150 | int xx = 0, yy = 0; | 152 | int xx = 0, yy = 0; |
151 | 153 | ||
152 | if (*p++ != 0x62) return 0; | 154 | if (*p++ != 0x62) |
153 | if (*p > 0x82) return 0; | 155 | return 0; |
154 | switch(*p) { | 156 | if (*p > 0x82) |
155 | case 0x82: p++; xx = (*p++ << 8); xx += *p++; break; | 157 | return 0; |
156 | case 0x81: p++; xx = *p++; break; | 158 | switch (*p) { |
157 | case 0x80: return 0; | 159 | case 0x82: |
158 | default: xx = *p++; break; | 160 | p++; |
159 | } | 161 | xx = (*p++ << 8); |
160 | if (*p++ != 0x30) return 0; | 162 | xx += *p++; |
161 | if (*p > 0x82) return 0; | 163 | break; |
162 | switch(*p) { | 164 | case 0x81: |
163 | case 0x82: p++; len+=2; yy = (*p++ << 8); yy += *p++; break; | 165 | p++; |
164 | case 0x81: p++; len++; yy = *p++; break; | 166 | xx = *p++; |
165 | case 0x80: return 0; | 167 | break; |
166 | default: yy = *p++; break; | 168 | case 0x80: |
167 | } | 169 | return 0; |
168 | 170 | default: | |
169 | return (xx - len == yy)? 1: 0; | 171 | xx = *p++; |
172 | break; | ||
173 | } | ||
174 | if (*p++ != 0x30) | ||
175 | return 0; | ||
176 | if (*p > 0x82) | ||
177 | return 0; | ||
178 | switch (*p) { | ||
179 | case 0x82: | ||
180 | p++; | ||
181 | len += 2; | ||
182 | yy = (*p++ << 8); | ||
183 | yy += *p++; | ||
184 | break; | ||
185 | case 0x81: | ||
186 | p++; | ||
187 | len++; | ||
188 | yy = *p++; | ||
189 | break; | ||
190 | case 0x80: | ||
191 | return 0; | ||
192 | default: | ||
193 | yy = *p++; | ||
194 | break; | ||
170 | } | 195 | } |
171 | 196 | ||
197 | return (xx - len == yy) ? 1: 0; | ||
198 | } | ||
199 | |||
172 | /* Allocate, fill, and return cksumlens array of checksum lengths. | 200 | /* Allocate, fill, and return cksumlens array of checksum lengths. |
173 | ** This array holds just the unique elements from the krb5_cksumarray[]. | 201 | ** This array holds just the unique elements from the krb5_cksumarray[]. |
174 | ** array[n] == 0 signals end of data. | 202 | ** array[n] == 0 signals end of data. |
@@ -179,8 +207,9 @@ static int kssl_test_confound(unsigned char *p) | |||
179 | ** what the highest assigned CKSUMTYPE_ constant is. As of 1.2.2 | 207 | ** what the highest assigned CKSUMTYPE_ constant is. As of 1.2.2 |
180 | ** it is 0x000c (CKSUMTYPE_HMAC_SHA1_DES3). So we will use 0x0010. | 208 | ** it is 0x000c (CKSUMTYPE_HMAC_SHA1_DES3). So we will use 0x0010. |
181 | */ | 209 | */ |
182 | static size_t *populate_cksumlens(void) | 210 | static size_t |
183 | { | 211 | *populate_cksumlens(void) |
212 | { | ||
184 | int i, j, n; | 213 | int i, j, n; |
185 | static size_t *cklens = NULL; | 214 | static size_t *cklens = NULL; |
186 | 215 | ||
@@ -189,26 +218,30 @@ static size_t *populate_cksumlens(void) | |||
189 | #else | 218 | #else |
190 | n = 0x0010; | 219 | n = 0x0010; |
191 | #endif /* KRB5_MIT_OLD11 */ | 220 | #endif /* KRB5_MIT_OLD11 */ |
192 | 221 | ||
193 | #ifdef KRB5CHECKAUTH | 222 | #ifdef KRB5CHECKAUTH |
194 | if (!cklens && !(cklens = (size_t *) calloc(sizeof(int),n+1))) return NULL; | 223 | if (!cklens && !(cklens = (size_t *) |
195 | 224 | calloc(sizeof(int), n + 1))) return NULL; | |
196 | for (i=0; i < n; i++) { | 225 | |
197 | if (!valid_cksumtype(i)) continue; /* array has holes */ | 226 | for (i = 0; i < n; i++) { |
198 | for (j=0; j < n; j++) { | 227 | if (!valid_cksumtype(i)) |
199 | if (cklens[j] == 0) { | 228 | continue; /* array has holes */ |
200 | cklens[j] = krb5_checksum_size(NULL,i); | 229 | for (j = 0; j < n; j++) { |
201 | break; /* krb5 elem was new: add */ | 230 | if (cklens[j] == 0) { |
202 | } | 231 | cklens[j] = krb5_checksum_size(NULL, i); |
203 | if (cklens[j] == krb5_checksum_size(NULL,i)) { | 232 | break; |
204 | break; /* ignore duplicate elements */ | 233 | /* krb5 elem was new: add */ |
205 | } | 234 | } |
235 | if (cklens[j] == krb5_checksum_size(NULL, i)) { | ||
236 | break; | ||
237 | /* ignore duplicate elements */ | ||
206 | } | 238 | } |
207 | } | 239 | } |
240 | } | ||
208 | #endif /* KRB5CHECKAUTH */ | 241 | #endif /* KRB5CHECKAUTH */ |
209 | 242 | ||
210 | return cklens; | 243 | return cklens; |
211 | } | 244 | } |
212 | 245 | ||
213 | /* Return pointer to start of real authenticator within authenticator, or | 246 | /* Return pointer to start of real authenticator within authenticator, or |
214 | ** return NULL on error. | 247 | ** return NULL on error. |
@@ -217,24 +250,26 @@ static size_t *populate_cksumlens(void) | |||
217 | ** This hackery wouldn't be necessary if MIT KRB5 1.0.6 had the | 250 | ** This hackery wouldn't be necessary if MIT KRB5 1.0.6 had the |
218 | ** krb5_auth_con_getcksumtype() function advertised in its krb5.h. | 251 | ** krb5_auth_con_getcksumtype() function advertised in its krb5.h. |
219 | */ | 252 | */ |
220 | unsigned char *kssl_skip_confound(krb5_enctype etype, unsigned char *a) | 253 | unsigned char |
221 | { | 254 | *kssl_skip_confound(krb5_enctype etype, unsigned char *a) |
255 | { | ||
222 | int i, conlen; | 256 | int i, conlen; |
223 | size_t cklen; | 257 | size_t cklen; |
224 | static size_t *cksumlens = NULL; | 258 | static size_t *cksumlens = NULL; |
225 | unsigned char *test_auth; | 259 | unsigned char *test_auth; |
226 | 260 | ||
227 | conlen = (etype)? 8: 0; | 261 | conlen = (etype) ? 8: 0; |
228 | 262 | ||
229 | if (!cksumlens && !(cksumlens = populate_cksumlens())) return NULL; | 263 | if (!cksumlens && !(cksumlens = populate_cksumlens())) |
230 | for (i=0; (cklen = cksumlens[i]) != 0; i++) | 264 | return NULL; |
231 | { | 265 | for (i = 0; (cklen = cksumlens[i]) != 0; i++) { |
232 | test_auth = a + conlen + cklen; | 266 | test_auth = a + conlen + cklen; |
233 | if (kssl_test_confound(test_auth)) return test_auth; | 267 | if (kssl_test_confound(test_auth)) |
234 | } | 268 | return test_auth; |
269 | } | ||
235 | 270 | ||
236 | return NULL; | 271 | return NULL; |
237 | } | 272 | } |
238 | 273 | ||
239 | 274 | ||
240 | /* Set kssl_err error info when reason text is a simple string | 275 | /* Set kssl_err error info when reason text is a simple string |
@@ -242,89 +277,84 @@ unsigned char *kssl_skip_confound(krb5_enctype etype, unsigned char *a) | |||
242 | */ | 277 | */ |
243 | void | 278 | void |
244 | kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text) | 279 | kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text) |
245 | { | 280 | { |
246 | if (kssl_err == NULL) return; | 281 | if (kssl_err == NULL) |
282 | return; | ||
247 | 283 | ||
248 | kssl_err->reason = reason; | 284 | kssl_err->reason = reason; |
249 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, "%s", text); | 285 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, "%s", text); |
250 | return; | 286 | return; |
251 | } | 287 | } |
252 | 288 | ||
253 | 289 | ||
254 | /* Display contents of krb5_data struct, for debugging | 290 | /* Display contents of krb5_data struct, for debugging |
255 | */ | 291 | */ |
256 | void | 292 | void |
257 | print_krb5_data(char *label, krb5_data *kdata) | 293 | print_krb5_data(char *label, krb5_data *kdata) |
258 | { | 294 | { |
259 | int i; | 295 | int i; |
260 | 296 | ||
261 | printf("%s[%d] ", label, kdata->length); | 297 | printf("%s[%d] ", label, kdata->length); |
262 | for (i=0; i < (int)kdata->length; i++) | 298 | for (i = 0; i < (int)kdata->length; i++) { |
263 | { | 299 | if (0 && isprint((int) kdata->data[i])) |
264 | if (0 && isprint((int) kdata->data[i])) | 300 | printf( "%c ", kdata->data[i]); |
265 | printf( "%c ", kdata->data[i]); | ||
266 | else | 301 | else |
267 | printf( "%02x ", (unsigned char) kdata->data[i]); | 302 | printf( "%02x ", (unsigned char) kdata->data[i]); |
268 | } | 303 | } |
269 | printf("\n"); | 304 | printf("\n"); |
270 | } | 305 | } |
271 | 306 | ||
272 | 307 | ||
273 | /* Display contents of krb5_authdata struct, for debugging | 308 | /* Display contents of krb5_authdata struct, for debugging |
274 | */ | 309 | */ |
275 | void | 310 | void |
276 | print_krb5_authdata(char *label, krb5_authdata **adata) | 311 | print_krb5_authdata(char *label, krb5_authdata **adata) |
277 | { | 312 | { |
278 | if (adata == NULL) | 313 | if (adata == NULL) { |
279 | { | ||
280 | printf("%s, authdata==0\n", label); | 314 | printf("%s, authdata==0\n", label); |
281 | return; | 315 | return; |
282 | } | 316 | } |
283 | printf("%s [%p]\n", label, (void *)adata); | 317 | printf("%s [%p]\n", label, (void *)adata); |
284 | #if 0 | 318 | #if 0 |
285 | { | 319 | { |
286 | int i; | 320 | int i; |
287 | printf("%s[at%d:%d] ", label, adata->ad_type, adata->length); | 321 | printf("%s[at%d:%d] ", label, adata->ad_type, adata->length); |
288 | for (i=0; i < adata->length; i++) | 322 | for (i = 0; i < adata->length; i++) { |
289 | { | 323 | printf((isprint(adata->contents[i]))? "%c ": "%02x", |
290 | printf((isprint(adata->contents[i]))? "%c ": "%02x", | 324 | adata->contents[i]); |
291 | adata->contents[i]); | ||
292 | } | 325 | } |
293 | printf("\n"); | 326 | printf("\n"); |
294 | } | 327 | } |
295 | #endif | 328 | #endif |
296 | } | 329 | } |
297 | 330 | ||
298 | 331 | ||
299 | /* Display contents of krb5_keyblock struct, for debugging | 332 | /* Display contents of krb5_keyblock struct, for debugging |
300 | */ | 333 | */ |
301 | void | 334 | void |
302 | print_krb5_keyblock(char *label, krb5_keyblock *keyblk) | 335 | print_krb5_keyblock(char *label, krb5_keyblock *keyblk) |
303 | { | 336 | { |
304 | int i; | 337 | int i; |
305 | 338 | ||
306 | if (keyblk == NULL) | 339 | if (keyblk == NULL) { |
307 | { | ||
308 | printf("%s, keyblk==0\n", label); | 340 | printf("%s, keyblk==0\n", label); |
309 | return; | 341 | return; |
310 | } | 342 | } |
311 | #ifdef KRB5_HEIMDAL | 343 | #ifdef KRB5_HEIMDAL |
312 | printf("%s\n\t[et%d:%d]: ", label, keyblk->keytype, | 344 | printf("%s\n\t[et%d:%d]: ", label, keyblk->keytype, |
313 | keyblk->keyvalue->length); | 345 | keyblk->keyvalue->length); |
314 | for (i=0; i < (int)keyblk->keyvalue->length; i++) | 346 | for (i = 0; i < (int)keyblk->keyvalue->length; i++) { |
315 | { | ||
316 | printf("%02x",(unsigned char *)(keyblk->keyvalue->contents)[i]); | 347 | printf("%02x",(unsigned char *)(keyblk->keyvalue->contents)[i]); |
317 | } | 348 | } |
318 | printf("\n"); | 349 | printf("\n"); |
319 | #else | 350 | #else |
320 | printf("%s\n\t[et%d:%d]: ", label, keyblk->enctype, keyblk->length); | 351 | printf("%s\n\t[et%d:%d]: ", label, keyblk->enctype, keyblk->length); |
321 | for (i=0; i < (int)keyblk->length; i++) | 352 | for (i = 0; i < (int)keyblk->length; i++) { |
322 | { | 353 | printf("%02x", keyblk->contents[i]); |
323 | printf("%02x",keyblk->contents[i]); | 354 | } |
324 | } | ||
325 | printf("\n"); | 355 | printf("\n"); |
326 | #endif | 356 | #endif |
327 | } | 357 | } |
328 | 358 | ||
329 | 359 | ||
330 | /* Display contents of krb5_principal_data struct, for debugging | 360 | /* Display contents of krb5_principal_data struct, for debugging |
@@ -332,23 +362,24 @@ print_krb5_keyblock(char *label, krb5_keyblock *keyblk) | |||
332 | */ | 362 | */ |
333 | static void | 363 | static void |
334 | print_krb5_princ(char *label, krb5_principal_data *princ) | 364 | print_krb5_princ(char *label, krb5_principal_data *princ) |
335 | { | 365 | { |
336 | int i, ui, uj; | 366 | int i, ui, uj; |
337 | 367 | ||
338 | printf("%s principal Realm: ", label); | 368 | printf("%s principal Realm: ", label); |
339 | if (princ == NULL) return; | 369 | if (princ == NULL) |
340 | for (ui=0; ui < (int)princ->realm.length; ui++) putchar(princ->realm.data[ui]); | 370 | return; |
341 | printf(" (nametype %d) has %d strings:\n", princ->type,princ->length); | 371 | for (ui = 0; ui < (int)princ->realm.length; ui++) |
342 | for (i=0; i < (int)princ->length; i++) | 372 | putchar(princ->realm.data[ui]); |
343 | { | 373 | printf(" (nametype %d) has %d strings:\n", princ->type, princ->length); |
374 | for (i = 0; i < (int)princ->length; i++) { | ||
344 | printf("\t%d [%d]: ", i, princ->data[i].length); | 375 | printf("\t%d [%d]: ", i, princ->data[i].length); |
345 | for (uj=0; uj < (int)princ->data[i].length; uj++) { | 376 | for (uj = 0; uj < (int)princ->data[i].length; uj++) { |
346 | putchar(princ->data[i].data[uj]); | 377 | putchar(princ->data[i].data[uj]); |
347 | } | ||
348 | printf("\n"); | ||
349 | } | 378 | } |
379 | printf("\n"); | ||
380 | } | ||
350 | return; | 381 | return; |
351 | } | 382 | } |
352 | 383 | ||
353 | 384 | ||
354 | /* Given krb5 service (typically "kssl") and hostname in kssl_ctx, | 385 | /* Given krb5 service (typically "kssl") and hostname in kssl_ctx, |
@@ -362,11 +393,12 @@ print_krb5_princ(char *label, krb5_principal_data *princ) | |||
362 | ** 20010606 VRS May also return optional authenticator. | 393 | ** 20010606 VRS May also return optional authenticator. |
363 | */ | 394 | */ |
364 | krb5_error_code | 395 | krb5_error_code |
365 | kssl_cget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | 396 | kssl_cget_tkt( |
366 | /* OUT */ krb5_data **enc_ticketp, | 397 | /* UPDATE */ KSSL_CTX *kssl_ctx, |
367 | /* UPDATE */ krb5_data *authenp, | 398 | /* OUT */ krb5_data **enc_ticketp, |
368 | /* OUT */ KSSL_ERR *kssl_err) | 399 | /* UPDATE */ krb5_data *authenp, |
369 | { | 400 | /* OUT */ KSSL_ERR *kssl_err) |
401 | { | ||
370 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | 402 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; |
371 | krb5_context krb5context = NULL; | 403 | krb5_context krb5context = NULL; |
372 | krb5_auth_context krb5auth_context = NULL; | 404 | krb5_auth_context krb5auth_context = NULL; |
@@ -377,47 +409,40 @@ kssl_cget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
377 | kssl_err_set(kssl_err, 0, ""); | 409 | kssl_err_set(kssl_err, 0, ""); |
378 | memset((char *)&krb5creds, 0, sizeof(krb5creds)); | 410 | memset((char *)&krb5creds, 0, sizeof(krb5creds)); |
379 | 411 | ||
380 | if (!kssl_ctx) | 412 | if (!kssl_ctx) { |
381 | { | ||
382 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 413 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
383 | "No kssl_ctx defined.\n"); | 414 | "No kssl_ctx defined.\n"); |
384 | goto err; | 415 | goto err; |
385 | } | 416 | } else if (!kssl_ctx->service_host) { |
386 | else if (!kssl_ctx->service_host) | ||
387 | { | ||
388 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 417 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
389 | "kssl_ctx service_host undefined.\n"); | 418 | "kssl_ctx service_host undefined.\n"); |
390 | goto err; | 419 | goto err; |
391 | } | 420 | } |
392 | 421 | ||
393 | if ((krb5rc = krb5_init_context(&krb5context)) != 0) | 422 | if ((krb5rc = krb5_init_context(&krb5context)) != 0) { |
394 | { | ||
395 | BIO_snprintf(kssl_err->text,KSSL_ERR_MAX, | 423 | BIO_snprintf(kssl_err->text,KSSL_ERR_MAX, |
396 | "krb5_init_context() fails: %d\n", krb5rc); | 424 | "krb5_init_context() fails: %d\n", krb5rc); |
397 | kssl_err->reason = SSL_R_KRB5_C_INIT; | 425 | kssl_err->reason = SSL_R_KRB5_C_INIT; |
398 | goto err; | 426 | goto err; |
399 | } | 427 | } |
400 | 428 | ||
401 | if ((krb5rc = krb5_sname_to_principal(krb5context, | 429 | if ((krb5rc = krb5_sname_to_principal( |
402 | kssl_ctx->service_host, | 430 | krb5context, kssl_ctx->service_host, |
403 | (kssl_ctx->service_name)? kssl_ctx->service_name: KRB5SVC, | 431 | (kssl_ctx->service_name) ? kssl_ctx->service_name : KRB5SVC, |
404 | KRB5_NT_SRV_HST, &krb5creds.server)) != 0) | 432 | KRB5_NT_SRV_HST, &krb5creds.server)) != 0) { |
405 | { | ||
406 | BIO_snprintf(kssl_err->text,KSSL_ERR_MAX, | 433 | BIO_snprintf(kssl_err->text,KSSL_ERR_MAX, |
407 | "krb5_sname_to_principal() fails for %s/%s\n", | 434 | "krb5_sname_to_principal() fails for %s/%s\n", |
408 | kssl_ctx->service_host, | 435 | kssl_ctx->service_host, |
409 | (kssl_ctx->service_name)? kssl_ctx->service_name: | 436 | (kssl_ctx->service_name) ? kssl_ctx->service_name: KRB5SVC); |
410 | KRB5SVC); | ||
411 | kssl_err->reason = SSL_R_KRB5_C_INIT; | 437 | kssl_err->reason = SSL_R_KRB5_C_INIT; |
412 | goto err; | 438 | goto err; |
413 | } | 439 | } |
414 | 440 | ||
415 | if ((krb5rc = krb5_cc_default(krb5context, &krb5ccdef)) != 0) | 441 | if ((krb5rc = krb5_cc_default(krb5context, &krb5ccdef)) != 0) { |
416 | { | ||
417 | kssl_err_set(kssl_err, SSL_R_KRB5_C_CC_PRINC, | 442 | kssl_err_set(kssl_err, SSL_R_KRB5_C_CC_PRINC, |
418 | "krb5_cc_default fails.\n"); | 443 | "krb5_cc_default fails.\n"); |
419 | goto err; | 444 | goto err; |
420 | } | 445 | } |
421 | 446 | ||
422 | if ((krb5rc = krb5_cc_get_principal(krb5context, krb5ccdef, | 447 | if ((krb5rc = krb5_cc_get_principal(krb5context, krb5ccdef, |
423 | &krb5creds.client)) != 0) | 448 | &krb5creds.client)) != 0) |
@@ -428,12 +453,11 @@ kssl_cget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
428 | } | 453 | } |
429 | 454 | ||
430 | if ((krb5rc = krb5_get_credentials(krb5context, 0, krb5ccdef, | 455 | if ((krb5rc = krb5_get_credentials(krb5context, 0, krb5ccdef, |
431 | &krb5creds, &krb5credsp)) != 0) | 456 | &krb5creds, &krb5credsp)) != 0) { |
432 | { | ||
433 | kssl_err_set(kssl_err, SSL_R_KRB5_C_GET_CRED, | 457 | kssl_err_set(kssl_err, SSL_R_KRB5_C_GET_CRED, |
434 | "krb5_get_credentials() fails.\n"); | 458 | "krb5_get_credentials() fails.\n"); |
435 | goto err; | 459 | goto err; |
436 | } | 460 | } |
437 | 461 | ||
438 | *enc_ticketp = &krb5credsp->ticket; | 462 | *enc_ticketp = &krb5credsp->ticket; |
439 | #ifdef KRB5_HEIMDAL | 463 | #ifdef KRB5_HEIMDAL |
@@ -448,8 +472,7 @@ kssl_cget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
448 | ** 20010605 VRS reinstated to offer Authenticator to KerberosWrapper | 472 | ** 20010605 VRS reinstated to offer Authenticator to KerberosWrapper |
449 | */ | 473 | */ |
450 | krb5_app_req.length = 0; | 474 | krb5_app_req.length = 0; |
451 | if (authenp) | 475 | if (authenp) { |
452 | { | ||
453 | krb5_data krb5in_data; | 476 | krb5_data krb5in_data; |
454 | const unsigned char *p; | 477 | const unsigned char *p; |
455 | long arlen; | 478 | long arlen; |
@@ -459,63 +482,61 @@ kssl_cget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
459 | krb5in_data.data = NULL; | 482 | krb5in_data.data = NULL; |
460 | krb5in_data.length = 0; | 483 | krb5in_data.length = 0; |
461 | if ((krb5rc = krb5_mk_req_extended(krb5context, | 484 | if ((krb5rc = krb5_mk_req_extended(krb5context, |
462 | &krb5auth_context, 0, &krb5in_data, krb5credsp, | 485 | &krb5auth_context, 0, &krb5in_data, krb5credsp, |
463 | &krb5_app_req)) != 0) | 486 | &krb5_app_req)) != 0) { |
464 | { | ||
465 | kssl_err_set(kssl_err, SSL_R_KRB5_C_MK_REQ, | 487 | kssl_err_set(kssl_err, SSL_R_KRB5_C_MK_REQ, |
466 | "krb5_mk_req_extended() fails.\n"); | 488 | "krb5_mk_req_extended() fails.\n"); |
467 | goto err; | 489 | goto err; |
468 | } | 490 | } |
469 | 491 | ||
470 | arlen = krb5_app_req.length; | 492 | arlen = krb5_app_req.length; |
471 | p = (unsigned char *)krb5_app_req.data; | 493 | p = (unsigned char *)krb5_app_req.data; |
472 | ap_req = (KRB5_APREQBODY *) d2i_KRB5_APREQ(NULL, &p, arlen); | 494 | ap_req = (KRB5_APREQBODY *) d2i_KRB5_APREQ(NULL, &p, arlen); |
473 | if (ap_req) | 495 | if (ap_req) { |
474 | { | ||
475 | authenp->length = i2d_KRB5_ENCDATA( | 496 | authenp->length = i2d_KRB5_ENCDATA( |
476 | ap_req->authenticator, NULL); | 497 | ap_req->authenticator, NULL); |
477 | if (authenp->length && | 498 | if (authenp->length && |
478 | (authenp->data = malloc(authenp->length))) | 499 | (authenp->data = malloc(authenp->length))) { |
479 | { | ||
480 | unsigned char *adp = (unsigned char *)authenp->data; | 500 | unsigned char *adp = (unsigned char *)authenp->data; |
481 | authenp->length = i2d_KRB5_ENCDATA( | 501 | authenp->length = i2d_KRB5_ENCDATA( |
482 | ap_req->authenticator, &adp); | 502 | ap_req->authenticator, &adp); |
483 | } | ||
484 | } | 503 | } |
485 | |||
486 | if (ap_req) KRB5_APREQ_free((KRB5_APREQ *) ap_req); | ||
487 | if (krb5_app_req.length) | ||
488 | kssl_krb5_free_data_contents(krb5context,&krb5_app_req); | ||
489 | } | 504 | } |
505 | |||
506 | if (ap_req) | ||
507 | KRB5_APREQ_free((KRB5_APREQ *) ap_req); | ||
508 | if (krb5_app_req.length) | ||
509 | kssl_krb5_free_data_contents(krb5context, &krb5_app_req); | ||
510 | } | ||
490 | #ifdef KRB5_HEIMDAL | 511 | #ifdef KRB5_HEIMDAL |
491 | if (kssl_ctx_setkey(kssl_ctx, &krb5credsp->session)) | 512 | if (kssl_ctx_setkey(kssl_ctx, &krb5credsp->session)) { |
492 | { | ||
493 | kssl_err_set(kssl_err, SSL_R_KRB5_C_INIT, | 513 | kssl_err_set(kssl_err, SSL_R_KRB5_C_INIT, |
494 | "kssl_ctx_setkey() fails.\n"); | 514 | "kssl_ctx_setkey() fails.\n"); |
495 | } | 515 | } |
496 | #else | 516 | #else |
497 | if (kssl_ctx_setkey(kssl_ctx, &krb5credsp->keyblock)) | 517 | if (kssl_ctx_setkey(kssl_ctx, &krb5credsp->keyblock)) { |
498 | { | ||
499 | kssl_err_set(kssl_err, SSL_R_KRB5_C_INIT, | 518 | kssl_err_set(kssl_err, SSL_R_KRB5_C_INIT, |
500 | "kssl_ctx_setkey() fails.\n"); | 519 | "kssl_ctx_setkey() fails.\n"); |
501 | } | 520 | } |
502 | #endif | 521 | #endif |
503 | else krb5rc = 0; | 522 | else |
523 | krb5rc = 0; | ||
504 | 524 | ||
505 | err: | 525 | err: |
506 | #ifdef KSSL_DEBUG | 526 | #ifdef KSSL_DEBUG |
507 | kssl_ctx_show(kssl_ctx); | 527 | kssl_ctx_show(kssl_ctx); |
508 | #endif /* KSSL_DEBUG */ | 528 | #endif /* KSSL_DEBUG */ |
509 | 529 | ||
510 | if (krb5creds.client) krb5_free_principal(krb5context, | 530 | if (krb5creds.client) |
511 | krb5creds.client); | 531 | krb5_free_principal(krb5context, krb5creds.client); |
512 | if (krb5creds.server) krb5_free_principal(krb5context, | 532 | if (krb5creds.server) |
513 | krb5creds.server); | 533 | krb5_free_principal(krb5context, krb5creds.server); |
514 | if (krb5auth_context) krb5_auth_con_free(krb5context, | 534 | if (krb5auth_context) |
515 | krb5auth_context); | 535 | krb5_auth_con_free(krb5context, krb5auth_context); |
516 | if (krb5context) krb5_free_context(krb5context); | 536 | if (krb5context) |
537 | krb5_free_context(krb5context); | ||
517 | return (krb5rc); | 538 | return (krb5rc); |
518 | } | 539 | } |
519 | 540 | ||
520 | 541 | ||
521 | /* Given d2i_-decoded asn1ticket, allocate and return a new krb5_ticket. | 542 | /* Given d2i_-decoded asn1ticket, allocate and return a new krb5_ticket. |
@@ -530,76 +551,71 @@ kssl_cget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
530 | ** like the real thing. | 551 | ** like the real thing. |
531 | */ | 552 | */ |
532 | static krb5_error_code | 553 | static krb5_error_code |
533 | kssl_TKT2tkt( /* IN */ krb5_context krb5context, | 554 | kssl_TKT2tkt( |
534 | /* IN */ KRB5_TKTBODY *asn1ticket, | 555 | /* IN */ krb5_context krb5context, |
535 | /* OUT */ krb5_ticket **krb5ticket, | 556 | /* IN */ KRB5_TKTBODY *asn1ticket, |
536 | /* OUT */ KSSL_ERR *kssl_err ) | 557 | /* OUT */ krb5_ticket **krb5ticket, |
537 | { | 558 | /* OUT */ KSSL_ERR *kssl_err ) |
559 | { | ||
538 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | 560 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; |
539 | krb5_ticket *new5ticket = NULL; | 561 | krb5_ticket *new5ticket = NULL; |
540 | ASN1_GENERALSTRING *gstr_svc, *gstr_host; | 562 | ASN1_GENERALSTRING *gstr_svc, *gstr_host; |
541 | 563 | ||
542 | *krb5ticket = NULL; | 564 | *krb5ticket = NULL; |
543 | 565 | ||
544 | if (asn1ticket == NULL || asn1ticket->realm == NULL || | 566 | if (asn1ticket == NULL || asn1ticket->realm == NULL || |
545 | asn1ticket->sname == NULL || | 567 | asn1ticket->sname == NULL || |
546 | sk_ASN1_GENERALSTRING_num(asn1ticket->sname->namestring) < 2) | 568 | sk_ASN1_GENERALSTRING_num(asn1ticket->sname->namestring) < 2) { |
547 | { | ||
548 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 569 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
549 | "Null field in asn1ticket.\n"); | 570 | "Null field in asn1ticket.\n"); |
550 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 571 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
551 | return KRB5KRB_ERR_GENERIC; | 572 | return KRB5KRB_ERR_GENERIC; |
552 | } | 573 | } |
553 | 574 | ||
554 | if ((new5ticket = (krb5_ticket *) calloc(1, sizeof(krb5_ticket)))==NULL) | 575 | if ((new5ticket = |
555 | { | 576 | (krb5_ticket *)calloc(1, sizeof(krb5_ticket))) == NULL) { |
556 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 577 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
557 | "Unable to allocate new krb5_ticket.\n"); | 578 | "Unable to allocate new krb5_ticket.\n"); |
558 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 579 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
559 | return ENOMEM; /* or KRB5KRB_ERR_GENERIC; */ | 580 | return ENOMEM; /* or KRB5KRB_ERR_GENERIC; */ |
560 | } | 581 | } |
561 | 582 | ||
562 | gstr_svc = sk_ASN1_GENERALSTRING_value(asn1ticket->sname->namestring, 0); | 583 | gstr_svc = sk_ASN1_GENERALSTRING_value(asn1ticket->sname->namestring, 0); |
563 | gstr_host = sk_ASN1_GENERALSTRING_value(asn1ticket->sname->namestring, 1); | 584 | gstr_host = sk_ASN1_GENERALSTRING_value(asn1ticket->sname->namestring, 1); |
564 | 585 | ||
565 | if ((krb5rc = kssl_build_principal_2(krb5context, | 586 | if ((krb5rc = kssl_build_principal_2(krb5context, &new5ticket->server, |
566 | &new5ticket->server, | 587 | asn1ticket->realm->length, (char *)asn1ticket->realm->data, |
567 | asn1ticket->realm->length, (char *)asn1ticket->realm->data, | 588 | gstr_svc->length, (char *)gstr_svc->data, gstr_host->length, |
568 | gstr_svc->length, (char *)gstr_svc->data, | 589 | (char *)gstr_host->data)) != 0) { |
569 | gstr_host->length, (char *)gstr_host->data)) != 0) | ||
570 | { | ||
571 | free(new5ticket); | 590 | free(new5ticket); |
572 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 591 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
573 | "Error building ticket server principal.\n"); | 592 | "Error building ticket server principal.\n"); |
574 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 593 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
575 | return krb5rc; /* or KRB5KRB_ERR_GENERIC; */ | 594 | return krb5rc; /* or KRB5KRB_ERR_GENERIC; */ |
576 | } | 595 | } |
577 | 596 | ||
578 | krb5_princ_type(krb5context, new5ticket->server) = | 597 | krb5_princ_type(krb5context, new5ticket->server) = |
579 | asn1ticket->sname->nametype->data[0]; | 598 | asn1ticket->sname->nametype->data[0]; |
580 | new5ticket->enc_part.enctype = asn1ticket->encdata->etype->data[0]; | 599 | new5ticket->enc_part.enctype = asn1ticket->encdata->etype->data[0]; |
581 | new5ticket->enc_part.kvno = asn1ticket->encdata->kvno->data[0]; | 600 | new5ticket->enc_part.kvno = asn1ticket->encdata->kvno->data[0]; |
582 | new5ticket->enc_part.ciphertext.length = | 601 | new5ticket->enc_part.ciphertext.length = |
583 | asn1ticket->encdata->cipher->length; | 602 | asn1ticket->encdata->cipher->length; |
584 | if ((new5ticket->enc_part.ciphertext.data = | 603 | if ((new5ticket->enc_part.ciphertext.data = |
585 | calloc(1, asn1ticket->encdata->cipher->length)) == NULL) | 604 | calloc(1, asn1ticket->encdata->cipher->length)) == NULL) { |
586 | { | ||
587 | free(new5ticket); | 605 | free(new5ticket); |
588 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 606 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
589 | "Error allocating cipher in krb5ticket.\n"); | 607 | "Error allocating cipher in krb5ticket.\n"); |
590 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 608 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
591 | return KRB5KRB_ERR_GENERIC; | 609 | return KRB5KRB_ERR_GENERIC; |
592 | } | 610 | } else { |
593 | else | ||
594 | { | ||
595 | memcpy(new5ticket->enc_part.ciphertext.data, | 611 | memcpy(new5ticket->enc_part.ciphertext.data, |
596 | asn1ticket->encdata->cipher->data, | 612 | asn1ticket->encdata->cipher->data, |
597 | asn1ticket->encdata->cipher->length); | 613 | asn1ticket->encdata->cipher->length); |
598 | } | 614 | } |
599 | 615 | ||
600 | *krb5ticket = new5ticket; | 616 | *krb5ticket = new5ticket; |
601 | return 0; | 617 | return 0; |
602 | } | 618 | } |
603 | 619 | ||
604 | 620 | ||
605 | /* Given krb5 service name in KSSL_CTX *kssl_ctx (typically "kssl"), | 621 | /* Given krb5 service name in KSSL_CTX *kssl_ctx (typically "kssl"), |
@@ -610,11 +626,12 @@ kssl_TKT2tkt( /* IN */ krb5_context krb5context, | |||
610 | ** 19990702 VRS Started. | 626 | ** 19990702 VRS Started. |
611 | */ | 627 | */ |
612 | krb5_error_code | 628 | krb5_error_code |
613 | kssl_sget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | 629 | kssl_sget_tkt( |
614 | /* IN */ krb5_data *indata, | 630 | /* UPDATE */ KSSL_CTX *kssl_ctx, |
615 | /* OUT */ krb5_ticket_times *ttimes, | 631 | /* IN */ krb5_data *indata, |
616 | /* OUT */ KSSL_ERR *kssl_err ) | 632 | /* OUT */ krb5_ticket_times *ttimes, |
617 | { | 633 | /* OUT */ KSSL_ERR *kssl_err ) |
634 | { | ||
618 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | 635 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; |
619 | static krb5_context krb5context = NULL; | 636 | static krb5_context krb5context = NULL; |
620 | static krb5_auth_context krb5auth_context = NULL; | 637 | static krb5_auth_context krb5auth_context = NULL; |
@@ -628,100 +645,86 @@ kssl_sget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
628 | 645 | ||
629 | kssl_err_set(kssl_err, 0, ""); | 646 | kssl_err_set(kssl_err, 0, ""); |
630 | 647 | ||
631 | if (!kssl_ctx) | 648 | if (!kssl_ctx) { |
632 | { | ||
633 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 649 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
634 | "No kssl_ctx defined.\n"); | 650 | "No kssl_ctx defined.\n"); |
635 | goto err; | 651 | goto err; |
636 | } | 652 | } |
637 | 653 | ||
638 | #ifdef KSSL_DEBUG | 654 | #ifdef KSSL_DEBUG |
639 | printf("in kssl_sget_tkt(%s)\n", kstring(kssl_ctx->service_name)); | 655 | printf("in kssl_sget_tkt(%s)\n", kstring(kssl_ctx->service_name)); |
640 | #endif /* KSSL_DEBUG */ | 656 | #endif /* KSSL_DEBUG */ |
641 | 657 | ||
642 | if (!krb5context && (krb5rc = krb5_init_context(&krb5context))) | 658 | if (!krb5context && (krb5rc = krb5_init_context(&krb5context))) { |
643 | { | ||
644 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 659 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
645 | "krb5_init_context() fails.\n"); | 660 | "krb5_init_context() fails.\n"); |
646 | goto err; | 661 | goto err; |
647 | } | 662 | } |
648 | if (krb5auth_context && | 663 | if (krb5auth_context && |
649 | (krb5rc = krb5_auth_con_free(krb5context, krb5auth_context))) | 664 | (krb5rc = krb5_auth_con_free(krb5context, krb5auth_context))) { |
650 | { | ||
651 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 665 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
652 | "krb5_auth_con_free() fails.\n"); | 666 | "krb5_auth_con_free() fails.\n"); |
653 | goto err; | 667 | goto err; |
654 | } | 668 | } else |
655 | else krb5auth_context = NULL; | 669 | krb5auth_context = NULL; |
656 | if (!krb5auth_context && | 670 | if (!krb5auth_context && |
657 | (krb5rc = krb5_auth_con_init(krb5context, &krb5auth_context))) | 671 | (krb5rc = krb5_auth_con_init(krb5context, &krb5auth_context))) { |
658 | { | ||
659 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 672 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
660 | "krb5_auth_con_init() fails.\n"); | 673 | "krb5_auth_con_init() fails.\n"); |
661 | goto err; | 674 | goto err; |
662 | } | 675 | } |
663 | 676 | ||
664 | |||
665 | if ((krb5rc = krb5_auth_con_getrcache(krb5context, krb5auth_context, | 677 | if ((krb5rc = krb5_auth_con_getrcache(krb5context, krb5auth_context, |
666 | &rcache))) | 678 | &rcache))) { |
667 | { | 679 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
668 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 680 | "krb5_auth_con_getrcache() fails.\n"); |
669 | "krb5_auth_con_getrcache() fails.\n"); | 681 | goto err; |
670 | goto err; | 682 | } |
671 | } | 683 | |
672 | |||
673 | if ((krb5rc = krb5_sname_to_principal(krb5context, NULL, | 684 | if ((krb5rc = krb5_sname_to_principal(krb5context, NULL, |
674 | (kssl_ctx->service_name)? kssl_ctx->service_name: KRB5SVC, | 685 | (kssl_ctx->service_name) ? kssl_ctx->service_name : KRB5SVC, |
675 | KRB5_NT_SRV_HST, &krb5server)) != 0) | 686 | KRB5_NT_SRV_HST, &krb5server)) != 0) { |
676 | { | ||
677 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 687 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
678 | "krb5_sname_to_principal() fails.\n"); | 688 | "krb5_sname_to_principal() fails.\n"); |
679 | goto err; | 689 | goto err; |
690 | } | ||
691 | |||
692 | if (rcache == NULL) { | ||
693 | if ((krb5rc = krb5_get_server_rcache(krb5context, | ||
694 | krb5_princ_component(krb5context, krb5server, 0), | ||
695 | &rcache))) { | ||
696 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
697 | "krb5_get_server_rcache() fails.\n"); | ||
698 | goto err; | ||
680 | } | 699 | } |
700 | } | ||
681 | 701 | ||
682 | if (rcache == NULL) | 702 | if ((krb5rc = krb5_auth_con_setrcache(krb5context, krb5auth_context, |
683 | { | 703 | rcache))) { |
684 | if ((krb5rc = krb5_get_server_rcache(krb5context, | 704 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
685 | krb5_princ_component(krb5context, krb5server, 0), | 705 | "krb5_auth_con_setrcache() fails.\n"); |
686 | &rcache))) | 706 | goto err; |
687 | { | 707 | } |
688 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
689 | "krb5_get_server_rcache() fails.\n"); | ||
690 | goto err; | ||
691 | } | ||
692 | } | ||
693 | |||
694 | if ((krb5rc = krb5_auth_con_setrcache(krb5context, krb5auth_context, rcache))) | ||
695 | { | ||
696 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
697 | "krb5_auth_con_setrcache() fails.\n"); | ||
698 | goto err; | ||
699 | } | ||
700 | 708 | ||
701 | 709 | ||
702 | /* kssl_ctx->keytab_file == NULL ==> use Kerberos default | 710 | /* kssl_ctx->keytab_file == NULL ==> use Kerberos default |
703 | */ | 711 | */ |
704 | if (kssl_ctx->keytab_file) | 712 | if (kssl_ctx->keytab_file) { |
705 | { | ||
706 | krb5rc = krb5_kt_resolve(krb5context, kssl_ctx->keytab_file, | 713 | krb5rc = krb5_kt_resolve(krb5context, kssl_ctx->keytab_file, |
707 | &krb5keytab); | 714 | &krb5keytab); |
708 | if (krb5rc) | 715 | if (krb5rc) { |
709 | { | ||
710 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 716 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
711 | "krb5_kt_resolve() fails.\n"); | 717 | "krb5_kt_resolve() fails.\n"); |
712 | goto err; | 718 | goto err; |
713 | } | ||
714 | } | 719 | } |
715 | else | 720 | } else { |
716 | { | 721 | krb5rc = krb5_kt_default(krb5context, &krb5keytab); |
717 | krb5rc = krb5_kt_default(krb5context,&krb5keytab); | 722 | if (krb5rc) { |
718 | if (krb5rc) | 723 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
719 | { | 724 | "krb5_kt_default() fails.\n"); |
720 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
721 | "krb5_kt_default() fails.\n"); | ||
722 | goto err; | 725 | goto err; |
723 | } | ||
724 | } | 726 | } |
727 | } | ||
725 | 728 | ||
726 | /* Actual Kerberos5 krb5_recvauth() has initial conversation here | 729 | /* Actual Kerberos5 krb5_recvauth() has initial conversation here |
727 | ** o check KRB5_SENDAUTH_BADAUTHVERS | 730 | ** o check KRB5_SENDAUTH_BADAUTHVERS |
@@ -739,157 +742,156 @@ kssl_sget_tkt( /* UPDATE */ KSSL_CTX *kssl_ctx, | |||
739 | 742 | ||
740 | p = (unsigned char *)indata->data; | 743 | p = (unsigned char *)indata->data; |
741 | if ((asn1ticket = (KRB5_TKTBODY *) d2i_KRB5_TICKET(NULL, &p, | 744 | if ((asn1ticket = (KRB5_TKTBODY *) d2i_KRB5_TICKET(NULL, &p, |
742 | (long) indata->length)) == NULL) | 745 | (long)indata->length)) == NULL) { |
743 | { | ||
744 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 746 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
745 | "d2i_KRB5_TICKET() ASN.1 decode failure.\n"); | 747 | "d2i_KRB5_TICKET() ASN.1 decode failure.\n"); |
746 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 748 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
747 | goto err; | 749 | goto err; |
748 | } | 750 | } |
749 | 751 | ||
750 | /* Was: krb5rc = krb5_decode_ticket(krb5in_data,&krb5ticket)) != 0) */ | 752 | /* Was: krb5rc = krb5_decode_ticket(krb5in_data,&krb5ticket)) != 0) */ |
751 | if ((krb5rc = kssl_TKT2tkt(krb5context, asn1ticket, &krb5ticket, | 753 | if ((krb5rc = kssl_TKT2tkt(krb5context, asn1ticket, &krb5ticket, |
752 | kssl_err)) != 0) | 754 | kssl_err)) != 0) { |
753 | { | ||
754 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 755 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
755 | "Error converting ASN.1 ticket to krb5_ticket.\n"); | 756 | "Error converting ASN.1 ticket to krb5_ticket.\n"); |
756 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 757 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
757 | goto err; | 758 | goto err; |
758 | } | 759 | } |
759 | 760 | ||
760 | if (! krb5_principal_compare(krb5context, krb5server, | 761 | if (!krb5_principal_compare(krb5context, krb5server, |
761 | krb5ticket->server)) { | 762 | krb5ticket->server)) { |
762 | krb5rc = KRB5_PRINC_NOMATCH; | 763 | krb5rc = KRB5_PRINC_NOMATCH; |
763 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 764 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
764 | "server principal != ticket principal\n"); | 765 | "server principal != ticket principal\n"); |
765 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 766 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
766 | goto err; | 767 | goto err; |
767 | } | 768 | } |
768 | if ((krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, | 769 | if ((krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, |
769 | krb5ticket->server, krb5ticket->enc_part.kvno, | 770 | krb5ticket->server, krb5ticket->enc_part.kvno, |
770 | krb5ticket->enc_part.enctype, &kt_entry)) != 0) { | 771 | krb5ticket->enc_part.enctype, &kt_entry)) != 0) { |
771 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 772 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
772 | "krb5_kt_get_entry() fails with %x.\n", krb5rc); | 773 | "krb5_kt_get_entry() fails with %x.\n", krb5rc); |
773 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 774 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
774 | goto err; | 775 | goto err; |
775 | } | 776 | } |
776 | if ((krb5rc = krb5_decrypt_tkt_part(krb5context, &kt_entry.key, | 777 | if ((krb5rc = krb5_decrypt_tkt_part(krb5context, &kt_entry.key, |
777 | krb5ticket)) != 0) { | 778 | krb5ticket)) != 0) { |
778 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, | 779 | BIO_snprintf(kssl_err->text, KSSL_ERR_MAX, |
779 | "krb5_decrypt_tkt_part() failed.\n"); | 780 | "krb5_decrypt_tkt_part() failed.\n"); |
780 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | 781 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; |
781 | goto err; | 782 | goto err; |
782 | } | 783 | } else { |
783 | else { | ||
784 | krb5_kt_free_entry(krb5context, &kt_entry); | 784 | krb5_kt_free_entry(krb5context, &kt_entry); |
785 | #ifdef KSSL_DEBUG | 785 | #ifdef KSSL_DEBUG |
786 | { | 786 | { |
787 | int i; krb5_address **paddr = krb5ticket->enc_part2->caddrs; | 787 | int i; |
788 | printf("Decrypted ticket fields:\n"); | 788 | krb5_address **paddr = krb5ticket->enc_part2->caddrs; |
789 | printf("\tflags: %X, transit-type: %X", | 789 | printf("Decrypted ticket fields:\n"); |
790 | printf("\tflags: %X, transit-type: %X", | ||
790 | krb5ticket->enc_part2->flags, | 791 | krb5ticket->enc_part2->flags, |
791 | krb5ticket->enc_part2->transited.tr_type); | 792 | krb5ticket->enc_part2->transited.tr_type); |
792 | print_krb5_data("\ttransit-data: ", | 793 | print_krb5_data("\ttransit-data: ", |
793 | &(krb5ticket->enc_part2->transited.tr_contents)); | 794 | &(krb5ticket->enc_part2->transited.tr_contents)); |
794 | printf("\tcaddrs: %p, authdata: %p\n", | 795 | printf("\tcaddrs: %p, authdata: %p\n", |
795 | krb5ticket->enc_part2->caddrs, | 796 | krb5ticket->enc_part2->caddrs, |
796 | krb5ticket->enc_part2->authorization_data); | 797 | krb5ticket->enc_part2->authorization_data); |
797 | if (paddr) | 798 | if (paddr) { |
798 | { | 799 | printf("\tcaddrs:\n"); |
799 | printf("\tcaddrs:\n"); | 800 | for (i = 0; paddr[i] != NULL; i++) { |
800 | for (i=0; paddr[i] != NULL; i++) | 801 | krb5_data d; |
801 | { | 802 | d.length = paddr[i]->length; |
802 | krb5_data d; | 803 | d.data = paddr[i]->contents; |
803 | d.length=paddr[i]->length; | 804 | print_krb5_data("\t\tIP: ", &d); |
804 | d.data=paddr[i]->contents; | ||
805 | print_krb5_data("\t\tIP: ", &d); | ||
806 | } | 805 | } |
807 | } | 806 | } |
808 | printf("\tstart/auth/end times: %d / %d / %d\n", | 807 | printf("\tstart/auth/end times: %d / %d / %d\n", |
809 | krb5ticket->enc_part2->times.starttime, | 808 | krb5ticket->enc_part2->times.starttime, |
810 | krb5ticket->enc_part2->times.authtime, | 809 | krb5ticket->enc_part2->times.authtime, |
811 | krb5ticket->enc_part2->times.endtime); | 810 | krb5ticket->enc_part2->times.endtime); |
812 | } | 811 | } |
813 | #endif /* KSSL_DEBUG */ | 812 | #endif /* KSSL_DEBUG */ |
814 | } | 813 | } |
815 | 814 | ||
816 | krb5rc = KRB5_NO_TKT_SUPPLIED; | 815 | krb5rc = KRB5_NO_TKT_SUPPLIED; |
817 | if (!krb5ticket || !krb5ticket->enc_part2 || | 816 | if (!krb5ticket || !krb5ticket->enc_part2 || |
818 | !krb5ticket->enc_part2->client || | 817 | !krb5ticket->enc_part2->client || |
819 | !krb5ticket->enc_part2->client->data || | 818 | !krb5ticket->enc_part2->client->data || |
820 | !krb5ticket->enc_part2->session) | 819 | !krb5ticket->enc_part2->session) { |
821 | { | ||
822 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | ||
823 | "bad ticket from krb5_rd_req.\n"); | ||
824 | } | ||
825 | else if (kssl_ctx_setprinc(kssl_ctx, KSSL_CLIENT, | ||
826 | &krb5ticket->enc_part2->client->realm, | ||
827 | krb5ticket->enc_part2->client->data, | ||
828 | krb5ticket->enc_part2->client->length)) | ||
829 | { | ||
830 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | 820 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, |
831 | "kssl_ctx_setprinc() fails.\n"); | 821 | "bad ticket from krb5_rd_req.\n"); |
832 | } | 822 | } else if (kssl_ctx_setprinc(kssl_ctx, KSSL_CLIENT, |
833 | else if (kssl_ctx_setkey(kssl_ctx, krb5ticket->enc_part2->session)) | 823 | &krb5ticket->enc_part2->client->realm, |
834 | { | 824 | krb5ticket->enc_part2->client->data, |
825 | krb5ticket->enc_part2->client->length)) { | ||
835 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | 826 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, |
836 | "kssl_ctx_setkey() fails.\n"); | 827 | "kssl_ctx_setprinc() fails.\n"); |
837 | } | 828 | } else if (kssl_ctx_setkey(kssl_ctx, krb5ticket->enc_part2->session)) { |
838 | else if (krb5ticket->enc_part2->flags & TKT_FLG_INVALID) | 829 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, |
839 | { | 830 | "kssl_ctx_setkey() fails.\n"); |
831 | } else if (krb5ticket->enc_part2->flags & TKT_FLG_INVALID) { | ||
840 | krb5rc = KRB5KRB_AP_ERR_TKT_INVALID; | 832 | krb5rc = KRB5KRB_AP_ERR_TKT_INVALID; |
841 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | 833 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, |
842 | "invalid ticket from krb5_rd_req.\n"); | 834 | "invalid ticket from krb5_rd_req.\n"); |
843 | } | 835 | } else |
844 | else krb5rc = 0; | 836 | krb5rc = 0; |
845 | 837 | ||
846 | kssl_ctx->enctype = krb5ticket->enc_part.enctype; | 838 | kssl_ctx->enctype = krb5ticket->enc_part.enctype; |
847 | ttimes->authtime = krb5ticket->enc_part2->times.authtime; | 839 | ttimes->authtime = krb5ticket->enc_part2->times.authtime; |
848 | ttimes->starttime = krb5ticket->enc_part2->times.starttime; | 840 | ttimes->starttime = krb5ticket->enc_part2->times.starttime; |
849 | ttimes->endtime = krb5ticket->enc_part2->times.endtime; | 841 | ttimes->endtime = krb5ticket->enc_part2->times.endtime; |
850 | ttimes->renew_till = krb5ticket->enc_part2->times.renew_till; | 842 | ttimes->renew_till = krb5ticket->enc_part2->times.renew_till; |
851 | 843 | ||
852 | err: | 844 | err: |
853 | #ifdef KSSL_DEBUG | 845 | #ifdef KSSL_DEBUG |
854 | kssl_ctx_show(kssl_ctx); | 846 | kssl_ctx_show(kssl_ctx); |
855 | #endif /* KSSL_DEBUG */ | 847 | #endif /* KSSL_DEBUG */ |
856 | 848 | ||
857 | if (asn1ticket) KRB5_TICKET_free((KRB5_TICKET *) asn1ticket); | 849 | if (asn1ticket) |
858 | if (krb5keytab) krb5_kt_close(krb5context, krb5keytab); | 850 | KRB5_TICKET_free((KRB5_TICKET *) asn1ticket); |
859 | if (krb5ticket) krb5_free_ticket(krb5context, krb5ticket); | 851 | if (krb5keytab) |
860 | if (krb5server) krb5_free_principal(krb5context, krb5server); | 852 | krb5_kt_close(krb5context, krb5keytab); |
853 | if (krb5ticket) | ||
854 | krb5_free_ticket(krb5context, krb5ticket); | ||
855 | if (krb5server) | ||
856 | krb5_free_principal(krb5context, krb5server); | ||
861 | return (krb5rc); | 857 | return (krb5rc); |
862 | } | 858 | } |
863 | 859 | ||
864 | 860 | ||
865 | /* Allocate & return a new kssl_ctx struct. | 861 | /* Allocate & return a new kssl_ctx struct. |
866 | */ | 862 | */ |
867 | KSSL_CTX * | 863 | KSSL_CTX * |
868 | kssl_ctx_new(void) | 864 | kssl_ctx_new(void) |
869 | { | 865 | { |
870 | return ((KSSL_CTX *) kssl_calloc(1, sizeof(KSSL_CTX))); | 866 | return ((KSSL_CTX *) kssl_calloc(1, sizeof(KSSL_CTX))); |
871 | } | 867 | } |
872 | 868 | ||
873 | 869 | ||
874 | /* Frees a kssl_ctx struct and any allocated memory it holds. | 870 | /* Frees a kssl_ctx struct and any allocated memory it holds. |
875 | ** Returns NULL. | 871 | ** Returns NULL. |
876 | */ | 872 | */ |
877 | KSSL_CTX * | 873 | KSSL_CTX * |
878 | kssl_ctx_free(KSSL_CTX *kssl_ctx) | 874 | kssl_ctx_free(KSSL_CTX *kssl_ctx) |
879 | { | 875 | { |
880 | if (kssl_ctx == NULL) return kssl_ctx; | 876 | if (kssl_ctx == NULL) |
877 | return kssl_ctx; | ||
881 | 878 | ||
882 | if (kssl_ctx->key) OPENSSL_cleanse(kssl_ctx->key, | 879 | if (kssl_ctx->key) |
883 | kssl_ctx->length); | 880 | OPENSSL_cleanse(kssl_ctx->key, kssl_ctx->length); |
884 | if (kssl_ctx->key) kssl_free(kssl_ctx->key); | 881 | if (kssl_ctx->key) |
885 | if (kssl_ctx->client_princ) kssl_free(kssl_ctx->client_princ); | 882 | kssl_free(kssl_ctx->key); |
886 | if (kssl_ctx->service_host) kssl_free(kssl_ctx->service_host); | 883 | if (kssl_ctx->client_princ) |
887 | if (kssl_ctx->service_name) kssl_free(kssl_ctx->service_name); | 884 | kssl_free(kssl_ctx->client_princ); |
888 | if (kssl_ctx->keytab_file) kssl_free(kssl_ctx->keytab_file); | 885 | if (kssl_ctx->service_host) |
886 | kssl_free(kssl_ctx->service_host); | ||
887 | if (kssl_ctx->service_name) | ||
888 | kssl_free(kssl_ctx->service_name); | ||
889 | if (kssl_ctx->keytab_file) | ||
890 | kssl_free(kssl_ctx->keytab_file); | ||
889 | 891 | ||
890 | kssl_free(kssl_ctx); | 892 | kssl_free(kssl_ctx); |
891 | return (KSSL_CTX *) NULL; | 893 | return (KSSL_CTX *) NULL; |
892 | } | 894 | } |
893 | 895 | ||
894 | 896 | ||
895 | /* Given an array of (krb5_data *) entity (and optional realm), | 897 | /* Given an array of (krb5_data *) entity (and optional realm), |
@@ -897,55 +899,57 @@ kssl_ctx_free(KSSL_CTX *kssl_ctx) | |||
897 | ** of the kssl_ctx struct. | 899 | ** of the kssl_ctx struct. |
898 | */ | 900 | */ |
899 | krb5_error_code | 901 | krb5_error_code |
900 | kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, | 902 | kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, krb5_data *realm, |
901 | krb5_data *realm, krb5_data *entity, int nentities) | 903 | krb5_data *entity, int nentities) |
902 | { | 904 | { |
903 | char **princ; | 905 | char **princ; |
904 | int length; | 906 | int length; |
905 | int i; | 907 | int i; |
906 | 908 | ||
907 | if (kssl_ctx == NULL || entity == NULL) return KSSL_CTX_ERR; | 909 | if (kssl_ctx == NULL || entity == NULL) |
910 | return KSSL_CTX_ERR; | ||
908 | 911 | ||
909 | switch (which) | 912 | switch (which) { |
910 | { | 913 | case KSSL_CLIENT: |
911 | case KSSL_CLIENT: princ = &kssl_ctx->client_princ; break; | 914 | princ = &kssl_ctx->client_princ; |
912 | case KSSL_SERVER: princ = &kssl_ctx->service_host; break; | 915 | break; |
913 | default: return KSSL_CTX_ERR; break; | 916 | case KSSL_SERVER: |
914 | } | 917 | princ = &kssl_ctx->service_host; |
915 | if (*princ) kssl_free(*princ); | 918 | break; |
919 | default: | ||
920 | return KSSL_CTX_ERR; | ||
921 | break; | ||
922 | } | ||
923 | if (*princ) | ||
924 | kssl_free(*princ); | ||
916 | 925 | ||
917 | /* Add up all the entity->lengths */ | 926 | /* Add up all the entity->lengths */ |
918 | length = 0; | 927 | length = 0; |
919 | for (i=0; i < nentities; i++) | 928 | for (i = 0; i < nentities; i++) { |
920 | { | ||
921 | length += entity[i].length; | 929 | length += entity[i].length; |
922 | } | 930 | } |
923 | /* Add in space for the '/' character(s) (if any) */ | 931 | /* Add in space for the '/' character(s) (if any) */ |
924 | length += nentities-1; | 932 | length += nentities - 1; |
925 | /* Space for the ('@'+realm+NULL | NULL) */ | 933 | /* Space for the ('@'+realm+NULL | NULL) */ |
926 | length += ((realm)? realm->length + 2: 1); | 934 | length += ((realm) ? realm->length + 2 : 1); |
927 | 935 | ||
928 | if ((*princ = kssl_calloc(1, length)) == NULL) | 936 | if ((*princ = kssl_calloc(1, length)) == NULL) |
929 | return KSSL_CTX_ERR; | 937 | return KSSL_CTX_ERR; |
930 | else | 938 | else { |
931 | { | 939 | for (i = 0; i < nentities; i++) { |
932 | for (i = 0; i < nentities; i++) | ||
933 | { | ||
934 | strncat(*princ, entity[i].data, entity[i].length); | 940 | strncat(*princ, entity[i].data, entity[i].length); |
935 | if (i < nentities-1) | 941 | if (i < nentities - 1) { |
936 | { | ||
937 | strcat (*princ, "/"); | 942 | strcat (*princ, "/"); |
938 | } | ||
939 | } | 943 | } |
940 | if (realm) | 944 | } |
941 | { | 945 | if (realm) { |
942 | strcat (*princ, "@"); | 946 | strcat (*princ, "@"); |
943 | (void) strncat(*princ, realm->data, realm->length); | 947 | (void) strncat(*princ, realm->data, realm->length); |
944 | } | ||
945 | } | 948 | } |
949 | } | ||
946 | 950 | ||
947 | return KSSL_CTX_OK; | 951 | return KSSL_CTX_OK; |
948 | } | 952 | } |
949 | 953 | ||
950 | 954 | ||
951 | /* Set one of the plain (char *) string members of the kssl_ctx struct. | 955 | /* Set one of the plain (char *) string members of the kssl_ctx struct. |
@@ -955,26 +959,36 @@ kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, | |||
955 | */ | 959 | */ |
956 | krb5_error_code | 960 | krb5_error_code |
957 | kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text) | 961 | kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text) |
958 | { | 962 | { |
959 | char **string; | 963 | char **string; |
960 | 964 | ||
961 | if (!kssl_ctx) return KSSL_CTX_ERR; | 965 | if (!kssl_ctx) |
966 | return KSSL_CTX_ERR; | ||
962 | 967 | ||
963 | switch (which) | 968 | switch (which) { |
964 | { | 969 | case KSSL_SERVICE: |
965 | case KSSL_SERVICE: string = &kssl_ctx->service_name; break; | 970 | string = &kssl_ctx->service_name; |
966 | case KSSL_SERVER: string = &kssl_ctx->service_host; break; | 971 | break; |
967 | case KSSL_CLIENT: string = &kssl_ctx->client_princ; break; | 972 | case KSSL_SERVER: |
968 | case KSSL_KEYTAB: string = &kssl_ctx->keytab_file; break; | 973 | string = &kssl_ctx->service_host; |
969 | default: return KSSL_CTX_ERR; break; | 974 | break; |
970 | } | 975 | case KSSL_CLIENT: |
971 | if (*string) kssl_free(*string); | 976 | string = &kssl_ctx->client_princ; |
977 | break; | ||
978 | case KSSL_KEYTAB: | ||
979 | string = &kssl_ctx->keytab_file; | ||
980 | break; | ||
981 | default: | ||
982 | return KSSL_CTX_ERR; | ||
983 | break; | ||
984 | } | ||
985 | if (*string) | ||
986 | kssl_free(*string); | ||
972 | 987 | ||
973 | if (!text) | 988 | if (!text) { |
974 | { | ||
975 | *string = '\0'; | 989 | *string = '\0'; |
976 | return KSSL_CTX_OK; | 990 | return KSSL_CTX_OK; |
977 | } | 991 | } |
978 | 992 | ||
979 | if ((*string = kssl_calloc(1, strlen(text) + 1)) == NULL) | 993 | if ((*string = kssl_calloc(1, strlen(text) + 1)) == NULL) |
980 | return KSSL_CTX_ERR; | 994 | return KSSL_CTX_ERR; |
@@ -982,7 +996,7 @@ kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text) | |||
982 | memcpy(*string, text, strlen(text) + 1); | 996 | memcpy(*string, text, strlen(text) + 1); |
983 | 997 | ||
984 | return KSSL_CTX_OK; | 998 | return KSSL_CTX_OK; |
985 | } | 999 | } |
986 | 1000 | ||
987 | 1001 | ||
988 | /* Copy the Kerberos session key from a (krb5_keyblock *) to a kssl_ctx | 1002 | /* Copy the Kerberos session key from a (krb5_keyblock *) to a kssl_ctx |
@@ -990,21 +1004,20 @@ kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text) | |||
990 | */ | 1004 | */ |
991 | krb5_error_code | 1005 | krb5_error_code |
992 | kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session) | 1006 | kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session) |
993 | { | 1007 | { |
994 | int length; | 1008 | int length; |
995 | krb5_enctype enctype; | 1009 | krb5_enctype enctype; |
996 | krb5_octet FAR *contents = NULL; | 1010 | krb5_octet FAR *contents = NULL; |
997 | 1011 | ||
998 | if (!kssl_ctx) return KSSL_CTX_ERR; | 1012 | if (!kssl_ctx) |
1013 | return KSSL_CTX_ERR; | ||
999 | 1014 | ||
1000 | if (kssl_ctx->key) | 1015 | if (kssl_ctx->key) { |
1001 | { | ||
1002 | OPENSSL_cleanse(kssl_ctx->key, kssl_ctx->length); | 1016 | OPENSSL_cleanse(kssl_ctx->key, kssl_ctx->length); |
1003 | kssl_free(kssl_ctx->key); | 1017 | kssl_free(kssl_ctx->key); |
1004 | } | 1018 | } |
1005 | 1019 | ||
1006 | if (session) | 1020 | if (session) { |
1007 | { | ||
1008 | 1021 | ||
1009 | #ifdef KRB5_HEIMDAL | 1022 | #ifdef KRB5_HEIMDAL |
1010 | length = session->keyvalue->length; | 1023 | length = session->keyvalue->length; |
@@ -1016,186 +1029,182 @@ kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session) | |||
1016 | contents = session->contents; | 1029 | contents = session->contents; |
1017 | #endif | 1030 | #endif |
1018 | kssl_ctx->enctype = enctype; | 1031 | kssl_ctx->enctype = enctype; |
1019 | kssl_ctx->length = length; | 1032 | kssl_ctx->length = length; |
1020 | } | 1033 | } else { |
1021 | else | ||
1022 | { | ||
1023 | kssl_ctx->enctype = ENCTYPE_UNKNOWN; | 1034 | kssl_ctx->enctype = ENCTYPE_UNKNOWN; |
1024 | kssl_ctx->length = 0; | 1035 | kssl_ctx->length = 0; |
1025 | return KSSL_CTX_OK; | 1036 | return KSSL_CTX_OK; |
1026 | } | 1037 | } |
1027 | 1038 | ||
1028 | if ((kssl_ctx->key = | 1039 | if ((kssl_ctx->key = |
1029 | (krb5_octet FAR *) kssl_calloc(1, kssl_ctx->length)) == NULL) | 1040 | (krb5_octet FAR *)kssl_calloc(1, kssl_ctx->length)) == NULL) { |
1030 | { | 1041 | kssl_ctx->length = 0; |
1031 | kssl_ctx->length = 0; | ||
1032 | return KSSL_CTX_ERR; | 1042 | return KSSL_CTX_ERR; |
1033 | } | 1043 | } else |
1034 | else | ||
1035 | memcpy(kssl_ctx->key, contents, length); | 1044 | memcpy(kssl_ctx->key, contents, length); |
1036 | 1045 | ||
1037 | return KSSL_CTX_OK; | 1046 | return KSSL_CTX_OK; |
1038 | } | 1047 | } |
1039 | 1048 | ||
1040 | 1049 | ||
1041 | /* Display contents of kssl_ctx struct | 1050 | /* Display contents of kssl_ctx struct |
1042 | */ | 1051 | */ |
1043 | void | 1052 | void |
1044 | kssl_ctx_show(KSSL_CTX *kssl_ctx) | 1053 | kssl_ctx_show(KSSL_CTX *kssl_ctx) |
1045 | { | 1054 | { |
1046 | int i; | 1055 | int i; |
1047 | 1056 | ||
1048 | printf("kssl_ctx: "); | 1057 | printf("kssl_ctx: "); |
1049 | if (kssl_ctx == NULL) | 1058 | if (kssl_ctx == NULL) { |
1050 | { | ||
1051 | printf("NULL\n"); | 1059 | printf("NULL\n"); |
1052 | return; | 1060 | return; |
1053 | } | 1061 | } else |
1054 | else | ||
1055 | printf("%p\n", (void *)kssl_ctx); | 1062 | printf("%p\n", (void *)kssl_ctx); |
1056 | 1063 | ||
1057 | printf("\tservice:\t%s\n", | 1064 | printf("\tservice:\t%s\n", |
1058 | (kssl_ctx->service_name)? kssl_ctx->service_name: "NULL"); | 1065 | (kssl_ctx->service_name) ? kssl_ctx->service_name : "NULL"); |
1059 | printf("\tclient:\t%s\n", | 1066 | printf("\tclient:\t%s\n", |
1060 | (kssl_ctx->client_princ)? kssl_ctx->client_princ: "NULL"); | 1067 | (kssl_ctx->client_princ) ? kssl_ctx->client_princ : "NULL"); |
1061 | printf("\tserver:\t%s\n", | 1068 | printf("\tserver:\t%s\n", |
1062 | (kssl_ctx->service_host)? kssl_ctx->service_host: "NULL"); | 1069 | (kssl_ctx->service_host) ? kssl_ctx->service_host : "NULL"); |
1063 | printf("\tkeytab:\t%s\n", | 1070 | printf("\tkeytab:\t%s\n", |
1064 | (kssl_ctx->keytab_file)? kssl_ctx->keytab_file: "NULL"); | 1071 | (kssl_ctx->keytab_file) ? kssl_ctx->keytab_file : "NULL"); |
1065 | printf("\tkey [%d:%d]:\t", | 1072 | printf("\tkey [%d:%d]:\t", |
1066 | kssl_ctx->enctype, kssl_ctx->length); | 1073 | kssl_ctx->enctype, kssl_ctx->length); |
1067 | 1074 | ||
1068 | for (i=0; i < kssl_ctx->length && kssl_ctx->key; i++) | 1075 | for (i = 0; i < kssl_ctx->length && kssl_ctx->key; i++) { |
1069 | { | ||
1070 | printf("%02x", kssl_ctx->key[i]); | 1076 | printf("%02x", kssl_ctx->key[i]); |
1071 | } | 1077 | } |
1072 | printf("\n"); | 1078 | printf("\n"); |
1073 | return; | 1079 | return; |
1074 | } | 1080 | } |
1075 | 1081 | ||
1076 | int | 1082 | int |
1077 | kssl_keytab_is_available(KSSL_CTX *kssl_ctx) | 1083 | kssl_keytab_is_available(KSSL_CTX *kssl_ctx) |
1078 | { | 1084 | { |
1079 | krb5_context krb5context = NULL; | 1085 | krb5_context krb5context = NULL; |
1080 | krb5_keytab krb5keytab = NULL; | 1086 | krb5_keytab krb5keytab = NULL; |
1081 | krb5_keytab_entry entry; | 1087 | krb5_keytab_entry entry; |
1082 | krb5_principal princ = NULL; | 1088 | krb5_principal princ = NULL; |
1083 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | 1089 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; |
1084 | int rc = 0; | 1090 | int rc = 0; |
1085 | 1091 | ||
1086 | if ((krb5rc = krb5_init_context(&krb5context))) | 1092 | if ((krb5rc = krb5_init_context(&krb5context))) |
1087 | return(0); | 1093 | return (0); |
1088 | 1094 | ||
1089 | /* kssl_ctx->keytab_file == NULL ==> use Kerberos default | 1095 | /* kssl_ctx->keytab_file == NULL ==> use Kerberos default |
1090 | */ | 1096 | */ |
1091 | if (kssl_ctx->keytab_file) | 1097 | if (kssl_ctx->keytab_file) { |
1092 | { | 1098 | krb5rc = krb5_kt_resolve(krb5context, kssl_ctx->keytab_file, |
1093 | krb5rc = krb5_kt_resolve(krb5context, kssl_ctx->keytab_file, | 1099 | &krb5keytab); |
1094 | &krb5keytab); | 1100 | if (krb5rc) |
1095 | if (krb5rc) | 1101 | goto exit; |
1096 | goto exit; | 1102 | } else { |
1097 | } | 1103 | krb5rc = krb5_kt_default(krb5context, &krb5keytab); |
1098 | else | 1104 | if (krb5rc) |
1099 | { | 1105 | goto exit; |
1100 | krb5rc = krb5_kt_default(krb5context,&krb5keytab); | 1106 | } |
1101 | if (krb5rc) | 1107 | |
1102 | goto exit; | 1108 | /* the host key we are looking for */ |
1103 | } | 1109 | krb5rc = krb5_sname_to_principal(krb5context, NULL, |
1104 | 1110 | kssl_ctx->service_name ? kssl_ctx->service_name : KRB5SVC, | |
1105 | /* the host key we are looking for */ | 1111 | KRB5_NT_SRV_HST, &princ); |
1106 | krb5rc = krb5_sname_to_principal(krb5context, NULL, | 1112 | |
1107 | kssl_ctx->service_name ? kssl_ctx->service_name: KRB5SVC, | 1113 | if (krb5rc) |
1108 | KRB5_NT_SRV_HST, &princ); | 1114 | goto exit; |
1109 | 1115 | ||
1110 | if (krb5rc) | 1116 | krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, princ, |
1111 | goto exit; | 1117 | 0 /* IGNORE_VNO */, |
1112 | 1118 | 0 /* IGNORE_ENCTYPE */, | |
1113 | krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, | 1119 | &entry); |
1114 | princ, | 1120 | if (krb5rc == KRB5_KT_NOTFOUND) { |
1115 | 0 /* IGNORE_VNO */, | 1121 | rc = 1; |
1116 | 0 /* IGNORE_ENCTYPE */, | 1122 | goto exit; |
1117 | &entry); | 1123 | } else if (krb5rc) |
1118 | if ( krb5rc == KRB5_KT_NOTFOUND ) { | 1124 | goto exit; |
1119 | rc = 1; | 1125 | |
1120 | goto exit; | 1126 | krb5_kt_free_entry(krb5context, &entry); |
1121 | } else if ( krb5rc ) | 1127 | rc = 1; |
1122 | goto exit; | 1128 | |
1123 | 1129 | exit: | |
1124 | krb5_kt_free_entry(krb5context, &entry); | 1130 | if (krb5keytab) |
1125 | rc = 1; | 1131 | krb5_kt_close(krb5context, krb5keytab); |
1126 | 1132 | if (princ) | |
1127 | exit: | 1133 | krb5_free_principal(krb5context, princ); |
1128 | if (krb5keytab) krb5_kt_close(krb5context, krb5keytab); | 1134 | if (krb5context) |
1129 | if (princ) krb5_free_principal(krb5context, princ); | 1135 | krb5_free_context(krb5context); |
1130 | if (krb5context) krb5_free_context(krb5context); | 1136 | return (rc); |
1131 | return(rc); | ||
1132 | } | 1137 | } |
1133 | 1138 | ||
1134 | int | 1139 | int |
1135 | kssl_tgt_is_available(KSSL_CTX *kssl_ctx) | 1140 | kssl_tgt_is_available(KSSL_CTX *kssl_ctx) |
1136 | { | 1141 | { |
1137 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | 1142 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; |
1138 | krb5_context krb5context = NULL; | 1143 | krb5_context krb5context = NULL; |
1139 | krb5_ccache krb5ccdef = NULL; | 1144 | krb5_ccache krb5ccdef = NULL; |
1140 | krb5_creds krb5creds, *krb5credsp = NULL; | 1145 | krb5_creds krb5creds, *krb5credsp = NULL; |
1141 | int rc = 0; | 1146 | int rc = 0; |
1142 | 1147 | ||
1143 | memset((char *)&krb5creds, 0, sizeof(krb5creds)); | 1148 | memset((char *)&krb5creds, 0, sizeof(krb5creds)); |
1144 | 1149 | ||
1145 | if (!kssl_ctx) | 1150 | if (!kssl_ctx) |
1146 | return(0); | 1151 | return (0); |
1147 | 1152 | ||
1148 | if (!kssl_ctx->service_host) | 1153 | if (!kssl_ctx->service_host) |
1149 | return(0); | 1154 | return (0); |
1150 | 1155 | ||
1151 | if ((krb5rc = krb5_init_context(&krb5context)) != 0) | 1156 | if ((krb5rc = krb5_init_context(&krb5context)) != 0) |
1152 | goto err; | 1157 | goto err; |
1153 | 1158 | ||
1154 | if ((krb5rc = krb5_sname_to_principal(krb5context, | 1159 | if ((krb5rc = krb5_sname_to_principal( |
1155 | kssl_ctx->service_host, | 1160 | krb5context, kssl_ctx->service_host, |
1156 | (kssl_ctx->service_name)? kssl_ctx->service_name: KRB5SVC, | 1161 | (kssl_ctx->service_name) ? kssl_ctx->service_name : KRB5SVC, |
1157 | KRB5_NT_SRV_HST, &krb5creds.server)) != 0) | 1162 | KRB5_NT_SRV_HST, &krb5creds.server)) != 0) |
1158 | goto err; | 1163 | goto err; |
1159 | 1164 | ||
1160 | if ((krb5rc = krb5_cc_default(krb5context, &krb5ccdef)) != 0) | 1165 | if ((krb5rc = krb5_cc_default(krb5context, &krb5ccdef)) != 0) |
1161 | goto err; | 1166 | goto err; |
1162 | 1167 | ||
1163 | if ((krb5rc = krb5_cc_get_principal(krb5context, krb5ccdef, | 1168 | if ((krb5rc = krb5_cc_get_principal(krb5context, krb5ccdef, |
1164 | &krb5creds.client)) != 0) | 1169 | &krb5creds.client)) != 0) |
1165 | goto err; | 1170 | goto err; |
1166 | 1171 | ||
1167 | if ((krb5rc = krb5_get_credentials(krb5context, 0, krb5ccdef, | 1172 | if ((krb5rc = krb5_get_credentials(krb5context, 0, krb5ccdef, |
1168 | &krb5creds, &krb5credsp)) != 0) | 1173 | &krb5creds, &krb5credsp)) != 0) |
1169 | goto err; | 1174 | goto err; |
1170 | 1175 | ||
1171 | rc = 1; | 1176 | rc = 1; |
1172 | 1177 | ||
1173 | err: | 1178 | err: |
1174 | #ifdef KSSL_DEBUG | 1179 | #ifdef KSSL_DEBUG |
1175 | kssl_ctx_show(kssl_ctx); | 1180 | kssl_ctx_show(kssl_ctx); |
1176 | #endif /* KSSL_DEBUG */ | 1181 | #endif /* KSSL_DEBUG */ |
1177 | 1182 | ||
1178 | if (krb5creds.client) krb5_free_principal(krb5context, krb5creds.client); | 1183 | if (krb5creds.client) |
1179 | if (krb5creds.server) krb5_free_principal(krb5context, krb5creds.server); | 1184 | krb5_free_principal(krb5context, krb5creds.client); |
1180 | if (krb5context) krb5_free_context(krb5context); | 1185 | if (krb5creds.server) |
1181 | return(rc); | 1186 | krb5_free_principal(krb5context, krb5creds.server); |
1182 | } | 1187 | if (krb5context) |
1188 | krb5_free_context(krb5context); | ||
1189 | return (rc); | ||
1190 | } | ||
1183 | 1191 | ||
1184 | void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data) | 1192 | void |
1185 | { | 1193 | kssl_krb5_free_data_contents(krb5_context context, krb5_data *data) |
1194 | { | ||
1186 | #ifdef KRB5_HEIMDAL | 1195 | #ifdef KRB5_HEIMDAL |
1187 | data->length = 0; | 1196 | data->length = 0; |
1188 | if (data->data) | 1197 | if (data->data) |
1189 | free(data->data); | 1198 | free(data->data); |
1190 | #elif defined(KRB5_MIT_OLD11) | 1199 | #elif defined(KRB5_MIT_OLD11) |
1191 | if (data->data) { | 1200 | if (data->data) { |
1192 | krb5_xfree(data->data); | 1201 | krb5_xfree(data->data); |
1193 | data->data = 0; | 1202 | data->data = 0; |
1194 | } | 1203 | } |
1195 | #else | 1204 | #else |
1196 | krb5_free_data_contents(NULL, data); | 1205 | krb5_free_data_contents(NULL, data); |
1197 | #endif | 1206 | #endif |
1198 | } | 1207 | } |
1199 | 1208 | ||
1200 | /* Given pointers to KerberosTime and struct tm structs, convert the | 1209 | /* Given pointers to KerberosTime and struct tm structs, convert the |
1201 | ** KerberosTime string to struct tm. Note that KerberosTime is a | 1210 | ** KerberosTime string to struct tm. Note that KerberosTime is a |
@@ -1204,25 +1213,52 @@ void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data) | |||
1204 | ** Return pointer to the (partially) filled in struct tm on success, | 1213 | ** Return pointer to the (partially) filled in struct tm on success, |
1205 | ** return NULL on failure. | 1214 | ** return NULL on failure. |
1206 | */ | 1215 | */ |
1207 | static struct tm *k_gmtime(ASN1_GENERALIZEDTIME *gtime, struct tm *k_tm) | 1216 | static struct tm |
1208 | { | 1217 | *k_gmtime(ASN1_GENERALIZEDTIME *gtime, struct tm *k_tm) { |
1209 | char c, *p; | 1218 | char c, *p; |
1210 | 1219 | ||
1211 | if (!k_tm) return NULL; | 1220 | if (!k_tm) |
1212 | if (gtime == NULL || gtime->length < 14) return NULL; | 1221 | return NULL; |
1213 | if (gtime->data == NULL) return NULL; | 1222 | if (gtime == NULL || gtime->length < 14) |
1223 | return NULL; | ||
1224 | if (gtime->data == NULL) | ||
1225 | return NULL; | ||
1214 | 1226 | ||
1215 | p = (char *)>ime->data[14]; | 1227 | p = (char *)>ime->data[14]; |
1216 | 1228 | ||
1217 | c = *p; *p = '\0'; p -= 2; k_tm->tm_sec = atoi(p); *(p+2) = c; | 1229 | c = *p; |
1218 | c = *p; *p = '\0'; p -= 2; k_tm->tm_min = atoi(p); *(p+2) = c; | 1230 | *p = '\0'; |
1219 | c = *p; *p = '\0'; p -= 2; k_tm->tm_hour = atoi(p); *(p+2) = c; | 1231 | p -= 2; |
1220 | c = *p; *p = '\0'; p -= 2; k_tm->tm_mday = atoi(p); *(p+2) = c; | 1232 | k_tm->tm_sec = atoi(p); |
1221 | c = *p; *p = '\0'; p -= 2; k_tm->tm_mon = atoi(p)-1; *(p+2) = c; | 1233 | *(p + 2) = c; |
1222 | c = *p; *p = '\0'; p -= 4; k_tm->tm_year = atoi(p)-1900; *(p+4) = c; | 1234 | c = *p; |
1235 | *p = '\0'; | ||
1236 | p -= 2; | ||
1237 | k_tm->tm_min = atoi(p); | ||
1238 | *(p + 2) = c; | ||
1239 | c = *p; | ||
1240 | *p = '\0'; | ||
1241 | p -= 2; | ||
1242 | k_tm->tm_hour = atoi(p); | ||
1243 | *(p + 2) = c; | ||
1244 | c = *p; | ||
1245 | *p = '\0'; | ||
1246 | p -= 2; | ||
1247 | k_tm->tm_mday = atoi(p); | ||
1248 | *(p + 2) = c; | ||
1249 | c = *p; | ||
1250 | *p = '\0'; | ||
1251 | p -= 2; | ||
1252 | k_tm->tm_mon = atoi(p) - 1; | ||
1253 | *(p + 2) = c; | ||
1254 | c = *p; | ||
1255 | *p = '\0'; | ||
1256 | p -= 4; | ||
1257 | k_tm->tm_year = atoi(p) - 1900; | ||
1258 | *(p + 4) = c; | ||
1223 | 1259 | ||
1224 | return k_tm; | 1260 | return k_tm; |
1225 | } | 1261 | } |
1226 | 1262 | ||
1227 | 1263 | ||
1228 | /* Helper function for kssl_validate_times(). | 1264 | /* Helper function for kssl_validate_times(). |
@@ -1230,19 +1266,22 @@ static struct tm *k_gmtime(ASN1_GENERALIZEDTIME *gtime, struct tm *k_tm) | |||
1230 | ** So we try to sneek the clockskew out through the replay cache. | 1266 | ** So we try to sneek the clockskew out through the replay cache. |
1231 | ** If that fails just return a likely default (300 seconds). | 1267 | ** If that fails just return a likely default (300 seconds). |
1232 | */ | 1268 | */ |
1233 | static krb5_deltat get_rc_clockskew(krb5_context context) | 1269 | static krb5_deltat |
1234 | { | 1270 | get_rc_clockskew(krb5_context context) |
1271 | { | ||
1235 | krb5_rcache rc; | 1272 | krb5_rcache rc; |
1236 | krb5_deltat clockskew; | 1273 | krb5_deltat clockskew; |
1237 | 1274 | ||
1238 | if (krb5_rc_default(context, &rc)) return KSSL_CLOCKSKEW; | 1275 | if (krb5_rc_default(context, &rc)) |
1239 | if (krb5_rc_initialize(context, rc, 0)) return KSSL_CLOCKSKEW; | 1276 | return KSSL_CLOCKSKEW; |
1277 | if (krb5_rc_initialize(context, rc, 0)) | ||
1278 | return KSSL_CLOCKSKEW; | ||
1240 | if (krb5_rc_get_lifespan(context, rc, &clockskew)) { | 1279 | if (krb5_rc_get_lifespan(context, rc, &clockskew)) { |
1241 | clockskew = KSSL_CLOCKSKEW; | 1280 | clockskew = KSSL_CLOCKSKEW; |
1242 | } | ||
1243 | (void) krb5_rc_destroy(context, rc); | ||
1244 | return clockskew; | ||
1245 | } | 1281 | } |
1282 | (void)krb5_rc_destroy(context, rc); | ||
1283 | return clockskew; | ||
1284 | } | ||
1246 | 1285 | ||
1247 | 1286 | ||
1248 | /* kssl_validate_times() combines (and more importantly exposes) | 1287 | /* kssl_validate_times() combines (and more importantly exposes) |
@@ -1255,34 +1294,41 @@ static krb5_deltat get_rc_clockskew(krb5_context context) | |||
1255 | ** See Also: (Kerberos source)/krb5/lib/krb5/krb/valid_times.c | 1294 | ** See Also: (Kerberos source)/krb5/lib/krb5/krb/valid_times.c |
1256 | ** 20010420 VRS | 1295 | ** 20010420 VRS |
1257 | */ | 1296 | */ |
1258 | krb5_error_code kssl_validate_times( krb5_timestamp atime, | 1297 | krb5_error_code |
1259 | krb5_ticket_times *ttimes) | 1298 | kssl_validate_times(krb5_timestamp atime, krb5_ticket_times *ttimes) |
1260 | { | 1299 | { |
1261 | krb5_deltat skew; | 1300 | krb5_deltat skew; |
1262 | krb5_timestamp start, now; | 1301 | krb5_timestamp start, now; |
1263 | krb5_error_code rc; | 1302 | krb5_error_code rc; |
1264 | krb5_context context; | 1303 | krb5_context context; |
1265 | 1304 | ||
1266 | if ((rc = krb5_init_context(&context))) return SSL_R_KRB5_S_BAD_TICKET; | 1305 | if ((rc = krb5_init_context(&context))) |
1267 | skew = get_rc_clockskew(context); | 1306 | return SSL_R_KRB5_S_BAD_TICKET; |
1268 | if ((rc = krb5_timeofday(context,&now))) return SSL_R_KRB5_S_BAD_TICKET; | 1307 | skew = get_rc_clockskew(context); |
1308 | |||
1309 | if ((rc = krb5_timeofday(context, &now))) | ||
1310 | return SSL_R_KRB5_S_BAD_TICKET; | ||
1269 | krb5_free_context(context); | 1311 | krb5_free_context(context); |
1270 | 1312 | ||
1271 | if (atime && labs(atime - now) >= skew) return SSL_R_KRB5_S_TKT_SKEW; | 1313 | if (atime && labs(atime - now) >= skew) |
1314 | return SSL_R_KRB5_S_TKT_SKEW; | ||
1272 | 1315 | ||
1273 | if (! ttimes) return 0; | 1316 | if (!ttimes) |
1317 | return 0; | ||
1274 | 1318 | ||
1275 | start = (ttimes->starttime != 0)? ttimes->starttime: ttimes->authtime; | 1319 | start = (ttimes->starttime != 0) ? ttimes->starttime : ttimes->authtime; |
1276 | if (start - now > skew) return SSL_R_KRB5_S_TKT_NYV; | 1320 | if (start - now > skew) |
1277 | if ((now - ttimes->endtime) > skew) return SSL_R_KRB5_S_TKT_EXPIRED; | 1321 | return SSL_R_KRB5_S_TKT_NYV; |
1322 | if ((now - ttimes->endtime) > skew) | ||
1323 | return SSL_R_KRB5_S_TKT_EXPIRED; | ||
1278 | 1324 | ||
1279 | #ifdef KSSL_DEBUG | 1325 | #ifdef KSSL_DEBUG |
1280 | printf("kssl_validate_times: %d |<- | %d - %d | < %d ->| %d\n", | 1326 | printf("kssl_validate_times: %d |<- | %d - %d | < %d ->| %d\n", |
1281 | start, atime, now, skew, ttimes->endtime); | 1327 | start, atime, now, skew, ttimes->endtime); |
1282 | #endif /* KSSL_DEBUG */ | 1328 | #endif /* KSSL_DEBUG */ |
1283 | 1329 | ||
1284 | return 0; | 1330 | return 0; |
1285 | } | 1331 | } |
1286 | 1332 | ||
1287 | 1333 | ||
1288 | /* Decode and decrypt given DER-encoded authenticator, then pass | 1334 | /* Decode and decrypt given DER-encoded authenticator, then pass |
@@ -1292,12 +1338,13 @@ krb5_error_code kssl_validate_times( krb5_timestamp atime, | |||
1292 | ** Note that kssl_check_authent() makes use of the KRB5 session key; | 1338 | ** Note that kssl_check_authent() makes use of the KRB5 session key; |
1293 | ** you must call kssl_sget_tkt() to get the key before calling this routine. | 1339 | ** you must call kssl_sget_tkt() to get the key before calling this routine. |
1294 | */ | 1340 | */ |
1295 | krb5_error_code kssl_check_authent( | 1341 | krb5_error_code |
1296 | /* IN */ KSSL_CTX *kssl_ctx, | 1342 | kssl_check_authent( |
1297 | /* IN */ krb5_data *authentp, | 1343 | /* IN */ KSSL_CTX *kssl_ctx, |
1298 | /* OUT */ krb5_timestamp *atimep, | 1344 | /* IN */ krb5_data *authentp, |
1299 | /* OUT */ KSSL_ERR *kssl_err ) | 1345 | /* OUT */ krb5_timestamp *atimep, |
1300 | { | 1346 | /* OUT */ KSSL_ERR *kssl_err ) |
1347 | { | ||
1301 | krb5_error_code krb5rc = 0; | 1348 | krb5_error_code krb5rc = 0; |
1302 | KRB5_ENCDATA *dec_authent = NULL; | 1349 | KRB5_ENCDATA *dec_authent = NULL; |
1303 | KRB5_AUTHENTBODY *auth = NULL; | 1350 | KRB5_AUTHENTBODY *auth = NULL; |
@@ -1323,114 +1370,112 @@ krb5_error_code kssl_check_authent( | |||
1323 | #endif | 1370 | #endif |
1324 | #endif /* KRB5CHECKAUTH */ | 1371 | #endif /* KRB5CHECKAUTH */ |
1325 | 1372 | ||
1326 | if (authentp == NULL || authentp->length == 0) return 0; | 1373 | if (authentp == NULL || authentp->length == 0) |
1374 | return 0; | ||
1327 | 1375 | ||
1328 | #ifdef KSSL_DEBUG | 1376 | #ifdef KSSL_DEBUG |
1329 | { | 1377 | { |
1330 | unsigned int ui; | 1378 | unsigned int ui; |
1331 | printf("kssl_check_authent: authenticator[%d]:\n",authentp->length); | 1379 | printf("kssl_check_authent: authenticator[%d]:\n", authentp->length); |
1332 | p = authentp->data; | 1380 | p = authentp->data; |
1333 | for (ui=0; ui < authentp->length; ui++) printf("%02x ",p[ui]); | 1381 | |
1334 | printf("\n"); | 1382 | for (ui = 0; ui < authentp->length; ui++) printf("%02x ", p[ui]); |
1335 | } | 1383 | printf("\n"); |
1384 | } | ||
1336 | #endif /* KSSL_DEBUG */ | 1385 | #endif /* KSSL_DEBUG */ |
1337 | 1386 | ||
1338 | unencbufsize = 2 * authentp->length; | 1387 | unencbufsize = 2 * authentp->length; |
1339 | if ((unenc_authent = calloc(1, unencbufsize)) == NULL) | 1388 | if ((unenc_authent = calloc(1, unencbufsize)) == NULL) { |
1340 | { | ||
1341 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 1389 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
1342 | "Unable to allocate authenticator buffer.\n"); | 1390 | "Unable to allocate authenticator buffer.\n"); |
1343 | krb5rc = KRB5KRB_ERR_GENERIC; | 1391 | krb5rc = KRB5KRB_ERR_GENERIC; |
1344 | goto err; | 1392 | goto err; |
1345 | } | 1393 | } |
1346 | 1394 | ||
1347 | p = (unsigned char *)authentp->data; | 1395 | p = (unsigned char *)authentp->data; |
1348 | if ((dec_authent = d2i_KRB5_ENCDATA(NULL, &p, | 1396 | if ((dec_authent = d2i_KRB5_ENCDATA(NULL, &p, |
1349 | (long) authentp->length)) == NULL) | 1397 | (long)authentp->length)) == NULL) { |
1350 | { | ||
1351 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 1398 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
1352 | "Error decoding authenticator.\n"); | 1399 | "Error decoding authenticator.\n"); |
1353 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | 1400 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; |
1354 | goto err; | 1401 | goto err; |
1355 | } | 1402 | } |
1356 | 1403 | ||
1357 | enctype = dec_authent->etype->data[0]; /* should = kssl_ctx->enctype */ | 1404 | enctype = dec_authent->etype->data[0]; /* should = kssl_ctx->enctype */ |
1358 | #if !defined(KRB5_MIT_OLD11) | 1405 | #if !defined(KRB5_MIT_OLD11) |
1359 | switch ( enctype ) { | 1406 | switch (enctype ) { |
1360 | case ENCTYPE_DES3_CBC_SHA1: /* EVP_des_ede3_cbc(); */ | 1407 | case ENCTYPE_DES3_CBC_SHA1: /* EVP_des_ede3_cbc(); */ |
1361 | case ENCTYPE_DES3_CBC_SHA: | 1408 | case ENCTYPE_DES3_CBC_SHA: |
1362 | case ENCTYPE_DES3_CBC_RAW: | 1409 | case ENCTYPE_DES3_CBC_RAW: |
1363 | krb5rc = 0; /* Skip, can't handle derived keys */ | 1410 | krb5rc = 0; |
1364 | goto err; | 1411 | /* Skip, can't handle derived keys */ |
1365 | } | 1412 | goto err; |
1413 | } | ||
1366 | #endif | 1414 | #endif |
1367 | enc = kssl_map_enc(enctype); | 1415 | enc = kssl_map_enc(enctype); |
1368 | memset(iv, 0, sizeof iv); /* per RFC 1510 */ | 1416 | memset(iv, 0, sizeof iv); |
1417 | /* per RFC 1510 */ | ||
1369 | 1418 | ||
1370 | if (enc == NULL) | 1419 | if (enc == NULL) { |
1371 | { | ||
1372 | /* Disable kssl_check_authent for ENCTYPE_DES3_CBC_SHA1. | 1420 | /* Disable kssl_check_authent for ENCTYPE_DES3_CBC_SHA1. |
1373 | ** This enctype indicates the authenticator was encrypted | 1421 | ** This enctype indicates the authenticator was encrypted |
1374 | ** using key-usage derived keys which openssl cannot decrypt. | 1422 | ** using key-usage derived keys which openssl cannot decrypt. |
1375 | */ | 1423 | */ |
1376 | goto err; | 1424 | goto err; |
1377 | } | 1425 | } |
1378 | 1426 | ||
1379 | if (!EVP_CipherInit(&ciph_ctx,enc,kssl_ctx->key,iv,0)) | 1427 | if (!EVP_CipherInit(&ciph_ctx, enc, kssl_ctx->key, iv, 0)) { |
1380 | { | 1428 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
1381 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 1429 | "EVP_CipherInit error decrypting authenticator.\n"); |
1382 | "EVP_CipherInit error decrypting authenticator.\n"); | 1430 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; |
1383 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | 1431 | goto err; |
1384 | goto err; | 1432 | } |
1385 | } | 1433 | outl = dec_authent->cipher->length; |
1386 | outl = dec_authent->cipher->length; | 1434 | if (!EVP_Cipher(&ciph_ctx, unenc_authent, dec_authent->cipher->data, outl)) { |
1387 | if (!EVP_Cipher(&ciph_ctx,unenc_authent,dec_authent->cipher->data,outl)) | 1435 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
1388 | { | 1436 | "EVP_Cipher error decrypting authenticator.\n"); |
1389 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 1437 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; |
1390 | "EVP_Cipher error decrypting authenticator.\n"); | 1438 | goto err; |
1391 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | 1439 | } |
1392 | goto err; | 1440 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); |
1393 | } | ||
1394 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
1395 | 1441 | ||
1396 | #ifdef KSSL_DEBUG | 1442 | #ifdef KSSL_DEBUG |
1397 | { | 1443 | { |
1398 | int padl; | 1444 | int padl; |
1399 | printf("kssl_check_authent: decrypted authenticator[%d] =\n", outl); | 1445 | printf("kssl_check_authent: decrypted authenticator[%d] =\n", outl); |
1400 | for (padl=0; padl < outl; padl++) printf("%02x ",unenc_authent[padl]); | 1446 | for (padl = 0; padl < outl; padl++) printf("%02x ", unenc_authent[padl]); |
1401 | printf("\n"); | 1447 | printf("\n"); |
1402 | } | 1448 | } |
1403 | #endif /* KSSL_DEBUG */ | 1449 | #endif /* KSSL_DEBUG */ |
1404 | 1450 | ||
1405 | if ((p = kssl_skip_confound(enctype, unenc_authent)) == NULL) | 1451 | if ((p = kssl_skip_confound(enctype, unenc_authent)) == NULL) { |
1406 | { | ||
1407 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 1452 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
1408 | "confounded by authenticator.\n"); | 1453 | "confounded by authenticator.\n"); |
1409 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | 1454 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; |
1410 | goto err; | 1455 | goto err; |
1411 | } | 1456 | } |
1412 | outl -= p - unenc_authent; | 1457 | outl -= p - unenc_authent; |
1413 | 1458 | ||
1414 | if ((auth = (KRB5_AUTHENTBODY *) d2i_KRB5_AUTHENT(NULL, &p, | 1459 | if ((auth = (KRB5_AUTHENTBODY *)d2i_KRB5_AUTHENT(NULL, &p, |
1415 | (long) outl))==NULL) | 1460 | (long)outl)) == NULL) { |
1416 | { | ||
1417 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | 1461 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, |
1418 | "Error decoding authenticator body.\n"); | 1462 | "Error decoding authenticator body.\n"); |
1419 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | 1463 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; |
1420 | goto err; | 1464 | goto err; |
1421 | } | 1465 | } |
1422 | 1466 | ||
1423 | memset(&tm_time,0,sizeof(struct tm)); | 1467 | memset(&tm_time, 0, sizeof(struct tm)); |
1424 | if (k_gmtime(auth->ctime, &tm_time) && | 1468 | if (k_gmtime(auth->ctime, &tm_time) && |
1425 | ((tr = mktime(&tm_time)) != (time_t)(-1))) | 1469 | ((tr = mktime(&tm_time)) != (time_t)(-1))) { |
1426 | { | 1470 | now = time(&now); |
1427 | now = time(&now); | 1471 | tm_l = localtime(&now); |
1428 | tm_l = localtime(&now); tl = mktime(tm_l); | 1472 | tl = mktime(tm_l); |
1429 | tm_g = gmtime(&now); tg = mktime(tm_g); | 1473 | tm_g = gmtime(&now); |
1430 | tz_offset = tg - tl; | 1474 | tg = mktime(tm_g); |
1475 | tz_offset = tg - tl; | ||
1431 | 1476 | ||
1432 | *atimep = (krb5_timestamp)(tr - tz_offset); | 1477 | *atimep = (krb5_timestamp)(tr - tz_offset); |
1433 | } | 1478 | } |
1434 | 1479 | ||
1435 | #ifdef KSSL_DEBUG | 1480 | #ifdef KSSL_DEBUG |
1436 | printf("kssl_check_authent: returns %d for client time ", *atimep); | 1481 | printf("kssl_check_authent: returns %d for client time ", *atimep); |
@@ -1439,13 +1484,16 @@ krb5_error_code kssl_check_authent( | |||
1439 | else printf("NULL\n"); | 1484 | else printf("NULL\n"); |
1440 | #endif /* KSSL_DEBUG */ | 1485 | #endif /* KSSL_DEBUG */ |
1441 | 1486 | ||
1442 | err: | 1487 | err: |
1443 | if (auth) KRB5_AUTHENT_free((KRB5_AUTHENT *) auth); | 1488 | if (auth) |
1444 | if (dec_authent) KRB5_ENCDATA_free(dec_authent); | 1489 | KRB5_AUTHENT_free((KRB5_AUTHENT *) auth); |
1445 | if (unenc_authent) free(unenc_authent); | 1490 | if (dec_authent) |
1491 | KRB5_ENCDATA_free(dec_authent); | ||
1492 | if (unenc_authent) | ||
1493 | free(unenc_authent); | ||
1446 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | 1494 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); |
1447 | return krb5rc; | 1495 | return krb5rc; |
1448 | } | 1496 | } |
1449 | 1497 | ||
1450 | 1498 | ||
1451 | /* Replaces krb5_build_principal_ext(), with varargs length == 2 (svc, host), | 1499 | /* Replaces krb5_build_principal_ext(), with varargs length == 2 (svc, host), |
@@ -1453,33 +1501,38 @@ krb5_error_code kssl_check_authent( | |||
1453 | ** Returns krb5_error_code == ENOMEM on alloc error, otherwise | 1501 | ** Returns krb5_error_code == ENOMEM on alloc error, otherwise |
1454 | ** passes back newly constructed principal, which should be freed by caller. | 1502 | ** passes back newly constructed principal, which should be freed by caller. |
1455 | */ | 1503 | */ |
1456 | krb5_error_code kssl_build_principal_2( | 1504 | krb5_error_code |
1457 | /* UPDATE */ krb5_context context, | 1505 | kssl_build_principal_2( |
1458 | /* OUT */ krb5_principal *princ, | 1506 | /* UPDATE */ krb5_context context, |
1459 | /* IN */ int rlen, const char *realm, | 1507 | /* OUT */ krb5_principal *princ, |
1460 | /* IN */ int slen, const char *svc, | 1508 | /* IN */ int rlen, const char *realm, |
1461 | /* IN */ int hlen, const char *host) | 1509 | /* IN */ int slen, const char *svc, |
1462 | { | 1510 | /* IN */ int hlen, const char *host) |
1511 | { | ||
1463 | krb5_data *p_data = NULL; | 1512 | krb5_data *p_data = NULL; |
1464 | krb5_principal new_p = NULL; | 1513 | krb5_principal new_p = NULL; |
1465 | char *new_r = NULL; | 1514 | char *new_r = NULL; |
1466 | 1515 | ||
1467 | if ((p_data = (krb5_data *) calloc(2, sizeof(krb5_data))) == NULL || | 1516 | if ((p_data = (krb5_data *)calloc(2, sizeof(krb5_data))) == NULL || |
1468 | (new_p = (krb5_principal) calloc(1, sizeof(krb5_principal_data))) | 1517 | (new_p = (krb5_principal)calloc(1, sizeof(krb5_principal_data))) |
1469 | == NULL) goto err; | 1518 | == NULL) |
1519 | goto err; | ||
1470 | new_p->length = 2; | 1520 | new_p->length = 2; |
1471 | new_p->data = p_data; | 1521 | new_p->data = p_data; |
1472 | 1522 | ||
1473 | if ((new_r = calloc(1, rlen + 1)) == NULL) goto err; | 1523 | if ((new_r = calloc(1, rlen + 1)) == NULL) |
1524 | goto err; | ||
1474 | memcpy(new_r, realm, rlen); | 1525 | memcpy(new_r, realm, rlen); |
1475 | krb5_princ_set_realm_length(context, new_p, rlen); | 1526 | krb5_princ_set_realm_length(context, new_p, rlen); |
1476 | krb5_princ_set_realm_data(context, new_p, new_r); | 1527 | krb5_princ_set_realm_data(context, new_p, new_r); |
1477 | 1528 | ||
1478 | if ((new_p->data[0].data = calloc(1, slen + 1)) == NULL) goto err; | 1529 | if ((new_p->data[0].data = calloc(1, slen + 1)) == NULL) |
1530 | goto err; | ||
1479 | memcpy(new_p->data[0].data, svc, slen); | 1531 | memcpy(new_p->data[0].data, svc, slen); |
1480 | new_p->data[0].length = slen; | 1532 | new_p->data[0].length = slen; |
1481 | 1533 | ||
1482 | if ((new_p->data[1].data = calloc(1, hlen + 1)) == NULL) goto err; | 1534 | if ((new_p->data[1].data = calloc(1, hlen + 1)) == NULL) |
1535 | goto err; | ||
1483 | memcpy(new_p->data[1].data, host, hlen); | 1536 | memcpy(new_p->data[1].data, host, hlen); |
1484 | new_p->data[1].length = hlen; | 1537 | new_p->data[1].length = hlen; |
1485 | 1538 | ||
@@ -1487,32 +1540,38 @@ krb5_error_code kssl_build_principal_2( | |||
1487 | *princ = new_p; | 1540 | *princ = new_p; |
1488 | return 0; | 1541 | return 0; |
1489 | 1542 | ||
1490 | err: | 1543 | err: |
1491 | if (new_p && new_p[0].data) free(new_p[0].data); | 1544 | if (new_p && new_p[0].data) |
1492 | if (new_p && new_p[1].data) free(new_p[1].data); | 1545 | free(new_p[0].data); |
1493 | if (new_p) free(new_p); | 1546 | if (new_p && new_p[1].data) |
1494 | if (new_r) free(new_r); | 1547 | free(new_p[1].data); |
1548 | if (new_p) | ||
1549 | free(new_p); | ||
1550 | if (new_r) | ||
1551 | free(new_r); | ||
1495 | return ENOMEM; | 1552 | return ENOMEM; |
1496 | } | 1553 | } |
1497 | 1554 | ||
1498 | void SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx) | 1555 | void |
1499 | { | 1556 | SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx) |
1557 | { | ||
1500 | s->kssl_ctx = kctx; | 1558 | s->kssl_ctx = kctx; |
1501 | } | 1559 | } |
1502 | 1560 | ||
1503 | KSSL_CTX * SSL_get0_kssl_ctx(SSL *s) | 1561 | KSSL_CTX * |
1504 | { | 1562 | SSL_get0_kssl_ctx(SSL *s) |
1563 | { | ||
1505 | return s->kssl_ctx; | 1564 | return s->kssl_ctx; |
1506 | } | 1565 | } |
1507 | 1566 | ||
1508 | char *kssl_ctx_get0_client_princ(KSSL_CTX *kctx) | 1567 | char * |
1509 | { | 1568 | kssl_ctx_get0_client_princ(KSSL_CTX *kctx) |
1569 | { | ||
1510 | if (kctx) | 1570 | if (kctx) |
1511 | return kctx->client_princ; | 1571 | return kctx->client_princ; |
1512 | return NULL; | 1572 | return NULL; |
1513 | } | 1573 | } |
1514 | 1574 | ||
1515 | #else /* !OPENSSL_NO_KRB5 */ | 1575 | #else /* !OPENSSL_NO_KRB5 */ |
1516 | 1576 | ||
1517 | #endif /* !OPENSSL_NO_KRB5 */ | 1577 | #endif /* !OPENSSL_NO_KRB5 */ |
1518 | |||