summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/crypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/crypt.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/crypt.c98
1 files changed, 98 insertions, 0 deletions
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 <stdio.h>
+#include <string.h>
+
+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