AES crypto performance improvements

Stefan Metzmacher metze at samba.org
Mon Aug 17 13:39:09 UTC 2015


Am 14.08.2015 um 15:28 schrieb Stefan Metzmacher:
> Am 13.08.2015 um 23:22 schrieb Stefan Metzmacher:
>> Hi,
>>
>> while debugging poor performance of our SMB3 crypto
>> I developed the following performance improvements.
>>
>> The aes_block_xor() improved by a factor of ~10.
>> The aes_block_[r|l]shift() functions improved by 25%.
>>
>> Please review and push.
>>
>> The real solution will be to use hardware support,
>> I've extended the work from Simo in the following branch
>> https://git.samba.org/?p=metze/samba/wip.git;a=shortlog;h=refs/heads/master3-smb-crypto
>> (ignore the unrelated and directly reverted commits on top)
>>
>> But I'm not that happy with the abstraction yet.
> 
> There's a regression in the aes_ccm_128 optimization because that doesn't
> have test cases... I'm working on it.

As a start I'd like to prefer aes-ccm for 4.3.0rc3.

Can someone review and push these patches to master?

Thanks!
metze
-------------- next part --------------
From cbe431929b5aa8e1ab9922fd1af71bdc495a3b28 Mon Sep 17 00:00:00 2001
From: Stefan Metzmacher <metze at samba.org>
Date: Mon, 17 Aug 2015 08:56:43 +0200
Subject: [PATCH 1/2] libcli/smb: prefer AES128_CCM

Callgrind showed that we use 28,165,720,719 cpu cycles to send
a 100MB file to a client using aes-ccm.

With aes-gcm this is raises up to 723,094,413,831 cpu cycles.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=11451

Signed-off-by: Stefan Metzmacher <metze at samba.org>
---
 libcli/smb/smbXcli_base.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 6c35430..c1e9e58 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -4598,8 +4598,12 @@ static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_sta
 		}
 
 		SSVAL(p, 0, 2); /* ChiperCount */
-		SSVAL(p, 2, SMB2_ENCRYPTION_AES128_GCM);
-		SSVAL(p, 4, SMB2_ENCRYPTION_AES128_CCM);
+		/*
+		 * For now we preferr CCM because our implementation
+		 * is faster than GCM, see bug #11451.
+		 */
+		SSVAL(p, 2, SMB2_ENCRYPTION_AES128_CCM);
+		SSVAL(p, 4, SMB2_ENCRYPTION_AES128_GCM);
 
 		b = data_blob_const(p, 6);
 		status = smb2_negotiate_context_add(state, &c,
-- 
1.9.1


From 9de1cb0329a6a5e375cae59a29768b6d925e5749 Mon Sep 17 00:00:00 2001
From: Stefan Metzmacher <metze at samba.org>
Date: Mon, 17 Aug 2015 08:56:43 +0200
Subject: [PATCH 2/2] s3:smb2_negprot: prefer AES128_CCM if the client supports
 it

Callgrind showed that we use 28,165,720,719 cpu cycles to send
a 100MB file to a client using aes-ccm.

With aes-gcm this is raises up to 723,094,413,831 cpu cycles.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=11451

Signed-off-by: Stefan Metzmacher <metze at samba.org>
---
 source3/smbd/smb2_negprot.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c
index 3106ef3..18382a9 100644
--- a/source3/smbd/smb2_negprot.c
+++ b/source3/smbd/smb2_negprot.c
@@ -421,6 +421,8 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
 		uint8_t buf[4];
 		DATA_BLOB b;
 		size_t i;
+		bool aes_128_ccm_supported = false;
+		bool aes_128_gcm_supported = false;
 
 		capabilities &= ~SMB2_CAP_ENCRYPTION;
 
@@ -451,15 +453,23 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
 			p += 2;
 
 			if (v == SMB2_ENCRYPTION_AES128_GCM) {
-				xconn->smb2.server.cipher = v;
-				break;
+				aes_128_gcm_supported = true;
 			}
 			if (v == SMB2_ENCRYPTION_AES128_CCM) {
-				xconn->smb2.server.cipher = v;
-				break;
+				aes_128_ccm_supported = true;
 			}
 		}
 
+		/*
+		 * For now we preferr CCM because our implementation
+		 * is faster than GCM, see bug #11451.
+		 */
+		if (aes_128_ccm_supported) {
+			xconn->smb2.server.cipher = SMB2_ENCRYPTION_AES128_CCM;
+		} else if (aes_128_gcm_supported) {
+			xconn->smb2.server.cipher = SMB2_ENCRYPTION_AES128_GCM;
+		}
+
 		SSVAL(buf, 0, 1); /* ChiperCount */
 		SSVAL(buf, 2, xconn->smb2.server.cipher);
 
-- 
1.9.1

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20150817/d1cee72c/signature.sig>


More information about the samba-technical mailing list