87
87
#define DESC_GCM_DEC_LEN (DESC_GCM_BASE + 12 * CAAM_CMD_SZ)
88
88
89
89
#define DESC_RFC4106_BASE (3 * CAAM_CMD_SZ)
90
- #define DESC_RFC4106_ENC_LEN (DESC_RFC4106_BASE + 10 * CAAM_CMD_SZ)
91
- #define DESC_RFC4106_DEC_LEN (DESC_RFC4106_BASE + 10 * CAAM_CMD_SZ)
90
+ #define DESC_RFC4106_ENC_LEN (DESC_RFC4106_BASE + 12 * CAAM_CMD_SZ)
91
+ #define DESC_RFC4106_DEC_LEN (DESC_RFC4106_BASE + 12 * CAAM_CMD_SZ)
92
92
93
93
#define DESC_RFC4543_BASE (3 * CAAM_CMD_SZ)
94
94
#define DESC_RFC4543_ENC_LEN (DESC_RFC4543_BASE + 11 * CAAM_CMD_SZ)
@@ -976,29 +976,32 @@ static int rfc4106_set_sh_desc(struct crypto_aead *aead)
976
976
append_operation (desc , ctx -> class1_alg_type |
977
977
OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT );
978
978
979
- append_math_add (desc , VARSEQINLEN , ZERO , REG3 , CAAM_CMD_SZ );
979
+ append_math_sub_imm_u32 (desc , VARSEQINLEN , REG3 , IMM , 8 );
980
980
append_math_add (desc , VARSEQOUTLEN , ZERO , REG3 , CAAM_CMD_SZ );
981
981
982
- /* Skip assoc data */
983
- append_seq_fifo_store (desc , 0 , FIFOST_TYPE_SKIP | FIFOLDST_VLF );
984
-
985
982
/* Read assoc data */
986
983
append_seq_fifo_load (desc , 0 , FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
987
984
FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1 );
988
985
989
- /* cryptlen = seqoutlen - assoclen */
990
- append_math_sub (desc , VARSEQOUTLEN , SEQINLEN , REG0 , CAAM_CMD_SZ );
986
+ /* Skip IV */
987
+ append_seq_fifo_load (desc , 8 , FIFOLD_CLASS_SKIP );
991
988
992
989
/* Will read cryptlen bytes */
993
990
append_math_sub (desc , VARSEQINLEN , SEQINLEN , REG0 , CAAM_CMD_SZ );
994
991
995
- /* Write encrypted data */
996
- append_seq_fifo_store (desc , 0 , FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF );
997
-
998
992
/* Read payload data */
999
993
append_seq_fifo_load (desc , 0 , FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
1000
994
FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1 );
1001
995
996
+ /* Skip assoc data */
997
+ append_seq_fifo_store (desc , 0 , FIFOST_TYPE_SKIP | FIFOLDST_VLF );
998
+
999
+ /* cryptlen = seqoutlen - assoclen */
1000
+ append_math_sub (desc , VARSEQOUTLEN , SEQINLEN , REG0 , CAAM_CMD_SZ );
1001
+
1002
+ /* Write encrypted data */
1003
+ append_seq_fifo_store (desc , 0 , FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF );
1004
+
1002
1005
/* Write ICV */
1003
1006
append_seq_store (desc , ctx -> authsize , LDST_CLASS_1_CCB |
1004
1007
LDST_SRCDST_BYTE_CONTEXT );
@@ -1044,29 +1047,32 @@ static int rfc4106_set_sh_desc(struct crypto_aead *aead)
1044
1047
append_operation (desc , ctx -> class1_alg_type |
1045
1048
OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON );
1046
1049
1047
- append_math_add (desc , VARSEQINLEN , ZERO , REG3 , CAAM_CMD_SZ );
1050
+ append_math_sub_imm_u32 (desc , VARSEQINLEN , REG3 , IMM , 8 );
1048
1051
append_math_add (desc , VARSEQOUTLEN , ZERO , REG3 , CAAM_CMD_SZ );
1049
1052
1050
- /* Skip assoc data */
1051
- append_seq_fifo_store (desc , 0 , FIFOST_TYPE_SKIP | FIFOLDST_VLF );
1052
-
1053
1053
/* Read assoc data */
1054
1054
append_seq_fifo_load (desc , 0 , FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
1055
1055
FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1 );
1056
1056
1057
- /* Will write cryptlen bytes */
1058
- append_math_sub (desc , VARSEQOUTLEN , SEQOUTLEN , REG0 , CAAM_CMD_SZ );
1057
+ /* Skip IV */
1058
+ append_seq_fifo_load (desc , 8 , FIFOLD_CLASS_SKIP );
1059
1059
1060
1060
/* Will read cryptlen bytes */
1061
- append_math_sub (desc , VARSEQINLEN , SEQOUTLEN , REG0 , CAAM_CMD_SZ );
1062
-
1063
- /* Store payload data */
1064
- append_seq_fifo_store (desc , 0 , FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF );
1061
+ append_math_sub (desc , VARSEQINLEN , SEQOUTLEN , REG3 , CAAM_CMD_SZ );
1065
1062
1066
1063
/* Read encrypted data */
1067
1064
append_seq_fifo_load (desc , 0 , FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
1068
1065
FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1 );
1069
1066
1067
+ /* Skip assoc data */
1068
+ append_seq_fifo_store (desc , 0 , FIFOST_TYPE_SKIP | FIFOLDST_VLF );
1069
+
1070
+ /* Will write cryptlen bytes */
1071
+ append_math_sub (desc , VARSEQOUTLEN , SEQOUTLEN , REG0 , CAAM_CMD_SZ );
1072
+
1073
+ /* Store payload data */
1074
+ append_seq_fifo_store (desc , 0 , FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF );
1075
+
1070
1076
/* Read ICV */
1071
1077
append_seq_fifo_load (desc , ctx -> authsize , FIFOLD_CLASS_CLASS1 |
1072
1078
FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1 );
@@ -2685,6 +2691,14 @@ static int gcm_encrypt(struct aead_request *req)
2685
2691
return ret ;
2686
2692
}
2687
2693
2694
+ static int ipsec_gcm_encrypt (struct aead_request * req )
2695
+ {
2696
+ if (req -> assoclen < 8 )
2697
+ return - EINVAL ;
2698
+
2699
+ return gcm_encrypt (req );
2700
+ }
2701
+
2688
2702
static int old_aead_encrypt (struct aead_request * req )
2689
2703
{
2690
2704
struct aead_edesc * edesc ;
@@ -2757,6 +2771,14 @@ static int gcm_decrypt(struct aead_request *req)
2757
2771
return ret ;
2758
2772
}
2759
2773
2774
+ static int ipsec_gcm_decrypt (struct aead_request * req )
2775
+ {
2776
+ if (req -> assoclen < 8 )
2777
+ return - EINVAL ;
2778
+
2779
+ return gcm_decrypt (req );
2780
+ }
2781
+
2760
2782
static int old_aead_decrypt (struct aead_request * req )
2761
2783
{
2762
2784
struct aead_edesc * edesc ;
@@ -4058,8 +4080,8 @@ static struct caam_aead_alg driver_aeads[] = {
4058
4080
},
4059
4081
.setkey = rfc4106_setkey ,
4060
4082
.setauthsize = rfc4106_setauthsize ,
4061
- .encrypt = gcm_encrypt ,
4062
- .decrypt = gcm_decrypt ,
4083
+ .encrypt = ipsec_gcm_encrypt ,
4084
+ .decrypt = ipsec_gcm_decrypt ,
4063
4085
.ivsize = 8 ,
4064
4086
.maxauthsize = AES_BLOCK_SIZE ,
4065
4087
},
@@ -4076,8 +4098,8 @@ static struct caam_aead_alg driver_aeads[] = {
4076
4098
},
4077
4099
.setkey = rfc4543_setkey ,
4078
4100
.setauthsize = rfc4543_setauthsize ,
4079
- .encrypt = gcm_encrypt ,
4080
- .decrypt = gcm_decrypt ,
4101
+ .encrypt = ipsec_gcm_encrypt ,
4102
+ .decrypt = ipsec_gcm_decrypt ,
4081
4103
.ivsize = 8 ,
4082
4104
.maxauthsize = AES_BLOCK_SIZE ,
4083
4105
},
@@ -4260,7 +4282,8 @@ static void caam_aead_alg_init(struct caam_aead_alg *t_alg)
4260
4282
alg -> base .cra_module = THIS_MODULE ;
4261
4283
alg -> base .cra_priority = CAAM_CRA_PRIORITY ;
4262
4284
alg -> base .cra_ctxsize = sizeof (struct caam_ctx );
4263
- alg -> base .cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY ;
4285
+ alg -> base .cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY |
4286
+ CRYPTO_ALG_AEAD_NEW ;
4264
4287
4265
4288
alg -> init = caam_aead_init ;
4266
4289
alg -> exit = caam_aead_exit ;
0 commit comments