aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2006-12-13 02:44:00 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2006-12-13 02:44:00 +0000
commit84553a1b5ea5a542a4f335270f1ec98452217e19 (patch)
treec60728225cdd14325773f8c27af88d13cb1fd008
parent9cddaf7c84fb3287e7fd3037301bc13082fac182 (diff)
if there is a list of mechTypes in the negTokenInit then store the first one
and associate it with the conversation properly. do the same for supportedMech in the negTokenTarg This will allow wireshark to decode the blob in negTokenTarg even when no supportedMech is provided. svn path=/trunk/; revision=20129
-rw-r--r--asn1/spnego/spnego.cnf66
-rw-r--r--epan/dissectors/packet-spnego.c78
-rw-r--r--epan/dissectors/packet-spnego.h2
3 files changed, 107 insertions, 39 deletions
diff --git a/asn1/spnego/spnego.cnf b/asn1/spnego/spnego.cnf
index d39d09238a..620a4bceb6 100644
--- a/asn1/spnego/spnego.cnf
+++ b/asn1/spnego/spnego.cnf
@@ -87,10 +87,32 @@ NegTokenInit/mechListMIC negTokenInit_mechListMIC
} else
offset = tvb_length(tvb);
-#.FN_HDR MechTypeList
+#.FN_BODY MechTypeList
+
+ conversation_t *conversation;
saw_mechanism = FALSE;
+%(DEFAULT_BODY)s
+
+ /*
+ * If we saw a mechType we need to store it in case the negTokenTarg
+ * does not provide a supportedMech.
+ */
+ if(saw_mechanism){
+ conversation = find_conversation(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ if(!conversation){
+ conversation = conversation_new(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ }
+ conversation_add_proto_data(conversation, proto_spnego, next_level_value);
+ }
+
#.FN_PARS NegTokenInit/mechToken
VAL_PTR = &mechToken_tvb
@@ -156,17 +178,21 @@ NegTokenInit/mechListMIC negTokenInit_mechListMIC
%(DEFAULT_BODY)s
/*
- * Now, we need to save this in per-proto info in the
- * conversation if it exists. We also should create a
- * conversation if one does not exist. FIXME!
- * Hmmm, might need to be smarter, because there can be
- * multiple mechTypes in a negTokenInit with one being the
- * default used in the Token if present. Then the negTokenTarg
- * could override that. :-(
+ * If we saw an explicit mechType we store this in the conversation so that
+ * it will override any mechType we might have picked up from the
+ * negTokenInit.
*/
- if ((conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
- pinfo->ptype, pinfo->srcport,
- pinfo->destport, 0))) {
+ if(saw_mechanism){
+ conversation = find_conversation(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ if(!conversation){
+ conversation = conversation_new(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ }
conversation_add_proto_data(conversation, proto_spnego, next_level_value);
}
@@ -189,9 +215,12 @@ NegTokenInit/mechListMIC negTokenInit_mechListMIC
* However, we should make sure that there is something in the
* response token ...
*/
- if (responseToken_tvb && next_level_value) {
- if (tvb_reported_length(responseToken_tvb) > 0)
- call_dissector(next_level_value->handle, responseToken_tvb, pinfo, tree);
+ if (responseToken_tvb && (tvb_reported_length(responseToken_tvb) > 0) ){
+ gssapi_oid_value *value=next_level_value;
+
+ if(value){
+ call_dissector(value->handle, responseToken_tvb, pinfo, tree);
+ }
}
@@ -211,8 +240,13 @@ NegTokenInit/mechListMIC negTokenInit_mechListMIC
* Now, we should be able to dispatch, if we've gotten a tvbuff for
* the MIC and we have information on how to dissect its contents.
*/
- if (mechListMIC_tvb && next_level_value)
- call_dissector(next_level_value->handle, mechListMIC_tvb, pinfo, tree);
+ if (mechListMIC_tvb && (tvb_reported_length(mechListMIC_tvb) > 0) ){
+ gssapi_oid_value *value=next_level_value;
+
+ if(value){
+ call_dissector(value->handle, mechListMIC_tvb, pinfo, tree);
+ }
+ }
#.END
diff --git a/epan/dissectors/packet-spnego.c b/epan/dissectors/packet-spnego.c
index 1471aa7a4f..cfe5b9e307 100644
--- a/epan/dissectors/packet-spnego.c
+++ b/epan/dissectors/packet-spnego.c
@@ -1,6 +1,6 @@
/* Do not modify this file. */
/* It is created automatically by the ASN.1 to Wireshark dissector compiler */
-/* .\packet-spnego.c */
+/* ./packet-spnego.c */
/* ../../tools/asn2wrs.py -b -e -p spnego -c spnego.cnf -s packet-spnego-template spnego.asn */
/* Input file: packet-spnego-template.c */
@@ -199,12 +199,34 @@ static int
dissect_spnego_MechTypeList(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
#line 91 "spnego.cnf"
- saw_mechanism = FALSE;
+ conversation_t *conversation;
+ saw_mechanism = FALSE;
offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
MechTypeList_sequence_of, hf_index, ett_spnego_MechTypeList);
+
+ /*
+ * If we saw a mechType we need to store it in case the negTokenTarg
+ * does not provide a supportedMech.
+ */
+ if(saw_mechanism){
+ conversation = find_conversation(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ if(!conversation){
+ conversation = conversation_new(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ }
+ conversation_add_proto_data(conversation, proto_spnego, next_level_value);
+ }
+
+
+
return offset;
}
static int dissect_mechTypes(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -239,7 +261,7 @@ static int dissect_reqFlags(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb,
static int
dissect_spnego_T_mechToken(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-#line 99 "spnego.cnf"
+#line 121 "spnego.cnf"
tvbuff_t *mechToken_tvb = NULL;
@@ -267,7 +289,7 @@ static int dissect_mechToken(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb
static int
dissect_spnego_T_NegTokenInit_mechListMIC(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-#line 113 "spnego.cnf"
+#line 135 "spnego.cnf"
gint8 class;
gboolean pc;
@@ -357,7 +379,7 @@ static int dissect_negResult(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb
static int
dissect_spnego_T_supportedMech(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-#line 151 "spnego.cnf"
+#line 173 "spnego.cnf"
conversation_t *conversation;
@@ -367,17 +389,21 @@ dissect_spnego_T_supportedMech(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
/*
- * Now, we need to save this in per-proto info in the
- * conversation if it exists. We also should create a
- * conversation if one does not exist. FIXME!
- * Hmmm, might need to be smarter, because there can be
- * multiple mechTypes in a negTokenInit with one being the
- * default used in the Token if present. Then the negTokenTarg
- * could override that. :-(
+ * If we saw an explicit mechType we store this in the conversation so that
+ * it will override any mechType we might have picked up from the
+ * negTokenInit.
*/
- if ((conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
- pinfo->ptype, pinfo->srcport,
- pinfo->destport, 0))) {
+ if(saw_mechanism){
+ conversation = find_conversation(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ if(!conversation){
+ conversation = conversation_new(pinfo->fd->num,
+ &pinfo->src, &pinfo->dst,
+ pinfo->ptype,
+ pinfo->srcport, pinfo->destport, 0);
+ }
conversation_add_proto_data(conversation, proto_spnego, next_level_value);
}
@@ -394,7 +420,7 @@ static int dissect_supportedMech(packet_info *pinfo, proto_tree *tree, tvbuff_t
static int
dissect_spnego_T_responseToken(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-#line 179 "spnego.cnf"
+#line 205 "spnego.cnf"
tvbuff_t *responseToken_tvb;
@@ -410,9 +436,12 @@ dissect_spnego_T_responseToken(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
* However, we should make sure that there is something in the
* response token ...
*/
- if (responseToken_tvb && next_level_value) {
- if (tvb_reported_length(responseToken_tvb) > 0)
- call_dissector(next_level_value->handle, responseToken_tvb, pinfo, tree);
+ if (responseToken_tvb && (tvb_reported_length(responseToken_tvb) > 0) ){
+ gssapi_oid_value *value=next_level_value;
+
+ if(value){
+ call_dissector(value->handle, responseToken_tvb, pinfo, tree);
+ }
}
@@ -428,7 +457,7 @@ static int dissect_responseToken(packet_info *pinfo, proto_tree *tree, tvbuff_t
static int
dissect_spnego_T_mechListMIC(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-#line 203 "spnego.cnf"
+#line 232 "spnego.cnf"
tvbuff_t *mechListMIC_tvb;
@@ -442,8 +471,13 @@ dissect_spnego_T_mechListMIC(gboolean implicit_tag _U_, tvbuff_t *tvb, int offse
* Now, we should be able to dispatch, if we've gotten a tvbuff for
* the MIC and we have information on how to dissect its contents.
*/
- if (mechListMIC_tvb && next_level_value)
- call_dissector(next_level_value->handle, mechListMIC_tvb, pinfo, tree);
+ if (mechListMIC_tvb && (tvb_reported_length(mechListMIC_tvb) > 0) ){
+ gssapi_oid_value *value=next_level_value;
+
+ if(value){
+ call_dissector(value->handle, mechListMIC_tvb, pinfo, tree);
+ }
+ }
diff --git a/epan/dissectors/packet-spnego.h b/epan/dissectors/packet-spnego.h
index 804173fb2f..b4b4bc73cd 100644
--- a/epan/dissectors/packet-spnego.h
+++ b/epan/dissectors/packet-spnego.h
@@ -1,6 +1,6 @@
/* Do not modify this file. */
/* It is created automatically by the ASN.1 to Wireshark dissector compiler */
-/* .\packet-spnego.h */
+/* ./packet-spnego.h */
/* ../../tools/asn2wrs.py -b -e -p spnego -c spnego.cnf -s packet-spnego-template spnego.asn */
/* Input file: packet-spnego-template.h */