#include <crypto/internal/geniv.h>
#include <crypto/internal/rng.h>
#include <crypto/scatterwalk.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/rtnetlink.h>
#include <linux/seq_file.h>
#include <linux/cryptouser.h>
#include <linux/compiler.h>
static int setkey_unaligned(struct crypto_aead *tfm, const u8 *key,
unsigned long alignmask = crypto_aead_alignmask(tfm);
u8 *buffer, *alignbuffer;
absize = keylen + alignmask;
buffer = kmalloc(absize, GFP_ATOMIC);
alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
memcpy(alignbuffer, key, keylen);
ret = crypto_aead_alg(tfm)->setkey(tfm, alignbuffer, keylen);
memset(alignbuffer, 0, keylen);
int crypto_aead_setkey(struct crypto_aead *tfm,
const u8 *key, unsigned int keylen)
unsigned long alignmask = crypto_aead_alignmask(tfm);
if ((unsigned long)key & alignmask)
err = setkey_unaligned(tfm, key, keylen);
err = crypto_aead_alg(tfm)->setkey(tfm, key, keylen);