/ vigenere.c
vigenere.c
 1  #include <string.h>
 2  #include "vigenere.h"
 3  
 4  int vigenere_init(struct vigenere_key_st *k, unsigned char *key, size_t keylen)
 5  {
 6    if (k == NULL)
 7      return 0;
 8  
 9    unsigned char *keycopy = strndup(key, keylen);
10  
11    if (keycopy != NULL) {
12      free(k->key);
13      k->key = keycopy;
14      k->keysize = keylen;
15      k->keypos = 0;
16    }
17    return keycopy != NULL;
18  }
19  
20  static int vigenere_process(const unsigned char *in, size_t inlen,
21                              unsigned char *out, size_t outsize,
22                              struct vigenere_key_st *k, int enc)
23  {
24    if (in == NULL || out == NULL)
25      return 0;
26    for (; inlen-- > 0;) {
27      unsigned char b = k->key[k->keypos++];
28      if (!enc)
29        b = 256 - b;
30      *out++ = (*in++ + b) % 256;
31      if (k->keypos >= k->keysize)
32        k->keypos = 0;
33    }
34    return 1;
35  }
36  
37  int vigenere_encrypt(const unsigned char *in, size_t inlen,
38                       unsigned char *out, size_t outsize,
39                       struct vigenere_key_st *k)
40  {
41    return vigenere_process(in, inlen, out, outsize, k, 1);
42  }
43  
44  int vigenere_decrypt(const unsigned char *in, size_t inlen,
45                       unsigned char *out, size_t outsize,
46                       struct vigenere_key_st *k)
47  {
48    return vigenere_process(in, inlen, out, outsize, k, 0);
49  }
50  
51  int vigenere_done(struct vigenere_key_st *k)
52  {
53    if (k == NULL)
54      return 0;
55  
56    free(k->key);
57    k->key = NULL;
58    k->keysize = 0;
59    return 1;
60  }