#include <crypto/internal/geniv.h>
#include <crypto/scatterwalk.h>
#include <crypto/skcipher.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/string.h>
static int echainiv_encrypt(struct aead_request *req)
struct crypto_aead *geniv = crypto_aead_reqtfm(req);
struct aead_geniv_ctx *ctx = crypto_aead_ctx(geniv);
struct aead_request *subreq = aead_request_ctx(req);
unsigned int ivsize = crypto_aead_ivsize(geniv);
if (req->cryptlen < ivsize)
aead_request_set_tfm(subreq, ctx->child);
if (req->src != req->dst) {
SYNC_SKCIPHER_REQUEST_ON_STACK(nreq, ctx->sknull);
skcipher_request_set_sync_tfm(nreq, ctx->sknull);
skcipher_request_set_callback(nreq, req->base.flags,
skcipher_request_set_crypt(nreq, req->src, req->dst,
req->assoclen + req->cryptlen,
err = crypto_skcipher_encrypt(nreq);
aead_request_set_callback(subreq, req->base.flags,
req->base.complete, req->base.data);
aead_request_set_crypt(subreq, req->dst, req->dst,
aead_request_set_ad(subreq, req->assoclen);