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 }