64 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2 3#include <linux/module.h>4#include <linux/kernel.h>5#include <linux/oid_registry.h>6#include "cifsglob.h"7#include "cifs_debug.h"8#include "cifsproto.h"9#include "cifs_spnego_negtokeninit.asn1.h"10 11int12decode_negTokenInit(unsigned char *security_blob, int length,13 struct TCP_Server_Info *server)14{15 if (asn1_ber_decoder(&cifs_spnego_negtokeninit_decoder, server,16 security_blob, length) == 0)17 return 1;18 else19 return 0;20}21 22int cifs_gssapi_this_mech(void *context, size_t hdrlen,23 unsigned char tag, const void *value, size_t vlen)24{25 enum OID oid;26 27 oid = look_up_OID(value, vlen);28 if (oid != OID_spnego) {29 char buf[50];30 31 sprint_oid(value, vlen, buf, sizeof(buf));32 cifs_dbg(FYI, "Error decoding negTokenInit header: unexpected OID %s\n",33 buf);34 return -EBADMSG;35 }36 return 0;37}38 39int cifs_neg_token_init_mech_type(void *context, size_t hdrlen,40 unsigned char tag,41 const void *value, size_t vlen)42{43 struct TCP_Server_Info *server = context;44 enum OID oid;45 46 oid = look_up_OID(value, vlen);47 if (oid == OID_mskrb5)48 server->sec_mskerberos = true;49 else if (oid == OID_krb5u2u)50 server->sec_kerberosu2u = true;51 else if (oid == OID_krb5)52 server->sec_kerberos = true;53 else if (oid == OID_ntlmssp)54 server->sec_ntlmssp = true;55 else {56 char buf[50];57 58 sprint_oid(value, vlen, buf, sizeof(buf));59 cifs_dbg(FYI, "Decoding negTokenInit: unsupported OID %s\n",60 buf);61 }62 return 0;63}64