s3-spnego: Fix Bug #6815. Windows 2008 R2 SPNEGO negTokenTarg parsing failure.
authorGünther Deschner <gd@samba.org>
Thu, 15 Oct 2009 12:13:26 +0000 (14:13 +0200)
committerKarolin Seeger <kseeger@samba.org>
Thu, 26 Nov 2009 10:39:23 +0000 (11:39 +0100)
When parsing a SPNEGO session setup retry (falling back from KRB5 to NTLMSSP),
we failed to parse the ASN1_ENUMERATED negResult in the negTokenTarg, thus
failing spnego_parse_auth() completely.

By just using the shared spnego/asn1 code, we get the parsing the correct way.

Guenther
(cherry picked from commit 449ab398f58c6e0041621752322ebe24e6d70225)
(cherry picked from commit 7936874af1ab8b2449af41f38695b2946813adf7)

source3/Makefile.in
source3/libsmb/clispnego.c

index 90faadf00163c049d30bc5b2ee97e37cb12a48e4..d12c9911c35c8d23512e43557a34e1612d3394de 100644 (file)
@@ -506,7 +506,9 @@ SCHANNEL_OBJ = ../libcli/auth/credentials.o \
               passdb/secrets_schannel.o
 
 LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
-            libsmb/clikrb5.o libsmb/clispnego.o ../lib/util/asn1.o \
+            libsmb/clikrb5.o libsmb/clispnego.o \
+            ../libcli/auth/spnego_parse.o \
+            ../lib/util/asn1.o \
             libsmb/clirap.o libsmb/clierror.o libsmb/climessage.o \
             libsmb/clireadwrite.o libsmb/clilist.o libsmb/cliprint.o \
             libsmb/clitrans.o libsmb/clisecdesc.o libsmb/clidgram.o \
index 5d7e43d941f79f20c7f78f8c5f7ac3fd8e3ac92e..1103ef84b63bf965936929b5728eb50bd23ec9b6 100644 (file)
@@ -495,31 +495,24 @@ DATA_BLOB spnego_gen_auth(DATA_BLOB blob)
 */
 bool spnego_parse_auth(DATA_BLOB blob, DATA_BLOB *auth)
 {
-       ASN1_DATA *data;
+       ssize_t len;
+       struct spnego_data token;
 
-       data = asn1_init(talloc_tos());
-       if (data == NULL) {
+       len = spnego_read_data(talloc_tos(), blob, &token);
+       if (len == -1) {
+               DEBUG(3,("spnego_parse_auth: spnego_read_data failed\n"));
                return false;
        }
 
-       asn1_load(data, blob);
-       asn1_start_tag(data, ASN1_CONTEXT(1));
-       asn1_start_tag(data, ASN1_SEQUENCE(0));
-       asn1_start_tag(data, ASN1_CONTEXT(2));
-       asn1_read_OctetString(data, talloc_autofree_context(), auth);
-       asn1_end_tag(data);
-       asn1_end_tag(data);
-       asn1_end_tag(data);
-
-       if (data->has_error) {
-               DEBUG(3,("spnego_parse_auth failed at %d\n", (int)data->ofs));
-               data_blob_free(auth);
-               asn1_free(data);
-               return False;
+       if (token.type != SPNEGO_NEG_TOKEN_TARG) {
+               DEBUG(3,("spnego_parse_auth: wrong token type: %d\n",
+                       token.type));
+               return false;
        }
 
-       asn1_free(data);
-       return True;
+       *auth = token.negTokenTarg.responseToken;
+
+       return true;
 }
 
 /*