Lines Matching +full:processing +full:- +full:engine
2 * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved.
21 #include <openssl/engine.h>
34 # warning "AFALG ENGINE requires Kernel Headers >= 4.1.0"
35 # warning "Skipping Compilation of AFALG engine"
79 static int afalg_destroy(ENGINE *e);
80 static int afalg_init(ENGINE *e);
81 static int afalg_finish(ENGINE *e);
84 static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
93 /* Engine Id and Name */
95 static const char *engine_afalg_name = "AFALG engine support";
127 /* A version of 'struct timespec' with 32-bit time_t and nanoseconds. */
139 /* Check if we are a 32-bit architecture with a 64-bit time_t */ in io_getevents()
158 * 64-bit time_t on a 32-bit architecture. If we can fit the in io_getevents()
159 * timeout value in a 32-bit time_t, then let's do that in io_getevents()
162 if (timeout && timeout->tv_sec == (long)timeout->tv_sec) { in io_getevents()
165 ts32.tv_sec = (__kernel_long_t) timeout->tv_sec; in io_getevents()
166 ts32.tv_nsec = (__kernel_long_t) timeout->tv_nsec; in io_getevents()
176 return -1; in io_getevents()
201 &aio->efd, &custom); in afalg_setup_async_event_notification()
207 aio->efd = eventfd(0); in afalg_setup_async_event_notification()
208 if (aio->efd == -1) { in afalg_setup_async_event_notification()
216 aio->efd, custom, in afalg_setup_async_event_notification()
220 close(aio->efd); in afalg_setup_async_event_notification()
223 /* make fd non-blocking in async mode */ in afalg_setup_async_event_notification()
224 if (fcntl(aio->efd, F_SETFL, O_NONBLOCK) != 0) { in afalg_setup_async_event_notification()
229 aio->mode = MODE_ASYNC; in afalg_setup_async_event_notification()
232 aio->efd = eventfd(0); in afalg_setup_async_event_notification()
233 if (aio->efd == -1) { in afalg_setup_async_event_notification()
239 aio->mode = MODE_SYNC; in afalg_setup_async_event_notification()
246 int r = -1; in afalg_init_aio()
249 aio->aio_ctx = 0; in afalg_init_aio()
250 r = io_setup(MAX_INFLIGHTS, &aio->aio_ctx); in afalg_init_aio()
257 memset(aio->cbt, 0, sizeof(aio->cbt)); in afalg_init_aio()
258 aio->efd = -1; in afalg_init_aio()
259 aio->mode = MODE_UNINIT; in afalg_init_aio()
279 if (aio->mode == MODE_UNINIT) { in afalg_fin_cipher_aio()
285 cb = &(aio->cbt[0 % MAX_INFLIGHTS]); in afalg_fin_cipher_aio()
287 cb->aio_fildes = sfd; in afalg_fin_cipher_aio()
288 cb->aio_lio_opcode = IOCB_CMD_PREAD; in afalg_fin_cipher_aio()
291 * sign extension on cast to 64 bit value in 32-bit builds in afalg_fin_cipher_aio()
293 cb->aio_buf = (size_t)buf; in afalg_fin_cipher_aio()
294 cb->aio_offset = 0; in afalg_fin_cipher_aio()
295 cb->aio_data = 0; in afalg_fin_cipher_aio()
296 cb->aio_nbytes = len; in afalg_fin_cipher_aio()
297 cb->aio_flags = IOCB_FLAG_RESFD; in afalg_fin_cipher_aio()
298 cb->aio_resfd = aio->efd; in afalg_fin_cipher_aio()
304 r = io_read(aio->aio_ctx, 1, &cb); in afalg_fin_cipher_aio()
315 r = read(aio->efd, &eval, sizeof(eval)); in afalg_fin_cipher_aio()
337 r = io_getevents(aio->aio_ctx, 1, MAX_INFLIGHTS, in afalg_fin_cipher_aio()
349 if (events[0].res == -EBUSY && retry++ < 3) { in afalg_fin_cipher_aio()
350 r = io_read(aio->aio_ctx, 1, &cb); in afalg_fin_cipher_aio()
359 * Retries exceed for -EBUSY or unrecoverable error in afalg_fin_cipher_aio()
386 cmsg->cmsg_level = SOL_ALG; in afalg_set_op_sk()
387 cmsg->cmsg_type = ALG_SET_OP; in afalg_set_op_sk()
388 cmsg->cmsg_len = CMSG_LEN(ALG_OP_LEN); in afalg_set_op_sk()
397 cmsg->cmsg_level = SOL_ALG; in afalg_set_iv_sk()
398 cmsg->cmsg_type = ALG_SET_IV; in afalg_set_iv_sk()
399 cmsg->cmsg_len = CMSG_LEN(ALG_IV_LEN(len)); in afalg_set_iv_sk()
401 aiv->ivlen = len; in afalg_set_iv_sk()
402 memcpy(aiv->iv, iv, len); in afalg_set_iv_sk()
409 ret = setsockopt(actx->bfd, SOL_ALG, ALG_SET_KEY, key, klen); in afalg_set_key()
422 int r = -1; in afalg_create_sk()
424 actx->bfd = actx->sfd = -1; in afalg_create_sk()
431 actx->bfd = socket(AF_ALG, SOCK_SEQPACKET, 0); in afalg_create_sk()
432 if (actx->bfd == -1) { in afalg_create_sk()
438 r = bind(actx->bfd, (struct sockaddr *)&sa, sizeof(sa)); in afalg_create_sk()
445 actx->sfd = accept(actx->bfd, NULL, 0); in afalg_create_sk()
446 if (actx->sfd < 0) { in afalg_create_sk()
455 if (actx->bfd >= 0) in afalg_create_sk()
456 close(actx->bfd); in afalg_create_sk()
457 if (actx->sfd >= 0) in afalg_create_sk()
458 close(actx->sfd); in afalg_create_sk()
459 actx->bfd = actx->sfd = -1; in afalg_create_sk()
500 * OPENS: out of place processing (i.e. out != in) in afalg_start_cipher_sk()
508 sbytes = sendmsg(actx->sfd, &msg, 0); in afalg_start_cipher_sk()
517 * kernel space processing avoiding copies from user to kernel space in afalg_start_cipher_sk()
519 ret = vmsplice(actx->zc_pipe[1], &iov, 1, SPLICE_F_GIFT); in afalg_start_cipher_sk()
525 ret = splice(actx->zc_pipe[0], NULL, actx->sfd, NULL, inl, 0); in afalg_start_cipher_sk()
535 sbytes = sendmsg(actx->sfd, &msg, 0); in afalg_start_cipher_sk()
595 /* Setup AFALG socket for crypto processing */ in afalg_cipher_init()
606 /* Setup AIO ctx to allow async AFALG crypto processing */ in afalg_cipher_init()
607 if (afalg_init_aio(&actx->aio) == 0) in afalg_cipher_init()
611 pipe(actx->zc_pipe); in afalg_cipher_init()
614 actx->init_done = MAGIC_INIT_NUM; in afalg_cipher_init()
619 close(actx->sfd); in afalg_cipher_init()
620 close(actx->bfd); in afalg_cipher_init()
638 if (actx == NULL || actx->init_done != MAGIC_INIT_NUM) { in afalg_do_cipher()
649 memcpy(nxtiv, in + (inl - ALG_AES_IV_LEN), ALG_AES_IV_LEN); in afalg_do_cipher()
661 ret = afalg_fin_cipher_aio(&actx->aio, actx->sfd, out, inl); in afalg_do_cipher()
666 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), out + (inl - ALG_AES_IV_LEN), in afalg_do_cipher()
686 if (actx == NULL || actx->init_done != MAGIC_INIT_NUM) in afalg_cipher_cleanup()
689 close(actx->sfd); in afalg_cipher_cleanup()
690 close(actx->bfd); in afalg_cipher_cleanup()
692 close(actx->zc_pipe[0]); in afalg_cipher_cleanup()
693 close(actx->zc_pipe[1]); in afalg_cipher_cleanup()
696 if (actx->aio.mode == MODE_SYNC) in afalg_cipher_cleanup()
697 close(actx->aio.efd); in afalg_cipher_cleanup()
698 io_destroy(actx->aio.aio_ctx); in afalg_cipher_cleanup()
723 if (cipher_handle->_hidden == NULL in afalg_aes_cbc()
724 && ((cipher_handle->_hidden = in afalg_aes_cbc()
727 cipher_handle->key_size)) == NULL in afalg_aes_cbc()
728 || !EVP_CIPHER_meth_set_iv_length(cipher_handle->_hidden, in afalg_aes_cbc()
730 || !EVP_CIPHER_meth_set_flags(cipher_handle->_hidden, in afalg_aes_cbc()
733 || !EVP_CIPHER_meth_set_init(cipher_handle->_hidden, in afalg_aes_cbc()
735 || !EVP_CIPHER_meth_set_do_cipher(cipher_handle->_hidden, in afalg_aes_cbc()
737 || !EVP_CIPHER_meth_set_cleanup(cipher_handle->_hidden, in afalg_aes_cbc()
739 || !EVP_CIPHER_meth_set_impl_ctx_size(cipher_handle->_hidden, in afalg_aes_cbc()
741 EVP_CIPHER_meth_free(cipher_handle->_hidden); in afalg_aes_cbc()
742 cipher_handle->_hidden= NULL; in afalg_aes_cbc()
744 return cipher_handle->_hidden; in afalg_aes_cbc()
747 static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher, in afalg_ciphers()
770 static int bind_afalg(ENGINE *e) in bind_afalg()
806 static int bind_helper(ENGINE *e, const char *id) in bind_helper()
829 int kver[3] = { -1, -1, -1 }; in IMPLEMENT_DYNAMIC_BIND_FN()
860 if (sock == -1) { in IMPLEMENT_DYNAMIC_BIND_FN()
870 static ENGINE *engine_afalg(void) in engine_afalg()
872 ENGINE *ret = ENGINE_new(); in engine_afalg()
884 ENGINE *toadd; in engine_load_afalg_int()
896 * release our just-created reference. in engine_load_afalg_int()
908 static int afalg_init(ENGINE *e) in afalg_init()
913 static int afalg_finish(ENGINE *e) in afalg_finish()
928 static int afalg_destroy(ENGINE *e) in afalg_destroy()