summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2014-03-26 23:31:45 -0400
committerSimo Sorce <simo@redhat.com>2014-05-04 17:21:06 -0400
commitae3dda499ad8bd9f30d2506434dd3f8c4e72ba24 (patch)
treeaad52385766a1c702526cb851c6ffe33fe7d3108
parentbc52b7a308c90cfdd8dfcd8dab09c67bcd578de2 (diff)
downloadgss-ntlmssp-ae3dda499ad8bd9f30d2506434dd3f8c4e72ba24.tar.gz
gss-ntlmssp-ae3dda499ad8bd9f30d2506434dd3f8c4e72ba24.tar.xz
gss-ntlmssp-ae3dda499ad8bd9f30d2506434dd3f8c4e72ba24.zip
Verify Channel Bindings in accept_sec_context
-rw-r--r--src/gss_sec_ctx.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/gss_sec_ctx.c b/src/gss_sec_ctx.c
index d659900..800d37e 100644
--- a/src/gss_sec_ctx.c
+++ b/src/gss_sec_ctx.c
@@ -766,6 +766,8 @@ uint32_t gssntlm_accept_sec_context(uint32_t *minor_status,
uint32_t in_flags;
uint32_t msg_type;
uint32_t av_flags = 0;
+ struct ntlm_buffer unhashed_cb = { 0 };
+ struct ntlm_buffer av_cb = { 0 };
uint8_t sec_req;
char *p;
@@ -1028,7 +1030,7 @@ uint32_t gssntlm_accept_sec_context(uint32_t *minor_status,
retmin = ntlm_decode_target_info(ctx->ntlm, &target_info,
NULL, NULL, NULL, NULL,
NULL, NULL, &av_flags,
- NULL, NULL, NULL);
+ NULL, NULL, &av_cb);
if (retmin) {
retmaj = GSS_S_FAILURE;
goto done;
@@ -1202,6 +1204,27 @@ uint32_t gssntlm_accept_sec_context(uint32_t *minor_status,
}
}
+ if (input_chan_bindings != GSS_C_NO_CHANNEL_BINDINGS) {
+ if (input_chan_bindings->initiator_addrtype != 0 ||
+ input_chan_bindings->initiator_address.length != 0 ||
+ input_chan_bindings->acceptor_addrtype != 0 ||
+ input_chan_bindings->acceptor_address.length != 0 ||
+ input_chan_bindings->application_data.length == 0) {
+ retmin = EINVAL;
+ retmaj = GSS_S_BAD_BINDINGS;
+ goto done;
+ }
+ unhashed_cb.length = input_chan_bindings->application_data.length;
+ unhashed_cb.data = input_chan_bindings->application_data.value;
+
+ /* TODO: optionally allow to ignore CBT if av_cb is null ? */
+ retmin = ntlm_verify_channel_bindings(&unhashed_cb, &av_cb);
+ if (retmin) {
+ retmaj = GSS_S_DEFECTIVE_TOKEN;
+ goto done;
+ }
+ }
+
if (ctx->neg_flags & (NTLMSSP_NEGOTIATE_SIGN |
NTLMSSP_NEGOTIATE_SEAL)) {
retmin = ntlm_signseal_keys(ctx->neg_flags, false,