/ lib / mac.c
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  }