/ plugin2.c
plugin2.c
  1  #include <assert.h>
  2  #include <string.h>
  3  #include <lscore/plugin.h>
  4  #include <lscore/param.h>
  5  #include <lsplugin/mkobject.h>
  6  #include <lsplugin/mkoperator.h>
  7  #include <lsplugin/register.h>
  8  #include <lsplugin/param.h>
  9  #include "vigenere.h"
 10  
 11  static LE_STATUS set_encryptor_v_key(LSC_encryptor_t *op, LSC_key_t *key)
 12  {
 13    assert(op != NULL && key != NULL);
 14    op->lsc_data = key;
 15    return LE_STS_SUCCESS;
 16  }
 17  
 18  static LE_STATUS get_encryptor_v_key(LSC_encryptor_t *op, LSC_key_t **key)
 19  {
 20    assert(op != NULL && key != NULL);
 21    *key = op->lsc_data;
 22    return LE_STS_SUCCESS;
 23  }
 24  
 25  static LE_STATUS get_v_encryption_unit_size(LSC_encryptor_t *enc, size_t *size)
 26  {
 27    *size = 1;
 28    return LE_STS_SUCCESS;
 29  }
 30  
 31  static LE_STATUS get_v_encryption_input_size(LSC_encryptor_t *enc, size_t *size)
 32  {
 33    *size = 0;
 34    return LE_STS_SUCCESS;
 35  }
 36  
 37  static LE_STATUS get_v_encryption_output_size(LSC_encryptor_t *enc, size_t *size)
 38  {
 39    *size = 0;
 40    return LE_STS_SUCCESS;
 41  }
 42  
 43  LE_STATUS start_v_encryption(LSC_encryptor_t *enc)
 44  {
 45    assert(enc != NULL && enc->lsc_data != NULL);
 46    LSC_key_t *key = enc->lsc_data;
 47  
 48    if (key->lsc_dispatch != LSplugin_key_dispatch)
 49      return LE_STS_ERROR;
 50  
 51    /* Not much to do here */
 52    return LE_STS_SUCCESS;
 53  }
 54  
 55  LE_STATUS perform_v_encryption(LSC_encryptor_t *enc,
 56                                 const unsigned char *in, size_t inlen,
 57                                 unsigned char *out, size_t outsize,
 58                                 size_t *outlen)
 59  {
 60    assert(enc != NULL && enc->lsc_data != NULL);
 61    LSC_key_t *key = enc->lsc_data;
 62  
 63    if (key->lsc_dispatch != LSplugin_key_dispatch)
 64      return LE_STS_ERROR;
 65  
 66    int res = vigenere_encrypt(in, inlen, out, outsize, key->lsc_data);
 67    *outlen = inlen;
 68    return res ? LE_STS_SUCCESS : LE_STS_ERROR;
 69  }
 70  
 71  LE_STATUS finalize_v_encryption(LSC_encryptor_t *enc, unsigned char *out,
 72                                  size_t outsize, size_t *outlen)
 73  {
 74    assert(enc != NULL && enc->lsc_data != NULL);
 75    LSC_key_t *key = enc->lsc_data;
 76  
 77    if (key->lsc_dispatch != LSplugin_key_dispatch)
 78      return LE_STS_ERROR;
 79  
 80    *outlen = 0;
 81    return LE_STS_SUCCESS;
 82  }
 83  
 84  LE_STATUS stop_v_encryption(LSC_encryptor_t *enc)
 85  {
 86    assert(enc != NULL && enc->lsc_data != NULL);
 87    LSC_key_t *key = enc->lsc_data;
 88  
 89    if (key->lsc_dispatch != LSplugin_key_dispatch)
 90      return LE_STS_ERROR;
 91  
 92    /* Not much to do here */
 93    return LE_STS_SUCCESS;
 94  }
 95  
 96  const LSplugin_encryptor_desc_t v_encryptor_desc = {
 97    NULL, "vigenere", NULL, "vigenere", /* lsp_docstring, lsp_id, lsp_priv_desc, lsp_key_id */
 98    NULL, NULL,                   /* No special data, yet */
 99    NULL,                         /* No setting the key encryptor */
100    set_encryptor_v_key,
101    get_encryptor_v_key,
102    (int[]){ LSC_ENCRYPTOR_TYPE_BASE_COMMANDS(),
103             LSC_ENCRYPTOR_SIZE_COMMANDS(),
104             LSC_NR_start_encryption,
105             LSC_NR_perform_encryption,
106             LSC_NR_finalize_encryption,
107             LSC_NR_stop_encryption, 0 },
108    NULL, NULL, NULL,
109    get_v_encryption_unit_size,
110    get_v_encryption_input_size,
111    get_v_encryption_output_size,
112    NULL,
113    start_v_encryption,
114    perform_v_encryption,
115    finalize_v_encryption,
116    stop_v_encryption
117  };
118  
119  const LSplugin_encryptor_desc_t v_key_encryptor_desc = {
120    NULL, NULL, NULL, NULL, /* lsp_docstring, lsp_id, lsp_priv_desc, lsp_key_id */
121    NULL, NULL,             /* No special data, yet */
122    NULL,                   /* No caching the key operation */
123    set_encryptor_v_key,
124    get_encryptor_v_key,
125    (int[]){ LSC_ENCRYPTOR_TYPE_BASE_COMMANDS(),
126             LSC_ENCRYPTOR_SIZE_COMMANDS(),
127             LSC_NR_start_encryption,
128             LSC_NR_perform_encryption,
129             LSC_NR_finalize_encryption,
130             LSC_NR_stop_encryption, 0 },
131    NULL, NULL, NULL,
132    get_v_encryption_unit_size,
133    get_v_encryption_input_size,
134    get_v_encryption_output_size,
135    NULL,
136    start_v_encryption,
137    perform_v_encryption,
138    finalize_v_encryption,
139    stop_v_encryption
140  };
141  
142  static LE_STATUS set_decryptor_v_key(LSC_decryptor_t *op, LSC_key_t *key)
143  {
144    assert(op != NULL && key != NULL);
145    op->lsc_data = key;
146    return LE_STS_SUCCESS;
147  }
148  
149  static LE_STATUS get_decryptor_v_key(LSC_decryptor_t *op, LSC_key_t **key)
150  {
151    assert(op != NULL && key != NULL);
152    *key = op->lsc_data;
153    return LE_STS_SUCCESS;
154  }
155  
156  static LE_STATUS get_v_decryption_unit_size(LSC_decryptor_t *enc, size_t *size)
157  {
158    *size = 1;
159    return LE_STS_SUCCESS;
160  }
161  
162  static LE_STATUS get_v_decryption_input_size(LSC_decryptor_t *enc, size_t *size)
163  {
164    *size = 0;
165    return LE_STS_SUCCESS;
166  }
167  
168  static LE_STATUS get_v_decryption_output_size(LSC_decryptor_t *enc, size_t *size)
169  {
170    *size = 0;
171    return LE_STS_SUCCESS;
172  }
173  
174  LE_STATUS start_v_decryption(LSC_decryptor_t *dec)
175  {
176    assert(dec != NULL && dec->lsc_data != NULL);
177    LSC_key_t *key = dec->lsc_data;
178  
179    if (key->lsc_dispatch != LSplugin_key_dispatch)
180      return LE_STS_ERROR;
181  
182    /* Not much to do here */
183    return LE_STS_SUCCESS;
184  }
185  
186  LE_STATUS perform_v_decryption(LSC_decryptor_t *dec,
187                                 const unsigned char *in, size_t inlen,
188                                 unsigned char *out, size_t outsize,
189                                 size_t *outlen)
190  {
191    assert(dec != NULL && dec->lsc_data != NULL);
192    LSC_key_t *key = dec->lsc_data;
193  
194    if (key->lsc_dispatch != LSplugin_key_dispatch)
195      return LE_STS_ERROR;
196  
197    int res = vigenere_decrypt(in, inlen, out, outsize, key->lsc_data);
198    *outlen = inlen;
199    return res ? LE_STS_SUCCESS : LE_STS_ERROR;
200  }
201  
202  LE_STATUS finalize_v_decryption(LSC_decryptor_t *dec, unsigned char *out,
203                                   size_t outsize, size_t *outlen)
204  {
205    assert(dec != NULL && dec->lsc_data != NULL);
206    LSC_key_t *key = dec->lsc_data;
207  
208    if (key->lsc_dispatch != LSplugin_key_dispatch)
209      return LE_STS_ERROR;
210  
211    *outlen = 0;
212    return LE_STS_SUCCESS;
213  }
214  
215  LE_STATUS stop_v_decryption(LSC_decryptor_t *dec)
216  {
217    assert(dec != NULL && dec->lsc_data != NULL);
218    LSC_key_t *key = dec->lsc_data;
219  
220    if (key->lsc_dispatch != LSplugin_key_dispatch)
221      return LE_STS_ERROR;
222  
223    /* Not much to do here */
224    return LE_STS_SUCCESS;
225  }
226  
227  const LSplugin_decryptor_desc_t v_decryptor_desc = {
228    NULL, "vigenere", NULL, "vigenere", /* lsp_docstring, lsp_id, lsp_priv_desc, lsp_key_id */
229    NULL, NULL,
230    NULL,                         /* No setting the key decryptor */
231    set_decryptor_v_key,
232    get_decryptor_v_key,
233    (int[]){ LSC_DECRYPTOR_TYPE_BASE_COMMANDS(),
234             LSC_DECRYPTOR_SIZE_COMMANDS(),
235             LSC_NR_start_decryption,
236             LSC_NR_perform_decryption,
237             LSC_NR_finalize_decryption,
238             LSC_NR_stop_decryption, 0 },
239    NULL, NULL, NULL,
240    get_v_decryption_unit_size,
241    get_v_decryption_input_size,
242    get_v_decryption_output_size,
243    NULL,
244    start_v_decryption,
245    perform_v_decryption,
246    finalize_v_decryption,
247    stop_v_decryption
248  };
249  
250  const LSplugin_decryptor_desc_t v_key_decryptor_desc = {
251    NULL, NULL, NULL, NULL, /* lsp_docstring, lsp_id, lsp_priv_desc, lsp_key_id */
252    NULL, NULL,             /* No special data, yet */
253    NULL,                   /* No caching the key operation */
254    set_decryptor_v_key,
255    get_decryptor_v_key,
256    (int[]){ LSC_DECRYPTOR_TYPE_BASE_COMMANDS(),
257             LSC_DECRYPTOR_SIZE_COMMANDS(),
258             LSC_NR_start_decryption,
259             LSC_NR_perform_decryption,
260             LSC_NR_finalize_decryption,
261             LSC_NR_stop_decryption, 0 },
262    NULL, NULL, NULL,
263    get_v_decryption_unit_size,
264    get_v_decryption_input_size,
265    get_v_decryption_output_size,
266    NULL,
267    start_v_decryption,
268    perform_v_decryption,
269    finalize_v_decryption,
270    stop_v_decryption
271  };
272  
273  /* ----------------------------------------------------------------------------- */
274  
275  static LE_STATUS set_constructor_v_key(LSC_key_constructor_t *op, LSC_key_t *key)
276  {
277    assert(op != NULL && key != NULL);
278    op->lsc_data = key;
279    return LE_STS_SUCCESS;
280  }
281  
282  static LE_STATUS get_constructor_v_key(LSC_key_constructor_t *op, LSC_key_t **key)
283  {
284    assert(op != NULL && key != NULL);
285    *key = op->lsc_data;
286    return LE_STS_SUCCESS;
287  }
288  
289  static LE_STATUS set_constructor_key_param(void *o, LSC_param_t *data, size_t index,
290                                             size_t data_offset, size_t datalen_offset)
291  {
292    LSC_key_t *key = o;
293    struct vigenere_key_st *k = key->lsc_data;
294  
295    assert(data_offset == 0);
296    vigenere_init(k, data->data, data->size / 8);
297    if (data->len != NULL)
298      *data->len = data->size;
299    return LE_STS_SUCCESS;
300  }
301  
302  static LSplugin_param_functions_t key_fns = {
303    0, 0, 0, false,
304    set_constructor_key_param, NULL
305  };
306  
307  static const LSC_param_desc_t constructor_param_descs[] = {
308    { "key", 1,
309      .p_data = { LSC_DT_bit_string, { { 8, 0, 8 } } },
310      .p_private = &key_fns,
311      .p_docstring = "The key bits used for encryption / decryption" },
312    { NULL, }
313  };
314  
315  static LE_STATUS
316  get_constructor_param_data(LSC_key_constructor_t *op, void **data)
317  {
318    *data = op->lsc_data;
319    return LE_STS_SUCCESS;
320  }
321  
322  static LE_STATUS
323  get_constructor_settable_param_desc(LSC_key_constructor_t *op,
324                                      const LSC_param_desc_t **param_desc)
325  {
326    *param_desc = constructor_param_descs;
327    return LE_STS_SUCCESS;
328  }
329  
330  static LE_STATUS construct_v_key(LSC_key_constructor_t *op)
331  {
332    /* Do nothing here, as we've done it all when setting the key param */
333    return LE_STS_SUCCESS;
334  }
335  
336  const LSplugin_key_constructor_desc_t v_key_constructor_desc = {
337    NULL, NULL, NULL, NULL, /* lsp_docstring, lsp_id, lsp_priv_desc, lsp_key_id */
338    NULL, NULL,
339    NULL,                         /* No caching the key constructor */
340    set_constructor_v_key,
341    get_constructor_v_key,
342    (int[]){ LSC_KEY_TYPE_BASE_COMMANDS(),
343             LSC_NR_construct_key, 0 },
344    get_constructor_param_data,
345    NULL,
346    get_constructor_settable_param_desc,
347    construct_v_key,
348  };
349  
350  /* ----------------------------------------------------------------------------- */
351  
352  LE_STATUS setup_v_key_data(LSC_key_t *key, const void *priv_desc)
353  {
354    if (key->lsc_data == NULL) {
355      key->lsc_data = malloc(sizeof(struct vigenere_key_st));
356      if (key->lsc_data == NULL)
357        return LE_STS_ERROR;
358      memset(key->lsc_data, 0, sizeof(struct vigenere_key_st));
359    }
360    return LE_STS_SUCCESS;
361  }
362  
363  LE_STATUS clean_v_key_data(LSC_key_t *key)
364  {
365    vigenere_done(key->lsc_data); /* For good measure */
366    free(key->lsc_data);
367    key->lsc_data = NULL;
368    return LE_STS_SUCCESS;
369  }
370  
371  static LE_STATUS get_v_key_size(LSC_key_t *key, size_t *keysize)
372  {
373    struct vigenere_key_st *k = key->lsc_data;
374    if (k == NULL || k->key == NULL)
375      return LE_STS_ERROR;
376  
377    *keysize = k->keysize;
378    return LE_STS_SUCCESS;
379  }
380  
381  const LSplugin_key_desc_t v_key_desc = {
382    NULL, "vigenere", NULL,
383    setup_v_key_data, clean_v_key_data,
384    (int[]){ LSC_KEY_TYPE_BASE_COMMANDS(),
385             LSC_NR_get_key_size,
386             LSC_NR_get_key_constructor,
387             LSC_NR_get_associated_encryptor,
388             LSC_NR_get_associated_decryptor, 0 },
389    get_v_key_size,
390    NULL,
391    &v_key_constructor_desc,
392    NULL,
393    &v_key_encryptor_desc,
394    &v_key_decryptor_desc,
395  };
396  
397  /* ----------------------------------------------------------------------------- */
398  
399  LSC_EXPORT const char LSC_plugin_docstring[] =
400    "The Vigenère plugin - 'vigenere' is a modern implementation of the \
401  a cipher first described by Giovan Battista Bellaso in 1553, and was \
402  later misattributed to Blaise de Vigenère.\n\
403  \n\
404  Read all about it in https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher.";
405  
406  static const LSplugin_key_desc_t *key_impls[] = { &v_key_desc, NULL };
407  static const LSplugin_encryptor_desc_t *enc_impls[] = { &v_encryptor_desc, NULL };
408  static const LSplugin_decryptor_desc_t *dec_impls[] = { &v_decryptor_desc, NULL };
409  
410  LSC_EXPORT LE_STATUS LSC_plugin_start(LSC_plugin_t *plugin)
411  {
412    LSC_env_t *env;
413    LE_STATUS sts;
414  
415    if (!LE_status_is_OK(sts = LSC_get_plugin_parent_environment(plugin, &env)))
416      return sts;
417    sts = LSplugin_register_key_implementations(env, plugin, key_impls);
418    if (!LE_status_is_OK(sts))
419      return sts;
420    sts = LSplugin_register_encryptor_implementations(env, plugin, enc_impls);
421    if (!LE_status_is_OK(sts))
422      return sts;
423    sts = LSplugin_register_decryptor_implementations(env, plugin, dec_impls);
424    return sts;
425  }
426  
427  LSC_EXPORT LE_STATUS LSC_plugin_stop(LSC_plugin_t *plugin)
428  {
429    LSC_env_t *env;
430    LE_STATUS sts;
431  
432    if (!LE_status_is_OK(sts = LSC_get_plugin_parent_environment(plugin, &env)))
433      return sts;
434    sts = LSplugin_deregister_key_implementations(env, plugin, key_impls);
435    if (!LE_status_is_OK(sts))
436      return sts;
437    sts = LSplugin_deregister_encryptor_implementations(env, plugin, enc_impls);
438    if (!LE_status_is_OK(sts))
439      return sts;
440    sts = LSplugin_deregister_decryptor_implementations(env, plugin, dec_impls);
441    return sts;
442  }