From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/crypt.c | 98 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/crypt.c (limited to 'reference/C/CONTRIB/SNIP/crypt.c') diff --git a/reference/C/CONTRIB/SNIP/crypt.c b/reference/C/CONTRIB/SNIP/crypt.c new file mode 100755 index 0000000..cbfac15 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/crypt.c @@ -0,0 +1,98 @@ +/****************************************************************/ +/* */ +/* S-CODER - Encrypt/decrypt data */ +/* */ +/* Copyright 1987-1989 by Robert B. Stout dba MicroFirm */ +/* */ +/* Originally written by Bob Stout with modifications */ +/* suggested by Mike Smedley. */ +/* */ +/* This code may be used freely in any program for any */ +/* application, personal or commercial. */ +/* */ +/* Current commercial availability: */ +/* */ +/* 1. MicroFirm Toolkit ver 3.00: LYNX and CRYPT utilities */ +/* 2. CXL libraries (MSC, TC, ZTC/C++, PC): fcrypt() */ +/* dedicated file encryption function */ +/* 3. SMTC & MFLZT libraries: crypt() function */ +/* */ +/****************************************************************/ + +char *cryptext; /* The actual encryption/decryption key */ +int crypt_ptr = 0; /* Circular pointer to elements of key */ +int crypt_length; /* Set externally to strlen(cryptext) */ + +/* NOTES: cryptext should be set and qualified (to something over + 5-6 chars, minimum) by the calling program, which should + also set crypt_ptr in the range of 0 to strlen(cryptext) + before each use. If crypt() is used to encrypt several + buffers, cryptext should be reloaded and crypt_ptr reset + before each buffer is encrypted. The encryption is both + reversible - to decrypt data, pass it back through crypt() + using the original key and original initial value of + crypt_ptr - and multiple passes are commutative. +*/ + +/**** Encrypt/decrypt buffer datum ******************************/ +void crypt(unsigned char *buf) +{ + *buf ^= cryptext[crypt_ptr] ^ (cryptext[0] * crypt_ptr); + cryptext[crypt_ptr] += ((crypt_ptr < (crypt_length - 1)) ? + cryptext[crypt_ptr + 1] : cryptext[0]); + if (!cryptext[crypt_ptr]) + cryptext[crypt_ptr] += 1; + if (++crypt_ptr >= crypt_length) + crypt_ptr = 0; +} + +/**** Encrypt/decrypt buffer ************************************/ +void bufcrypt(unsigned char *buf, long length) +{ + while (length--) + crypt(*buf++) +} + +#ifdef TEST + +#include +#include + +int main(int argc, char *argv[]) +{ + static char buf[16384]; + size_t len, i; + FILE *in, *out; + + if (4 > argc) + { + puts("Usage: CRYPT password infile outfile"); + return -1; + } + cryptext = argv[1]; + crypt_length = strlen(cryptext); + if (NULL == (in = fopen(argv[2], "rb"))) + { + printf("Can't open %s for input\n", argv[2]); + return -1; + } + if (NULL == (out = fopen(argv[3], "wb"))) + { + printf("Can't open %s for output\n", argv[3]); + return -1; + } + do + { + if (0 != (len = fread(buf, 1, 16384, in))) + { + for (i = 0; i < len; ++i) + crypt(&buf[i]); + fwrite(buf, 1, len, out); + } + } while (len); + fclose(in); + fclose(out); + return 0; +} + +#endif -- cgit v1.2.3-54-g00ecf