You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (46 commits) hwrng: via_rng - Fix memory scribbling on some CPUs crypto: padlock - Move padlock.h into include/crypto hwrng: via_rng - Fix asm constraints crypto: n2 - use __devexit not __exit in n2_unregister_algs crypto: mark crypto workqueues CPU_INTENSIVE crypto: mv_cesa - dont return PTR_ERR() of wrong pointer crypto: ripemd - Set module author and update email address crypto: omap-sham - backlog handling fix crypto: gf128mul - Remove experimental tag crypto: af_alg - fix af_alg memory_allocated data type crypto: aesni-intel - Fixed build with binutils 2.16 crypto: af_alg - Make sure sk_security is initialized on accept()ed sockets net: Add missing lockdep class names for af_alg include: Install linux/if_alg.h for user-space crypto API crypto: omap-aes - checkpatch --file warning fixes crypto: omap-aes - initialize aes module once per request crypto: omap-aes - unnecessary code removed crypto: omap-aes - error handling implementation improved crypto: omap-aes - redundant locking is removed crypto: omap-aes - DMA initialization fixes for OMAP off mode ...
This commit is contained in:
+1802
-30
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+28
-6
@@ -110,7 +110,6 @@ config CRYPTO_MANAGER_DISABLE_TESTS
|
||||
|
||||
config CRYPTO_GF128MUL
|
||||
tristate "GF(2^128) multiplication functions (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
Efficient table driven implementation of multiplications in the
|
||||
field GF(2^128). This is needed by some cypher modes. This
|
||||
@@ -539,8 +538,9 @@ config CRYPTO_AES_X86_64
|
||||
|
||||
config CRYPTO_AES_NI_INTEL
|
||||
tristate "AES cipher algorithms (AES-NI)"
|
||||
depends on (X86 || UML_X86) && 64BIT
|
||||
select CRYPTO_AES_X86_64
|
||||
depends on (X86 || UML_X86)
|
||||
select CRYPTO_AES_X86_64 if 64BIT
|
||||
select CRYPTO_AES_586 if !64BIT
|
||||
select CRYPTO_CRYPTD
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_FPU
|
||||
@@ -563,9 +563,10 @@ config CRYPTO_AES_NI_INTEL
|
||||
|
||||
See <http://csrc.nist.gov/encryption/aes/> for more information.
|
||||
|
||||
In addition to AES cipher algorithm support, the
|
||||
acceleration for some popular block cipher mode is supported
|
||||
too, including ECB, CBC, CTR, LRW, PCBC, XTS.
|
||||
In addition to AES cipher algorithm support, the acceleration
|
||||
for some popular block cipher mode is supported too, including
|
||||
ECB, CBC, LRW, PCBC, XTS. The 64 bit version has additional
|
||||
acceleration for CTR.
|
||||
|
||||
config CRYPTO_ANUBIS
|
||||
tristate "Anubis cipher algorithm"
|
||||
@@ -841,6 +842,27 @@ config CRYPTO_ANSI_CPRNG
|
||||
ANSI X9.31 A.2.4. Note that this option must be enabled if
|
||||
CRYPTO_FIPS is selected
|
||||
|
||||
config CRYPTO_USER_API
|
||||
tristate
|
||||
|
||||
config CRYPTO_USER_API_HASH
|
||||
tristate "User-space interface for hash algorithms"
|
||||
depends on NET
|
||||
select CRYPTO_HASH
|
||||
select CRYPTO_USER_API
|
||||
help
|
||||
This option enables the user-spaces interface for hash
|
||||
algorithms.
|
||||
|
||||
config CRYPTO_USER_API_SKCIPHER
|
||||
tristate "User-space interface for symmetric key cipher algorithms"
|
||||
depends on NET
|
||||
select CRYPTO_BLKCIPHER
|
||||
select CRYPTO_USER_API
|
||||
help
|
||||
This option enables the user-spaces interface for symmetric
|
||||
key cipher algorithms.
|
||||
|
||||
source "drivers/crypto/Kconfig"
|
||||
|
||||
endif # if CRYPTO
|
||||
|
||||
+10
-7
@@ -3,32 +3,32 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_CRYPTO) += crypto.o
|
||||
crypto-objs := api.o cipher.o compress.o
|
||||
crypto-y := api.o cipher.o compress.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_WORKQUEUE) += crypto_wq.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_FIPS) += fips.o
|
||||
|
||||
crypto_algapi-$(CONFIG_PROC_FS) += proc.o
|
||||
crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y)
|
||||
crypto_algapi-y := algapi.o scatterwalk.o $(crypto_algapi-y)
|
||||
obj-$(CONFIG_CRYPTO_ALGAPI2) += crypto_algapi.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_AEAD2) += aead.o
|
||||
|
||||
crypto_blkcipher-objs := ablkcipher.o
|
||||
crypto_blkcipher-objs += blkcipher.o
|
||||
crypto_blkcipher-y := ablkcipher.o
|
||||
crypto_blkcipher-y += blkcipher.o
|
||||
obj-$(CONFIG_CRYPTO_BLKCIPHER2) += crypto_blkcipher.o
|
||||
obj-$(CONFIG_CRYPTO_BLKCIPHER2) += chainiv.o
|
||||
obj-$(CONFIG_CRYPTO_BLKCIPHER2) += eseqiv.o
|
||||
obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o
|
||||
|
||||
crypto_hash-objs += ahash.o
|
||||
crypto_hash-objs += shash.o
|
||||
crypto_hash-y += ahash.o
|
||||
crypto_hash-y += shash.o
|
||||
obj-$(CONFIG_CRYPTO_HASH2) += crypto_hash.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_PCOMP2) += pcompress.o
|
||||
|
||||
cryptomgr-objs := algboss.o testmgr.o
|
||||
cryptomgr-y := algboss.o testmgr.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_MANAGER2) += cryptomgr.o
|
||||
obj-$(CONFIG_CRYPTO_HMAC) += hmac.o
|
||||
@@ -85,6 +85,9 @@ obj-$(CONFIG_CRYPTO_RNG2) += krng.o
|
||||
obj-$(CONFIG_CRYPTO_ANSI_CPRNG) += ansi_cprng.o
|
||||
obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
|
||||
obj-$(CONFIG_CRYPTO_GHASH) += ghash-generic.o
|
||||
obj-$(CONFIG_CRYPTO_USER_API) += af_alg.o
|
||||
obj-$(CONFIG_CRYPTO_USER_API_HASH) += algif_hash.o
|
||||
obj-$(CONFIG_CRYPTO_USER_API_SKCIPHER) += algif_skcipher.o
|
||||
|
||||
#
|
||||
# generic algorithms and the async_tx api
|
||||
|
||||
+483
@@ -0,0 +1,483 @@
|
||||
/*
|
||||
* af_alg: User-space algorithm interface
|
||||
*
|
||||
* This file provides the user-space API for algorithms.
|
||||
*
|
||||
* Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <crypto/if_alg.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/rwsem.h>
|
||||
|
||||
struct alg_type_list {
|
||||
const struct af_alg_type *type;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
static atomic_long_t alg_memory_allocated;
|
||||
|
||||
static struct proto alg_proto = {
|
||||
.name = "ALG",
|
||||
.owner = THIS_MODULE,
|
||||
.memory_allocated = &alg_memory_allocated,
|
||||
.obj_size = sizeof(struct alg_sock),
|
||||
};
|
||||
|
||||
static LIST_HEAD(alg_types);
|
||||
static DECLARE_RWSEM(alg_types_sem);
|
||||
|
||||
static const struct af_alg_type *alg_get_type(const char *name)
|
||||
{
|
||||
const struct af_alg_type *type = ERR_PTR(-ENOENT);
|
||||
struct alg_type_list *node;
|
||||
|
||||
down_read(&alg_types_sem);
|
||||
list_for_each_entry(node, &alg_types, list) {
|
||||
if (strcmp(node->type->name, name))
|
||||
continue;
|
||||
|
||||
if (try_module_get(node->type->owner))
|
||||
type = node->type;
|
||||
break;
|
||||
}
|
||||
up_read(&alg_types_sem);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
int af_alg_register_type(const struct af_alg_type *type)
|
||||
{
|
||||
struct alg_type_list *node;
|
||||
int err = -EEXIST;
|
||||
|
||||
down_write(&alg_types_sem);
|
||||
list_for_each_entry(node, &alg_types, list) {
|
||||
if (!strcmp(node->type->name, type->name))
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
node = kmalloc(sizeof(*node), GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!node)
|
||||
goto unlock;
|
||||
|
||||
type->ops->owner = THIS_MODULE;
|
||||
node->type = type;
|
||||
list_add(&node->list, &alg_types);
|
||||
err = 0;
|
||||
|
||||
unlock:
|
||||
up_write(&alg_types_sem);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_register_type);
|
||||
|
||||
int af_alg_unregister_type(const struct af_alg_type *type)
|
||||
{
|
||||
struct alg_type_list *node;
|
||||
int err = -ENOENT;
|
||||
|
||||
down_write(&alg_types_sem);
|
||||
list_for_each_entry(node, &alg_types, list) {
|
||||
if (strcmp(node->type->name, type->name))
|
||||
continue;
|
||||
|
||||
list_del(&node->list);
|
||||
kfree(node);
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
up_write(&alg_types_sem);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_unregister_type);
|
||||
|
||||
static void alg_do_release(const struct af_alg_type *type, void *private)
|
||||
{
|
||||
if (!type)
|
||||
return;
|
||||
|
||||
type->release(private);
|
||||
module_put(type->owner);
|
||||
}
|
||||
|
||||
int af_alg_release(struct socket *sock)
|
||||
{
|
||||
if (sock->sk)
|
||||
sock_put(sock->sk);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_release);
|
||||
|
||||
static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct sockaddr_alg *sa = (void *)uaddr;
|
||||
const struct af_alg_type *type;
|
||||
void *private;
|
||||
|
||||
if (sock->state == SS_CONNECTED)
|
||||
return -EINVAL;
|
||||
|
||||
if (addr_len != sizeof(*sa))
|
||||
return -EINVAL;
|
||||
|
||||
sa->salg_type[sizeof(sa->salg_type) - 1] = 0;
|
||||
sa->salg_name[sizeof(sa->salg_name) - 1] = 0;
|
||||
|
||||
type = alg_get_type(sa->salg_type);
|
||||
if (IS_ERR(type) && PTR_ERR(type) == -ENOENT) {
|
||||
request_module("algif-%s", sa->salg_type);
|
||||
type = alg_get_type(sa->salg_type);
|
||||
}
|
||||
|
||||
if (IS_ERR(type))
|
||||
return PTR_ERR(type);
|
||||
|
||||
private = type->bind(sa->salg_name, sa->salg_feat, sa->salg_mask);
|
||||
if (IS_ERR(private)) {
|
||||
module_put(type->owner);
|
||||
return PTR_ERR(private);
|
||||
}
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
swap(ask->type, type);
|
||||
swap(ask->private, private);
|
||||
|
||||
release_sock(sk);
|
||||
|
||||
alg_do_release(type, private);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alg_setkey(struct sock *sk, char __user *ukey,
|
||||
unsigned int keylen)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
const struct af_alg_type *type = ask->type;
|
||||
u8 *key;
|
||||
int err;
|
||||
|
||||
key = sock_kmalloc(sk, keylen, GFP_KERNEL);
|
||||
if (!key)
|
||||
return -ENOMEM;
|
||||
|
||||
err = -EFAULT;
|
||||
if (copy_from_user(key, ukey, keylen))
|
||||
goto out;
|
||||
|
||||
err = type->setkey(ask->private, key, keylen);
|
||||
|
||||
out:
|
||||
sock_kfree_s(sk, key, keylen);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int alg_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
const struct af_alg_type *type;
|
||||
int err = -ENOPROTOOPT;
|
||||
|
||||
lock_sock(sk);
|
||||
type = ask->type;
|
||||
|
||||
if (level != SOL_ALG || !type)
|
||||
goto unlock;
|
||||
|
||||
switch (optname) {
|
||||
case ALG_SET_KEY:
|
||||
if (sock->state == SS_CONNECTED)
|
||||
goto unlock;
|
||||
if (!type->setkey)
|
||||
goto unlock;
|
||||
|
||||
err = alg_setkey(sk, optval, optlen);
|
||||
}
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int af_alg_accept(struct sock *sk, struct socket *newsock)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
const struct af_alg_type *type;
|
||||
struct sock *sk2;
|
||||
int err;
|
||||
|
||||
lock_sock(sk);
|
||||
type = ask->type;
|
||||
|
||||
err = -EINVAL;
|
||||
if (!type)
|
||||
goto unlock;
|
||||
|
||||
sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto);
|
||||
err = -ENOMEM;
|
||||
if (!sk2)
|
||||
goto unlock;
|
||||
|
||||
sock_init_data(newsock, sk2);
|
||||
sock_graft(sk2, newsock);
|
||||
|
||||
err = type->accept(ask->private, sk2);
|
||||
if (err) {
|
||||
sk_free(sk2);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
sk2->sk_family = PF_ALG;
|
||||
|
||||
sock_hold(sk);
|
||||
alg_sk(sk2)->parent = sk;
|
||||
alg_sk(sk2)->type = type;
|
||||
|
||||
newsock->ops = type->ops;
|
||||
newsock->state = SS_CONNECTED;
|
||||
|
||||
err = 0;
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_accept);
|
||||
|
||||
static int alg_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
{
|
||||
return af_alg_accept(sock->sk, newsock);
|
||||
}
|
||||
|
||||
static const struct proto_ops alg_proto_ops = {
|
||||
.family = PF_ALG,
|
||||
.owner = THIS_MODULE,
|
||||
|
||||
.connect = sock_no_connect,
|
||||
.socketpair = sock_no_socketpair,
|
||||
.getname = sock_no_getname,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.getsockopt = sock_no_getsockopt,
|
||||
.mmap = sock_no_mmap,
|
||||
.sendpage = sock_no_sendpage,
|
||||
.sendmsg = sock_no_sendmsg,
|
||||
.recvmsg = sock_no_recvmsg,
|
||||
.poll = sock_no_poll,
|
||||
|
||||
.bind = alg_bind,
|
||||
.release = af_alg_release,
|
||||
.setsockopt = alg_setsockopt,
|
||||
.accept = alg_accept,
|
||||
};
|
||||
|
||||
static void alg_sock_destruct(struct sock *sk)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
alg_do_release(ask->type, ask->private);
|
||||
}
|
||||
|
||||
static int alg_create(struct net *net, struct socket *sock, int protocol,
|
||||
int kern)
|
||||
{
|
||||
struct sock *sk;
|
||||
int err;
|
||||
|
||||
if (sock->type != SOCK_SEQPACKET)
|
||||
return -ESOCKTNOSUPPORT;
|
||||
if (protocol != 0)
|
||||
return -EPROTONOSUPPORT;
|
||||
|
||||
err = -ENOMEM;
|
||||
sk = sk_alloc(net, PF_ALG, GFP_KERNEL, &alg_proto);
|
||||
if (!sk)
|
||||
goto out;
|
||||
|
||||
sock->ops = &alg_proto_ops;
|
||||
sock_init_data(sock, sk);
|
||||
|
||||
sk->sk_family = PF_ALG;
|
||||
sk->sk_destruct = alg_sock_destruct;
|
||||
|
||||
return 0;
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct net_proto_family alg_family = {
|
||||
.family = PF_ALG,
|
||||
.create = alg_create,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
int af_alg_make_sg(struct af_alg_sgl *sgl, void __user *addr, int len,
|
||||
int write)
|
||||
{
|
||||
unsigned long from = (unsigned long)addr;
|
||||
unsigned long npages;
|
||||
unsigned off;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = -EFAULT;
|
||||
if (!access_ok(write ? VERIFY_READ : VERIFY_WRITE, addr, len))
|
||||
goto out;
|
||||
|
||||
off = from & ~PAGE_MASK;
|
||||
npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
if (npages > ALG_MAX_PAGES)
|
||||
npages = ALG_MAX_PAGES;
|
||||
|
||||
err = get_user_pages_fast(from, npages, write, sgl->pages);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
npages = err;
|
||||
err = -EINVAL;
|
||||
if (WARN_ON(npages == 0))
|
||||
goto out;
|
||||
|
||||
err = 0;
|
||||
|
||||
sg_init_table(sgl->sg, npages);
|
||||
|
||||
for (i = 0; i < npages; i++) {
|
||||
int plen = min_t(int, len, PAGE_SIZE - off);
|
||||
|
||||
sg_set_page(sgl->sg + i, sgl->pages[i], plen, off);
|
||||
|
||||
off = 0;
|
||||
len -= plen;
|
||||
err += plen;
|
||||
}
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_make_sg);
|
||||
|
||||
void af_alg_free_sg(struct af_alg_sgl *sgl)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
put_page(sgl->pages[i]);
|
||||
} while (!sg_is_last(sgl->sg + (i++)));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_free_sg);
|
||||
|
||||
int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
|
||||
{
|
||||
struct cmsghdr *cmsg;
|
||||
|
||||
for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
|
||||
if (!CMSG_OK(msg, cmsg))
|
||||
return -EINVAL;
|
||||
if (cmsg->cmsg_level != SOL_ALG)
|
||||
continue;
|
||||
|
||||
switch(cmsg->cmsg_type) {
|
||||
case ALG_SET_IV:
|
||||
if (cmsg->cmsg_len < CMSG_LEN(sizeof(*con->iv)))
|
||||
return -EINVAL;
|
||||
con->iv = (void *)CMSG_DATA(cmsg);
|
||||
if (cmsg->cmsg_len < CMSG_LEN(con->iv->ivlen +
|
||||
sizeof(*con->iv)))
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
case ALG_SET_OP:
|
||||
if (cmsg->cmsg_len < CMSG_LEN(sizeof(u32)))
|
||||
return -EINVAL;
|
||||
con->op = *(u32 *)CMSG_DATA(cmsg);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_cmsg_send);
|
||||
|
||||
int af_alg_wait_for_completion(int err, struct af_alg_completion *completion)
|
||||
{
|
||||
switch (err) {
|
||||
case -EINPROGRESS:
|
||||
case -EBUSY:
|
||||
wait_for_completion(&completion->completion);
|
||||
INIT_COMPLETION(completion->completion);
|
||||
err = completion->err;
|
||||
break;
|
||||
};
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_wait_for_completion);
|
||||
|
||||
void af_alg_complete(struct crypto_async_request *req, int err)
|
||||
{
|
||||
struct af_alg_completion *completion = req->data;
|
||||
|
||||
completion->err = err;
|
||||
complete(&completion->completion);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_complete);
|
||||
|
||||
static int __init af_alg_init(void)
|
||||
{
|
||||
int err = proto_register(&alg_proto, 0);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = sock_register(&alg_family);
|
||||
if (err != 0)
|
||||
goto out_unregister_proto;
|
||||
|
||||
out:
|
||||
return err;
|
||||
|
||||
out_unregister_proto:
|
||||
proto_unregister(&alg_proto);
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void __exit af_alg_exit(void)
|
||||
{
|
||||
sock_unregister(PF_ALG);
|
||||
proto_unregister(&alg_proto);
|
||||
}
|
||||
|
||||
module_init(af_alg_init);
|
||||
module_exit(af_alg_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS_NETPROTO(AF_ALG);
|
||||
@@ -0,0 +1,319 @@
|
||||
/*
|
||||
* algif_hash: User-space interface for hash algorithms
|
||||
*
|
||||
* This file provides the user-space API for hash algorithms.
|
||||
*
|
||||
* Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <crypto/hash.h>
|
||||
#include <crypto/if_alg.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/net.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
struct hash_ctx {
|
||||
struct af_alg_sgl sgl;
|
||||
|
||||
u8 *result;
|
||||
|
||||
struct af_alg_completion completion;
|
||||
|
||||
unsigned int len;
|
||||
bool more;
|
||||
|
||||
struct ahash_request req;
|
||||
};
|
||||
|
||||
static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
|
||||
struct msghdr *msg, size_t ignored)
|
||||
{
|
||||
int limit = ALG_MAX_PAGES * PAGE_SIZE;
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
unsigned long iovlen;
|
||||
struct iovec *iov;
|
||||
long copied = 0;
|
||||
int err;
|
||||
|
||||
if (limit > sk->sk_sndbuf)
|
||||
limit = sk->sk_sndbuf;
|
||||
|
||||
lock_sock(sk);
|
||||
if (!ctx->more) {
|
||||
err = crypto_ahash_init(&ctx->req);
|
||||
if (err)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
ctx->more = 0;
|
||||
|
||||
for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0;
|
||||
iovlen--, iov++) {
|
||||
unsigned long seglen = iov->iov_len;
|
||||
char __user *from = iov->iov_base;
|
||||
|
||||
while (seglen) {
|
||||
int len = min_t(unsigned long, seglen, limit);
|
||||
int newlen;
|
||||
|
||||
newlen = af_alg_make_sg(&ctx->sgl, from, len, 0);
|
||||
if (newlen < 0)
|
||||
goto unlock;
|
||||
|
||||
ahash_request_set_crypt(&ctx->req, ctx->sgl.sg, NULL,
|
||||
newlen);
|
||||
|
||||
err = af_alg_wait_for_completion(
|
||||
crypto_ahash_update(&ctx->req),
|
||||
&ctx->completion);
|
||||
|
||||
af_alg_free_sg(&ctx->sgl);
|
||||
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
seglen -= newlen;
|
||||
from += newlen;
|
||||
copied += newlen;
|
||||
}
|
||||
}
|
||||
|
||||
err = 0;
|
||||
|
||||
ctx->more = msg->msg_flags & MSG_MORE;
|
||||
if (!ctx->more) {
|
||||
ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0);
|
||||
err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req),
|
||||
&ctx->completion);
|
||||
}
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
|
||||
return err ?: copied;
|
||||
}
|
||||
|
||||
static ssize_t hash_sendpage(struct socket *sock, struct page *page,
|
||||
int offset, size_t size, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
int err;
|
||||
|
||||
lock_sock(sk);
|
||||
sg_init_table(ctx->sgl.sg, 1);
|
||||
sg_set_page(ctx->sgl.sg, page, size, offset);
|
||||
|
||||
ahash_request_set_crypt(&ctx->req, ctx->sgl.sg, ctx->result, size);
|
||||
|
||||
if (!(flags & MSG_MORE)) {
|
||||
if (ctx->more)
|
||||
err = crypto_ahash_finup(&ctx->req);
|
||||
else
|
||||
err = crypto_ahash_digest(&ctx->req);
|
||||
} else {
|
||||
if (!ctx->more) {
|
||||
err = crypto_ahash_init(&ctx->req);
|
||||
if (err)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
err = crypto_ahash_update(&ctx->req);
|
||||
}
|
||||
|
||||
err = af_alg_wait_for_completion(err, &ctx->completion);
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
ctx->more = flags & MSG_MORE;
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
|
||||
return err ?: size;
|
||||
}
|
||||
|
||||
static int hash_recvmsg(struct kiocb *unused, struct socket *sock,
|
||||
struct msghdr *msg, size_t len, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
unsigned ds = crypto_ahash_digestsize(crypto_ahash_reqtfm(&ctx->req));
|
||||
int err;
|
||||
|
||||
if (len > ds)
|
||||
len = ds;
|
||||
else if (len < ds)
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
|
||||
lock_sock(sk);
|
||||
if (ctx->more) {
|
||||
ctx->more = 0;
|
||||
ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0);
|
||||
err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req),
|
||||
&ctx->completion);
|
||||
if (err)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
err = memcpy_toiovec(msg->msg_iov, ctx->result, len);
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
|
||||
return err ?: len;
|
||||
}
|
||||
|
||||
static int hash_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
struct ahash_request *req = &ctx->req;
|
||||
char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req))];
|
||||
struct sock *sk2;
|
||||
struct alg_sock *ask2;
|
||||
struct hash_ctx *ctx2;
|
||||
int err;
|
||||
|
||||
err = crypto_ahash_export(req, state);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = af_alg_accept(ask->parent, newsock);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
sk2 = newsock->sk;
|
||||
ask2 = alg_sk(sk2);
|
||||
ctx2 = ask2->private;
|
||||
ctx2->more = 1;
|
||||
|
||||
err = crypto_ahash_import(&ctx2->req, state);
|
||||
if (err) {
|
||||
sock_orphan(sk2);
|
||||
sock_put(sk2);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct proto_ops algif_hash_ops = {
|
||||
.family = PF_ALG,
|
||||
|
||||
.connect = sock_no_connect,
|
||||
.socketpair = sock_no_socketpair,
|
||||
.getname = sock_no_getname,
|
||||
.ioctl = sock_no_ioctl,
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = sock_no_shutdown,
|
||||
.getsockopt = sock_no_getsockopt,
|
||||
.mmap = sock_no_mmap,
|
||||
.bind = sock_no_bind,
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
.poll = sock_no_poll,
|
||||
|
||||
.release = af_alg_release,
|
||||
.sendmsg = hash_sendmsg,
|
||||
.sendpage = hash_sendpage,
|
||||
.recvmsg = hash_recvmsg,
|
||||
.accept = hash_accept,
|
||||
};
|
||||
|
||||
static void *hash_bind(const char *name, u32 type, u32 mask)
|
||||
{
|
||||
return crypto_alloc_ahash(name, type, mask);
|
||||
}
|
||||
|
||||
static void hash_release(void *private)
|
||||
{
|
||||
crypto_free_ahash(private);
|
||||
}
|
||||
|
||||
static int hash_setkey(void *private, const u8 *key, unsigned int keylen)
|
||||
{
|
||||
return crypto_ahash_setkey(private, key, keylen);
|
||||
}
|
||||
|
||||
static void hash_sock_destruct(struct sock *sk)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
|
||||
sock_kfree_s(sk, ctx->result,
|
||||
crypto_ahash_digestsize(crypto_ahash_reqtfm(&ctx->req)));
|
||||
sock_kfree_s(sk, ctx, ctx->len);
|
||||
af_alg_release_parent(sk);
|
||||
}
|
||||
|
||||
static int hash_accept_parent(void *private, struct sock *sk)
|
||||
{
|
||||
struct hash_ctx *ctx;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
unsigned len = sizeof(*ctx) + crypto_ahash_reqsize(private);
|
||||
unsigned ds = crypto_ahash_digestsize(private);
|
||||
|
||||
ctx = sock_kmalloc(sk, len, GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
ctx->result = sock_kmalloc(sk, ds, GFP_KERNEL);
|
||||
if (!ctx->result) {
|
||||
sock_kfree_s(sk, ctx, len);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(ctx->result, 0, ds);
|
||||
|
||||
ctx->len = len;
|
||||
ctx->more = 0;
|
||||
af_alg_init_completion(&ctx->completion);
|
||||
|
||||
ask->private = ctx;
|
||||
|
||||
ahash_request_set_tfm(&ctx->req, private);
|
||||
ahash_request_set_callback(&ctx->req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||
af_alg_complete, &ctx->completion);
|
||||
|
||||
sk->sk_destruct = hash_sock_destruct;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct af_alg_type algif_type_hash = {
|
||||
.bind = hash_bind,
|
||||
.release = hash_release,
|
||||
.setkey = hash_setkey,
|
||||
.accept = hash_accept_parent,
|
||||
.ops = &algif_hash_ops,
|
||||
.name = "hash",
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
static int __init algif_hash_init(void)
|
||||
{
|
||||
return af_alg_register_type(&algif_type_hash);
|
||||
}
|
||||
|
||||
static void __exit algif_hash_exit(void)
|
||||
{
|
||||
int err = af_alg_unregister_type(&algif_type_hash);
|
||||
BUG_ON(err);
|
||||
}
|
||||
|
||||
module_init(algif_hash_init);
|
||||
module_exit(algif_hash_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
File diff suppressed because it is too large
Load Diff
+4
-18
@@ -107,20 +107,6 @@ badkey:
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void authenc_chain(struct scatterlist *head, struct scatterlist *sg,
|
||||
int chain)
|
||||
{
|
||||
if (chain) {
|
||||
head->length += sg->length;
|
||||
sg = scatterwalk_sg_next(sg);
|
||||
}
|
||||
|
||||
if (sg)
|
||||
scatterwalk_sg_chain(head, 2, sg);
|
||||
else
|
||||
sg_mark_end(head);
|
||||
}
|
||||
|
||||
static void authenc_geniv_ahash_update_done(struct crypto_async_request *areq,
|
||||
int err)
|
||||
{
|
||||
@@ -345,7 +331,7 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
|
||||
if (ivsize) {
|
||||
sg_init_table(cipher, 2);
|
||||
sg_set_buf(cipher, iv, ivsize);
|
||||
authenc_chain(cipher, dst, vdst == iv + ivsize);
|
||||
scatterwalk_crypto_chain(cipher, dst, vdst == iv + ivsize, 2);
|
||||
dst = cipher;
|
||||
cryptlen += ivsize;
|
||||
}
|
||||
@@ -354,7 +340,7 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
|
||||
authenc_ahash_fn = crypto_authenc_ahash;
|
||||
sg_init_table(asg, 2);
|
||||
sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset);
|
||||
authenc_chain(asg, dst, 0);
|
||||
scatterwalk_crypto_chain(asg, dst, 0, 2);
|
||||
dst = asg;
|
||||
cryptlen += req->assoclen;
|
||||
}
|
||||
@@ -499,7 +485,7 @@ static int crypto_authenc_iverify(struct aead_request *req, u8 *iv,
|
||||
if (ivsize) {
|
||||
sg_init_table(cipher, 2);
|
||||
sg_set_buf(cipher, iv, ivsize);
|
||||
authenc_chain(cipher, src, vsrc == iv + ivsize);
|
||||
scatterwalk_crypto_chain(cipher, src, vsrc == iv + ivsize, 2);
|
||||
src = cipher;
|
||||
cryptlen += ivsize;
|
||||
}
|
||||
@@ -508,7 +494,7 @@ static int crypto_authenc_iverify(struct aead_request *req, u8 *iv,
|
||||
authenc_ahash_fn = crypto_authenc_ahash;
|
||||
sg_init_table(asg, 2);
|
||||
sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset);
|
||||
authenc_chain(asg, src, 0);
|
||||
scatterwalk_crypto_chain(asg, src, 0, 2);
|
||||
src = asg;
|
||||
cryptlen += req->assoclen;
|
||||
}
|
||||
|
||||
+13
-39
@@ -604,7 +604,6 @@ static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
|
||||
* Rounds 3, 6, 9, 12, and 15 use f function Type 3.
|
||||
*/
|
||||
|
||||
if (!(c->rr)) {
|
||||
t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
|
||||
@@ -617,23 +616,11 @@ static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
|
||||
t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
if (!(c->rr)) {
|
||||
t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
|
||||
} else {
|
||||
t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
}
|
||||
|
||||
/* c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16 and
|
||||
@@ -663,32 +650,19 @@ static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
|
||||
t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
|
||||
} else {
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
|
||||
}
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
|
||||
|
||||
dst[0] = cpu_to_be32(r);
|
||||
dst[1] = cpu_to_be32(l);
|
||||
|
||||
+2
-1
@@ -20,7 +20,8 @@ EXPORT_SYMBOL_GPL(kcrypto_wq);
|
||||
|
||||
static int __init crypto_wq_init(void)
|
||||
{
|
||||
kcrypto_wq = create_workqueue("crypto");
|
||||
kcrypto_wq = alloc_workqueue("crypto",
|
||||
WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE, 1);
|
||||
if (unlikely(!kcrypto_wq))
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
||||
+1
-2
@@ -48,12 +48,11 @@ static int deflate_comp_init(struct deflate_ctx *ctx)
|
||||
int ret = 0;
|
||||
struct z_stream_s *stream = &ctx->comp_stream;
|
||||
|
||||
stream->workspace = vmalloc(zlib_deflate_workspacesize());
|
||||
stream->workspace = vzalloc(zlib_deflate_workspacesize());
|
||||
if (!stream->workspace) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memset(stream->workspace, 0, zlib_deflate_workspacesize());
|
||||
ret = zlib_deflateInit2(stream, DEFLATE_DEF_LEVEL, Z_DEFLATED,
|
||||
-DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL,
|
||||
Z_DEFAULT_STRATEGY);
|
||||
|
||||
+2
-16
@@ -62,20 +62,6 @@ out:
|
||||
skcipher_givcrypt_complete(req, err);
|
||||
}
|
||||
|
||||
static void eseqiv_chain(struct scatterlist *head, struct scatterlist *sg,
|
||||
int chain)
|
||||
{
|
||||
if (chain) {
|
||||
head->length += sg->length;
|
||||
sg = scatterwalk_sg_next(sg);
|
||||
}
|
||||
|
||||
if (sg)
|
||||
scatterwalk_sg_chain(head, 2, sg);
|
||||
else
|
||||
sg_mark_end(head);
|
||||
}
|
||||
|
||||
static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
||||
{
|
||||
struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
|
||||
@@ -124,13 +110,13 @@ static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
||||
|
||||
sg_init_table(reqctx->src, 2);
|
||||
sg_set_buf(reqctx->src, giv, ivsize);
|
||||
eseqiv_chain(reqctx->src, osrc, vsrc == giv + ivsize);
|
||||
scatterwalk_crypto_chain(reqctx->src, osrc, vsrc == giv + ivsize, 2);
|
||||
|
||||
dst = reqctx->src;
|
||||
if (osrc != odst) {
|
||||
sg_init_table(reqctx->dst, 2);
|
||||
sg_set_buf(reqctx->dst, giv, ivsize);
|
||||
eseqiv_chain(reqctx->dst, odst, vdst == giv + ivsize);
|
||||
scatterwalk_crypto_chain(reqctx->dst, odst, vdst == giv + ivsize, 2);
|
||||
|
||||
dst = reqctx->dst;
|
||||
}
|
||||
|
||||
+2
-17
@@ -1102,21 +1102,6 @@ static int crypto_rfc4543_setauthsize(struct crypto_aead *parent,
|
||||
return crypto_aead_setauthsize(ctx->child, authsize);
|
||||
}
|
||||
|
||||
/* this is the same as crypto_authenc_chain */
|
||||
static void crypto_rfc4543_chain(struct scatterlist *head,
|
||||
struct scatterlist *sg, int chain)
|
||||
{
|
||||
if (chain) {
|
||||
head->length += sg->length;
|
||||
sg = scatterwalk_sg_next(sg);
|
||||
}
|
||||
|
||||
if (sg)
|
||||
scatterwalk_sg_chain(head, 2, sg);
|
||||
else
|
||||
sg_mark_end(head);
|
||||
}
|
||||
|
||||
static struct aead_request *crypto_rfc4543_crypt(struct aead_request *req,
|
||||
int enc)
|
||||
{
|
||||
@@ -1154,13 +1139,13 @@ static struct aead_request *crypto_rfc4543_crypt(struct aead_request *req,
|
||||
|
||||
sg_init_table(payload, 2);
|
||||
sg_set_buf(payload, req->iv, 8);
|
||||
crypto_rfc4543_chain(payload, dst, vdst == req->iv + 8);
|
||||
scatterwalk_crypto_chain(payload, dst, vdst == req->iv + 8, 2);
|
||||
assoclen += 8 + req->cryptlen - (enc ? 0 : authsize);
|
||||
|
||||
sg_init_table(assoc, 2);
|
||||
sg_set_page(assoc, sg_page(req->assoc), req->assoc->length,
|
||||
req->assoc->offset);
|
||||
crypto_rfc4543_chain(assoc, payload, 0);
|
||||
scatterwalk_crypto_chain(assoc, payload, 0, 2);
|
||||
|
||||
aead_request_set_tfm(subreq, ctx->child);
|
||||
aead_request_set_callback(subreq, req->base.flags, req->base.complete,
|
||||
|
||||
+2
-1
@@ -455,7 +455,8 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt,
|
||||
|
||||
get_online_cpus();
|
||||
|
||||
pcrypt->wq = create_workqueue(name);
|
||||
pcrypt->wq = alloc_workqueue(name,
|
||||
WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE, 1);
|
||||
if (!pcrypt->wq)
|
||||
goto err;
|
||||
|
||||
|
||||
+2
-1
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
|
||||
*
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <ken@codelabs.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
@@ -325,4 +325,5 @@ module_init(rmd128_mod_init);
|
||||
module_exit(rmd128_mod_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
|
||||
MODULE_DESCRIPTION("RIPEMD-128 Message Digest");
|
||||
|
||||
+2
-1
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
|
||||
*
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <ken@codelabs.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
@@ -369,4 +369,5 @@ module_init(rmd160_mod_init);
|
||||
module_exit(rmd160_mod_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
|
||||
MODULE_DESCRIPTION("RIPEMD-160 Message Digest");
|
||||
|
||||
+2
-1
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
|
||||
*
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <ken@codelabs.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
@@ -344,4 +344,5 @@ module_init(rmd256_mod_init);
|
||||
module_exit(rmd256_mod_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
|
||||
MODULE_DESCRIPTION("RIPEMD-256 Message Digest");
|
||||
|
||||
+2
-1
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
|
||||
*
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
|
||||
* Copyright (c) 2008 Adrian-Ken Rueegsegger <ken@codelabs.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
@@ -393,4 +393,5 @@ module_init(rmd320_mod_init);
|
||||
module_exit(rmd320_mod_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
|
||||
MODULE_DESCRIPTION("RIPEMD-320 Message Digest");
|
||||
|
||||
+7
-1
@@ -310,7 +310,13 @@ static int shash_async_export(struct ahash_request *req, void *out)
|
||||
|
||||
static int shash_async_import(struct ahash_request *req, const void *in)
|
||||
{
|
||||
return crypto_shash_import(ahash_request_ctx(req), in);
|
||||
struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
|
||||
struct shash_desc *desc = ahash_request_ctx(req);
|
||||
|
||||
desc->tfm = *ctx;
|
||||
desc->flags = req->base.flags;
|
||||
|
||||
return crypto_shash_import(desc, in);
|
||||
}
|
||||
|
||||
static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm)
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
* Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
|
||||
* Copyright (c) 2007 Nokia Siemens Networks
|
||||
*
|
||||
* Updated RFC4106 AES-GCM testing.
|
||||
* Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
|
||||
* Adrian Hoban <adrian.hoban@intel.com>
|
||||
* Gabriele Paoloni <gabriele.paoloni@intel.com>
|
||||
* Tadeusz Struk (tadeusz.struk@intel.com)
|
||||
* Copyright (c) 2010, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
@@ -980,6 +987,10 @@ static int do_test(int m)
|
||||
ret += tcrypt_test("ansi_cprng");
|
||||
break;
|
||||
|
||||
case 151:
|
||||
ret += tcrypt_test("rfc4106(gcm(aes))");
|
||||
break;
|
||||
|
||||
case 200:
|
||||
test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
|
||||
speed_template_16_24_32);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user