/ lib / encapsulator.c
encapsulator.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_encapsulator_dispatch(LSC_encapsulator_t *op, int num, ...)
15  {
16    LE_STATUS sts = LE_STS_WARNING;
17  
18    IMPL_COMMON_INTRO(encapsulator, op, id, opdesc, key, key_id);
19  
20    va_list ap;
21  
22    va_start(ap, num);
23    switch (num) {
24      LSC_ENCAPSULATOR_TYPE_BASE_DISPATCHES(id, op, sts, ap, opdesc->lsp_dispatch_cmds);
25      IMPL_OBJECT_DISPATCHES(ap, num, sts, encapsulator, op, id, opdesc, key, key_id);
26      IMPL_GETTABLE_PARAMETER_DISPATCHES(ap, num, sts, encapsulator, encapsulation, op, opdesc);
27      IMPL_SETTABLE_PARAMETER_DISPATCHES(ap, num, sts, encapsulator, encapsulation, op, opdesc);
28      IMPL_SIZE_DISPATCH(ap, sts, encapsulator, shared_secret, op, opdesc);
29      IMPL_SIZE_DISPATCH(ap, sts, encapsulator, output, op, opdesc);
30    case LSC_NR_perform_encapsulation_once:
31      if (opdesc->lsp_perform_encapsulation_once != NULL) {
32        unsigned char *wrappedsecret = va_arg(ap, unsigned char *);
33        size_t wrappedsecretsize = va_arg(ap, size_t);
34        size_t *wrappedsecretlen = va_arg(ap, size_t *);
35        unsigned char *sharedsecret = va_arg(ap, unsigned char *);
36        size_t sharedsecretsize = va_arg(ap, size_t);
37        size_t *sharedsecretlen = va_arg(ap, size_t *);
38  
39        sts = opdesc->lsp_perform_encapsulation_once(op,
40                                                     wrappedsecret,
41                                                     wrappedsecretsize,
42                                                     wrappedsecretlen,
43                                                     sharedsecret,
44                                                     sharedsecretsize,
45                                                     sharedsecretlen);
46      }
47      break;
48    }
49    va_end(ap);
50  
51    return sts;
52  }
53  
54  LE_STATUS LSplugin_destroy_encapsulator(LSC_encapsulator_t *op)
55  {
56    if (op == NULL)
57      return LE_STS_SUCCESS;
58    if (op->lsc_dispatch_data == NULL)
59      return LE_STS_ERROR;
60  
61    LE_STATUS sts = LE_STS_SUCCESS;
62    const LSplugin_encapsulator_desc_t *opdesc = op->lsc_dispatch_data;
63  
64    if (opdesc->lsp_clean_encapsulator_data == NULL
65        || LE_status_is_OK(sts = opdesc->lsp_clean_encapsulator_data(op)))
66      free(op);
67    return sts;
68  }