diff options
Diffstat (limited to 'cryptodev_main.c')
-rw-r--r-- | cryptodev_main.c | 113 |
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)); |