Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 
0003 #include <linux/module.h>
0004 #include <linux/kernel.h>
0005 #include <linux/oid_registry.h>
0006 #include "cifsglob.h"
0007 #include "cifs_debug.h"
0008 #include "cifsproto.h"
0009 #include "cifs_spnego_negtokeninit.asn1.h"
0010 
0011 int
0012 decode_negTokenInit(unsigned char *security_blob, int length,
0013             struct TCP_Server_Info *server)
0014 {
0015     if (asn1_ber_decoder(&cifs_spnego_negtokeninit_decoder, server,
0016                  security_blob, length) == 0)
0017         return 1;
0018     else
0019         return 0;
0020 }
0021 
0022 int cifs_gssapi_this_mech(void *context, size_t hdrlen,
0023               unsigned char tag, const void *value, size_t vlen)
0024 {
0025     enum OID oid;
0026 
0027     oid = look_up_OID(value, vlen);
0028     if (oid != OID_spnego) {
0029         char buf[50];
0030 
0031         sprint_oid(value, vlen, buf, sizeof(buf));
0032         cifs_dbg(FYI, "Error decoding negTokenInit header: unexpected OID %s\n",
0033              buf);
0034         return -EBADMSG;
0035     }
0036     return 0;
0037 }
0038 
0039 int cifs_neg_token_init_mech_type(void *context, size_t hdrlen,
0040                   unsigned char tag,
0041                   const void *value, size_t vlen)
0042 {
0043     struct TCP_Server_Info *server = context;
0044     enum OID oid;
0045 
0046     oid = look_up_OID(value, vlen);
0047     if (oid == OID_mskrb5)
0048         server->sec_mskerberos = true;
0049     else if (oid == OID_krb5u2u)
0050         server->sec_kerberosu2u = true;
0051     else if (oid == OID_krb5)
0052         server->sec_kerberos = true;
0053     else if (oid == OID_ntlmssp)
0054         server->sec_ntlmssp = true;
0055     else {
0056         char buf[50];
0057 
0058         sprint_oid(value, vlen, buf, sizeof(buf));
0059         cifs_dbg(FYI, "Decoding negTokenInit: unsupported OID %s\n",
0060              buf);
0061     }
0062     return 0;
0063 }