root/fs/smb/server/auth.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
 */

#ifndef __AUTH_H__
#define __AUTH_H__

#include "ntlmssp.h"

#ifdef CONFIG_SMB_SERVER_KERBEROS5
#define AUTH_GSS_LENGTH         96
#define AUTH_GSS_PADDING        0
#else
#define AUTH_GSS_LENGTH         74
#define AUTH_GSS_PADDING        6
#endif

#define CIFS_HMAC_MD5_HASH_SIZE (16)
#define CIFS_NTHASH_SIZE        (16)

/*
 * Size of the ntlm client response
 */
#define CIFS_AUTH_RESP_SIZE             24
#define CIFS_SMB1_SIGNATURE_SIZE        8
#define CIFS_SMB1_SESSKEY_SIZE          16

#define KSMBD_AUTH_NTLMSSP      0x0001
#define KSMBD_AUTH_KRB5         0x0002
#define KSMBD_AUTH_MSKRB5       0x0004
#define KSMBD_AUTH_KRB5U2U      0x0008

struct ksmbd_session;
struct ksmbd_conn;
struct ksmbd_work;
struct kvec;

int ksmbd_crypt_message(struct ksmbd_work *work, struct kvec *iov,
                        unsigned int nvec, int enc);
void ksmbd_copy_gss_neg_header(void *buf);
int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
                      struct ntlmv2_resp *ntlmv2, int blen, char *domain_name,
                      char *cryptkey);
int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
                                   int blob_len, struct ksmbd_conn *conn,
                                   struct ksmbd_session *sess);
int ksmbd_decode_ntlmssp_neg_blob(struct negotiate_message *negblob,
                                  int blob_len, struct ksmbd_conn *conn);
unsigned int
ksmbd_build_ntlmssp_challenge_blob(struct challenge_message *chgblob,
                                   struct ksmbd_conn *conn);
int ksmbd_krb5_authenticate(struct ksmbd_session *sess, char *in_blob,
                            int in_len, char *out_blob, int *out_len);
void ksmbd_sign_smb2_pdu(struct ksmbd_conn *conn, char *key, struct kvec *iov,
                         int n_vec, char *sig);
int ksmbd_sign_smb3_pdu(struct ksmbd_conn *conn, char *key, struct kvec *iov,
                        int n_vec, char *sig);
int ksmbd_gen_smb30_signingkey(struct ksmbd_session *sess,
                               struct ksmbd_conn *conn);
int ksmbd_gen_smb311_signingkey(struct ksmbd_session *sess,
                                struct ksmbd_conn *conn);
void ksmbd_gen_smb30_encryptionkey(struct ksmbd_conn *conn,
                                   struct ksmbd_session *sess);
void ksmbd_gen_smb311_encryptionkey(struct ksmbd_conn *conn,
                                    struct ksmbd_session *sess);
int ksmbd_gen_preauth_integrity_hash(struct ksmbd_conn *conn, char *buf,
                                     __u8 *pi_hash);
#endif