1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | |
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 | |
11 | int |
12 | decode_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 | else |
19 | return 0; |
20 | } |
21 | |
22 | int 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(data: value, datasize: 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 | |
39 | int 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(data: value, datasize: 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 | |