1 /* 2 * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* We need to use some deprecated APIs */ 11 #define OPENSSL_SUPPRESS_DEPRECATED 12 13 /* Required for vmsplice */ 14 #ifndef _GNU_SOURCE 15 #define _GNU_SOURCE 16 #endif 17 #include <stdio.h> 18 #include <string.h> 19 #include <unistd.h> 20 21 #include <openssl/engine.h> 22 #include <openssl/async.h> 23 #include <openssl/err.h> 24 #include "internal/nelem.h" 25 26 #include <sys/socket.h> 27 #include <linux/version.h> 28 #define K_MAJ 4 29 #define K_MIN1 1 30 #define K_MIN2 0 31 #if LINUX_VERSION_CODE < KERNEL_VERSION(K_MAJ, K_MIN1, K_MIN2) || !defined(AF_ALG) 32 #ifndef PEDANTIC 33 #warning "AFALG ENGINE requires Kernel Headers >= 4.1.0" 34 #warning "Skipping Compilation of AFALG engine" 35 #endif 36 void engine_load_afalg_int(void); 37 void engine_load_afalg_int(void) 38 { 39 } 40 #else 41 42 #include <linux/if_alg.h> 43 #include <fcntl.h> 44 #include <sys/utsname.h> 45 46 #include <linux/aio_abi.h> 47 #include <sys/syscall.h> 48 #include <errno.h> 49 50 /* clang-format off */ 51 # include "e_afalg.h" 52 # include "e_afalg_err.c" 53 /* clang-format on */ 54 55 #ifndef SOL_ALG 56 #define SOL_ALG 279 57 #endif 58 59 #ifdef ALG_ZERO_COPY 60 #ifndef SPLICE_F_GIFT 61 #define SPLICE_F_GIFT (0x08) 62 #endif 63 #endif 64 65 #define ALG_AES_IV_LEN 16 66 #define ALG_IV_LEN(len) (sizeof(struct af_alg_iv) + (len)) 67 #define ALG_OP_TYPE unsigned int 68 #define ALG_OP_LEN (sizeof(ALG_OP_TYPE)) 69 70 #ifdef OPENSSL_NO_DYNAMIC_ENGINE 71 void engine_load_afalg_int(void); 72 #endif 73 74 /* Local Linkage Functions */ 75 static int afalg_init_aio(afalg_aio *aio); 76 static int afalg_fin_cipher_aio(afalg_aio *ptr, int sfd, 77 unsigned char *buf, size_t len); 78 static int afalg_create_sk(afalg_ctx *actx, const char *ciphertype, 79 const char *ciphername); 80 static int afalg_destroy(ENGINE *e); 81 static int afalg_init(ENGINE *e); 82 static int afalg_finish(ENGINE *e); 83 static const EVP_CIPHER *afalg_aes_cbc(int nid); 84 static cbc_handles *get_cipher_handle(int nid); 85 static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher, 86 const int **nids, int nid); 87 static int afalg_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, 88 const unsigned char *iv, int enc); 89 static int afalg_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 90 const unsigned char *in, size_t inl); 91 static int afalg_cipher_cleanup(EVP_CIPHER_CTX *ctx); 92 static int afalg_chk_platform(void); 93 94 /* Engine Id and Name */ 95 static const char *engine_afalg_id = "afalg"; 96 static const char *engine_afalg_name = "AFALG engine support"; 97 98 static int afalg_cipher_nids[] = { 99 NID_aes_128_cbc, 100 NID_aes_192_cbc, 101 NID_aes_256_cbc, 102 }; 103 104 static cbc_handles cbc_handle[] = { { AES_KEY_SIZE_128, NULL }, 105 { AES_KEY_SIZE_192, NULL }, 106 { AES_KEY_SIZE_256, NULL } }; 107 108 static ossl_inline int io_setup(unsigned n, aio_context_t *ctx) 109 { 110 return syscall(__NR_io_setup, n, ctx); 111 } 112 113 static ossl_inline int eventfd(int n) 114 { 115 return syscall(__NR_eventfd2, n, 0); 116 } 117 118 static ossl_inline int io_destroy(aio_context_t ctx) 119 { 120 return syscall(__NR_io_destroy, ctx); 121 } 122 123 static ossl_inline int io_read(aio_context_t ctx, long n, struct iocb **iocb) 124 { 125 return syscall(__NR_io_submit, ctx, n, iocb); 126 } 127 128 /* A version of 'struct timespec' with 32-bit time_t and nanoseconds. */ 129 struct __timespec32 { 130 __kernel_long_t tv_sec; 131 __kernel_long_t tv_nsec; 132 }; 133 134 static ossl_inline int io_getevents(aio_context_t ctx, long min, long max, 135 struct io_event *events, 136 struct timespec *timeout) 137 { 138 #if defined(__NR_io_pgetevents_time64) 139 /* Check if we are a 32-bit architecture with a 64-bit time_t */ 140 if (sizeof(*timeout) != sizeof(struct __timespec32)) { 141 int ret = syscall(__NR_io_pgetevents_time64, ctx, min, max, events, 142 timeout, NULL); 143 if (ret == 0 || errno != ENOSYS) 144 return ret; 145 } 146 #endif 147 148 #if defined(__NR_io_getevents) 149 if (sizeof(*timeout) == sizeof(struct __timespec32)) 150 /* 151 * time_t matches our architecture length, we can just use 152 * __NR_io_getevents 153 */ 154 return syscall(__NR_io_getevents, ctx, min, max, events, timeout); 155 else { 156 /* 157 * We don't have __NR_io_pgetevents_time64, but we are using a 158 * 64-bit time_t on a 32-bit architecture. If we can fit the 159 * timeout value in a 32-bit time_t, then let's do that 160 * and then use the __NR_io_getevents syscall. 161 */ 162 if (timeout && timeout->tv_sec == (long)timeout->tv_sec) { 163 struct __timespec32 ts32; 164 165 ts32.tv_sec = (__kernel_long_t)timeout->tv_sec; 166 ts32.tv_nsec = (__kernel_long_t)timeout->tv_nsec; 167 168 return syscall(__NR_io_getevents, ctx, min, max, events, &ts32); 169 } else { 170 return syscall(__NR_io_getevents, ctx, min, max, events, NULL); 171 } 172 } 173 #endif 174 175 errno = ENOSYS; 176 return -1; 177 } 178 179 static void afalg_waitfd_cleanup(ASYNC_WAIT_CTX *ctx, const void *key, 180 OSSL_ASYNC_FD waitfd, void *custom) 181 { 182 close(waitfd); 183 } 184 185 static int afalg_setup_async_event_notification(afalg_aio *aio) 186 { 187 ASYNC_JOB *job; 188 ASYNC_WAIT_CTX *waitctx; 189 void *custom = NULL; 190 int ret; 191 192 if ((job = ASYNC_get_current_job()) != NULL) { 193 /* Async mode */ 194 waitctx = ASYNC_get_wait_ctx(job); 195 if (waitctx == NULL) { 196 ALG_WARN("%s(%d): ASYNC_get_wait_ctx error", __FILE__, __LINE__); 197 return 0; 198 } 199 /* Get waitfd from ASYNC_WAIT_CTX if it is already set */ 200 ret = ASYNC_WAIT_CTX_get_fd(waitctx, engine_afalg_id, 201 &aio->efd, &custom); 202 if (ret == 0) { 203 /* 204 * waitfd is not set in ASYNC_WAIT_CTX, create a new one 205 * and set it. efd will be signaled when AIO operation completes 206 */ 207 aio->efd = eventfd(0); 208 if (aio->efd == -1) { 209 ALG_PERR("%s(%d): Failed to get eventfd : ", __FILE__, 210 __LINE__); 211 AFALGerr(AFALG_F_AFALG_SETUP_ASYNC_EVENT_NOTIFICATION, 212 AFALG_R_EVENTFD_FAILED); 213 return 0; 214 } 215 ret = ASYNC_WAIT_CTX_set_wait_fd(waitctx, engine_afalg_id, 216 aio->efd, custom, 217 afalg_waitfd_cleanup); 218 if (ret == 0) { 219 ALG_WARN("%s(%d): Failed to set wait fd", __FILE__, __LINE__); 220 close(aio->efd); 221 return 0; 222 } 223 /* make fd non-blocking in async mode */ 224 if (fcntl(aio->efd, F_SETFL, O_NONBLOCK) != 0) { 225 ALG_WARN("%s(%d): Failed to set event fd as NONBLOCKING", 226 __FILE__, __LINE__); 227 } 228 } 229 aio->mode = MODE_ASYNC; 230 } else { 231 /* Sync mode */ 232 aio->efd = eventfd(0); 233 if (aio->efd == -1) { 234 ALG_PERR("%s(%d): Failed to get eventfd : ", __FILE__, __LINE__); 235 AFALGerr(AFALG_F_AFALG_SETUP_ASYNC_EVENT_NOTIFICATION, 236 AFALG_R_EVENTFD_FAILED); 237 return 0; 238 } 239 aio->mode = MODE_SYNC; 240 } 241 return 1; 242 } 243 244 static int afalg_init_aio(afalg_aio *aio) 245 { 246 int r = -1; 247 248 /* Initialise for AIO */ 249 aio->aio_ctx = 0; 250 r = io_setup(MAX_INFLIGHTS, &aio->aio_ctx); 251 if (r < 0) { 252 ALG_PERR("%s(%d): io_setup error : ", __FILE__, __LINE__); 253 AFALGerr(AFALG_F_AFALG_INIT_AIO, AFALG_R_IO_SETUP_FAILED); 254 return 0; 255 } 256 257 memset(aio->cbt, 0, sizeof(aio->cbt)); 258 aio->efd = -1; 259 aio->mode = MODE_UNINIT; 260 261 return 1; 262 } 263 264 static int afalg_fin_cipher_aio(afalg_aio *aio, int sfd, unsigned char *buf, 265 size_t len) 266 { 267 int r; 268 int retry = 0; 269 unsigned int done = 0; 270 struct iocb *cb; 271 struct timespec timeout; 272 struct io_event events[MAX_INFLIGHTS]; 273 u_int64_t eval = 0; 274 275 timeout.tv_sec = 0; 276 timeout.tv_nsec = 0; 277 278 /* if efd has not been initialised yet do it here */ 279 if (aio->mode == MODE_UNINIT) { 280 r = afalg_setup_async_event_notification(aio); 281 if (r == 0) 282 return 0; 283 } 284 285 cb = &(aio->cbt[0 % MAX_INFLIGHTS]); 286 memset(cb, '\0', sizeof(*cb)); 287 cb->aio_fildes = sfd; 288 cb->aio_lio_opcode = IOCB_CMD_PREAD; 289 /* 290 * The pointer has to be converted to unsigned value first to avoid 291 * sign extension on cast to 64 bit value in 32-bit builds 292 */ 293 cb->aio_buf = (size_t)buf; 294 cb->aio_offset = 0; 295 cb->aio_data = 0; 296 cb->aio_nbytes = len; 297 cb->aio_flags = IOCB_FLAG_RESFD; 298 cb->aio_resfd = aio->efd; 299 300 /* 301 * Perform AIO read on AFALG socket, this in turn performs an async 302 * crypto operation in kernel space 303 */ 304 r = io_read(aio->aio_ctx, 1, &cb); 305 if (r < 0) { 306 ALG_PWARN("%s(%d): io_read failed : ", __FILE__, __LINE__); 307 return 0; 308 } 309 310 do { 311 /* While AIO read is being performed pause job */ 312 ASYNC_pause_job(); 313 314 /* Check for completion of AIO read */ 315 r = read(aio->efd, &eval, sizeof(eval)); 316 if (r < 0) { 317 if (errno == EAGAIN || errno == EWOULDBLOCK) 318 continue; 319 ALG_PERR("%s(%d): read failed for event fd : ", __FILE__, __LINE__); 320 return 0; 321 } else if (r == 0 || eval <= 0) { 322 ALG_WARN("%s(%d): eventfd read %d bytes, eval = %lu\n", __FILE__, 323 __LINE__, r, eval); 324 } 325 if (eval > 0) { 326 327 #ifdef OSSL_SANITIZE_MEMORY 328 /* 329 * In a memory sanitiser build, the changes to memory made by the 330 * system call aren't reliably detected. By initialising the 331 * memory here, the sanitiser is told that they are okay. 332 */ 333 memset(events, 0, sizeof(events)); 334 #endif 335 336 /* Get results of AIO read */ 337 r = io_getevents(aio->aio_ctx, 1, MAX_INFLIGHTS, 338 events, &timeout); 339 if (r > 0) { 340 /* 341 * events.res indicates the actual status of the operation. 342 * Handle the error condition first. 343 */ 344 if (events[0].res < 0) { 345 /* 346 * Underlying operation cannot be completed at the time 347 * of previous submission. Resubmit for the operation. 348 */ 349 if (events[0].res == -EBUSY && retry++ < 3) { 350 r = io_read(aio->aio_ctx, 1, &cb); 351 if (r < 0) { 352 ALG_PERR("%s(%d): retry %d for io_read failed : ", 353 __FILE__, __LINE__, retry); 354 return 0; 355 } 356 continue; 357 } else { 358 char strbuf[32]; 359 /* 360 * sometimes __s64 is defined as long long int 361 * but on some archs ( like mips64 or powerpc64 ) it's just long int 362 * 363 * to be able to use BIO_snprintf() with %lld without warnings 364 * copy events[0].res to an long long int variable 365 * 366 * because long long int should always be at least 64 bit this should work 367 */ 368 long long int op_ret = events[0].res; 369 370 /* 371 * Retries exceed for -EBUSY or unrecoverable error 372 * condition for this instance of operation. 373 */ 374 ALG_WARN("%s(%d): Crypto Operation failed with code %lld\n", 375 __FILE__, __LINE__, events[0].res); 376 BIO_snprintf(strbuf, sizeof(strbuf), "%lld", op_ret); 377 switch (events[0].res) { 378 case -ENOMEM: 379 AFALGerr(0, AFALG_R_KERNEL_OP_FAILED); 380 ERR_add_error_data(3, "-ENOMEM ( code ", strbuf, " )"); 381 break; 382 default: 383 AFALGerr(0, AFALG_R_KERNEL_OP_FAILED); 384 ERR_add_error_data(2, "code ", strbuf); 385 break; 386 } 387 return 0; 388 } 389 } 390 /* Operation successful. */ 391 done = 1; 392 } else if (r < 0) { 393 ALG_PERR("%s(%d): io_getevents failed : ", __FILE__, __LINE__); 394 return 0; 395 } else { 396 ALG_WARN("%s(%d): io_geteventd read 0 bytes\n", __FILE__, 397 __LINE__); 398 } 399 } 400 } while (!done); 401 402 return 1; 403 } 404 405 static ossl_inline void afalg_set_op_sk(struct cmsghdr *cmsg, 406 const ALG_OP_TYPE op) 407 { 408 cmsg->cmsg_level = SOL_ALG; 409 cmsg->cmsg_type = ALG_SET_OP; 410 cmsg->cmsg_len = CMSG_LEN(ALG_OP_LEN); 411 memcpy(CMSG_DATA(cmsg), &op, ALG_OP_LEN); 412 } 413 414 static void afalg_set_iv_sk(struct cmsghdr *cmsg, const unsigned char *iv, 415 const unsigned int len) 416 { 417 struct af_alg_iv *aiv; 418 419 cmsg->cmsg_level = SOL_ALG; 420 cmsg->cmsg_type = ALG_SET_IV; 421 cmsg->cmsg_len = CMSG_LEN(ALG_IV_LEN(len)); 422 aiv = (struct af_alg_iv *)CMSG_DATA(cmsg); 423 aiv->ivlen = len; 424 memcpy(aiv->iv, iv, len); 425 } 426 427 static ossl_inline int afalg_set_key(afalg_ctx *actx, const unsigned char *key, 428 const int klen) 429 { 430 int ret; 431 ret = setsockopt(actx->bfd, SOL_ALG, ALG_SET_KEY, key, klen); 432 if (ret < 0) { 433 ALG_PERR("%s(%d): Failed to set socket option : ", __FILE__, __LINE__); 434 AFALGerr(AFALG_F_AFALG_SET_KEY, AFALG_R_SOCKET_SET_KEY_FAILED); 435 return 0; 436 } 437 return 1; 438 } 439 440 static int afalg_create_sk(afalg_ctx *actx, const char *ciphertype, 441 const char *ciphername) 442 { 443 struct sockaddr_alg sa; 444 int r = -1; 445 446 actx->bfd = actx->sfd = -1; 447 448 memset(&sa, 0, sizeof(sa)); 449 sa.salg_family = AF_ALG; 450 OPENSSL_strlcpy((char *)sa.salg_type, ciphertype, sizeof(sa.salg_type)); 451 OPENSSL_strlcpy((char *)sa.salg_name, ciphername, sizeof(sa.salg_name)); 452 453 actx->bfd = socket(AF_ALG, SOCK_SEQPACKET, 0); 454 if (actx->bfd == -1) { 455 ALG_PERR("%s(%d): Failed to open socket : ", __FILE__, __LINE__); 456 AFALGerr(AFALG_F_AFALG_CREATE_SK, AFALG_R_SOCKET_CREATE_FAILED); 457 goto err; 458 } 459 460 r = bind(actx->bfd, (struct sockaddr *)&sa, sizeof(sa)); 461 if (r < 0) { 462 ALG_PERR("%s(%d): Failed to bind socket : ", __FILE__, __LINE__); 463 AFALGerr(AFALG_F_AFALG_CREATE_SK, AFALG_R_SOCKET_BIND_FAILED); 464 goto err; 465 } 466 467 actx->sfd = accept(actx->bfd, NULL, 0); 468 if (actx->sfd < 0) { 469 ALG_PERR("%s(%d): Socket Accept Failed : ", __FILE__, __LINE__); 470 AFALGerr(AFALG_F_AFALG_CREATE_SK, AFALG_R_SOCKET_ACCEPT_FAILED); 471 goto err; 472 } 473 474 return 1; 475 476 err: 477 if (actx->bfd >= 0) 478 close(actx->bfd); 479 if (actx->sfd >= 0) 480 close(actx->sfd); 481 actx->bfd = actx->sfd = -1; 482 return 0; 483 } 484 485 static int afalg_start_cipher_sk(afalg_ctx *actx, const unsigned char *in, 486 size_t inl, const unsigned char *iv, 487 unsigned int enc) 488 { 489 struct msghdr msg; 490 struct cmsghdr *cmsg; 491 struct iovec iov; 492 ssize_t sbytes; 493 #ifdef ALG_ZERO_COPY 494 int ret; 495 #endif 496 char cbuf[CMSG_SPACE(ALG_IV_LEN(ALG_AES_IV_LEN)) + CMSG_SPACE(ALG_OP_LEN)]; 497 498 memset(&msg, 0, sizeof(msg)); 499 memset(cbuf, 0, sizeof(cbuf)); 500 msg.msg_control = cbuf; 501 msg.msg_controllen = sizeof(cbuf); 502 503 /* 504 * cipher direction (i.e. encrypt or decrypt) and iv are sent to the 505 * kernel as part of sendmsg()'s ancillary data 506 */ 507 cmsg = CMSG_FIRSTHDR(&msg); 508 afalg_set_op_sk(cmsg, enc); 509 cmsg = CMSG_NXTHDR(&msg, cmsg); 510 afalg_set_iv_sk(cmsg, iv, ALG_AES_IV_LEN); 511 512 /* iov that describes input data */ 513 iov.iov_base = (unsigned char *)in; 514 iov.iov_len = inl; 515 516 msg.msg_flags = MSG_MORE; 517 518 #ifdef ALG_ZERO_COPY 519 /* 520 * ZERO_COPY mode 521 * Works best when buffer is 4k aligned 522 * OPENS: out of place processing (i.e. out != in) 523 */ 524 525 /* Input data is not sent as part of call to sendmsg() */ 526 msg.msg_iovlen = 0; 527 msg.msg_iov = NULL; 528 529 /* Sendmsg() sends iv and cipher direction to the kernel */ 530 sbytes = sendmsg(actx->sfd, &msg, 0); 531 if (sbytes < 0) { 532 ALG_PERR("%s(%d): sendmsg failed for zero copy cipher operation : ", 533 __FILE__, __LINE__); 534 return 0; 535 } 536 537 /* 538 * vmsplice and splice are used to pin the user space input buffer for 539 * kernel space processing avoiding copies from user to kernel space 540 */ 541 ret = vmsplice(actx->zc_pipe[1], &iov, 1, SPLICE_F_GIFT); 542 if (ret < 0) { 543 ALG_PERR("%s(%d): vmsplice failed : ", __FILE__, __LINE__); 544 return 0; 545 } 546 547 ret = splice(actx->zc_pipe[0], NULL, actx->sfd, NULL, inl, 0); 548 if (ret < 0) { 549 ALG_PERR("%s(%d): splice failed : ", __FILE__, __LINE__); 550 return 0; 551 } 552 #else 553 msg.msg_iovlen = 1; 554 msg.msg_iov = &iov; 555 556 /* Sendmsg() sends iv, cipher direction and input data to the kernel */ 557 sbytes = sendmsg(actx->sfd, &msg, 0); 558 if (sbytes < 0) { 559 ALG_PERR("%s(%d): sendmsg failed for cipher operation : ", __FILE__, 560 __LINE__); 561 return 0; 562 } 563 564 if (sbytes != (ssize_t)inl) { 565 ALG_WARN("Cipher operation send bytes %zd != inlen %zd\n", sbytes, 566 inl); 567 return 0; 568 } 569 #endif 570 571 return 1; 572 } 573 574 static int afalg_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, 575 const unsigned char *iv, int enc) 576 { 577 int ciphertype; 578 int ret, len; 579 afalg_ctx *actx; 580 const char *ciphername; 581 582 if (ctx == NULL || key == NULL) { 583 ALG_WARN("%s(%d): Null Parameter\n", __FILE__, __LINE__); 584 return 0; 585 } 586 587 if (EVP_CIPHER_CTX_get0_cipher(ctx) == NULL) { 588 ALG_WARN("%s(%d): Cipher object NULL\n", __FILE__, __LINE__); 589 return 0; 590 } 591 592 actx = EVP_CIPHER_CTX_get_cipher_data(ctx); 593 if (actx == NULL) { 594 ALG_WARN("%s(%d): Cipher data NULL\n", __FILE__, __LINE__); 595 return 0; 596 } 597 598 ciphertype = EVP_CIPHER_CTX_get_nid(ctx); 599 switch (ciphertype) { 600 case NID_aes_128_cbc: 601 case NID_aes_192_cbc: 602 case NID_aes_256_cbc: 603 ciphername = "cbc(aes)"; 604 break; 605 default: 606 ALG_WARN("%s(%d): Unsupported Cipher type %d\n", __FILE__, __LINE__, 607 ciphertype); 608 return 0; 609 } 610 611 if (ALG_AES_IV_LEN != EVP_CIPHER_CTX_get_iv_length(ctx)) { 612 ALG_WARN("%s(%d): Unsupported IV length :%d\n", __FILE__, __LINE__, 613 EVP_CIPHER_CTX_get_iv_length(ctx)); 614 return 0; 615 } 616 617 /* Setup AFALG socket for crypto processing */ 618 ret = afalg_create_sk(actx, "skcipher", ciphername); 619 if (ret < 1) 620 return 0; 621 622 if ((len = EVP_CIPHER_CTX_get_key_length(ctx)) <= 0) 623 goto err; 624 ret = afalg_set_key(actx, key, len); 625 if (ret < 1) 626 goto err; 627 628 /* Setup AIO ctx to allow async AFALG crypto processing */ 629 if (afalg_init_aio(&actx->aio) == 0) 630 goto err; 631 632 #ifdef ALG_ZERO_COPY 633 pipe(actx->zc_pipe); 634 #endif 635 636 actx->init_done = MAGIC_INIT_NUM; 637 638 return 1; 639 640 err: 641 close(actx->sfd); 642 close(actx->bfd); 643 return 0; 644 } 645 646 static int afalg_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 647 const unsigned char *in, size_t inl) 648 { 649 afalg_ctx *actx; 650 int ret; 651 char nxtiv[ALG_AES_IV_LEN] = { 0 }; 652 653 if (ctx == NULL || out == NULL || in == NULL) { 654 ALG_WARN("NULL parameter passed to function %s(%d)\n", __FILE__, 655 __LINE__); 656 return 0; 657 } 658 659 actx = (afalg_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); 660 if (actx == NULL || actx->init_done != MAGIC_INIT_NUM) { 661 ALG_WARN("%s afalg ctx passed\n", 662 ctx == NULL ? "NULL" : "Uninitialised"); 663 return 0; 664 } 665 666 /* 667 * set iv now for decrypt operation as the input buffer can be 668 * overwritten for inplace operation where in = out. 669 */ 670 if (EVP_CIPHER_CTX_is_encrypting(ctx) == 0) { 671 memcpy(nxtiv, in + (inl - ALG_AES_IV_LEN), ALG_AES_IV_LEN); 672 } 673 674 /* Send input data to kernel space */ 675 ret = afalg_start_cipher_sk(actx, (unsigned char *)in, inl, 676 EVP_CIPHER_CTX_iv(ctx), 677 EVP_CIPHER_CTX_is_encrypting(ctx)); 678 if (ret < 1) { 679 return 0; 680 } 681 682 /* Perform async crypto operation in kernel space */ 683 ret = afalg_fin_cipher_aio(&actx->aio, actx->sfd, out, inl); 684 if (ret < 1) 685 return 0; 686 687 if (EVP_CIPHER_CTX_is_encrypting(ctx)) { 688 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), out + (inl - ALG_AES_IV_LEN), 689 ALG_AES_IV_LEN); 690 } else { 691 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), nxtiv, ALG_AES_IV_LEN); 692 } 693 694 return 1; 695 } 696 697 static int afalg_cipher_cleanup(EVP_CIPHER_CTX *ctx) 698 { 699 afalg_ctx *actx; 700 701 if (ctx == NULL) { 702 ALG_WARN("NULL parameter passed to function %s(%d)\n", __FILE__, 703 __LINE__); 704 return 0; 705 } 706 707 actx = (afalg_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); 708 if (actx == NULL || actx->init_done != MAGIC_INIT_NUM) 709 return 1; 710 711 close(actx->sfd); 712 close(actx->bfd); 713 #ifdef ALG_ZERO_COPY 714 close(actx->zc_pipe[0]); 715 close(actx->zc_pipe[1]); 716 #endif 717 /* close efd in sync mode, async mode is closed in afalg_waitfd_cleanup() */ 718 if (actx->aio.mode == MODE_SYNC) 719 close(actx->aio.efd); 720 io_destroy(actx->aio.aio_ctx); 721 722 return 1; 723 } 724 725 static cbc_handles *get_cipher_handle(int nid) 726 { 727 switch (nid) { 728 case NID_aes_128_cbc: 729 return &cbc_handle[AES_CBC_128]; 730 case NID_aes_192_cbc: 731 return &cbc_handle[AES_CBC_192]; 732 case NID_aes_256_cbc: 733 return &cbc_handle[AES_CBC_256]; 734 default: 735 return NULL; 736 } 737 } 738 739 static const EVP_CIPHER *afalg_aes_cbc(int nid) 740 { 741 cbc_handles *cipher_handle = get_cipher_handle(nid); 742 743 if (cipher_handle == NULL) 744 return NULL; 745 if (cipher_handle->_hidden == NULL 746 && ((cipher_handle->_hidden = EVP_CIPHER_meth_new(nid, 747 AES_BLOCK_SIZE, 748 cipher_handle->key_size)) 749 == NULL 750 || !EVP_CIPHER_meth_set_iv_length(cipher_handle->_hidden, 751 AES_IV_LEN) 752 || !EVP_CIPHER_meth_set_flags(cipher_handle->_hidden, 753 EVP_CIPH_CBC_MODE | EVP_CIPH_FLAG_DEFAULT_ASN1) 754 || !EVP_CIPHER_meth_set_init(cipher_handle->_hidden, 755 afalg_cipher_init) 756 || !EVP_CIPHER_meth_set_do_cipher(cipher_handle->_hidden, 757 afalg_do_cipher) 758 || !EVP_CIPHER_meth_set_cleanup(cipher_handle->_hidden, 759 afalg_cipher_cleanup) 760 || !EVP_CIPHER_meth_set_impl_ctx_size(cipher_handle->_hidden, 761 sizeof(afalg_ctx)))) { 762 EVP_CIPHER_meth_free(cipher_handle->_hidden); 763 cipher_handle->_hidden = NULL; 764 } 765 return cipher_handle->_hidden; 766 } 767 768 static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher, 769 const int **nids, int nid) 770 { 771 int r = 1; 772 773 if (cipher == NULL) { 774 *nids = afalg_cipher_nids; 775 return OSSL_NELEM(afalg_cipher_nids); 776 } 777 778 switch (nid) { 779 case NID_aes_128_cbc: 780 case NID_aes_192_cbc: 781 case NID_aes_256_cbc: 782 *cipher = afalg_aes_cbc(nid); 783 break; 784 default: 785 *cipher = NULL; 786 r = 0; 787 } 788 return r; 789 } 790 791 static int bind_afalg(ENGINE *e) 792 { 793 /* Ensure the afalg error handling is set up */ 794 unsigned short i; 795 ERR_load_AFALG_strings(); 796 797 if (!ENGINE_set_id(e, engine_afalg_id) 798 || !ENGINE_set_name(e, engine_afalg_name) 799 || !ENGINE_set_destroy_function(e, afalg_destroy) 800 || !ENGINE_set_init_function(e, afalg_init) 801 || !ENGINE_set_finish_function(e, afalg_finish)) { 802 AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED); 803 return 0; 804 } 805 806 /* 807 * Create _hidden_aes_xxx_cbc by calling afalg_aes_xxx_cbc 808 * now, as bind_aflag can only be called by one thread at a 809 * time. 810 */ 811 for (i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) { 812 if (afalg_aes_cbc(afalg_cipher_nids[i]) == NULL) { 813 AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED); 814 return 0; 815 } 816 } 817 818 if (!ENGINE_set_ciphers(e, afalg_ciphers)) { 819 AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED); 820 return 0; 821 } 822 823 return 1; 824 } 825 826 #ifndef OPENSSL_NO_DYNAMIC_ENGINE 827 static int bind_helper(ENGINE *e, const char *id) 828 { 829 if (id && (strcmp(id, engine_afalg_id) != 0)) 830 return 0; 831 832 if (!afalg_chk_platform()) 833 return 0; 834 835 if (!bind_afalg(e)) { 836 afalg_destroy(e); 837 return 0; 838 } 839 return 1; 840 } 841 842 IMPLEMENT_DYNAMIC_CHECK_FN() 843 IMPLEMENT_DYNAMIC_BIND_FN(bind_helper) 844 #endif 845 846 static int afalg_chk_platform(void) 847 { 848 int ret; 849 int i; 850 int kver[3] = { -1, -1, -1 }; 851 int sock; 852 char *str; 853 struct utsname ut; 854 855 ret = uname(&ut); 856 if (ret != 0) { 857 AFALGerr(AFALG_F_AFALG_CHK_PLATFORM, 858 AFALG_R_FAILED_TO_GET_PLATFORM_INFO); 859 return 0; 860 } 861 862 str = strtok(ut.release, "."); 863 for (i = 0; i < 3 && str != NULL; i++) { 864 kver[i] = atoi(str); 865 str = strtok(NULL, "."); 866 } 867 868 if (KERNEL_VERSION(kver[0], kver[1], kver[2]) 869 < KERNEL_VERSION(K_MAJ, K_MIN1, K_MIN2)) { 870 ALG_ERR("ASYNC AFALG not supported this kernel(%d.%d.%d)\n", 871 kver[0], kver[1], kver[2]); 872 ALG_ERR("ASYNC AFALG requires kernel version %d.%d.%d or later\n", 873 K_MAJ, K_MIN1, K_MIN2); 874 AFALGerr(AFALG_F_AFALG_CHK_PLATFORM, 875 AFALG_R_KERNEL_DOES_NOT_SUPPORT_ASYNC_AFALG); 876 return 0; 877 } 878 879 /* Test if we can actually create an AF_ALG socket */ 880 sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 881 if (sock == -1) { 882 AFALGerr(AFALG_F_AFALG_CHK_PLATFORM, AFALG_R_SOCKET_CREATE_FAILED); 883 return 0; 884 } 885 close(sock); 886 887 return 1; 888 } 889 890 #ifdef OPENSSL_NO_DYNAMIC_ENGINE 891 static ENGINE *engine_afalg(void) 892 { 893 ENGINE *ret = ENGINE_new(); 894 if (ret == NULL) 895 return NULL; 896 if (!bind_afalg(ret)) { 897 ENGINE_free(ret); 898 return NULL; 899 } 900 return ret; 901 } 902 903 void engine_load_afalg_int(void) 904 { 905 ENGINE *toadd; 906 907 if (!afalg_chk_platform()) 908 return; 909 910 toadd = engine_afalg(); 911 if (toadd == NULL) 912 return; 913 ERR_set_mark(); 914 ENGINE_add(toadd); 915 /* 916 * If the "add" worked, it gets a structural reference. So either way, we 917 * release our just-created reference. 918 */ 919 ENGINE_free(toadd); 920 /* 921 * If the "add" didn't work, it was probably a conflict because it was 922 * already added (eg. someone calling ENGINE_load_blah then calling 923 * ENGINE_load_builtin_engines() perhaps). 924 */ 925 ERR_pop_to_mark(); 926 } 927 #endif 928 929 static int afalg_init(ENGINE *e) 930 { 931 return 1; 932 } 933 934 static int afalg_finish(ENGINE *e) 935 { 936 return 1; 937 } 938 939 static int free_cbc(void) 940 { 941 short unsigned int i; 942 for (i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) { 943 EVP_CIPHER_meth_free(cbc_handle[i]._hidden); 944 cbc_handle[i]._hidden = NULL; 945 } 946 return 1; 947 } 948 949 static int afalg_destroy(ENGINE *e) 950 { 951 ERR_unload_AFALG_strings(); 952 free_cbc(); 953 return 1; 954 } 955 956 #endif /* KERNEL VERSION */ 957