encryptor.c
1 // SPDX-FileCopyrightText: 2023-2024 Le'Sec Plugin collective 2 // 3 // SPDX-License-Identifier: LGPL-3.0-or-later 4 5 #include <stdarg.h> 6 #include <string.h> 7 #include <stdbool.h> 8 #include <assert.h> 9 #include <lsplugin/param.h> 10 #include <lsplugin/mkoperator.h> 11 #include <lsplugin/mkobject.h> 12 #include "operator-impl.h" 13 14 LE_STATUS LSplugin_encryptor_dispatch(LSC_encryptor_t *op, int num, ...) 15 { 16 LE_STATUS sts = LE_STS_WARNING; 17 18 IMPL_COMMON_INTRO(encryptor, op, id, opdesc, key, key_id); 19 20 va_list ap; 21 22 va_start(ap, num); 23 switch (num) { 24 LSC_ENCRYPTOR_TYPE_BASE_DISPATCHES(id, op, sts, ap, opdesc->lsp_dispatch_cmds); 25 IMPL_OBJECT_DISPATCHES(ap, num, sts, encryptor, op, id, opdesc, key, key_id); 26 IMPL_GETTABLE_PARAMETER_DISPATCHES(ap, num, sts, encryptor, encryption, op, opdesc); 27 IMPL_SETTABLE_PARAMETER_DISPATCHES(ap, num, sts, encryptor, encryption, op, opdesc); 28 IMPL_SIZE_DISPATCH(ap, sts, encryptor, unit, op, opdesc); 29 IMPL_SIZE_DISPATCH(ap, sts, encryptor, input, op, opdesc); 30 IMPL_SIZE_DISPATCH(ap, sts, encryptor, output, op, opdesc); 31 case LSC_NR_perform_encryption_once: 32 if (opdesc->lsp_perform_encryption_once != NULL) { 33 const unsigned char *in = va_arg(ap, const unsigned char *); 34 size_t inlen = va_arg(ap, size_t); 35 unsigned char *out = va_arg(ap, unsigned char *); 36 size_t outsize = va_arg(ap, size_t); 37 size_t *outlen = va_arg(ap, size_t *); 38 39 sts = opdesc->lsp_perform_encryption_once(op, in, inlen, 40 out, outsize, outlen); 41 } 42 break; 43 case LSC_NR_start_encryption: 44 if (opdesc->lsp_start_encryption != NULL) 45 sts = opdesc->lsp_start_encryption(op); 46 break; 47 case LSC_NR_perform_encryption: 48 if (opdesc->lsp_perform_encryption != NULL) { 49 const unsigned char *in = va_arg(ap, const unsigned char *); 50 size_t inlen = va_arg(ap, size_t); 51 unsigned char *out = va_arg(ap, unsigned char *); 52 size_t outsize = va_arg(ap, size_t); 53 size_t *outlen = va_arg(ap, size_t *); 54 55 sts = opdesc->lsp_perform_encryption(op, in, inlen, out, outsize, outlen); 56 } 57 break; 58 case LSC_NR_finalize_encryption: 59 if (opdesc->lsp_finalize_encryption != NULL) { 60 unsigned char *out = va_arg(ap, unsigned char *); 61 size_t outsize = va_arg(ap, size_t); 62 size_t *outlen = va_arg(ap, size_t *); 63 64 sts = opdesc->lsp_finalize_encryption(op, out, outsize, outlen); 65 } 66 break; 67 case LSC_NR_stop_encryption: 68 if (opdesc->lsp_stop_encryption != NULL) 69 sts = opdesc->lsp_stop_encryption(op); 70 break; 71 } 72 va_end(ap); 73 74 return sts; 75 } 76 77 LE_STATUS LSplugin_destroy_encryptor(LSC_encryptor_t *op) 78 { 79 if (op == NULL) 80 return LE_STS_SUCCESS; 81 if (op->lsc_dispatch_data == NULL) 82 return LE_STS_ERROR; 83 84 LE_STATUS sts = LE_STS_SUCCESS; 85 const LSplugin_encryptor_desc_t *opdesc = op->lsc_dispatch_data; 86 87 if (opdesc->lsp_clean_encryptor_data == NULL 88 || LE_status_is_OK(sts = opdesc->lsp_clean_encryptor_data(op))) 89 free(op); 90 return sts; 91 }