diff options
author | Greg Hudson <ghudson@mit.edu> | 2010-04-30 21:22:48 +0000 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2010-04-30 21:22:48 +0000 |
commit | baea9a7a27d781581505f0bb6d0ac4e4f24053aa (patch) | |
tree | af04244ed8b910bed378296d0b263c5f2b3a3ffc /src/lib/krb5 | |
parent | d20d802b8e44178017fd1a1da55a72194f50da55 (diff) | |
download | krb5-baea9a7a27d781581505f0bb6d0ac4e4f24053aa.tar.gz krb5-baea9a7a27d781581505f0bb6d0ac4e4f24053aa.tar.xz krb5-baea9a7a27d781581505f0bb6d0ac4e4f24053aa.zip |
Add IAKERB mechanism and gss_acquire_cred_with_password
Merge branches/iakerb to trunk. Includes the following:
* New IAKERB mechanism.
* New gss_acquire_cred_with_password mechglue function.
* ASN.1 encoders and decoders for IAKERB structures (with tests).
* New shortcuts in gss-sample client and server.
* Tests to exercise SPNEGO and IAKERB using gss-sample application.
ticket: 6712
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@23960 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5')
-rw-r--r-- | src/lib/krb5/asn.1/asn1_k_decode.c | 41 | ||||
-rw-r--r-- | src/lib/krb5/asn.1/asn1_k_decode.h | 6 | ||||
-rw-r--r-- | src/lib/krb5/asn.1/asn1_k_encode.c | 31 | ||||
-rw-r--r-- | src/lib/krb5/asn.1/krb5_decode.c | 24 | ||||
-rw-r--r-- | src/lib/krb5/error_tables/krb5_err.et | 4 | ||||
-rw-r--r-- | src/lib/krb5/krb/kfree.c | 19 | ||||
-rw-r--r-- | src/lib/krb5/libkrb5.exports | 6 |
7 files changed, 129 insertions, 2 deletions
diff --git a/src/lib/krb5/asn.1/asn1_k_decode.c b/src/lib/krb5/asn.1/asn1_k_decode.c index 60d9455a1..c2dd5f6d4 100644 --- a/src/lib/krb5/asn.1/asn1_k_decode.c +++ b/src/lib/krb5/asn.1/asn1_k_decode.c @@ -1899,6 +1899,47 @@ error_out: return retval; } +asn1_error_code asn1_decode_iakerb_header +(asn1buf *buf, krb5_iakerb_header *val) +{ + setup(); + val->target_realm.data = NULL; + val->target_realm.length = 0; + val->cookie = NULL; + { + begin_structure(); + get_lenfield(val->target_realm.length, val->target_realm.data, + 1, asn1_decode_charstring); + if (tagnum == 2) { + alloc_data(val->cookie); + get_lenfield(val->cookie->length, val->cookie->data, + 2, asn1_decode_charstring); + } + end_structure(); + } + return 0; +error_out: + krb5_free_data_contents(NULL, &val->target_realm); + krb5_free_data(NULL, val->cookie); + return retval; +} + +asn1_error_code asn1_decode_iakerb_finished +(asn1buf *buf, krb5_iakerb_finished *val) +{ + setup(); + val->checksum.contents = NULL; + { + begin_structure(); + get_field(val->checksum, 1, asn1_decode_checksum); + end_structure(); + } + return 0; +error_out: + krb5_free_checksum_contents(NULL, &val->checksum); + return retval; +} + #ifndef DISABLE_PKINIT /* PKINIT */ diff --git a/src/lib/krb5/asn.1/asn1_k_decode.h b/src/lib/krb5/asn.1/asn1_k_decode.h index 1b0aa750b..79a4a05e4 100644 --- a/src/lib/krb5/asn.1/asn1_k_decode.h +++ b/src/lib/krb5/asn.1/asn1_k_decode.h @@ -271,4 +271,10 @@ asn1_error_code asn1_decode_ad_kdcissued_ptr(asn1buf *buf, asn1_error_code asn1_decode_ad_signedpath(asn1buf *buf, krb5_ad_signedpath *val); +asn1_error_code asn1_decode_iakerb_header(asn1buf *buf, + krb5_iakerb_header *val); + +asn1_error_code asn1_decode_iakerb_finished(asn1buf *buf, + krb5_iakerb_finished *val); + #endif diff --git a/src/lib/krb5/asn.1/asn1_k_encode.c b/src/lib/krb5/asn.1/asn1_k_encode.c index a35f561e6..d334ae632 100644 --- a/src/lib/krb5/asn.1/asn1_k_encode.c +++ b/src/lib/krb5/asn.1/asn1_k_encode.c @@ -1394,6 +1394,35 @@ static unsigned int ad_signedpath_optional(const void *p) DEFSEQTYPE(ad_signedpath, krb5_ad_signedpath, ad_signedpath_fields, ad_signedpath_optional); +static const struct field_info iakerb_header_fields[] = { + FIELDOF_NORM(krb5_iakerb_header, ostring_data, target_realm, 1), + FIELDOF_OPT(krb5_iakerb_header, ostring_data_ptr, cookie, 2, 2), +}; + +static unsigned int iakerb_header_optional(const void *p) +{ + unsigned int optional = 0; + const krb5_iakerb_header *val = p; + if (val->cookie && val->cookie->data) + optional |= (1u << 2); + return optional; +} + +DEFSEQTYPE(iakerb_header, krb5_iakerb_header, iakerb_header_fields, iakerb_header_optional); + +static const struct field_info iakerb_finished_fields[] = { + FIELDOF_NORM(krb5_iakerb_finished, checksum, checksum, 1), +}; + +static unsigned int iakerb_finished_optional(const void *p) +{ + unsigned int optional = 0; + return optional; +} + +DEFSEQTYPE(iakerb_finished, krb5_iakerb_finished, iakerb_finished_fields, +iakerb_finished_optional); + /* Exported complete encoders -- these produce a krb5_data with the encoding in the correct byte order. */ @@ -1472,6 +1501,8 @@ MAKE_FULL_ENCODER(encode_krb5_fast_response, fast_response); MAKE_FULL_ENCODER(encode_krb5_ad_kdcissued, ad_kdc_issued); MAKE_FULL_ENCODER(encode_krb5_ad_signedpath_data, ad_signedpath_data); MAKE_FULL_ENCODER(encode_krb5_ad_signedpath, ad_signedpath); +MAKE_FULL_ENCODER(encode_krb5_iakerb_header, iakerb_header); +MAKE_FULL_ENCODER(encode_krb5_iakerb_finished, iakerb_finished); diff --git a/src/lib/krb5/asn.1/krb5_decode.c b/src/lib/krb5/asn.1/krb5_decode.c index 542a626da..7aeb6bfe5 100644 --- a/src/lib/krb5/asn.1/krb5_decode.c +++ b/src/lib/krb5/asn.1/krb5_decode.c @@ -1218,6 +1218,30 @@ decode_krb5_ad_signedpath(const krb5_data *code, krb5_ad_signedpath **repptr) cleanup(free); } +krb5_error_code decode_krb5_iakerb_header +(const krb5_data *code, krb5_iakerb_header **repptr) +{ + setup_buf_only(krb5_iakerb_header *); + alloc_field(rep); + + retval = asn1_decode_iakerb_header(&buf, rep); + if (retval) clean_return(retval); + + cleanup(free); +} + +krb5_error_code decode_krb5_iakerb_finished +(const krb5_data *code, krb5_iakerb_finished **repptr) +{ + setup_buf_only(krb5_iakerb_finished *); + alloc_field(rep); + + retval = asn1_decode_iakerb_finished(&buf, rep); + if (retval) clean_return(retval); + + cleanup(free); +} + krb5_error_code krb5int_get_authdata_containee_types(krb5_context context, const krb5_authdata *authdata, diff --git a/src/lib/krb5/error_tables/krb5_err.et b/src/lib/krb5/error_tables/krb5_err.et index bf3404de1..56434ad47 100644 --- a/src/lib/krb5/error_tables/krb5_err.et +++ b/src/lib/krb5/error_tables/krb5_err.et @@ -126,8 +126,8 @@ error_code KRB5KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED, "Public key encrypti error_code KRB5PLACEHOLD_82, "KRB5 error code 82" error_code KRB5PLACEHOLD_83, "KRB5 error code 83" error_code KRB5PLACEHOLD_84, "KRB5 error code 84" -error_code KRB5PLACEHOLD_85, "KRB5 error code 85" -error_code KRB5PLACEHOLD_86, "KRB5 error code 86" +error_code KRB5KRB_AP_ERR_IAKERB_KDC_NOT_FOUND, "The IAKERB proxy could not find a KDC" +error_code KRB5KRB_AP_ERR_IAKERB_KDC_NO_RESPONSE, "The KDC did not respond to the IAKERB proxy" error_code KRB5PLACEHOLD_87, "KRB5 error code 87" error_code KRB5PLACEHOLD_88, "KRB5 error code 88" error_code KRB5PLACEHOLD_89, "KRB5 error code 89" diff --git a/src/lib/krb5/krb/kfree.c b/src/lib/krb5/krb/kfree.c index 2adaa4101..6a3e6b291 100644 --- a/src/lib/krb5/krb/kfree.c +++ b/src/lib/krb5/krb/kfree.c @@ -913,3 +913,22 @@ krb5_free_ad_signedpath(krb5_context context, krb5_ad_signedpath *val) krb5_free_pa_data(context, val->method_data); free(val); } + +void KRB5_CALLCONV +krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val) +{ + if (val == NULL) + return ; + + krb5_free_data_contents(context, &val->target_realm); + krb5_free_data(context, val->cookie); +} + +void KRB5_CALLCONV +krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val) +{ + if (val == NULL) + return ; + + krb5_free_checksum_contents(context, &val->checksum); +} diff --git a/src/lib/krb5/libkrb5.exports b/src/lib/krb5/libkrb5.exports index 58e4ddac7..5c517c89c 100644 --- a/src/lib/krb5/libkrb5.exports +++ b/src/lib/krb5/libkrb5.exports @@ -22,6 +22,8 @@ decode_krb5_error decode_krb5_etype_info decode_krb5_etype_info2 decode_krb5_fast_req +decode_krb5_iakerb_finished +decode_krb5_iakerb_header decode_krb5_kdc_req_body decode_krb5_pa_enc_ts decode_krb5_pa_for_user @@ -67,6 +69,8 @@ encode_krb5_error encode_krb5_etype_info encode_krb5_etype_info2 encode_krb5_fast_response +encode_krb5_iakerb_finished +encode_krb5_iakerb_header encode_krb5_kdc_req_body encode_krb5_pa_enc_ts encode_krb5_pa_for_user @@ -266,6 +270,8 @@ krb5_free_etype_info krb5_free_fast_armored_req krb5_free_fast_req krb5_free_host_realm +krb5_free_iakerb_finished +krb5_free_iakerb_header krb5_free_kdc_rep krb5_free_kdc_req krb5_free_keyblock |