mac.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_mac_dispatch(LSC_mac_t *op, int num, ...) 15 { 16 LE_STATUS sts = LE_STS_WARNING; 17 18 IMPL_COMMON_INTRO(mac, op, id, opdesc, key, key_id); 19 20 va_list ap; 21 22 va_start(ap, num); 23 switch (num) { 24 LSC_MAC_TYPE_BASE_DISPATCHES(id, op, sts, ap, opdesc->lsp_dispatch_cmds); 25 IMPL_OBJECT_DISPATCHES(ap, num, sts, mac, op, id, opdesc, key, key_id); 26 IMPL_GETTABLE_PARAMETER_DISPATCHES(ap, num, sts, mac, mac, op, opdesc); 27 IMPL_SETTABLE_PARAMETER_DISPATCHES(ap, num, sts, mac, mac, op, opdesc); 28 IMPL_SIZE_DISPATCH(ap, sts, mac, input, op, opdesc); 29 IMPL_SIZE_DISPATCH(ap, sts, mac, output, op, opdesc); 30 case LSC_NR_perform_mac_once: 31 if (opdesc->lsp_perform_mac_once != NULL) { 32 const unsigned char *msg = va_arg(ap, const unsigned char *); 33 size_t msglen = va_arg(ap, size_t); 34 unsigned char *sig = va_arg(ap, unsigned char *); 35 size_t sigsize = va_arg(ap, size_t); 36 size_t *siglen = va_arg(ap, size_t *); 37 38 sts = opdesc->lsp_perform_mac_once(op, msg, msglen, sig, sigsize, siglen); 39 } 40 break; 41 case LSC_NR_start_mac: 42 if (opdesc->lsp_start_mac != NULL) 43 sts = opdesc->lsp_start_mac(op); 44 break; 45 case LSC_NR_accumulate_mac_input: 46 if (opdesc->lsp_accumulate_mac_input != NULL) { 47 const unsigned char *in = va_arg(ap, const unsigned char *); 48 size_t inlen = va_arg(ap, size_t); 49 50 sts = opdesc->lsp_accumulate_mac_input(op, in, inlen); 51 } 52 break; 53 case LSC_NR_finalize_mac: 54 if (opdesc->lsp_finalize_mac != NULL) { 55 unsigned char *sig = va_arg(ap, unsigned char *); 56 size_t sigsize = va_arg(ap, size_t); 57 size_t *siglen = va_arg(ap, size_t *); 58 59 sts = opdesc->lsp_finalize_mac(op, sig, sigsize, siglen); 60 } 61 break; 62 case LSC_NR_stop_mac: 63 if (opdesc->lsp_stop_mac != NULL) 64 sts = opdesc->lsp_stop_mac(op); 65 break; 66 } 67 va_end(ap); 68 69 return sts; 70 } 71 72 LE_STATUS LSplugin_destroy_mac(LSC_mac_t *op) 73 { 74 if (op == NULL) 75 return LE_STS_SUCCESS; 76 if (op->lsc_dispatch_data == NULL) 77 return LE_STS_ERROR; 78 79 LE_STATUS sts = LE_STS_SUCCESS; 80 const LSplugin_mac_desc_t *opdesc = op->lsc_dispatch_data; 81 82 if (opdesc->lsp_clean_mac_data == NULL 83 || LE_status_is_OK(sts = opdesc->lsp_clean_mac_data(op))) 84 free(op); 85 return sts; 86 }