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