diff options
Diffstat (limited to 'drivers/crypto/inside-secure/safexcel_cipher.c')
| -rw-r--r-- | drivers/crypto/inside-secure/safexcel_cipher.c | 600 | 
1 files changed, 344 insertions, 256 deletions
| diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c index c02995694b41..0c5e80c3f6e3 100644 --- a/drivers/crypto/inside-secure/safexcel_cipher.c +++ b/drivers/crypto/inside-secure/safexcel_cipher.c @@ -47,8 +47,12 @@ struct safexcel_cipher_ctx {  	u32 mode;  	enum safexcel_cipher_alg alg; -	char aead; /* !=0=AEAD, 2=IPSec ESP AEAD, 3=IPsec ESP GMAC */ -	char xcm;  /* 0=authenc, 1=GCM, 2 reserved for CCM */ +	u8 aead; /* !=0=AEAD, 2=IPSec ESP AEAD, 3=IPsec ESP GMAC */ +	u8 xcm;  /* 0=authenc, 1=GCM, 2 reserved for CCM */ +	u8 aadskip; +	u8 blocksz; +	u32 ivmask; +	u32 ctrinit;  	__le32 key[16];  	u32 nonce; @@ -72,251 +76,298 @@ struct safexcel_cipher_req {  	int  nr_src, nr_dst;  }; -static void safexcel_cipher_token(struct safexcel_cipher_ctx *ctx, u8 *iv, -				  struct safexcel_command_desc *cdesc) +static int safexcel_skcipher_iv(struct safexcel_cipher_ctx *ctx, u8 *iv, +				struct safexcel_command_desc *cdesc)  { -	u32 block_sz = 0; - -	if (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD || -	    ctx->aead & EIP197_AEAD_TYPE_IPSEC_ESP) { /* _ESP and _ESP_GMAC */ +	if (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD) {  		cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; -  		/* 32 bit nonce */  		cdesc->control_data.token[0] = ctx->nonce;  		/* 64 bit IV part */  		memcpy(&cdesc->control_data.token[1], iv, 8); - -		if (ctx->alg == SAFEXCEL_CHACHA20 || -		    ctx->xcm == EIP197_XCM_MODE_CCM) { -			/* 32 bit counter, starting at 0 */ -			cdesc->control_data.token[3] = 0; -		} else { -			/* 32 bit counter, start at 1 (big endian!) */ -			cdesc->control_data.token[3] = -				(__force u32)cpu_to_be32(1); -		} - -		return; -	} else if (ctx->xcm == EIP197_XCM_MODE_GCM || -		   (ctx->aead && ctx->alg == SAFEXCEL_CHACHA20)) { -		cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; - -		/* 96 bit IV part */ -		memcpy(&cdesc->control_data.token[0], iv, 12); - -		if (ctx->alg == SAFEXCEL_CHACHA20) { -			/* 32 bit counter, starting at 0 */ -			cdesc->control_data.token[3] = 0; -		} else { -			/* 32 bit counter, start at 1 (big endian!) */ -			*(__be32 *)&cdesc->control_data.token[3] = -				cpu_to_be32(1); -		} - -		return; -	} else if (ctx->alg == SAFEXCEL_CHACHA20) { +		/* 32 bit counter, start at 0 or 1 (big endian!) */ +		cdesc->control_data.token[3] = +			(__force u32)cpu_to_be32(ctx->ctrinit); +		return 4; +	} +	if (ctx->alg == SAFEXCEL_CHACHA20) {  		cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; -  		/* 96 bit nonce part */  		memcpy(&cdesc->control_data.token[0], &iv[4], 12);  		/* 32 bit counter */  		cdesc->control_data.token[3] = *(u32 *)iv; - -		return; -	} else if (ctx->xcm == EIP197_XCM_MODE_CCM) { -		cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; - -		/* Variable length IV part */ -		memcpy(&cdesc->control_data.token[0], iv, 15 - iv[0]); -		/* Start variable length counter at 0 */ -		memset((u8 *)&cdesc->control_data.token[0] + 15 - iv[0], -		       0, iv[0] + 1); - -		return; +		return 4;  	} -	if (ctx->mode != CONTEXT_CONTROL_CRYPTO_MODE_ECB) { -		switch (ctx->alg) { -		case SAFEXCEL_DES: -			block_sz = DES_BLOCK_SIZE; -			cdesc->control_data.options |= EIP197_OPTION_2_TOKEN_IV_CMD; -			break; -		case SAFEXCEL_3DES: -			block_sz = DES3_EDE_BLOCK_SIZE; -			cdesc->control_data.options |= EIP197_OPTION_2_TOKEN_IV_CMD; -			break; -		case SAFEXCEL_SM4: -			block_sz = SM4_BLOCK_SIZE; -			cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; -			break; -		case SAFEXCEL_AES: -			block_sz = AES_BLOCK_SIZE; -			cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; -			break; -		default: -			break; -		} -		memcpy(cdesc->control_data.token, iv, block_sz); -	} +	cdesc->control_data.options |= ctx->ivmask; +	memcpy(cdesc->control_data.token, iv, ctx->blocksz); +	return ctx->blocksz / sizeof(u32);  }  static void safexcel_skcipher_token(struct safexcel_cipher_ctx *ctx, u8 *iv,  				    struct safexcel_command_desc *cdesc, +				    struct safexcel_token *atoken,  				    u32 length)  {  	struct safexcel_token *token; +	int ivlen; -	safexcel_cipher_token(ctx, iv, cdesc); +	ivlen = safexcel_skcipher_iv(ctx, iv, cdesc); +	if (ivlen == 4) { +		/* No space in cdesc, instruction moves to atoken */ +		cdesc->additional_cdata_size = 1; +		token = atoken; +	} else { +		/* Everything fits in cdesc */ +		token = (struct safexcel_token *)(cdesc->control_data.token + 2); +		/* Need to pad with NOP */ +		eip197_noop_token(&token[1]); +	} -	/* skip over worst case IV of 4 dwords, no need to be exact */ -	token = (struct safexcel_token *)(cdesc->control_data.token + 4); +	token->opcode = EIP197_TOKEN_OPCODE_DIRECTION; +	token->packet_length = length; +	token->stat = EIP197_TOKEN_STAT_LAST_PACKET | +		      EIP197_TOKEN_STAT_LAST_HASH; +	token->instructions = EIP197_TOKEN_INS_LAST | +			      EIP197_TOKEN_INS_TYPE_CRYPTO | +			      EIP197_TOKEN_INS_TYPE_OUTPUT; +} -	token[0].opcode = EIP197_TOKEN_OPCODE_DIRECTION; -	token[0].packet_length = length; -	token[0].stat = EIP197_TOKEN_STAT_LAST_PACKET | -			EIP197_TOKEN_STAT_LAST_HASH; -	token[0].instructions = EIP197_TOKEN_INS_LAST | -				EIP197_TOKEN_INS_TYPE_CRYPTO | -				EIP197_TOKEN_INS_TYPE_OUTPUT; +static void safexcel_aead_iv(struct safexcel_cipher_ctx *ctx, u8 *iv, +			     struct safexcel_command_desc *cdesc) +{ +	if (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD || +	    ctx->aead & EIP197_AEAD_TYPE_IPSEC_ESP) { /* _ESP and _ESP_GMAC */ +		/* 32 bit nonce */ +		cdesc->control_data.token[0] = ctx->nonce; +		/* 64 bit IV part */ +		memcpy(&cdesc->control_data.token[1], iv, 8); +		/* 32 bit counter, start at 0 or 1 (big endian!) */ +		cdesc->control_data.token[3] = +			(__force u32)cpu_to_be32(ctx->ctrinit); +		return; +	} +	if (ctx->xcm == EIP197_XCM_MODE_GCM || ctx->alg == SAFEXCEL_CHACHA20) { +		/* 96 bit IV part */ +		memcpy(&cdesc->control_data.token[0], iv, 12); +		/* 32 bit counter, start at 0 or 1 (big endian!) */ +		cdesc->control_data.token[3] = +			(__force u32)cpu_to_be32(ctx->ctrinit); +		return; +	} +	/* CBC */ +	memcpy(cdesc->control_data.token, iv, ctx->blocksz);  }  static void safexcel_aead_token(struct safexcel_cipher_ctx *ctx, u8 *iv,  				struct safexcel_command_desc *cdesc, +				struct safexcel_token *atoken,  				enum safexcel_cipher_direction direction,  				u32 cryptlen, u32 assoclen, u32 digestsize)  { -	struct safexcel_token *token; +	struct safexcel_token *aadref; +	int atoksize = 2; /* Start with minimum size */ +	int assocadj = assoclen - ctx->aadskip, aadalign; -	safexcel_cipher_token(ctx, iv, cdesc); +	/* Always 4 dwords of embedded IV  for AEAD modes */ +	cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD; -	if (direction == SAFEXCEL_ENCRYPT) { -		/* align end of instruction sequence to end of token */ -		token = (struct safexcel_token *)(cdesc->control_data.token + -			 EIP197_MAX_TOKENS - 14); - -		token[13].opcode = EIP197_TOKEN_OPCODE_INSERT; -		token[13].packet_length = digestsize; -		token[13].stat = EIP197_TOKEN_STAT_LAST_HASH | -				 EIP197_TOKEN_STAT_LAST_PACKET; -		token[13].instructions = EIP197_TOKEN_INS_TYPE_OUTPUT | -					 EIP197_TOKEN_INS_INSERT_HASH_DIGEST; -	} else { +	if (direction == SAFEXCEL_DECRYPT)  		cryptlen -= digestsize; -		/* align end of instruction sequence to end of token */ -		token = (struct safexcel_token *)(cdesc->control_data.token + -			 EIP197_MAX_TOKENS - 15); - -		token[13].opcode = EIP197_TOKEN_OPCODE_RETRIEVE; -		token[13].packet_length = digestsize; -		token[13].stat = EIP197_TOKEN_STAT_LAST_HASH | -				 EIP197_TOKEN_STAT_LAST_PACKET; -		token[13].instructions = EIP197_TOKEN_INS_INSERT_HASH_DIGEST; - -		token[14].opcode = EIP197_TOKEN_OPCODE_VERIFY; -		token[14].packet_length = digestsize | -					  EIP197_TOKEN_HASH_RESULT_VERIFY; -		token[14].stat = EIP197_TOKEN_STAT_LAST_HASH | -				 EIP197_TOKEN_STAT_LAST_PACKET; -		token[14].instructions = EIP197_TOKEN_INS_TYPE_OUTPUT; -	} - -	if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP) { -		/* For ESP mode (and not GMAC), skip over the IV */ -		token[8].opcode = EIP197_TOKEN_OPCODE_DIRECTION; -		token[8].packet_length = EIP197_AEAD_IPSEC_IV_SIZE; - -		assoclen -= EIP197_AEAD_IPSEC_IV_SIZE; -	} +	if (unlikely(ctx->xcm == EIP197_XCM_MODE_CCM)) { +		/* Construct IV block B0 for the CBC-MAC */ +		u8 *final_iv = (u8 *)cdesc->control_data.token; +		u8 *cbcmaciv = (u8 *)&atoken[1]; +		__le32 *aadlen = (__le32 *)&atoken[5]; + +		if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP) { +			/* Length + nonce */ +			cdesc->control_data.token[0] = ctx->nonce; +			/* Fixup flags byte */ +			*(__le32 *)cbcmaciv = +				cpu_to_le32(ctx->nonce | +					    ((assocadj > 0) << 6) | +					    ((digestsize - 2) << 2)); +			/* 64 bit IV part */ +			memcpy(&cdesc->control_data.token[1], iv, 8); +			memcpy(cbcmaciv + 4, iv, 8); +			/* Start counter at 0 */ +			cdesc->control_data.token[3] = 0; +			/* Message length */ +			*(__be32 *)(cbcmaciv + 12) = cpu_to_be32(cryptlen); +		} else { +			/* Variable length IV part */ +			memcpy(final_iv, iv, 15 - iv[0]); +			memcpy(cbcmaciv, iv, 15 - iv[0]); +			/* Start variable length counter at 0 */ +			memset(final_iv + 15 - iv[0], 0, iv[0] + 1); +			memset(cbcmaciv + 15 - iv[0], 0, iv[0] - 1); +			/* fixup flags byte */ +			cbcmaciv[0] |= ((assocadj > 0) << 6) | +				       ((digestsize - 2) << 2); +			/* insert lower 2 bytes of message length */ +			cbcmaciv[14] = cryptlen >> 8; +			cbcmaciv[15] = cryptlen & 255; +		} -	token[6].opcode = EIP197_TOKEN_OPCODE_DIRECTION; -	token[6].packet_length = assoclen; -	token[6].instructions = EIP197_TOKEN_INS_LAST | -				EIP197_TOKEN_INS_TYPE_HASH; +		atoken->opcode = EIP197_TOKEN_OPCODE_INSERT; +		atoken->packet_length = AES_BLOCK_SIZE + +					((assocadj > 0) << 1); +		atoken->stat = 0; +		atoken->instructions = EIP197_TOKEN_INS_ORIGIN_TOKEN | +				       EIP197_TOKEN_INS_TYPE_HASH; + +		if (likely(assocadj)) { +			*aadlen = cpu_to_le32((assocadj >> 8) | +					      (assocadj & 255) << 8); +			atoken += 6; +			atoksize += 7; +		} else { +			atoken += 5; +			atoksize += 6; +		} -	if (likely(cryptlen || ctx->alg == SAFEXCEL_CHACHA20)) { -		token[11].opcode = EIP197_TOKEN_OPCODE_DIRECTION; -		token[11].packet_length = cryptlen; -		token[11].stat = EIP197_TOKEN_STAT_LAST_HASH; -		if (unlikely(ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP_GMAC)) { -			token[6].instructions = EIP197_TOKEN_INS_TYPE_HASH; -			/* Do not send to crypt engine in case of GMAC */ -			token[11].instructions = EIP197_TOKEN_INS_LAST | -						 EIP197_TOKEN_INS_TYPE_HASH | -						 EIP197_TOKEN_INS_TYPE_OUTPUT; +		/* Process AAD data */ +		aadref = atoken; +		atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION; +		atoken->packet_length = assocadj; +		atoken->stat = 0; +		atoken->instructions = EIP197_TOKEN_INS_TYPE_HASH; +		atoken++; + +		/* For CCM only, align AAD data towards hash engine */ +		atoken->opcode = EIP197_TOKEN_OPCODE_INSERT; +		aadalign = (assocadj + 2) & 15; +		atoken->packet_length = assocadj && aadalign ? +						16 - aadalign : +						0; +		if (likely(cryptlen)) { +			atoken->stat = 0; +			atoken->instructions = EIP197_TOKEN_INS_TYPE_HASH;  		} else { -			token[11].instructions = EIP197_TOKEN_INS_LAST | -						 EIP197_TOKEN_INS_TYPE_CRYPTO | -						 EIP197_TOKEN_INS_TYPE_HASH | -						 EIP197_TOKEN_INS_TYPE_OUTPUT; +			atoken->stat = EIP197_TOKEN_STAT_LAST_HASH; +			atoken->instructions = EIP197_TOKEN_INS_LAST | +					       EIP197_TOKEN_INS_TYPE_HASH;  		} -	} else if (ctx->xcm != EIP197_XCM_MODE_CCM) { -		token[6].stat = EIP197_TOKEN_STAT_LAST_HASH; +	} else { +		safexcel_aead_iv(ctx, iv, cdesc); + +		/* Process AAD data */ +		aadref = atoken; +		atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION; +		atoken->packet_length = assocadj; +		atoken->stat = EIP197_TOKEN_STAT_LAST_HASH; +		atoken->instructions = EIP197_TOKEN_INS_LAST | +				       EIP197_TOKEN_INS_TYPE_HASH;  	} +	atoken++; -	if (!ctx->xcm) -		return; +	if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP) { +		/* For ESP mode (and not GMAC), skip over the IV */ +		atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION; +		atoken->packet_length = EIP197_AEAD_IPSEC_IV_SIZE; +		atoken->stat = 0; +		atoken->instructions = 0; +		atoken++; +		atoksize++; +	} else if (unlikely(ctx->alg == SAFEXCEL_CHACHA20 && +			    direction == SAFEXCEL_DECRYPT)) { +		/* Poly-chacha decryption needs a dummy NOP here ... */ +		atoken->opcode = EIP197_TOKEN_OPCODE_INSERT; +		atoken->packet_length = 16; /* According to Op Manual */ +		atoken->stat = 0; +		atoken->instructions = 0; +		atoken++; +		atoksize++; +	} -	token[9].opcode = EIP197_TOKEN_OPCODE_INSERT_REMRES; -	token[9].packet_length = 0; -	token[9].instructions = AES_BLOCK_SIZE; +	if  (ctx->xcm) { +		/* For GCM and CCM, obtain enc(Y0) */ +		atoken->opcode = EIP197_TOKEN_OPCODE_INSERT_REMRES; +		atoken->packet_length = 0; +		atoken->stat = 0; +		atoken->instructions = AES_BLOCK_SIZE; +		atoken++; + +		atoken->opcode = EIP197_TOKEN_OPCODE_INSERT; +		atoken->packet_length = AES_BLOCK_SIZE; +		atoken->stat = 0; +		atoken->instructions = EIP197_TOKEN_INS_TYPE_OUTPUT | +				       EIP197_TOKEN_INS_TYPE_CRYPTO; +		atoken++; +		atoksize += 2; +	} -	token[10].opcode = EIP197_TOKEN_OPCODE_INSERT; -	token[10].packet_length = AES_BLOCK_SIZE; -	token[10].instructions = EIP197_TOKEN_INS_TYPE_OUTPUT | -				 EIP197_TOKEN_INS_TYPE_CRYPTO; +	if (likely(cryptlen || ctx->alg == SAFEXCEL_CHACHA20)) { +		/* Fixup stat field for AAD direction instruction */ +		aadref->stat = 0; -	if (ctx->xcm != EIP197_XCM_MODE_GCM) { -		u8 *final_iv = (u8 *)cdesc->control_data.token; -		u8 *cbcmaciv = (u8 *)&token[1]; -		__le32 *aadlen = (__le32 *)&token[5]; +		/* Process crypto data */ +		atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION; +		atoken->packet_length = cryptlen; -		/* Construct IV block B0 for the CBC-MAC */ -		token[0].opcode = EIP197_TOKEN_OPCODE_INSERT; -		token[0].packet_length = AES_BLOCK_SIZE + -					 ((assoclen > 0) << 1); -		token[0].instructions = EIP197_TOKEN_INS_ORIGIN_TOKEN | -					EIP197_TOKEN_INS_TYPE_HASH; -		/* Variable length IV part */ -		memcpy(cbcmaciv, final_iv, 15 - final_iv[0]); -		/* fixup flags byte */ -		cbcmaciv[0] |= ((assoclen > 0) << 6) | ((digestsize - 2) << 2); -		/* Clear upper bytes of variable message length to 0 */ -		memset(cbcmaciv + 15 - final_iv[0], 0, final_iv[0] - 1); -		/* insert lower 2 bytes of message length */ -		cbcmaciv[14] = cryptlen >> 8; -		cbcmaciv[15] = cryptlen & 255; +		if (unlikely(ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP_GMAC)) { +			/* Fixup instruction field for AAD dir instruction */ +			aadref->instructions = EIP197_TOKEN_INS_TYPE_HASH; -		if (assoclen) { -			*aadlen = cpu_to_le32((assoclen >> 8) | -					      ((assoclen & 0xff) << 8)); -			assoclen += 2; +			/* Do not send to crypt engine in case of GMAC */ +			atoken->instructions = EIP197_TOKEN_INS_LAST | +					       EIP197_TOKEN_INS_TYPE_HASH | +					       EIP197_TOKEN_INS_TYPE_OUTPUT; +		} else { +			atoken->instructions = EIP197_TOKEN_INS_LAST | +					       EIP197_TOKEN_INS_TYPE_CRYPTO | +					       EIP197_TOKEN_INS_TYPE_HASH | +					       EIP197_TOKEN_INS_TYPE_OUTPUT;  		} -		token[6].instructions = EIP197_TOKEN_INS_TYPE_HASH; - -		/* Align AAD data towards hash engine */ -		token[7].opcode = EIP197_TOKEN_OPCODE_INSERT; -		assoclen &= 15; -		token[7].packet_length = assoclen ? 16 - assoclen : 0; - -		if (likely(cryptlen)) { -			token[7].instructions = EIP197_TOKEN_INS_TYPE_HASH; - -			/* Align crypto data towards hash engine */ -			token[11].stat = 0; - -			token[12].opcode = EIP197_TOKEN_OPCODE_INSERT; -			cryptlen &= 15; -			token[12].packet_length = cryptlen ? 16 - cryptlen : 0; -			token[12].stat = EIP197_TOKEN_STAT_LAST_HASH; -			token[12].instructions = EIP197_TOKEN_INS_TYPE_HASH; +		cryptlen &= 15; +		if (unlikely(ctx->xcm == EIP197_XCM_MODE_CCM && cryptlen)) { +			atoken->stat = 0; +			/* For CCM only, pad crypto data to the hash engine */ +			atoken++; +			atoksize++; +			atoken->opcode = EIP197_TOKEN_OPCODE_INSERT; +			atoken->packet_length = 16 - cryptlen; +			atoken->stat = EIP197_TOKEN_STAT_LAST_HASH; +			atoken->instructions = EIP197_TOKEN_INS_TYPE_HASH;  		} else { -			token[7].stat = EIP197_TOKEN_STAT_LAST_HASH; -			token[7].instructions = EIP197_TOKEN_INS_LAST | -						EIP197_TOKEN_INS_TYPE_HASH; +			atoken->stat = EIP197_TOKEN_STAT_LAST_HASH;  		} +		atoken++; +		atoksize++;  	} + +	if (direction == SAFEXCEL_ENCRYPT) { +		/* Append ICV */ +		atoken->opcode = EIP197_TOKEN_OPCODE_INSERT; +		atoken->packet_length = digestsize; +		atoken->stat = EIP197_TOKEN_STAT_LAST_HASH | +			       EIP197_TOKEN_STAT_LAST_PACKET; +		atoken->instructions = EIP197_TOKEN_INS_TYPE_OUTPUT | +				       EIP197_TOKEN_INS_INSERT_HASH_DIGEST; +	} else { +		/* Extract ICV */ +		atoken->opcode = EIP197_TOKEN_OPCODE_RETRIEVE; +		atoken->packet_length = digestsize; +		atoken->stat = EIP197_TOKEN_STAT_LAST_HASH | +			       EIP197_TOKEN_STAT_LAST_PACKET; +		atoken->instructions = EIP197_TOKEN_INS_INSERT_HASH_DIGEST; +		atoken++; +		atoksize++; + +		/* Verify ICV */ +		atoken->opcode = EIP197_TOKEN_OPCODE_VERIFY; +		atoken->packet_length = digestsize | +					EIP197_TOKEN_HASH_RESULT_VERIFY; +		atoken->stat = EIP197_TOKEN_STAT_LAST_HASH | +			       EIP197_TOKEN_STAT_LAST_PACKET; +		atoken->instructions = EIP197_TOKEN_INS_TYPE_OUTPUT; +	} + +	/* Fixup length of the token in the command descriptor */ +	cdesc->additional_cdata_size = atoksize;  }  static int safexcel_skcipher_aes_setkey(struct crypto_skcipher *ctfm, @@ -329,10 +380,8 @@ static int safexcel_skcipher_aes_setkey(struct crypto_skcipher *ctfm,  	int ret, i;  	ret = aes_expandkey(&aes, key, len); -	if (ret) { -		crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (ret)  		return ret; -	}  	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {  		for (i = 0; i < len / sizeof(u32); i++) { @@ -382,12 +431,12 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,  	case SAFEXCEL_DES:  		err = verify_aead_des_key(ctfm, keys.enckey, keys.enckeylen);  		if (unlikely(err)) -			goto badkey_expflags; +			goto badkey;  		break;  	case SAFEXCEL_3DES:  		err = verify_aead_des3_key(ctfm, keys.enckey, keys.enckeylen);  		if (unlikely(err)) -			goto badkey_expflags; +			goto badkey;  		break;  	case SAFEXCEL_AES:  		err = aes_expandkey(&aes, keys.enckey, keys.enckeylen); @@ -450,9 +499,6 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,  		goto badkey;  	} -	crypto_aead_set_flags(ctfm, crypto_aead_get_flags(ctfm) & -				    CRYPTO_TFM_RES_MASK); -  	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma &&  	    (memcmp(ctx->ipad, istate.state, ctx->state_sz) ||  	     memcmp(ctx->opad, ostate.state, ctx->state_sz))) @@ -470,8 +516,6 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,  	return 0;  badkey: -	crypto_aead_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); -badkey_expflags:  	memzero_explicit(&keys, sizeof(keys));  	return err;  } @@ -656,6 +700,7 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring,  	unsigned int totlen;  	unsigned int totlen_src = cryptlen + assoclen;  	unsigned int totlen_dst = totlen_src; +	struct safexcel_token *atoken;  	int n_cdesc = 0, n_rdesc = 0;  	int queued, i, ret = 0;  	bool first = true; @@ -730,56 +775,60 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring,  	memcpy(ctx->base.ctxr->data, ctx->key, ctx->key_len); -	/* The EIP cannot deal with zero length input packets! */ -	if (totlen == 0) -		totlen = 1; +	if (!totlen) { +		/* +		 * The EIP97 cannot deal with zero length input packets! +		 * So stuff a dummy command descriptor indicating a 1 byte +		 * (dummy) input packet, using the context record as source. +		 */ +		first_cdesc = safexcel_add_cdesc(priv, ring, +						 1, 1, ctx->base.ctxr_dma, +						 1, 1, ctx->base.ctxr_dma, +						 &atoken); +		if (IS_ERR(first_cdesc)) { +			/* No space left in the command descriptor ring */ +			ret = PTR_ERR(first_cdesc); +			goto cdesc_rollback; +		} +		n_cdesc = 1; +		goto skip_cdesc; +	}  	/* command descriptors */  	for_each_sg(src, sg, sreq->nr_src, i) {  		int len = sg_dma_len(sg);  		/* Do not overflow the request */ -		if (queued - len < 0) +		if (queued < len)  			len = queued;  		cdesc = safexcel_add_cdesc(priv, ring, !n_cdesc,  					   !(queued - len),  					   sg_dma_address(sg), len, totlen, -					   ctx->base.ctxr_dma); +					   ctx->base.ctxr_dma, &atoken);  		if (IS_ERR(cdesc)) {  			/* No space left in the command descriptor ring */  			ret = PTR_ERR(cdesc);  			goto cdesc_rollback;  		} -		n_cdesc++; -		if (n_cdesc == 1) { +		if (!n_cdesc)  			first_cdesc = cdesc; -		} +		n_cdesc++;  		queued -= len;  		if (!queued)  			break;  	} - -	if (unlikely(!n_cdesc)) { -		/* -		 * Special case: zero length input buffer. -		 * The engine always needs the 1st command descriptor, however! -		 */ -		first_cdesc = safexcel_add_cdesc(priv, ring, 1, 1, 0, 0, totlen, -						 ctx->base.ctxr_dma); -		n_cdesc = 1; -	} - +skip_cdesc:  	/* Add context control words and token to first command descriptor */  	safexcel_context_control(ctx, base, sreq, first_cdesc);  	if (ctx->aead) -		safexcel_aead_token(ctx, iv, first_cdesc, +		safexcel_aead_token(ctx, iv, first_cdesc, atoken,  				    sreq->direction, cryptlen,  				    assoclen, digestsize);  	else -		safexcel_skcipher_token(ctx, iv, first_cdesc, +		safexcel_skcipher_token(ctx, iv, first_cdesc, atoken,  					cryptlen);  	/* result descriptors */ @@ -1166,6 +1215,8 @@ static int safexcel_skcipher_cra_init(struct crypto_tfm *tfm)  	ctx->base.send = safexcel_skcipher_send;  	ctx->base.handle_result = safexcel_skcipher_handle_result; +	ctx->ivmask = EIP197_OPTION_4_TOKEN_IV_CMD; +	ctx->ctrinit = 1;  	return 0;  } @@ -1230,6 +1281,8 @@ static int safexcel_skcipher_aes_ecb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_AES;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB; +	ctx->blocksz = 0; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1264,6 +1317,7 @@ static int safexcel_skcipher_aes_cbc_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_AES; +	ctx->blocksz = AES_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;  	return 0;  } @@ -1300,6 +1354,7 @@ static int safexcel_skcipher_aes_cfb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_AES; +	ctx->blocksz = AES_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CFB;  	return 0;  } @@ -1336,6 +1391,7 @@ static int safexcel_skcipher_aes_ofb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_AES; +	ctx->blocksz = AES_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_OFB;  	return 0;  } @@ -1381,10 +1437,8 @@ static int safexcel_skcipher_aesctr_setkey(struct crypto_skcipher *ctfm,  	/* exclude the nonce here */  	keylen = len - CTR_RFC3686_NONCE_SIZE;  	ret = aes_expandkey(&aes, key, keylen); -	if (ret) { -		crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (ret)  		return ret; -	}  	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {  		for (i = 0; i < keylen / sizeof(u32); i++) { @@ -1410,6 +1464,7 @@ static int safexcel_skcipher_aes_ctr_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_AES; +	ctx->blocksz = AES_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD;  	return 0;  } @@ -1445,6 +1500,7 @@ static int safexcel_des_setkey(struct crypto_skcipher *ctfm, const u8 *key,  			       unsigned int len)  {  	struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm); +	struct safexcel_crypto_priv *priv = ctx->priv;  	int ret;  	ret = verify_skcipher_des_key(ctfm, key); @@ -1452,7 +1508,7 @@ static int safexcel_des_setkey(struct crypto_skcipher *ctfm, const u8 *key,  		return ret;  	/* if context exits and key changed, need to invalidate it */ -	if (ctx->base.ctxr_dma) +	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)  		if (memcmp(ctx->key, key, len))  			ctx->base.needs_inv = true; @@ -1468,6 +1524,8 @@ static int safexcel_skcipher_des_cbc_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_DES; +	ctx->blocksz = DES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;  	return 0;  } @@ -1505,6 +1563,8 @@ static int safexcel_skcipher_des_ecb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_DES;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB; +	ctx->blocksz = 0; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1537,6 +1597,7 @@ static int safexcel_des3_ede_setkey(struct crypto_skcipher *ctfm,  				   const u8 *key, unsigned int len)  {  	struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm); +	struct safexcel_crypto_priv *priv = ctx->priv;  	int err;  	err = verify_skcipher_des3_key(ctfm, key); @@ -1544,7 +1605,7 @@ static int safexcel_des3_ede_setkey(struct crypto_skcipher *ctfm,  		return err;  	/* if context exits and key changed, need to invalidate it */ -	if (ctx->base.ctxr_dma) +	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)  		if (memcmp(ctx->key, key, len))  			ctx->base.needs_inv = true; @@ -1560,6 +1621,8 @@ static int safexcel_skcipher_des3_cbc_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_3DES; +	ctx->blocksz = DES3_EDE_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;  	return 0;  } @@ -1597,6 +1660,8 @@ static int safexcel_skcipher_des3_ecb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_3DES;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB; +	ctx->blocksz = 0; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1652,6 +1717,9 @@ static int safexcel_aead_cra_init(struct crypto_tfm *tfm)  	ctx->priv = tmpl->priv;  	ctx->alg  = SAFEXCEL_AES; /* default */ +	ctx->blocksz = AES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_4_TOKEN_IV_CMD; +	ctx->ctrinit = 1;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC; /* default */  	ctx->aead = true;  	ctx->base.send = safexcel_aead_send; @@ -1840,6 +1908,8 @@ static int safexcel_aead_sha1_des3_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha1_cra_init(tfm);  	ctx->alg = SAFEXCEL_3DES; /* override default */ +	ctx->blocksz = DES3_EDE_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1874,6 +1944,8 @@ static int safexcel_aead_sha256_des3_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha256_cra_init(tfm);  	ctx->alg = SAFEXCEL_3DES; /* override default */ +	ctx->blocksz = DES3_EDE_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1908,6 +1980,8 @@ static int safexcel_aead_sha224_des3_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha224_cra_init(tfm);  	ctx->alg = SAFEXCEL_3DES; /* override default */ +	ctx->blocksz = DES3_EDE_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1942,6 +2016,8 @@ static int safexcel_aead_sha512_des3_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha512_cra_init(tfm);  	ctx->alg = SAFEXCEL_3DES; /* override default */ +	ctx->blocksz = DES3_EDE_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -1976,6 +2052,8 @@ static int safexcel_aead_sha384_des3_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha384_cra_init(tfm);  	ctx->alg = SAFEXCEL_3DES; /* override default */ +	ctx->blocksz = DES3_EDE_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -2010,6 +2088,8 @@ static int safexcel_aead_sha1_des_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha1_cra_init(tfm);  	ctx->alg = SAFEXCEL_DES; /* override default */ +	ctx->blocksz = DES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -2044,6 +2124,8 @@ static int safexcel_aead_sha256_des_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha256_cra_init(tfm);  	ctx->alg = SAFEXCEL_DES; /* override default */ +	ctx->blocksz = DES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -2078,6 +2160,8 @@ static int safexcel_aead_sha224_des_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha224_cra_init(tfm);  	ctx->alg = SAFEXCEL_DES; /* override default */ +	ctx->blocksz = DES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -2112,6 +2196,8 @@ static int safexcel_aead_sha512_des_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha512_cra_init(tfm);  	ctx->alg = SAFEXCEL_DES; /* override default */ +	ctx->blocksz = DES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -2146,6 +2232,8 @@ static int safexcel_aead_sha384_des_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_sha384_cra_init(tfm);  	ctx->alg = SAFEXCEL_DES; /* override default */ +	ctx->blocksz = DES_BLOCK_SIZE; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -2362,10 +2450,8 @@ static int safexcel_skcipher_aesxts_setkey(struct crypto_skcipher *ctfm,  	/* Only half of the key data is cipher key */  	keylen = (len >> 1);  	ret = aes_expandkey(&aes, key, keylen); -	if (ret) { -		crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (ret)  		return ret; -	}  	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {  		for (i = 0; i < keylen / sizeof(u32); i++) { @@ -2381,10 +2467,8 @@ static int safexcel_skcipher_aesxts_setkey(struct crypto_skcipher *ctfm,  	/* The other half is the tweak key */  	ret = aes_expandkey(&aes, (u8 *)(key + keylen), keylen); -	if (ret) { -		crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (ret)  		return ret; -	}  	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {  		for (i = 0; i < keylen / sizeof(u32); i++) { @@ -2412,6 +2496,7 @@ static int safexcel_skcipher_aes_xts_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_AES; +	ctx->blocksz = AES_BLOCK_SIZE;  	ctx->xts  = 1;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_XTS;  	return 0; @@ -2472,7 +2557,6 @@ static int safexcel_aead_gcm_setkey(struct crypto_aead *ctfm, const u8 *key,  	ret = aes_expandkey(&aes, key, len);  	if (ret) { -		crypto_aead_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN);  		memzero_explicit(&aes, sizeof(aes));  		return ret;  	} @@ -2496,8 +2580,6 @@ static int safexcel_aead_gcm_setkey(struct crypto_aead *ctfm, const u8 *key,  	crypto_cipher_set_flags(ctx->hkaes, crypto_aead_get_flags(ctfm) &  				CRYPTO_TFM_REQ_MASK);  	ret = crypto_cipher_setkey(ctx->hkaes, key, len); -	crypto_aead_set_flags(ctfm, crypto_cipher_get_flags(ctx->hkaes) & -			      CRYPTO_TFM_RES_MASK);  	if (ret)  		return ret; @@ -2532,10 +2614,7 @@ static int safexcel_aead_gcm_cra_init(struct crypto_tfm *tfm)  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_XCM; /* override default */  	ctx->hkaes = crypto_alloc_cipher("aes", 0, 0); -	if (IS_ERR(ctx->hkaes)) -		return PTR_ERR(ctx->hkaes); - -	return 0; +	return PTR_ERR_OR_ZERO(ctx->hkaes);  }  static void safexcel_aead_gcm_cra_exit(struct crypto_tfm *tfm) @@ -2589,7 +2668,6 @@ static int safexcel_aead_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,  	ret = aes_expandkey(&aes, key, len);  	if (ret) { -		crypto_aead_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN);  		memzero_explicit(&aes, sizeof(aes));  		return ret;  	} @@ -2632,6 +2710,7 @@ static int safexcel_aead_ccm_cra_init(struct crypto_tfm *tfm)  	ctx->state_sz = 3 * AES_BLOCK_SIZE;  	ctx->xcm = EIP197_XCM_MODE_CCM;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_XCM; /* override default */ +	ctx->ctrinit = 0;  	return 0;  } @@ -2719,10 +2798,9 @@ static int safexcel_skcipher_chacha20_setkey(struct crypto_skcipher *ctfm,  {  	struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm); -	if (len != CHACHA_KEY_SIZE) { -		crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (len != CHACHA_KEY_SIZE)  		return -EINVAL; -	} +  	safexcel_chacha20_setkey(ctx, key);  	return 0; @@ -2734,6 +2812,7 @@ static int safexcel_skcipher_chacha20_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_CHACHA20; +	ctx->ctrinit = 0;  	ctx->mode = CONTEXT_CONTROL_CHACHA20_MODE_256_32;  	return 0;  } @@ -2775,10 +2854,9 @@ static int safexcel_aead_chachapoly_setkey(struct crypto_aead *ctfm,  		len -= EIP197_AEAD_IPSEC_NONCE_SIZE;  		ctx->nonce = *(u32 *)(key + len);  	} -	if (len != CHACHA_KEY_SIZE) { -		crypto_aead_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (len != CHACHA_KEY_SIZE)  		return -EINVAL; -	} +  	safexcel_chacha20_setkey(ctx, key);  	return 0; @@ -2885,6 +2963,7 @@ static int safexcel_aead_chachapoly_cra_init(struct crypto_tfm *tfm)  	ctx->alg  = SAFEXCEL_CHACHA20;  	ctx->mode = CONTEXT_CONTROL_CHACHA20_MODE_256_32 |  		    CONTEXT_CONTROL_CHACHA20_MODE_CALC_OTK; +	ctx->ctrinit = 0;  	ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_POLY1305;  	ctx->state_sz = 0; /* Precomputed by HW */  	return 0; @@ -2933,6 +3012,7 @@ static int safexcel_aead_chachapolyesp_cra_init(struct crypto_tfm *tfm)  	ret = safexcel_aead_chachapoly_cra_init(tfm);  	ctx->aead  = EIP197_AEAD_TYPE_IPSEC_ESP; +	ctx->aadskip = EIP197_AEAD_IPSEC_IV_SIZE;  	return ret;  } @@ -2971,10 +3051,8 @@ static int safexcel_skcipher_sm4_setkey(struct crypto_skcipher *ctfm,  	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);  	struct safexcel_crypto_priv *priv = ctx->priv; -	if (len != SM4_KEY_SIZE) { -		crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +	if (len != SM4_KEY_SIZE)  		return -EINVAL; -	}  	if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)  		if (memcmp(ctx->key, key, SM4_KEY_SIZE)) @@ -3013,6 +3091,8 @@ static int safexcel_skcipher_sm4_ecb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_SM4;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB; +	ctx->blocksz = 0; +	ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;  	return 0;  } @@ -3047,6 +3127,7 @@ static int safexcel_skcipher_sm4_cbc_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_SM4; +	ctx->blocksz = SM4_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;  	return 0;  } @@ -3083,6 +3164,7 @@ static int safexcel_skcipher_sm4_ofb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_SM4; +	ctx->blocksz = SM4_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_OFB;  	return 0;  } @@ -3119,6 +3201,7 @@ static int safexcel_skcipher_sm4_cfb_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_SM4; +	ctx->blocksz = SM4_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CFB;  	return 0;  } @@ -3169,6 +3252,7 @@ static int safexcel_skcipher_sm4_ctr_cra_init(struct crypto_tfm *tfm)  	safexcel_skcipher_cra_init(tfm);  	ctx->alg  = SAFEXCEL_SM4; +	ctx->blocksz = SM4_BLOCK_SIZE;  	ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD;  	return 0;  } @@ -3228,6 +3312,7 @@ static int safexcel_aead_sm4cbc_sha1_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_cra_init(tfm);  	ctx->alg = SAFEXCEL_SM4; +	ctx->blocksz = SM4_BLOCK_SIZE;  	ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA1;  	ctx->state_sz = SHA1_DIGEST_SIZE;  	return 0; @@ -3335,6 +3420,7 @@ static int safexcel_aead_sm4cbc_sm3_cra_init(struct crypto_tfm *tfm)  	safexcel_aead_fallback_cra_init(tfm);  	ctx->alg = SAFEXCEL_SM4; +	ctx->blocksz = SM4_BLOCK_SIZE;  	ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SM3;  	ctx->state_sz = SM3_DIGEST_SIZE;  	return 0; @@ -3473,6 +3559,7 @@ static int safexcel_rfc4106_gcm_cra_init(struct crypto_tfm *tfm)  	ret = safexcel_aead_gcm_cra_init(tfm);  	ctx->aead  = EIP197_AEAD_TYPE_IPSEC_ESP; +	ctx->aadskip = EIP197_AEAD_IPSEC_IV_SIZE;  	return ret;  } @@ -3607,6 +3694,7 @@ static int safexcel_rfc4309_ccm_cra_init(struct crypto_tfm *tfm)  	ret = safexcel_aead_ccm_cra_init(tfm);  	ctx->aead  = EIP197_AEAD_TYPE_IPSEC_ESP; +	ctx->aadskip = EIP197_AEAD_IPSEC_IV_SIZE;  	return ret;  } | 
