/ 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 }