|
@@ -625,10 +625,13 @@ EXPORT_SYMBOL(cnstr_shdsc_aead_givencap);
|
|
|
* @desc: pointer to buffer used for descriptor construction
|
|
|
* @cdata: pointer to block cipher transform definitions
|
|
|
* Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
|
|
|
+ * @ivsize: initialization vector size
|
|
|
* @icvsize: integrity check value (ICV) size (truncated or full)
|
|
|
+ * @is_qi: true when called from caam/qi
|
|
|
*/
|
|
|
void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
- unsigned int icvsize)
|
|
|
+ unsigned int ivsize, unsigned int icvsize,
|
|
|
+ const bool is_qi)
|
|
|
{
|
|
|
u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1,
|
|
|
*zero_assoc_jump_cmd2;
|
|
@@ -650,11 +653,35 @@ void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
|
|
|
OP_ALG_ENCRYPT);
|
|
|
|
|
|
+ if (is_qi) {
|
|
|
+ u32 *wait_load_cmd;
|
|
|
+
|
|
|
+ /* REG3 = assoclen */
|
|
|
+ append_seq_load(desc, 4, LDST_CLASS_DECO |
|
|
|
+ LDST_SRCDST_WORD_DECO_MATH3 |
|
|
|
+ (4 << LDST_OFFSET_SHIFT));
|
|
|
+
|
|
|
+ wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
|
|
|
+ JUMP_COND_CALM | JUMP_COND_NCP |
|
|
|
+ JUMP_COND_NOP | JUMP_COND_NIP |
|
|
|
+ JUMP_COND_NIFP);
|
|
|
+ set_jump_tgt_here(desc, wait_load_cmd);
|
|
|
+
|
|
|
+ append_math_sub_imm_u32(desc, VARSEQOUTLEN, SEQINLEN, IMM,
|
|
|
+ ivsize);
|
|
|
+ } else {
|
|
|
+ append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0,
|
|
|
+ CAAM_CMD_SZ);
|
|
|
+ }
|
|
|
+
|
|
|
/* if assoclen + cryptlen is ZERO, skip to ICV write */
|
|
|
- append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
|
|
|
zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL |
|
|
|
JUMP_COND_MATH_Z);
|
|
|
|
|
|
+ if (is_qi)
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
|
|
|
+
|
|
|
/* if assoclen is ZERO, skip reading the assoc data */
|
|
|
append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
|
|
|
zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
|
|
@@ -686,8 +713,11 @@ void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
|
|
|
FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
|
|
|
|
|
|
- /* jump the zero-payload commands */
|
|
|
- append_jump(desc, JUMP_TEST_ALL | 2);
|
|
|
+ /* jump to ICV writing */
|
|
|
+ if (is_qi)
|
|
|
+ append_jump(desc, JUMP_TEST_ALL | 4);
|
|
|
+ else
|
|
|
+ append_jump(desc, JUMP_TEST_ALL | 2);
|
|
|
|
|
|
/* zero-payload commands */
|
|
|
set_jump_tgt_here(desc, zero_payload_jump_cmd);
|
|
@@ -695,10 +725,18 @@ void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
/* read assoc data */
|
|
|
append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
|
|
|
FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
|
|
|
+ if (is_qi)
|
|
|
+ /* jump to ICV writing */
|
|
|
+ append_jump(desc, JUMP_TEST_ALL | 2);
|
|
|
|
|
|
/* There is no input data */
|
|
|
set_jump_tgt_here(desc, zero_assoc_jump_cmd2);
|
|
|
|
|
|
+ if (is_qi)
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 |
|
|
|
+ FIFOLD_TYPE_LAST1);
|
|
|
+
|
|
|
/* write ICV */
|
|
|
append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
|
|
|
LDST_SRCDST_BYTE_CONTEXT);
|
|
@@ -715,10 +753,13 @@ EXPORT_SYMBOL(cnstr_shdsc_gcm_encap);
|
|
|
* @desc: pointer to buffer used for descriptor construction
|
|
|
* @cdata: pointer to block cipher transform definitions
|
|
|
* Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
|
|
|
+ * @ivsize: initialization vector size
|
|
|
* @icvsize: integrity check value (ICV) size (truncated or full)
|
|
|
+ * @is_qi: true when called from caam/qi
|
|
|
*/
|
|
|
void cnstr_shdsc_gcm_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
- unsigned int icvsize)
|
|
|
+ unsigned int ivsize, unsigned int icvsize,
|
|
|
+ const bool is_qi)
|
|
|
{
|
|
|
u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1;
|
|
|
|
|
@@ -739,6 +780,24 @@ void cnstr_shdsc_gcm_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
|
|
|
OP_ALG_DECRYPT | OP_ALG_ICV_ON);
|
|
|
|
|
|
+ if (is_qi) {
|
|
|
+ u32 *wait_load_cmd;
|
|
|
+
|
|
|
+ /* REG3 = assoclen */
|
|
|
+ append_seq_load(desc, 4, LDST_CLASS_DECO |
|
|
|
+ LDST_SRCDST_WORD_DECO_MATH3 |
|
|
|
+ (4 << LDST_OFFSET_SHIFT));
|
|
|
+
|
|
|
+ wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
|
|
|
+ JUMP_COND_CALM | JUMP_COND_NCP |
|
|
|
+ JUMP_COND_NOP | JUMP_COND_NIP |
|
|
|
+ JUMP_COND_NIFP);
|
|
|
+ set_jump_tgt_here(desc, wait_load_cmd);
|
|
|
+
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
|
|
|
+ }
|
|
|
+
|
|
|
/* if assoclen is ZERO, skip reading the assoc data */
|
|
|
append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
|
|
|
zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
|
|
@@ -791,10 +850,13 @@ EXPORT_SYMBOL(cnstr_shdsc_gcm_decap);
|
|
|
* @desc: pointer to buffer used for descriptor construction
|
|
|
* @cdata: pointer to block cipher transform definitions
|
|
|
* Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
|
|
|
+ * @ivsize: initialization vector size
|
|
|
* @icvsize: integrity check value (ICV) size (truncated or full)
|
|
|
+ * @is_qi: true when called from caam/qi
|
|
|
*/
|
|
|
void cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
- unsigned int icvsize)
|
|
|
+ unsigned int ivsize, unsigned int icvsize,
|
|
|
+ const bool is_qi)
|
|
|
{
|
|
|
u32 *key_jump_cmd;
|
|
|
|
|
@@ -815,7 +877,29 @@ void cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
|
|
|
OP_ALG_ENCRYPT);
|
|
|
|
|
|
- append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8);
|
|
|
+ if (is_qi) {
|
|
|
+ u32 *wait_load_cmd;
|
|
|
+
|
|
|
+ /* REG3 = assoclen */
|
|
|
+ append_seq_load(desc, 4, LDST_CLASS_DECO |
|
|
|
+ LDST_SRCDST_WORD_DECO_MATH3 |
|
|
|
+ (4 << LDST_OFFSET_SHIFT));
|
|
|
+
|
|
|
+ wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
|
|
|
+ JUMP_COND_CALM | JUMP_COND_NCP |
|
|
|
+ JUMP_COND_NOP | JUMP_COND_NIP |
|
|
|
+ JUMP_COND_NIFP);
|
|
|
+ set_jump_tgt_here(desc, wait_load_cmd);
|
|
|
+
|
|
|
+ /* Read salt and IV */
|
|
|
+ append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
|
|
|
+ cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV);
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
|
|
|
+ }
|
|
|
+
|
|
|
+ append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
|
|
|
append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
|
|
|
|
|
|
/* Read assoc data */
|
|
@@ -823,7 +907,7 @@ void cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
|
|
|
|
|
|
/* Skip IV */
|
|
|
- append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
|
|
|
|
|
|
/* Will read cryptlen bytes */
|
|
|
append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
|
|
@@ -862,10 +946,13 @@ EXPORT_SYMBOL(cnstr_shdsc_rfc4106_encap);
|
|
|
* @desc: pointer to buffer used for descriptor construction
|
|
|
* @cdata: pointer to block cipher transform definitions
|
|
|
* Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
|
|
|
+ * @ivsize: initialization vector size
|
|
|
* @icvsize: integrity check value (ICV) size (truncated or full)
|
|
|
+ * @is_qi: true when called from caam/qi
|
|
|
*/
|
|
|
void cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
- unsigned int icvsize)
|
|
|
+ unsigned int ivsize, unsigned int icvsize,
|
|
|
+ const bool is_qi)
|
|
|
{
|
|
|
u32 *key_jump_cmd;
|
|
|
|
|
@@ -887,7 +974,29 @@ void cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
|
|
|
OP_ALG_DECRYPT | OP_ALG_ICV_ON);
|
|
|
|
|
|
- append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8);
|
|
|
+ if (is_qi) {
|
|
|
+ u32 *wait_load_cmd;
|
|
|
+
|
|
|
+ /* REG3 = assoclen */
|
|
|
+ append_seq_load(desc, 4, LDST_CLASS_DECO |
|
|
|
+ LDST_SRCDST_WORD_DECO_MATH3 |
|
|
|
+ (4 << LDST_OFFSET_SHIFT));
|
|
|
+
|
|
|
+ wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
|
|
|
+ JUMP_COND_CALM | JUMP_COND_NCP |
|
|
|
+ JUMP_COND_NOP | JUMP_COND_NIP |
|
|
|
+ JUMP_COND_NIFP);
|
|
|
+ set_jump_tgt_here(desc, wait_load_cmd);
|
|
|
+
|
|
|
+ /* Read salt and IV */
|
|
|
+ append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
|
|
|
+ cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV);
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
|
|
|
+ }
|
|
|
+
|
|
|
+ append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
|
|
|
append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
|
|
|
|
|
|
/* Read assoc data */
|
|
@@ -895,7 +1004,7 @@ void cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
|
|
|
|
|
|
/* Skip IV */
|
|
|
- append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
|
|
|
|
|
|
/* Will read cryptlen bytes */
|
|
|
append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ);
|
|
@@ -934,10 +1043,13 @@ EXPORT_SYMBOL(cnstr_shdsc_rfc4106_decap);
|
|
|
* @desc: pointer to buffer used for descriptor construction
|
|
|
* @cdata: pointer to block cipher transform definitions
|
|
|
* Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
|
|
|
+ * @ivsize: initialization vector size
|
|
|
* @icvsize: integrity check value (ICV) size (truncated or full)
|
|
|
+ * @is_qi: true when called from caam/qi
|
|
|
*/
|
|
|
void cnstr_shdsc_rfc4543_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
- unsigned int icvsize)
|
|
|
+ unsigned int ivsize, unsigned int icvsize,
|
|
|
+ const bool is_qi)
|
|
|
{
|
|
|
u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
|
|
|
|
|
@@ -958,6 +1070,18 @@ void cnstr_shdsc_rfc4543_encap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
|
|
|
OP_ALG_ENCRYPT);
|
|
|
|
|
|
+ if (is_qi) {
|
|
|
+ /* assoclen is not needed, skip it */
|
|
|
+ append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
|
|
|
+
|
|
|
+ /* Read salt and IV */
|
|
|
+ append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
|
|
|
+ cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV);
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
|
|
|
+ }
|
|
|
+
|
|
|
/* assoclen + cryptlen = seqinlen */
|
|
|
append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
|
|
|
|
|
@@ -1004,10 +1128,13 @@ EXPORT_SYMBOL(cnstr_shdsc_rfc4543_encap);
|
|
|
* @desc: pointer to buffer used for descriptor construction
|
|
|
* @cdata: pointer to block cipher transform definitions
|
|
|
* Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
|
|
|
+ * @ivsize: initialization vector size
|
|
|
* @icvsize: integrity check value (ICV) size (truncated or full)
|
|
|
+ * @is_qi: true when called from caam/qi
|
|
|
*/
|
|
|
void cnstr_shdsc_rfc4543_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
- unsigned int icvsize)
|
|
|
+ unsigned int ivsize, unsigned int icvsize,
|
|
|
+ const bool is_qi)
|
|
|
{
|
|
|
u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
|
|
|
|
|
@@ -1028,6 +1155,18 @@ void cnstr_shdsc_rfc4543_decap(u32 * const desc, struct alginfo *cdata,
|
|
|
append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
|
|
|
OP_ALG_DECRYPT | OP_ALG_ICV_ON);
|
|
|
|
|
|
+ if (is_qi) {
|
|
|
+ /* assoclen is not needed, skip it */
|
|
|
+ append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
|
|
|
+
|
|
|
+ /* Read salt and IV */
|
|
|
+ append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
|
|
|
+ cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV);
|
|
|
+ append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
|
|
|
+ FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
|
|
|
+ }
|
|
|
+
|
|
|
/* assoclen + cryptlen = seqoutlen */
|
|
|
append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ);
|
|
|
|