@@ -590,8 +590,8 @@ int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
590
590
{
591
591
unsigned int tioffset ; /* challenge message target info area */
592
592
unsigned int tilen ; /* challenge message target info area length */
593
-
594
593
CHALLENGE_MESSAGE * pblob = (CHALLENGE_MESSAGE * )bcc_ptr ;
594
+ __u32 server_flags ;
595
595
596
596
if (blob_len < sizeof (CHALLENGE_MESSAGE )) {
597
597
cifs_dbg (VFS , "challenge blob len %d too small\n" , blob_len );
@@ -609,12 +609,37 @@ int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
609
609
return - EINVAL ;
610
610
}
611
611
612
+ server_flags = le32_to_cpu (pblob -> NegotiateFlags );
613
+ cifs_dbg (FYI , "%s: negotiate=0x%08x challenge=0x%08x\n" , __func__ ,
614
+ ses -> ntlmssp -> client_flags , server_flags );
615
+
616
+ if ((ses -> ntlmssp -> client_flags & (NTLMSSP_NEGOTIATE_SEAL | NTLMSSP_NEGOTIATE_SIGN )) &&
617
+ (!(server_flags & NTLMSSP_NEGOTIATE_56 ) && !(server_flags & NTLMSSP_NEGOTIATE_128 ))) {
618
+ cifs_dbg (VFS , "%s: requested signing/encryption but server did not return either 56-bit or 128-bit session key size\n" ,
619
+ __func__ );
620
+ return - EINVAL ;
621
+ }
622
+ if (!(server_flags & NTLMSSP_NEGOTIATE_NTLM ) && !(server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC )) {
623
+ cifs_dbg (VFS , "%s: server does not seem to support either NTLMv1 or NTLMv2\n" , __func__ );
624
+ return - EINVAL ;
625
+ }
626
+ if (ses -> server -> sign && !(server_flags & NTLMSSP_NEGOTIATE_SIGN )) {
627
+ cifs_dbg (VFS , "%s: forced packet signing but server does not seem to support it\n" ,
628
+ __func__ );
629
+ return - EOPNOTSUPP ;
630
+ }
631
+ if ((ses -> ntlmssp -> client_flags & NTLMSSP_NEGOTIATE_KEY_XCH ) &&
632
+ !(server_flags & NTLMSSP_NEGOTIATE_KEY_XCH ))
633
+ pr_warn_once ("%s: authentication has been weakened as server does not support key exchange\n" ,
634
+ __func__ );
635
+
636
+ ses -> ntlmssp -> server_flags = server_flags ;
637
+
612
638
memcpy (ses -> ntlmssp -> cryptkey , pblob -> Challenge , CIFS_CRYPTO_KEY_SIZE );
613
- /* BB we could decode pblob->NegotiateFlags; some may be useful */
614
639
/* In particular we can examine sign flags */
615
640
/* BB spec says that if AvId field of MsvAvTimestamp is populated then
616
641
we must set the MIC field of the AUTHENTICATE_MESSAGE */
617
- ses -> ntlmssp -> server_flags = le32_to_cpu ( pblob -> NegotiateFlags );
642
+
618
643
tioffset = le32_to_cpu (pblob -> TargetInfoArray .BufferOffset );
619
644
tilen = le16_to_cpu (pblob -> TargetInfoArray .Length );
620
645
if (tioffset > blob_len || tioffset + tilen > blob_len ) {
@@ -721,13 +746,13 @@ int build_ntlmssp_negotiate_blob(unsigned char **pbuffer,
721
746
flags = NTLMSSP_NEGOTIATE_56 | NTLMSSP_REQUEST_TARGET |
722
747
NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
723
748
NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
724
- NTLMSSP_NEGOTIATE_SEAL ;
725
- if (server -> sign )
726
- flags |= NTLMSSP_NEGOTIATE_SIGN ;
749
+ NTLMSSP_NEGOTIATE_ALWAYS_SIGN | NTLMSSP_NEGOTIATE_SEAL |
750
+ NTLMSSP_NEGOTIATE_SIGN ;
727
751
if (!server -> session_estab || ses -> ntlmssp -> sesskey_per_smbsess )
728
752
flags |= NTLMSSP_NEGOTIATE_KEY_XCH ;
729
753
730
754
tmp = * pbuffer + sizeof (NEGOTIATE_MESSAGE );
755
+ ses -> ntlmssp -> client_flags = flags ;
731
756
sec_blob -> NegotiateFlags = cpu_to_le32 (flags );
732
757
733
758
/* these fields should be null in negotiate phase MS-NLMP 3.1.5.1.1 */
@@ -779,15 +804,8 @@ int build_ntlmssp_auth_blob(unsigned char **pbuffer,
779
804
memcpy (sec_blob -> Signature , NTLMSSP_SIGNATURE , 8 );
780
805
sec_blob -> MessageType = NtLmAuthenticate ;
781
806
782
- flags = NTLMSSP_NEGOTIATE_56 |
783
- NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
784
- NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
785
- NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
786
- NTLMSSP_NEGOTIATE_SEAL | NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED ;
787
- if (ses -> server -> sign )
788
- flags |= NTLMSSP_NEGOTIATE_SIGN ;
789
- if (!ses -> server -> session_estab || ses -> ntlmssp -> sesskey_per_smbsess )
790
- flags |= NTLMSSP_NEGOTIATE_KEY_XCH ;
807
+ flags = ses -> ntlmssp -> server_flags | NTLMSSP_REQUEST_TARGET |
808
+ NTLMSSP_NEGOTIATE_TARGET_INFO | NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED ;
791
809
792
810
tmp = * pbuffer + sizeof (AUTHENTICATE_MESSAGE );
793
811
sec_blob -> NegotiateFlags = cpu_to_le32 (flags );
@@ -834,9 +852,9 @@ int build_ntlmssp_auth_blob(unsigned char **pbuffer,
834
852
* pbuffer , & tmp ,
835
853
nls_cp );
836
854
837
- if ((( ses -> ntlmssp -> server_flags & NTLMSSP_NEGOTIATE_KEY_XCH ) ||
838
- ( ses -> ntlmssp -> server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC ))
839
- && !calc_seckey (ses )) {
855
+ if ((ses -> ntlmssp -> server_flags & NTLMSSP_NEGOTIATE_KEY_XCH ) &&
856
+ (! ses -> server -> session_estab || ses -> ntlmssp -> sesskey_per_smbsess ) &&
857
+ !calc_seckey (ses )) {
840
858
memcpy (tmp , ses -> ntlmssp -> ciphertext , CIFS_CPHTXT_SIZE );
841
859
sec_blob -> SessionKey .BufferOffset = cpu_to_le32 (tmp - * pbuffer );
842
860
sec_blob -> SessionKey .Length = cpu_to_le16 (CIFS_CPHTXT_SIZE );
0 commit comments