Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[sfrench/cifs-2.6.git] / crypto / aead.c
index c3c158ba988303114aa22baaeb0540ac00405914..fbf0ec93bc8e1ea343ea19ab276a2f112df9c336 100644 (file)
@@ -84,6 +84,42 @@ int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
 }
 EXPORT_SYMBOL_GPL(crypto_aead_setauthsize);
 
+int crypto_aead_encrypt(struct aead_request *req)
+{
+       struct crypto_aead *aead = crypto_aead_reqtfm(req);
+       struct crypto_alg *alg = aead->base.__crt_alg;
+       unsigned int cryptlen = req->cryptlen;
+       int ret;
+
+       crypto_stats_get(alg);
+       if (crypto_aead_get_flags(aead) & CRYPTO_TFM_NEED_KEY)
+               ret = -ENOKEY;
+       else
+               ret = crypto_aead_alg(aead)->encrypt(req);
+       crypto_stats_aead_encrypt(cryptlen, alg, ret);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(crypto_aead_encrypt);
+
+int crypto_aead_decrypt(struct aead_request *req)
+{
+       struct crypto_aead *aead = crypto_aead_reqtfm(req);
+       struct crypto_alg *alg = aead->base.__crt_alg;
+       unsigned int cryptlen = req->cryptlen;
+       int ret;
+
+       crypto_stats_get(alg);
+       if (crypto_aead_get_flags(aead) & CRYPTO_TFM_NEED_KEY)
+               ret = -ENOKEY;
+       else if (req->cryptlen < crypto_aead_authsize(aead))
+               ret = -EINVAL;
+       else
+               ret = crypto_aead_alg(aead)->decrypt(req);
+       crypto_stats_aead_decrypt(cryptlen, alg, ret);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(crypto_aead_decrypt);
+
 static void crypto_aead_exit_tfm(struct crypto_tfm *tfm)
 {
        struct crypto_aead *aead = __crypto_aead_cast(tfm);