Hello Pascal, On Tue, Sep 10, 2019 at 04:38:13PM +0200, Pascal van Leeuwen wrote: > @@ -43,8 +44,8 @@ struct safexcel_cipher_ctx { > > u32 mode; > enum safexcel_cipher_alg alg; > - bool aead; > - int xcm; /* 0=authenc, 1=GCM, 2 reserved for CCM */ > + char aead; /* !=0=AEAD, 2=IPSec ESP AEAD */ > + char xcm; /* 0=authenc, 1=GCM, 2 reserved for CCM */ You could use an u8 instead. It also seems the aead comment has an issue, I'll let you check that. > - dev_err(priv->dev, "aead: unsupported hash algorithm\n"); > + dev_err(priv->dev, "aead: unsupported hash algorithmn"); You remove the '\' here. > @@ -440,6 +459,17 @@ static int safexcel_context_control(struct safexcel_cipher_ctx *ctx, > CONTEXT_CONTROL_DIGEST_XCM | > ctx->hash_alg | > CONTEXT_CONTROL_SIZE(ctrl_size); > + } else if (ctx->alg == SAFEXCEL_CHACHA20) { > + /* Chacha20-Poly1305 */ > + cdesc->control_data.control0 = > + CONTEXT_CONTROL_KEY_EN | > + CONTEXT_CONTROL_CRYPTO_ALG_CHACHA20 | > + (sreq->direction == SAFEXCEL_ENCRYPT ? > + CONTEXT_CONTROL_TYPE_ENCRYPT_HASH_OUT : > + CONTEXT_CONTROL_TYPE_HASH_DECRYPT_IN) | > + ctx->hash_alg | > + CONTEXT_CONTROL_SIZE(ctrl_size); I think you could use an if + |= for readability here. > +static int safexcel_aead_chachapoly_crypt(struct aead_request *req, > + enum safexcel_cipher_direction dir) > +{ > + struct safexcel_cipher_req *creq = aead_request_ctx(req); > + struct crypto_aead *aead = crypto_aead_reqtfm(req); > + struct crypto_tfm *tfm = crypto_aead_tfm(aead); > + struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm); > + struct aead_request *subreq = aead_request_ctx(req); > + u32 key[CHACHA_KEY_SIZE / sizeof(u32) + 1]; Shouldn't you explicitly memzero the key at the end of the function? Thanks! Antoine -- Antoine Ténart, Bootlin Embedded Linux and Kernel engineering https://bootlin.com