diff options
| -rw-r--r-- | fs/smb/client/cifsencrypt.c | 1 | ||||
| -rw-r--r-- | fs/smb/client/cifsglob.h | 1 | ||||
| -rw-r--r-- | fs/smb/client/sess.c | 2 | ||||
| -rw-r--r-- | fs/smb/client/smb2misc.c | 28 | ||||
| -rw-r--r-- | fs/smb/client/smb2proto.h | 2 | ||||
| -rw-r--r-- | fs/smb/client/smb2transport.c | 30 | 
6 files changed, 47 insertions, 17 deletions
| diff --git a/fs/smb/client/cifsencrypt.c b/fs/smb/client/cifsencrypt.c index 2d851f596a72..464e6ccdfa5f 100644 --- a/fs/smb/client/cifsencrypt.c +++ b/fs/smb/client/cifsencrypt.c @@ -700,6 +700,7 @@ cifs_crypto_secmech_release(struct TCP_Server_Info *server)  	cifs_free_hash(&server->secmech.aes_cmac);  	cifs_free_hash(&server->secmech.hmacsha256);  	cifs_free_hash(&server->secmech.md5); +	cifs_free_hash(&server->secmech.sha512);  	if (!SERVER_IS_CHAN(server)) {  		if (server->secmech.enc) { diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 315aac5dec05..da35c160e7dd 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -180,6 +180,7 @@ struct session_key {  struct cifs_secmech {  	struct shash_desc *md5; /* md5 hash function, for CIFS/SMB1 signatures */  	struct shash_desc *hmacsha256; /* hmac-sha256 hash function, for SMB2 signatures */ +	struct shash_desc *sha512; /* sha512 hash function, for SMB3.1.1 preauth hash */  	struct shash_desc *aes_cmac; /* block-cipher based MAC function, for SMB3 signatures */  	struct crypto_aead *enc; /* smb3 encryption AEAD TFM (AES-CCM and AES-GCM) */ diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c index 03c0b484a4b5..3216f786908f 100644 --- a/fs/smb/client/sess.c +++ b/fs/smb/client/sess.c @@ -624,7 +624,7 @@ cifs_ses_add_channel(struct cifs_ses *ses,  	 * to sign packets before we generate the channel signing key  	 * (we sign with the session key)  	 */ -	rc = smb3_crypto_shash_allocate(chan->server); +	rc = smb311_crypto_shash_allocate(chan->server);  	if (rc) {  		cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);  		mutex_unlock(&ses->session_mutex); diff --git a/fs/smb/client/smb2misc.c b/fs/smb/client/smb2misc.c index bdeb12ff53e3..f3c4b70b77b9 100644 --- a/fs/smb/client/smb2misc.c +++ b/fs/smb/client/smb2misc.c @@ -906,41 +906,41 @@ smb311_update_preauth_hash(struct cifs_ses *ses, struct TCP_Server_Info *server,  		|| (hdr->Status !=  		    cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))))  		return 0; +  ok: -	rc = cifs_alloc_hash("sha512", &sha512); -	if (rc) { -		cifs_dbg(VFS, "%s: Could not allocate SHA512 shash, rc=%d\n", __func__, rc); +	rc = smb311_crypto_shash_allocate(server); +	if (rc)  		return rc; -	} +	sha512 = server->secmech.sha512;  	rc = crypto_shash_init(sha512);  	if (rc) { -		cifs_dbg(VFS, "%s: Could not init SHA512 shash, rc=%d\n", __func__, rc); -		goto err_free; +		cifs_dbg(VFS, "%s: Could not init sha512 shash\n", __func__); +		return rc;  	}  	rc = crypto_shash_update(sha512, ses->preauth_sha_hash,  				 SMB2_PREAUTH_HASH_SIZE);  	if (rc) { -		cifs_dbg(VFS, "%s: Could not update SHA512 shash, rc=%d\n", __func__, rc); -		goto err_free; +		cifs_dbg(VFS, "%s: Could not update sha512 shash\n", __func__); +		return rc;  	}  	for (i = 0; i < nvec; i++) {  		rc = crypto_shash_update(sha512, iov[i].iov_base, iov[i].iov_len);  		if (rc) { -			cifs_dbg(VFS, "%s: Could not update SHA512 shash, rc=%d\n", __func__, rc); -			goto err_free; +			cifs_dbg(VFS, "%s: Could not update sha512 shash\n", +				 __func__); +			return rc;  		}  	}  	rc = crypto_shash_final(sha512, ses->preauth_sha_hash);  	if (rc) { -		cifs_dbg(VFS, "%s: Could not finalize SHA12 shash, rc=%d\n", __func__, rc); -		goto err_free; +		cifs_dbg(VFS, "%s: Could not finalize sha512 shash\n", +			 __func__); +		return rc;  	} -err_free: -	cifs_free_hash(&sha512);  	return 0;  } diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 56a896ff7cd9..c7e1b149877a 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -291,7 +291,7 @@ extern int smb2_validate_and_copy_iov(unsigned int offset,  extern void smb2_copy_fs_info_to_kstatfs(  	 struct smb2_fs_full_size_info *pfs_inf,  	 struct kstatfs *kst); -extern int smb3_crypto_shash_allocate(struct TCP_Server_Info *server); +extern int smb311_crypto_shash_allocate(struct TCP_Server_Info *server);  extern int smb311_update_preauth_hash(struct cifs_ses *ses,  				      struct TCP_Server_Info *server,  				      struct kvec *iov, int nvec); diff --git a/fs/smb/client/smb2transport.c b/fs/smb/client/smb2transport.c index f7e04c40d22e..c8bf0000f73b 100644 --- a/fs/smb/client/smb2transport.c +++ b/fs/smb/client/smb2transport.c @@ -26,7 +26,8 @@  #include "../common/smb2status.h"  #include "smb2glob.h" -int smb3_crypto_shash_allocate(struct TCP_Server_Info *server) +static int +smb3_crypto_shash_allocate(struct TCP_Server_Info *server)  {  	struct cifs_secmech *p = &server->secmech;  	int rc; @@ -45,6 +46,33 @@ err:  	return rc;  } +int +smb311_crypto_shash_allocate(struct TCP_Server_Info *server) +{ +	struct cifs_secmech *p = &server->secmech; +	int rc = 0; + +	rc = cifs_alloc_hash("hmac(sha256)", &p->hmacsha256); +	if (rc) +		return rc; + +	rc = cifs_alloc_hash("cmac(aes)", &p->aes_cmac); +	if (rc) +		goto err; + +	rc = cifs_alloc_hash("sha512", &p->sha512); +	if (rc) +		goto err; + +	return 0; + +err: +	cifs_free_hash(&p->aes_cmac); +	cifs_free_hash(&p->hmacsha256); +	return rc; +} + +  static  int smb2_get_sign_key(__u64 ses_id, struct TCP_Server_Info *server, u8 *key)  { | 
