]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net/tls: support SM4 CCM algorithm
authorTianjia Zhang <tianjia.zhang@linux.alibaba.com>
Tue, 28 Sep 2021 06:28:43 +0000 (14:28 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 28 Sep 2021 12:26:23 +0000 (13:26 +0100)
The IV of CCM mode has special requirements, this patch supports CCM
mode of SM4 algorithm.

Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/tls.h
net/tls/tls_sw.c

index be4b3e1cac46221d3f51e0d8708b33fe8af4974f..b6d40642afdd11775c5d6bd8ba63ae744e70ba06 100644 (file)
@@ -66,7 +66,7 @@
 #define MAX_IV_SIZE                    16
 #define TLS_MAX_REC_SEQ_SIZE           8
 
-/* For AES-CCM, the full 16-bytes of IV is made of '4' fields of given sizes.
+/* For CCM mode, the full 16-bytes of IV is made of '4' fields of given sizes.
  *
  * IV[16] = b0[1] || implicit nonce[4] || explicit nonce[8] || length[3]
  *
@@ -74,6 +74,7 @@
  * Hence b0 contains (3 - 1) = 2.
  */
 #define TLS_AES_CCM_IV_B0_BYTE         2
+#define TLS_SM4_CCM_IV_B0_BYTE         2
 
 #define __TLS_INC_STATS(net, field)                            \
        __SNMP_INC_STATS((net)->mib.tls_statistics, field)
index 989d1423a245ef7e3b270cfd2f3c8f83f3761e1f..4147bb2e705730a059e093edf806107cefc4231c 100644 (file)
@@ -498,9 +498,15 @@ static int tls_do_encryption(struct sock *sk,
        int rc, iv_offset = 0;
 
        /* For CCM based ciphers, first byte of IV is a constant */
-       if (prot->cipher_type == TLS_CIPHER_AES_CCM_128) {
+       switch (prot->cipher_type) {
+       case TLS_CIPHER_AES_CCM_128:
                rec->iv_data[0] = TLS_AES_CCM_IV_B0_BYTE;
                iv_offset = 1;
+               break;
+       case TLS_CIPHER_SM4_CCM:
+               rec->iv_data[0] = TLS_SM4_CCM_IV_B0_BYTE;
+               iv_offset = 1;
+               break;
        }
 
        memcpy(&rec->iv_data[iv_offset], tls_ctx->tx.iv,
@@ -1457,10 +1463,16 @@ static int decrypt_internal(struct sock *sk, struct sk_buff *skb,
        aad = (u8 *)(sgout + n_sgout);
        iv = aad + prot->aad_size;
 
-       /* For CCM based ciphers, first byte of nonce+iv is always '2' */
-       if (prot->cipher_type == TLS_CIPHER_AES_CCM_128) {
-               iv[0] = 2;
+       /* For CCM based ciphers, first byte of nonce+iv is a constant */
+       switch (prot->cipher_type) {
+       case TLS_CIPHER_AES_CCM_128:
+               iv[0] = TLS_AES_CCM_IV_B0_BYTE;
                iv_offset = 1;
+               break;
+       case TLS_CIPHER_SM4_CCM:
+               iv[0] = TLS_SM4_CCM_IV_B0_BYTE;
+               iv_offset = 1;
+               break;
        }
 
        /* Prepare IV */