aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--asn1/spnego/packet-spnego-template.c7
-rw-r--r--asn1/spnego/spnego.asn91
-rw-r--r--asn1/spnego/spnego.cnf65
-rw-r--r--epan/dissectors/packet-spnego.c196
4 files changed, 213 insertions, 146 deletions
diff --git a/asn1/spnego/packet-spnego-template.c b/asn1/spnego/packet-spnego-template.c
index ead29a345d..ac2d9b1f64 100644
--- a/asn1/spnego/packet-spnego-template.c
+++ b/asn1/spnego/packet-spnego-template.c
@@ -96,13 +96,16 @@ static gint ett_spnego_krb5_cfx_flags = -1;
#include "packet-spnego-ett.c"
/*
- * Unfortunately, we have to have a forward declaration of this,
+ * Unfortunately, we have to have forward declarations of thess,
* as the code generated by asn2wrs includes a call before the
* definition.
*/
-static int dissect_spnego_PrincipalSeq(gboolean implicit_tag, tvbuff_t *tvb,
+static int dissect_spnego_NegTokenInit(gboolean implicit_tag, tvbuff_t *tvb,
int offset, asn1_ctx_t *actx _U_,
proto_tree *tree, int hf_index);
+static int dissect_spnego_NegTokenInit2(gboolean implicit_tag, tvbuff_t *tvb,
+ int offset, asn1_ctx_t *actx _U_,
+ proto_tree *tree, int hf_index);
#include "packet-spnego-fn.c"
/*
diff --git a/asn1/spnego/spnego.asn b/asn1/spnego/spnego.asn
index 190b3f1555..b62973df2f 100644
--- a/asn1/spnego/spnego.asn
+++ b/asn1/spnego/spnego.asn
@@ -13,21 +13,11 @@ NegotiationToken ::= CHOICE {
MechTypeList ::= SEQUENCE OF MechType
--
--- In some cases, the mechListMIC is a sequence of GeneralString,
--- rather than an OCTET STRING. We define that sequence here so
--- that we can call its dissector.
--- The IRC discussion at
+-- MS-SPNG tells us that the format of a negTokenInit is actually
+-- negTokenInit2 if a negTokenInit is seen in a response. It might need
+-- to be the first negTokenInit seen in a response, but I am not sure.
+-- It will only occur in a NegotiateProtocol response in CIFS/SMB or SMB2.
--
--- http://irc.vernstok.nl/samba-technical.dy
---
--- seems to suggest that it's a Kerberos principal of some sort, thanks
--- to some flavor of "embrace, extend, expectorate" sequence from
--- Microsoft.
---
-PrincipalSeq ::= SEQUENCE {
- principal [0] GeneralString
-}
-
NegTokenInit ::= SEQUENCE {
mechTypes [0] MechTypeList OPTIONAL,
reqFlags [1] ContextFlags OPTIONAL,
@@ -35,6 +25,19 @@ NegTokenInit ::= SEQUENCE {
mechListMIC [3] OCTET STRING OPTIONAL
}
+NegHints ::= SEQUENCE {
+ hintName [0] GeneralString OPTIONAL,
+ hintAddress [1] OCTET STRING OPTIONAL
+}
+
+NegTokenInit2 ::= SEQUENCE {
+ mechTypes [0] MechTypeList OPTIONAL,
+ reqFlags [1] ContextFlags OPTIONAL,
+ mechToken [2] OCTET STRING OPTIONAL,
+ negHints [3] NegHints OPTIONAL,
+ mechListMIC [4] OCTET STRING OPTIONAL
+}
+
ContextFlags ::= BIT STRING {
delegFlag (0),
mutualFlag (1),
@@ -55,46 +58,46 @@ NegTokenTarg ::= SEQUENCE {
mechListMIC [3] OCTET STRING OPTIONAL
}
---GSS-API DEFINITIONS ::=
---BEGIN
---MechType ::= OBJECT IDENTIFIER
--- data structure definitions
--- callers must be able to distinguish among
--- InitialContextToken, SubsequentContextToken,
--- PerMsgToken, and SealedMessage data elements
--- based on the usage in which they occur
-InitialContextToken ::=
- -- option indication (delegation, etc.) indicated within
- -- mechanism-specific token
-[APPLICATION 0] IMPLICIT SEQUENCE {
- thisMech MechType,
- innerContextToken InnerContextToken
- -- DEFINED BY thisMech
- -- contents mechanism-specific
+--GSS-API DEFINITIONS ::=
+--BEGIN
+--MechType ::= OBJECT IDENTIFIER
+-- data structure definitions
+-- callers must be able to distinguish among
+-- InitialContextToken, SubsequentContextToken,
+-- PerMsgToken, and SealedMessage data elements
+-- based on the usage in which they occur
+InitialContextToken ::=
+ -- option indication (delegation, etc.) indicated within
+ -- mechanism-specific token
+[APPLICATION 0] IMPLICIT SEQUENCE {
+ thisMech MechType,
+ innerContextToken InnerContextToken
+ -- DEFINED BY thisMech
+ -- contents mechanism-specific
-- ASN.1 structure not required
- }
+ }
-- SubsequentContextToken ::= InnerContextToken
InnerContextToken ::= ANY
--- interpretation based on predecessor InitialContextToken
--- ASN.1 structure not required
+-- interpretation based on predecessor InitialContextToken
+-- ASN.1 structure not required
--- PerMsgToken ::=
--- as emitted by GSS_GetMIC and processed by GSS_VerifyMIC
--- ASN.1 structure not required
+-- PerMsgToken ::=
+-- as emitted by GSS_GetMIC and processed by GSS_VerifyMIC
+-- ASN.1 structure not required
-- InnerMsgToken
-- InnerMsgToken ::= ANY
--- SealedMessage ::=
--- as emitted by GSS_Wrap and processed by GSS_Unwrap
--- includes internal, mechanism-defined indicator
--- of whether or not encrypted
--- ASN.1 structure not required
--- SealedUserData
-
--- SealedUserData ::= ANY
+-- SealedMessage ::=
+-- as emitted by GSS_Wrap and processed by GSS_Unwrap
+-- includes internal, mechanism-defined indicator
+-- of whether or not encrypted
+-- ASN.1 structure not required
+-- SealedUserData
+
+-- SealedUserData ::= ANY
-- END GSS-API DEFINITIONS
diff --git a/asn1/spnego/spnego.cnf b/asn1/spnego/spnego.cnf
index a4fcc0b388..9d9e760cb2 100644
--- a/asn1/spnego/spnego.cnf
+++ b/asn1/spnego/spnego.cnf
@@ -8,11 +8,22 @@
#.NO_EMIT ONLY_VALS
NegotiationToken
-#.TYPE_RENAME
-NegTokenInit/mechListMIC T_NegTokenInit_mechListMIC
+#.FN_BODY NegotiationToken/negTokenInit
+ gboolean is_response = actx->pinfo->ptype == PT_TCP &&
+ actx->pinfo->srcport < 1024;
-#.FIELD_RENAME
-NegTokenInit/mechListMIC negTokenInit_mechListMIC
+ /*
+ * We decode as negTokenInit2 or negTokenInit depending on whether or not
+ * we are in a response or a request. That is essentially what MS-SPNG
+ * says.
+ */
+ if (is_response) {
+ return dissect_spnego_NegTokenInit2(%(IMPLICIT_TAG)s, %(TVB)s, %(OFFSET)s,
+ %(ACTX)s, %(TREE)s, %(HF_INDEX)s);
+ } else {
+ return dissect_spnego_NegTokenInit(%(IMPLICIT_TAG)s, %(TVB)s, %(OFFSET)s,
+ %(ACTX)s, %(TREE)s, %(HF_INDEX)s);
+ }
#.FN_PARS MechType
@@ -121,42 +132,28 @@ NegTokenInit/mechListMIC negTokenInit_mechListMIC
call_dissector(next_level_value->handle, mechToken_tvb, actx->pinfo, tree);
+#.FN_PARS NegTokenInit/mechListMIC
+
+ VAL_PTR = &mechListMIC_tvb
+
#.FN_BODY NegTokenInit/mechListMIC
- gint8 ber_class;
- gboolean pc;
- gint32 tag;
tvbuff_t *mechListMIC_tvb;
+
+%(DEFAULT_BODY)s
+
+
/*
- * There seems to be two different forms this can take,
- * one as an octet string, and one as a general string in a
- * sequence.
- *
- * Peek at the header, and then decide which it is we're seeing.
+ * 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.
*/
- get_ber_identifier(tvb, offset, &ber_class, &pc, &tag);
- if (ber_class == BER_CLASS_UNI && pc && tag == BER_UNI_TAG_SEQUENCE) {
- /*
- * It's a sequence.
- */
- return dissect_spnego_PrincipalSeq(FALSE, tvb, offset, actx, tree,
- hf_spnego_mechListMIC);
- } else {
- /*
- * It's not a sequence, so dissect it as an octet string,
- * which is what it's supposed to be; that'll cause the
- * right error report if it's not an octet string, either.
- */
- offset = dissect_ber_octet_string(FALSE, actx, tree, tvb, offset,
- hf_spnego_mechListMIC, &mechListMIC_tvb);
-
- /*
- * Now, we should be able to dispatch with that tvbuff.
- */
- if (mechListMIC_tvb && next_level_value)
- call_dissector(next_level_value->handle, mechListMIC_tvb, actx->pinfo, tree);
- return offset;
+ if (mechListMIC_tvb && (tvb_reported_length(mechListMIC_tvb) > 0) ){
+ gssapi_oid_value *value=next_level_value;
+
+ if(value){
+ call_dissector(value->handle, mechListMIC_tvb, actx->pinfo, tree);
+ }
}
#.FN_BODY NegTokenTarg/supportedMech
diff --git a/epan/dissectors/packet-spnego.c b/epan/dissectors/packet-spnego.c
index 727a48f8de..e533214d36 100644
--- a/epan/dissectors/packet-spnego.c
+++ b/epan/dissectors/packet-spnego.c
@@ -90,18 +90,22 @@ static int hf_spnego_krb5_cfx_seq = -1;
/*--- Included file: packet-spnego-hf.c ---*/
#line 1 "../../asn1/spnego/packet-spnego-hf.c"
-static int hf_spnego_negTokenInit = -1; /* NegTokenInit */
+static int hf_spnego_negTokenInit = -1; /* T_negTokenInit */
static int hf_spnego_negTokenTarg = -1; /* NegTokenTarg */
static int hf_spnego_MechTypeList_item = -1; /* MechType */
-static int hf_spnego_principal = -1; /* GeneralString */
static int hf_spnego_mechTypes = -1; /* MechTypeList */
static int hf_spnego_reqFlags = -1; /* ContextFlags */
static int hf_spnego_mechToken = -1; /* T_mechToken */
-static int hf_spnego_negTokenInit_mechListMIC = -1; /* T_NegTokenInit_mechListMIC */
+static int hf_spnego_mechListMIC = -1; /* T_mechListMIC */
+static int hf_spnego_hintName = -1; /* GeneralString */
+static int hf_spnego_hintAddress = -1; /* OCTET_STRING */
+static int hf_spnego_mechToken_01 = -1; /* OCTET_STRING */
+static int hf_spnego_negHints = -1; /* NegHints */
+static int hf_spnego_mechListMIC_01 = -1; /* OCTET_STRING */
static int hf_spnego_negResult = -1; /* T_negResult */
static int hf_spnego_supportedMech = -1; /* T_supportedMech */
static int hf_spnego_responseToken = -1; /* T_responseToken */
-static int hf_spnego_mechListMIC = -1; /* T_mechListMIC */
+static int hf_spnego_mechListMIC_02 = -1; /* T_mechListMIC_01 */
static int hf_spnego_thisMech = -1; /* MechType */
static int hf_spnego_innerContextToken = -1; /* InnerContextToken */
/* named bits */
@@ -133,8 +137,9 @@ static gint ett_spnego_krb5_cfx_flags = -1;
#line 1 "../../asn1/spnego/packet-spnego-ett.c"
static gint ett_spnego_NegotiationToken = -1;
static gint ett_spnego_MechTypeList = -1;
-static gint ett_spnego_PrincipalSeq = -1;
static gint ett_spnego_NegTokenInit = -1;
+static gint ett_spnego_NegHints = -1;
+static gint ett_spnego_NegTokenInit2 = -1;
static gint ett_spnego_ContextFlags = -1;
static gint ett_spnego_NegTokenTarg = -1;
static gint ett_spnego_InitialContextToken_U = -1;
@@ -143,13 +148,16 @@ static gint ett_spnego_InitialContextToken_U = -1;
#line 97 "../../asn1/spnego/packet-spnego-template.c"
/*
- * Unfortunately, we have to have a forward declaration of this,
+ * Unfortunately, we have to have forward declarations of thess,
* as the code generated by asn2wrs includes a call before the
* definition.
*/
-static int dissect_spnego_PrincipalSeq(gboolean implicit_tag, tvbuff_t *tvb,
+static int dissect_spnego_NegTokenInit(gboolean implicit_tag, tvbuff_t *tvb,
int offset, asn1_ctx_t *actx _U_,
proto_tree *tree, int hf_index);
+static int dissect_spnego_NegTokenInit2(gboolean implicit_tag, tvbuff_t *tvb,
+ int offset, asn1_ctx_t *actx _U_,
+ proto_tree *tree, int hf_index);
/*--- Included file: packet-spnego-fn.c ---*/
@@ -158,7 +166,7 @@ static int dissect_spnego_PrincipalSeq(gboolean implicit_tag, tvbuff_t *tvb,
static int
dissect_spnego_MechType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 22 "../../asn1/spnego/spnego.cnf"
+#line 33 "../../asn1/spnego/spnego.cnf"
gssapi_oid_value *value;
@@ -196,7 +204,7 @@ static const ber_sequence_t MechTypeList_sequence_of[1] = {
static int
dissect_spnego_MechTypeList(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 90 "../../asn1/spnego/spnego.cnf"
+#line 101 "../../asn1/spnego/spnego.cnf"
conversation_t *conversation;
@@ -245,7 +253,7 @@ dissect_spnego_ContextFlags(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
static int
dissect_spnego_T_mechToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 111 "../../asn1/spnego/spnego.cnf"
+#line 122 "../../asn1/spnego/spnego.cnf"
tvbuff_t *mechToken_tvb = NULL;
@@ -269,43 +277,27 @@ dissect_spnego_T_mechToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int off
static int
-dissect_spnego_T_NegTokenInit_mechListMIC(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 125 "../../asn1/spnego/spnego.cnf"
+dissect_spnego_T_mechListMIC(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 140 "../../asn1/spnego/spnego.cnf"
- gint8 ber_class;
- gboolean pc;
- gint32 tag;
tvbuff_t *mechListMIC_tvb;
+
+ offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
+ &mechListMIC_tvb);
+
+
+
/*
- * There seems to be two different forms this can take,
- * one as an octet string, and one as a general string in a
- * sequence.
- *
- * Peek at the header, and then decide which it is we're seeing.
+ * 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.
*/
- get_ber_identifier(tvb, offset, &ber_class, &pc, &tag);
- if (ber_class == BER_CLASS_UNI && pc && tag == BER_UNI_TAG_SEQUENCE) {
- /*
- * It's a sequence.
- */
- return dissect_spnego_PrincipalSeq(FALSE, tvb, offset, actx, tree,
- hf_spnego_mechListMIC);
- } else {
- /*
- * It's not a sequence, so dissect it as an octet string,
- * which is what it's supposed to be; that'll cause the
- * right error report if it's not an octet string, either.
- */
- offset = dissect_ber_octet_string(FALSE, actx, tree, tvb, offset,
- hf_spnego_mechListMIC, &mechListMIC_tvb);
-
- /*
- * Now, we should be able to dispatch with that tvbuff.
- */
- if (mechListMIC_tvb && next_level_value)
- call_dissector(next_level_value->handle, mechListMIC_tvb, actx->pinfo, tree);
- return offset;
+ if (mechListMIC_tvb && (tvb_reported_length(mechListMIC_tvb) > 0) ){
+ gssapi_oid_value *value=next_level_value;
+
+ if(value){
+ call_dissector(value->handle, mechListMIC_tvb, actx->pinfo, tree);
+ }
}
@@ -318,7 +310,7 @@ static const ber_sequence_t NegTokenInit_sequence[] = {
{ &hf_spnego_mechTypes , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_spnego_MechTypeList },
{ &hf_spnego_reqFlags , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_spnego_ContextFlags },
{ &hf_spnego_mechToken , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL, dissect_spnego_T_mechToken },
- { &hf_spnego_negTokenInit_mechListMIC, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL, dissect_spnego_T_NegTokenInit_mechListMIC },
+ { &hf_spnego_mechListMIC , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL, dissect_spnego_T_mechListMIC },
{ NULL, 0, 0, 0, NULL }
};
@@ -331,6 +323,32 @@ dissect_spnego_NegTokenInit(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
}
+
+static int
+dissect_spnego_T_negTokenInit(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 12 "../../asn1/spnego/spnego.cnf"
+ gboolean is_response = actx->pinfo->ptype == PT_TCP &&
+ actx->pinfo->srcport < 1024;
+
+ /*
+ * We decode as negTokenInit2 or negTokenInit depending on whether or not
+ * we are in a response or a request. That is essentially what MS-SPNG
+ * says.
+ */
+ if (is_response) {
+ return dissect_spnego_NegTokenInit2(implicit_tag, tvb, offset,
+ actx, tree, hf_index);
+ } else {
+ return dissect_spnego_NegTokenInit(implicit_tag, tvb, offset,
+ actx, tree, hf_index);
+ }
+
+
+
+ return offset;
+}
+
+
static const value_string spnego_T_negResult_vals[] = {
{ 0, "accept-completed" },
{ 1, "accept-incomplete" },
@@ -351,7 +369,7 @@ dissect_spnego_T_negResult(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int off
static int
dissect_spnego_T_supportedMech(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 163 "../../asn1/spnego/spnego.cnf"
+#line 160 "../../asn1/spnego/spnego.cnf"
conversation_t *conversation;
@@ -380,7 +398,7 @@ dissect_spnego_T_supportedMech(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
static int
dissect_spnego_T_responseToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 186 "../../asn1/spnego/spnego.cnf"
+#line 183 "../../asn1/spnego/spnego.cnf"
tvbuff_t *responseToken_tvb;
@@ -413,8 +431,8 @@ dissect_spnego_T_responseToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
static int
-dissect_spnego_T_mechListMIC(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 213 "../../asn1/spnego/spnego.cnf"
+dissect_spnego_T_mechListMIC_01(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 210 "../../asn1/spnego/spnego.cnf"
tvbuff_t *mechListMIC_tvb;
@@ -447,7 +465,7 @@ static const ber_sequence_t NegTokenTarg_sequence[] = {
{ &hf_spnego_negResult , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_spnego_T_negResult },
{ &hf_spnego_supportedMech, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_spnego_T_supportedMech },
{ &hf_spnego_responseToken, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL, dissect_spnego_T_responseToken },
- { &hf_spnego_mechListMIC , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL, dissect_spnego_T_mechListMIC },
+ { &hf_spnego_mechListMIC_02, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL, dissect_spnego_T_mechListMIC_01 },
{ NULL, 0, 0, 0, NULL }
};
@@ -461,7 +479,7 @@ dissect_spnego_NegTokenTarg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
static const ber_choice_t NegotiationToken_choice[] = {
- { 0, &hf_spnego_negTokenInit , BER_CLASS_CON, 0, 0, dissect_spnego_NegTokenInit },
+ { 0, &hf_spnego_negTokenInit , BER_CLASS_CON, 0, 0, dissect_spnego_T_negTokenInit },
{ 1, &hf_spnego_negTokenTarg , BER_CLASS_CON, 1, 0, dissect_spnego_NegTokenTarg },
{ 0, NULL, 0, 0, 0, NULL }
};
@@ -487,15 +505,44 @@ dissect_spnego_GeneralString(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int o
}
-static const ber_sequence_t PrincipalSeq_sequence[] = {
- { &hf_spnego_principal , BER_CLASS_CON, 0, 0, dissect_spnego_GeneralString },
+
+static int
+dissect_spnego_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+ offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
+ NULL);
+
+ return offset;
+}
+
+
+static const ber_sequence_t NegHints_sequence[] = {
+ { &hf_spnego_hintName , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_spnego_GeneralString },
+ { &hf_spnego_hintAddress , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_spnego_OCTET_STRING },
{ NULL, 0, 0, 0, NULL }
};
static int
-dissect_spnego_PrincipalSeq(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+dissect_spnego_NegHints(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
- PrincipalSeq_sequence, hf_index, ett_spnego_PrincipalSeq);
+ NegHints_sequence, hf_index, ett_spnego_NegHints);
+
+ return offset;
+}
+
+
+static const ber_sequence_t NegTokenInit2_sequence[] = {
+ { &hf_spnego_mechTypes , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_spnego_MechTypeList },
+ { &hf_spnego_reqFlags , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_spnego_ContextFlags },
+ { &hf_spnego_mechToken_01 , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL, dissect_spnego_OCTET_STRING },
+ { &hf_spnego_negHints , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL, dissect_spnego_NegHints },
+ { &hf_spnego_mechListMIC_01, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL, dissect_spnego_OCTET_STRING },
+ { NULL, 0, 0, 0, NULL }
+};
+
+static int
+dissect_spnego_NegTokenInit2(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+ offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
+ NegTokenInit2_sequence, hf_index, ett_spnego_NegTokenInit2);
return offset;
}
@@ -504,7 +551,7 @@ dissect_spnego_PrincipalSeq(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
static int
dissect_spnego_InnerContextToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 47 "../../asn1/spnego/spnego.cnf"
+#line 58 "../../asn1/spnego/spnego.cnf"
gssapi_oid_value *next_level_value_lcl;
proto_item *item;
@@ -579,7 +626,7 @@ dissect_spnego_InitialContextToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
/*--- End of included file: packet-spnego-fn.c ---*/
-#line 108 "../../asn1/spnego/packet-spnego-template.c"
+#line 111 "../../asn1/spnego/packet-spnego-template.c"
/*
* This is the SPNEGO KRB5 dissector. It is not true KRB5, but some ASN.1
* wrapped blob with an OID, USHORT token ID, and a Ticket, that is also
@@ -1865,10 +1912,6 @@ void proto_register_spnego(void) {
{ "MechType", "spnego.MechType",
FT_OID, BASE_NONE, NULL, 0,
NULL, HFILL }},
- { &hf_spnego_principal,
- { "principal", "spnego.principal",
- FT_STRING, BASE_NONE, NULL, 0,
- "GeneralString", HFILL }},
{ &hf_spnego_mechTypes,
{ "mechTypes", "spnego.mechTypes",
FT_UINT32, BASE_DEC, NULL, 0,
@@ -1881,10 +1924,30 @@ void proto_register_spnego(void) {
{ "mechToken", "spnego.mechToken",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- { &hf_spnego_negTokenInit_mechListMIC,
+ { &hf_spnego_mechListMIC,
{ "mechListMIC", "spnego.mechListMIC",
FT_BYTES, BASE_NONE, NULL, 0,
- "T_NegTokenInit_mechListMIC", HFILL }},
+ NULL, HFILL }},
+ { &hf_spnego_hintName,
+ { "hintName", "spnego.hintName",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "GeneralString", HFILL }},
+ { &hf_spnego_hintAddress,
+ { "hintAddress", "spnego.hintAddress",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "OCTET_STRING", HFILL }},
+ { &hf_spnego_mechToken_01,
+ { "mechToken", "spnego.mechToken",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "OCTET_STRING", HFILL }},
+ { &hf_spnego_negHints,
+ { "negHints", "spnego.negHints_element",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+ { &hf_spnego_mechListMIC_01,
+ { "mechListMIC", "spnego.mechListMIC",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "OCTET_STRING", HFILL }},
{ &hf_spnego_negResult,
{ "negResult", "spnego.negResult",
FT_UINT32, BASE_DEC, VALS(spnego_T_negResult_vals), 0,
@@ -1897,10 +1960,10 @@ void proto_register_spnego(void) {
{ "responseToken", "spnego.responseToken",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- { &hf_spnego_mechListMIC,
+ { &hf_spnego_mechListMIC_02,
{ "mechListMIC", "spnego.mechListMIC",
FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ "T_mechListMIC_01", HFILL }},
{ &hf_spnego_thisMech,
{ "thisMech", "spnego.thisMech",
FT_OID, BASE_NONE, NULL, 0,
@@ -1939,7 +2002,7 @@ void proto_register_spnego(void) {
NULL, HFILL }},
/*--- End of included file: packet-spnego-hfarr.c ---*/
-#line 1379 "../../asn1/spnego/packet-spnego-template.c"
+#line 1382 "../../asn1/spnego/packet-spnego-template.c"
};
/* List of subtrees */
@@ -1954,14 +2017,15 @@ void proto_register_spnego(void) {
#line 1 "../../asn1/spnego/packet-spnego-ettarr.c"
&ett_spnego_NegotiationToken,
&ett_spnego_MechTypeList,
- &ett_spnego_PrincipalSeq,
&ett_spnego_NegTokenInit,
+ &ett_spnego_NegHints,
+ &ett_spnego_NegTokenInit2,
&ett_spnego_ContextFlags,
&ett_spnego_NegTokenTarg,
&ett_spnego_InitialContextToken_U,
/*--- End of included file: packet-spnego-ettarr.c ---*/
-#line 1389 "../../asn1/spnego/packet-spnego-template.c"
+#line 1392 "../../asn1/spnego/packet-spnego-template.c"
};
/* Register protocol */