algif_skcipher.c (866c9b94ef968445c52214b3748ecc52a8491bca) algif_skcipher.c (7d2c3f54e6f646887d019faa45f35d6fe9fe82ce)
1/*
2 * algif_skcipher: User-space interface for skcipher algorithms
3 *
4 * This file provides the user-space API for symmetric key ciphers.
5 *
6 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
7 *
8 * This program is free software; you can redistribute it and/or modify it

--- 103 unchanged lines hidden (view full) ---

112
113 /* Initialize the crypto operation */
114 skcipher_request_set_tfm(&areq->cra_u.skcipher_req, tfm);
115 skcipher_request_set_crypt(&areq->cra_u.skcipher_req, areq->tsgl,
116 areq->first_rsgl.sgl.sg, len, ctx->iv);
117
118 if (msg->msg_iocb && !is_sync_kiocb(msg->msg_iocb)) {
119 /* AIO operation */
1/*
2 * algif_skcipher: User-space interface for skcipher algorithms
3 *
4 * This file provides the user-space API for symmetric key ciphers.
5 *
6 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
7 *
8 * This program is free software; you can redistribute it and/or modify it

--- 103 unchanged lines hidden (view full) ---

112
113 /* Initialize the crypto operation */
114 skcipher_request_set_tfm(&areq->cra_u.skcipher_req, tfm);
115 skcipher_request_set_crypt(&areq->cra_u.skcipher_req, areq->tsgl,
116 areq->first_rsgl.sgl.sg, len, ctx->iv);
117
118 if (msg->msg_iocb && !is_sync_kiocb(msg->msg_iocb)) {
119 /* AIO operation */
120 sock_hold(sk);
120 areq->iocb = msg->msg_iocb;
121 skcipher_request_set_callback(&areq->cra_u.skcipher_req,
122 CRYPTO_TFM_REQ_MAY_SLEEP,
123 af_alg_async_cb, areq);
124 err = ctx->enc ?
125 crypto_skcipher_encrypt(&areq->cra_u.skcipher_req) :
126 crypto_skcipher_decrypt(&areq->cra_u.skcipher_req);
121 areq->iocb = msg->msg_iocb;
122 skcipher_request_set_callback(&areq->cra_u.skcipher_req,
123 CRYPTO_TFM_REQ_MAY_SLEEP,
124 af_alg_async_cb, areq);
125 err = ctx->enc ?
126 crypto_skcipher_encrypt(&areq->cra_u.skcipher_req) :
127 crypto_skcipher_decrypt(&areq->cra_u.skcipher_req);
128
129 /* AIO operation in progress */
130 if (err == -EINPROGRESS || err == -EBUSY) {
131 /* Remember output size that will be generated. */
132 areq->outlen = len;
133
134 return -EIOCBQUEUED;
135 }
136
137 sock_put(sk);
127 } else {
128 /* Synchronous operation */
129 skcipher_request_set_callback(&areq->cra_u.skcipher_req,
130 CRYPTO_TFM_REQ_MAY_SLEEP |
131 CRYPTO_TFM_REQ_MAY_BACKLOG,
132 crypto_req_done, &ctx->wait);
133 err = crypto_wait_req(ctx->enc ?
134 crypto_skcipher_encrypt(&areq->cra_u.skcipher_req) :
135 crypto_skcipher_decrypt(&areq->cra_u.skcipher_req),
136 &ctx->wait);
137 }
138
138 } else {
139 /* Synchronous operation */
140 skcipher_request_set_callback(&areq->cra_u.skcipher_req,
141 CRYPTO_TFM_REQ_MAY_SLEEP |
142 CRYPTO_TFM_REQ_MAY_BACKLOG,
143 crypto_req_done, &ctx->wait);
144 err = crypto_wait_req(ctx->enc ?
145 crypto_skcipher_encrypt(&areq->cra_u.skcipher_req) :
146 crypto_skcipher_decrypt(&areq->cra_u.skcipher_req),
147 &ctx->wait);
148 }
149
139 /* AIO operation in progress */
140 if (err == -EINPROGRESS) {
141 sock_hold(sk);
142
150
143 /* Remember output size that will be generated. */
144 areq->outlen = len;
145
146 return -EIOCBQUEUED;
147 }
148
149free:
151free:
150 af_alg_free_areq_sgls(areq);
151 sock_kfree_s(sk, areq, areq->areqlen);
152 af_alg_free_resources(areq);
152
153 return err ? err : len;
154}
155
156static int skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
157 size_t ignored, int flags)
158{
159 struct sock *sk = sock->sk;

--- 275 unchanged lines hidden ---
153
154 return err ? err : len;
155}
156
157static int skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
158 size_t ignored, int flags)
159{
160 struct sock *sk = sock->sk;

--- 275 unchanged lines hidden ---