summaryrefslogtreecommitdiff
path: root/src/misc2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc2.c')
-rw-r--r--src/misc2.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/misc2.c b/src/misc2.c
index 8cd568304..3abef1562 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -3685,6 +3685,11 @@ update_mouseshape(shape_idx)
* NOTE FOR USA: Since 2000 exporting this code from the USA is allowed to
* most countries. There are a few exceptions, but that still should not be a
* problem since this code was originally created in Europe and India.
+ *
+ * Blowfish addition originally made by Mohsin Ahmed,
+ * http://www.cs.albany.edu/~mosh 2010-03-14
+ * Based on blowfish by Bruce Schneier (http://www.schneier.com/blowfish.html)
+ * and sha256 by Christophe Devine.
*/
/* from zip.h */
@@ -3730,6 +3735,8 @@ decrypt_byte()
{
ush temp;
+ if (use_crypt_method > 0)
+ return bf_ranbyte();
temp = (ush)keys[2] | 2;
return (int)(((unsigned)(temp * (temp ^ 1)) >> 8) & 0xff);
}
@@ -3737,15 +3744,19 @@ decrypt_byte()
/*
* Update the encryption keys with the next byte of plain text
*/
- int
+ void
update_keys(c)
int c; /* byte of plain text */
{
- keys[0] = CRC32(keys[0], c);
- keys[1] += keys[0] & 0xff;
- keys[1] = keys[1] * 134775813L + 1;
- keys[2] = CRC32(keys[2], (int)(keys[1] >> 24));
- return c;
+ if (use_crypt_method > 0)
+ bf_ofb_update( (unsigned char) c);
+ else
+ {
+ keys[0] = CRC32(keys[0], c);
+ keys[1] += keys[0] & 0xff;
+ keys[1] = keys[1] * 134775813L + 1;
+ keys[2] = CRC32(keys[2], (int)(keys[1] >> 24));
+ }
}
/*
@@ -3769,8 +3780,26 @@ crypt_init_keys(passwd)
}
/*
+ * Free an allocated crypt key. Clear the text to make sure it doesn't stay
+ * in memory anywhere.
+ */
+ void
+free_crypt_key(key)
+ char_u *key;
+{
+ char_u *p;
+
+ if (key != NULL)
+ {
+ for (p = key; *p != NUL; ++p)
+ *p++ = 0;
+ vim_free(key);
+ }
+}
+
+/*
* Ask the user for a crypt key.
- * When "store" is TRUE, the new key in stored in the 'key' option, and the
+ * When "store" is TRUE, the new key is stored in the 'key' option, and the
* 'key' option value is returned: Don't free it.
* When "store" is FALSE, the typed key is returned in allocated memory.
* Returns NULL on failure.
@@ -3801,16 +3830,17 @@ get_crypt_key(store, twice)
if (p2 != NULL && STRCMP(p1, p2) != 0)
{
MSG(_("Keys don't match!"));
- vim_free(p1);
- vim_free(p2);
+ free_crypt_key(p1);
+ free_crypt_key(p2);
p2 = NULL;
round = -1; /* do it again */
continue;
}
+
if (store)
{
set_option_value((char_u *)"key", 0L, p1, OPT_LOCAL);
- vim_free(p1);
+ free_crypt_key(p1);
p1 = curbuf->b_p_key;
}
break;
@@ -3822,7 +3852,7 @@ get_crypt_key(store, twice)
need_wait_return = FALSE;
msg_didout = FALSE;
- vim_free(p2);
+ free_crypt_key(p2);
return p1;
}