summaryrefslogtreecommitdiffstats
path: root/cryptodev_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'cryptodev_main.c')
-rw-r--r--cryptodev_main.c113
1 files changed, 70 insertions, 43 deletions
diff --git a/cryptodev_main.c b/cryptodev_main.c
index dba3d63..3293cbb 100644
--- a/cryptodev_main.c
+++ b/cryptodev_main.c
@@ -310,27 +310,33 @@ static int do_data_sendmsg(struct kiocb *iocb, struct alg_sock *ask,
// FIXME: locking
- // FIXME: make generic
DUMP_ASK(ask);
- BUG_ON(index != 0);
- BUG_ON(ask->hash.init == 0);
- // FIXME: limit size, or use socket buffer, or refer to userspace
- // pages directly
- buf = kmalloc(total_len, GFP_KERNEL);
- if (!buf)
- return -ENOMEM;
+ switch (ask->op_type) {
+ case OP_HASH:
+ BUG_ON(index != 0);
+ BUG_ON(ask->hash.init == 0);
- res = memcpy_fromiovec(buf, m->msg_iov, total_len);
- if (res != 0)
- goto err;
+ // FIXME: limit size, or use socket buffer, or refer to
+ // userspace pages directly
+ buf = kmalloc(total_len, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
- // FIXME
- res = _cryptodev_hash_update(&ask->hash, buf, total_len);
- if (res < 0)
- goto err;
+ res = memcpy_fromiovec(buf, m->msg_iov, total_len);
+ if (res != 0)
+ goto err;
- res = total_len;
+ res = _cryptodev_hash_update(&ask->hash, buf, total_len);
+ if (res < 0)
+ goto err;
+
+ res = total_len;
+ break;
+
+ default:
+ BUG();
+ }
err:
kfree(buf);
@@ -352,34 +358,40 @@ static int do_data_recvmsg(struct kiocb *iocb, struct alg_sock *ask,
unsigned index, struct msghdr *m, size_t total_len,
int flags)
{
- char digest[NCR_HASH_MAX_OUTPUT_SIZE];
- int res;
-
// FIXME: locking
- // FIXME: make generic
DUMP_ASK(ask);
- BUG_ON(index != 0);
- BUG_ON(ask->hash.init == 0);
- if (total_len < ask->hash.digestsize)
- return -EINVAL;
+ switch (ask->op_type) {
+ case OP_HASH: {
+ char digest[NCR_HASH_MAX_OUTPUT_SIZE];
+ int res;
- BUG_ON(ask->hash.digestsize > sizeof(digest));
- res = cryptodev_hash_final(&ask->hash, digest);
- if (res < 0)
- return res;
+ BUG_ON(index != 0);
+ BUG_ON(ask->hash.init == 0);
- res = memcpy_toiovec(m->msg_iov, digest, ask->hash.digestsize);
- if (res != 0)
- return res;
+ if (total_len < ask->hash.digestsize)
+ return -EINVAL;
- res = cryptodev_hash_reset(&ask->hash);
- if (res != 0)
- return res;
- DUMP_ASK(ask);
+ BUG_ON(ask->hash.digestsize > sizeof(digest));
+ res = cryptodev_hash_final(&ask->hash, digest);
+ if (res < 0)
+ return res;
+
+ res = memcpy_toiovec(m->msg_iov, digest, ask->hash.digestsize);
+ if (res != 0)
+ return res;
+
+ res = cryptodev_hash_reset(&ask->hash);
+ if (res != 0)
+ return res;
+
+ return ask->hash.digestsize;
+ }
- return ask->hash.digestsize;
+ default:
+ BUG();
+ }
}
static int data_recvmsg(struct kiocb *iocb, struct socket *sock,
@@ -428,8 +440,17 @@ static void alg_destruct(struct sock *sk)
ask = alg_sk(sk);
DUMP_ASK(ask);
- if (ask->hash.init != 0)
+ switch (ask->op_type) {
+ case OP_NONE:
+ break;
+
+ case OP_HASH:
cryptodev_hash_deinit(&ask->hash);
+ break;
+
+ default:
+ BUG();
+ }
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), &alg_proto, -1);
@@ -549,15 +570,21 @@ static int alg_listen(struct socket *sock, int len)
ask = alg_sk(sock->sk);
DUMP_ASK(ask);
- if (ask->op_type == OP_NONE)
- return -EDESTADDRREQ;
-
if (ask->num_slaves != 0)
return -EINVAL;
- // FIXME: type-specific
- if (len != 1)
- return -EINVAL;
+ switch (ask->op_type) {
+ case OP_NONE:
+ return -EDESTADDRREQ;
+
+ case OP_HASH:
+ if (len != 1)
+ return -EINVAL;
+ break;
+
+ default:
+ BUG();
+ }
BUG_ON(len > ARRAY_SIZE(ask->slaves));