Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cifsd fixes #21

Merged
merged 8 commits into from Jan 29, 2021
2 changes: 1 addition & 1 deletion fs/cifsd/Makefile
Expand Up @@ -9,5 +9,5 @@ ksmbd-y := unicode.o auth.o vfs.o vfs_cache.o server.o buffer_pool.o \
mgmt/ksmbd_ida.o mgmt/user_config.o mgmt/share_config.o \
mgmt/tree_connect.o mgmt/user_session.o smb_common.o \
transport_tcp.o transport_ipc.o smbacl.o smb2pdu.o \
smb2ops.o smb2misc.o asn1.o netmisc.o
smb2ops.o smb2misc.o asn1.o netmisc.o ndr.o
ksmbd-$(CONFIG_SMB_SERVER_SMBDIRECT) += transport_rdma.o
34 changes: 34 additions & 0 deletions fs/cifsd/auth.c
Expand Up @@ -1110,6 +1110,40 @@ int ksmbd_gen_preauth_integrity_hash(struct ksmbd_conn *conn,
return rc;
}

int ksmbd_gen_sd_hash(struct ksmbd_conn *conn, char *sd_buf, int len,
__u8 *pi_hash)
{
int rc = -1;
struct ksmbd_crypto_ctx *ctx = NULL;

ctx = ksmbd_crypto_ctx_find_sha256();
if (!ctx) {
ksmbd_debug(AUTH, "could not alloc sha256 rc %d\n", rc);
goto out;
}

rc = crypto_shash_init(CRYPTO_SHA256(ctx));
if (rc) {
ksmbd_debug(AUTH, "could not init shashn");
goto out;
}

rc = crypto_shash_update(CRYPTO_SHA256(ctx), sd_buf, len);
if (rc) {
ksmbd_debug(AUTH, "could not update with n\n");
goto out;
}

rc = crypto_shash_final(CRYPTO_SHA256(ctx), pi_hash);
if (rc) {
ksmbd_debug(AUTH, "Could not generate hash err : %d\n", rc);
goto out;
}
out:
ksmbd_release_crypto_ctx(ctx);
return rc;
}

static int ksmbd_get_encryption_key(struct ksmbd_conn *conn,
__u64 ses_id,
int enc,
Expand Down
2 changes: 2 additions & 0 deletions fs/cifsd/auth.h
Expand Up @@ -85,4 +85,6 @@ int ksmbd_gen_smb311_encryptionkey(struct ksmbd_session *sess);
int ksmbd_gen_preauth_integrity_hash(struct ksmbd_conn *conn,
char *buf,
__u8 *pi_hash);
int ksmbd_gen_sd_hash(struct ksmbd_conn *conn, char *sd_buf, int len,
__u8 *pi_hash);
#endif
8 changes: 8 additions & 0 deletions fs/cifsd/crypto_ctx.c
Expand Up @@ -77,6 +77,9 @@ static struct shash_desc *alloc_shash_desc(int id)
case CRYPTO_SHASH_CMACAES:
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
break;
case CRYPTO_SHASH_SHA256:
tfm = crypto_alloc_shash("sha256", 0, 0);
break;
case CRYPTO_SHASH_SHA512:
tfm = crypto_alloc_shash("sha512", 0, 0);
break;
Expand Down Expand Up @@ -206,6 +209,11 @@ struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes(void)
return ____crypto_shash_ctx_find(CRYPTO_SHASH_CMACAES);
}

struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_sha256(void)
{
return ____crypto_shash_ctx_find(CRYPTO_SHASH_SHA256);
}

struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_sha512(void)
{
return ____crypto_shash_ctx_find(CRYPTO_SHASH_SHA512);
Expand Down
4 changes: 4 additions & 0 deletions fs/cifsd/crypto_ctx.h
Expand Up @@ -13,6 +13,7 @@ enum {
CRYPTO_SHASH_HMACMD5 = 0,
CRYPTO_SHASH_HMACSHA256,
CRYPTO_SHASH_CMACAES,
CRYPTO_SHASH_SHA256,
CRYPTO_SHASH_SHA512,
CRYPTO_SHASH_MD4,
CRYPTO_SHASH_MD5,
Expand Down Expand Up @@ -40,6 +41,7 @@ struct ksmbd_crypto_ctx {
#define CRYPTO_HMACMD5(c) ((c)->desc[CRYPTO_SHASH_HMACMD5])
#define CRYPTO_HMACSHA256(c) ((c)->desc[CRYPTO_SHASH_HMACSHA256])
#define CRYPTO_CMACAES(c) ((c)->desc[CRYPTO_SHASH_CMACAES])
#define CRYPTO_SHA256(c) ((c)->desc[CRYPTO_SHASH_SHA256])
#define CRYPTO_SHA512(c) ((c)->desc[CRYPTO_SHASH_SHA512])
#define CRYPTO_MD4(c) ((c)->desc[CRYPTO_SHASH_MD4])
#define CRYPTO_MD5(c) ((c)->desc[CRYPTO_SHASH_MD5])
Expand All @@ -48,6 +50,7 @@ struct ksmbd_crypto_ctx {
#define CRYPTO_HMACSHA256_TFM(c)\
((c)->desc[CRYPTO_SHASH_HMACSHA256]->tfm)
#define CRYPTO_CMACAES_TFM(c) ((c)->desc[CRYPTO_SHASH_CMACAES]->tfm)
#define CRYPTO_SHA256_TFM(c) ((c)->desc[CRYPTO_SHASH_SHA256]->tfm)
#define CRYPTO_SHA512_TFM(c) ((c)->desc[CRYPTO_SHASH_SHA512]->tfm)
#define CRYPTO_MD4_TFM(c) ((c)->desc[CRYPTO_SHASH_MD4]->tfm)
#define CRYPTO_MD5_TFM(c) ((c)->desc[CRYPTO_SHASH_MD5]->tfm)
Expand All @@ -61,6 +64,7 @@ struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacmd5(void);
struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacsha256(void);
struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes(void);
struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_sha512(void);
struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_sha256(void);
struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_md4(void);
struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_md5(void);

Expand Down
2 changes: 2 additions & 0 deletions fs/cifsd/ksmbd_server.h
Expand Up @@ -228,6 +228,7 @@ enum KSMBD_TREE_CONN_STATUS {
#define KSMBD_SHARE_FLAG_INHERIT_OWNER (1 << 11)
#define KSMBD_SHARE_FLAG_STREAMS (1 << 12)
#define KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS (1 << 13)
#define KSMBD_SHARE_FLAG_ACL_XATTR (1 << 14)

/*
* Tree connect request flags.
Expand Down Expand Up @@ -274,6 +275,7 @@ enum KSMBD_TREE_CONN_STATUS {
#define KSMBD_RPC_EINVALID_PARAMETER 0x00000057
#define KSMBD_RPC_EMORE_DATA 0x000000EA
#define KSMBD_RPC_EINVALID_LEVEL 0x0000007C
#define KSMBD_RPC_SOME_NOT_MAPPED 0x00000107

#define KSMBD_CONFIG_OPT_DISABLED 0
#define KSMBD_CONFIG_OPT_ENABLED 1
Expand Down
2 changes: 1 addition & 1 deletion fs/cifsd/ksmbd_work.c
Expand Up @@ -37,7 +37,7 @@ struct ksmbd_work *ksmbd_alloc_work_struct(void)

void ksmbd_free_work_struct(struct ksmbd_work *work)
{
WARN_ON(work->saved_cred_level != 0);
WARN_ON(work->saved_cred != NULL);
if (server_conf.flags & KSMBD_GLOBAL_FLAG_CACHE_TBUF &&
work->set_trans_buf)
ksmbd_release_buffer(RESPONSE_BUF(work));
Expand Down
5 changes: 2 additions & 3 deletions fs/cifsd/ksmbd_work.h
Expand Up @@ -48,7 +48,6 @@ struct ksmbd_work {
unsigned int compound_sid;

const struct cred *saved_cred;
int saved_cred_level;

/* Number of granted credits */
unsigned int credits_granted;
Expand Down Expand Up @@ -105,12 +104,12 @@ struct ksmbd_work {

#define INIT_AUX_PAYLOAD(w) ((w)->aux_payload_buf = NULL)
#define HAS_AUX_PAYLOAD(w) ((w)->aux_payload_sz != 0)
#define AUX_PAYLOAD(w) (void *)((w)->aux_payload_buf)
#define AUX_PAYLOAD(w) ((void *)((w)->aux_payload_buf))
#define AUX_PAYLOAD_SIZE(w) ((w)->aux_payload_sz)
#define RESP_HDR_SIZE(w) ((w)->resp_hdr_sz)

#define HAS_TRANSFORM_BUF(w) ((w)->tr_buf != NULL)
#define TRANSFORM_BUF(w) (void *)((w)->tr_buf)
#define TRANSFORM_BUF(w) ((void *)((w)->tr_buf))

struct ksmbd_work *ksmbd_alloc_work_struct(void);
void ksmbd_free_work_struct(struct ksmbd_work *work);
Expand Down