diff options
Diffstat (limited to 'drivers/crypto/chelsio/chcr_ipsec.c')
| -rw-r--r-- | drivers/crypto/chelsio/chcr_ipsec.c | 19 | 
1 files changed, 6 insertions, 13 deletions
diff --git a/drivers/crypto/chelsio/chcr_ipsec.c b/drivers/crypto/chelsio/chcr_ipsec.c index f429aae72542..24355680f30a 100644 --- a/drivers/crypto/chelsio/chcr_ipsec.c +++ b/drivers/crypto/chelsio/chcr_ipsec.c @@ -132,11 +132,11 @@ static inline int chcr_ipsec_setauthsize(struct xfrm_state *x,  static inline int chcr_ipsec_setkey(struct xfrm_state *x,  				    struct ipsec_sa_entry *sa_entry)  { -	struct crypto_cipher *cipher;  	int keylen = (x->aead->alg_key_len + 7) / 8;  	unsigned char *key = x->aead->alg_key;  	int ck_size, key_ctx_size = 0;  	unsigned char ghash_h[AEAD_H_SIZE]; +	struct crypto_aes_ctx aes;  	int ret = 0;  	if (keylen > 3) { @@ -170,26 +170,19 @@ static inline int chcr_ipsec_setkey(struct xfrm_state *x,  	/* Calculate the H = CIPH(K, 0 repeated 16 times).  	 * It will go in key context  	 */ -	cipher = crypto_alloc_cipher("aes-generic", 0, 0); -	if (IS_ERR(cipher)) { -		sa_entry->enckey_len = 0; -		ret = -ENOMEM; -		goto out; -	} - -	ret = crypto_cipher_setkey(cipher, key, keylen); +	ret = aes_expandkey(&aes, key, keylen);  	if (ret) {  		sa_entry->enckey_len = 0; -		goto out1; +		goto out;  	}  	memset(ghash_h, 0, AEAD_H_SIZE); -	crypto_cipher_encrypt_one(cipher, ghash_h, ghash_h); +	aes_encrypt(&aes, ghash_h, ghash_h); +	memzero_explicit(&aes, sizeof(aes)); +  	memcpy(sa_entry->key + (DIV_ROUND_UP(sa_entry->enckey_len, 16) *  	       16), ghash_h, AEAD_H_SIZE);  	sa_entry->kctx_len = ((DIV_ROUND_UP(sa_entry->enckey_len, 16)) << 4) +  			      AEAD_H_SIZE; -out1: -	crypto_free_cipher(cipher);  out:  	return ret;  }  |