Skip to content
Snippets Groups Projects
Commit 823a1651 authored by Bram Moolenaar's avatar Bram Moolenaar
Browse files

Minor updates to blowfish encryption.

parent 40e6a71c
No related merge requests found
...@@ -30,17 +30,15 @@ be worked on, but only if you sponsor Vim development. See |sponsor|. ...@@ -30,17 +30,15 @@ be worked on, but only if you sponsor Vim development. See |sponsor|.
*known-bugs* *known-bugs*
-------------------- Known bugs and current work ----------------------- -------------------- Known bugs and current work -----------------------
check blowfish.c
check sha256.c
Use 'cm' option only when FEAT_CRYPT is defined.
When not full match with magic, check for head and give warning about
unsupported crypt method.
if 'enc' is ucs-2, does utf-8 to ucs-2 encoding always work for seed?
Crypt update: Crypt update:
- move bf_self_test() and sha256_self_test() elsewhere - Use 'cm' option only when FEAT_CRYPT is defined.
- When not full match with magic, check for head and give warning about
unsupported crypt method.
- if 'enc' is ucs-2, does utf-8 to ucs-2 encoding always work for seed?
- Update E000 to error number. - Update E000 to error number.
Include cabal and obj syntax files. (Vincent Berthoux, 2010 May 16)
Cursor positioning wrong with 0x200e character. (John Becket, 2010 May 6) Cursor positioning wrong with 0x200e character. (John Becket, 2010 May 6)
E315 when trying to change a file in FileChangedRO autocommand event. E315 when trying to change a file in FileChangedRO autocommand event.
......
/* vi:set ts=8 sts=4 sw=4: /* vi:set ts=8 sts=4 sw=4:
* *
* Blowfish encryption for vim; in Blowfish output feedback mode. * Blowfish encryption for Vim; in Blowfish output feedback mode.
* GPL(C) Mohsin Ahmed, http://www.cs.albany.edu/~mosh * GPL(C) Mohsin Ahmed, http://www.cs.albany.edu/~mosh
* Based on http://www.schneier.com/blowfish.html by Bruce Schneier. * Based on http://www.schneier.com/blowfish.html by Bruce Schneier.
*/ */
...@@ -399,10 +399,10 @@ bf_key_init(password) ...@@ -399,10 +399,10 @@ bf_key_init(password)
{ {
int i, j, keypos = 0; int i, j, keypos = 0;
long_u val, data_l, data_r; long_u val, data_l, data_r;
char *key; char_u *key;
int keylen; int keylen;
key = sha256_key((char *)password); key = sha256_key(password);
keylen = STRLEN(key); keylen = STRLEN(key);
for (i = 0; i < 256; ++i) for (i = 0; i < 256; ++i)
{ {
...@@ -416,7 +416,7 @@ bf_key_init(password) ...@@ -416,7 +416,7 @@ bf_key_init(password)
{ {
val = 0; val = 0;
for (j = 0; j < 4; ++j) for (j = 0; j < 4; ++j)
val = (val << 8) | (key[keypos++ % keylen] & 0xff); val = (val << 8) | key[keypos++ % keylen];
pax[i] = ipa[i] ^ val; pax[i] = ipa[i] ^ val;
} }
......
/* sha256.c */ /* sha256.c */
char *sha256_key __ARGS((char *buf)); char_u *sha256_key __ARGS((char_u *buf));
int sha256_self_test __ARGS((void)); int sha256_self_test __ARGS((void));
void sha2_seed __ARGS((char_u header[], int header_len)); void sha2_seed __ARGS((char_u header[], int header_len));
/* vim: set ft=c : */ /* vim: set ft=c : */
...@@ -28,7 +28,7 @@ static void sha256_starts __ARGS((context_sha256_T *ctx)); ...@@ -28,7 +28,7 @@ static void sha256_starts __ARGS((context_sha256_T *ctx));
static void sha256_process __ARGS((context_sha256_T *ctx, char_u data[64])); static void sha256_process __ARGS((context_sha256_T *ctx, char_u data[64]));
static void sha256_update __ARGS((context_sha256_T *ctx, char_u *input, uint32_t length)); static void sha256_update __ARGS((context_sha256_T *ctx, char_u *input, uint32_t length));
static void sha256_finish __ARGS((context_sha256_T *ctx, char_u digest[32])); static void sha256_finish __ARGS((context_sha256_T *ctx, char_u digest[32]));
static char *sha256_bytes __ARGS((char *buf, int buflen)); static char_u *sha256_bytes __ARGS((char_u *buf, int buflen));
static unsigned int get_some_time __ARGS((void)); static unsigned int get_some_time __ARGS((void));
...@@ -277,48 +277,42 @@ sha256_finish(ctx, digest) ...@@ -277,48 +277,42 @@ sha256_finish(ctx, digest)
PUT_UINT32(ctx->state[7], digest, 28); PUT_UINT32(ctx->state[7], digest, 28);
} }
static char * /*
* Returns hex digest of "buf[buflen]" in a static array.
*/
static char_u *
sha256_bytes(buf, buflen) sha256_bytes(buf, buflen)
char *buf; char_u *buf;
int buflen; int buflen;
{ {
char_u sha256sum[32]; char_u sha256sum[32];
static char hexit[65]; static char_u hexit[65];
int j; int j;
context_sha256_T ctx; context_sha256_T ctx;
sha256_self_test(); sha256_self_test();
sha256_starts(&ctx); sha256_starts(&ctx);
sha256_update(&ctx, (char_u *)buf, buflen); sha256_update(&ctx, buf, buflen);
sha256_finish(&ctx, sha256sum); sha256_finish(&ctx, sha256sum);
for (j = 0; j < 32; j++) for (j = 0; j < 32; j++)
sprintf(hexit + j * 2, "%02x", sha256sum[j]); sprintf((char *)hexit + j * 2, "%02x", sha256sum[j]);
hexit[sizeof(hexit) - 1] = '\0'; hexit[sizeof(hexit) - 1] = '\0';
return hexit; return hexit;
} }
/* /*
* Returns sha256(buf) as 64 hex chars. * Returns sha256(buf) as 64 hex chars in static array.
*/ */
char * char_u *
sha256_key(buf) sha256_key(buf)
char *buf; char_u *buf;
{ {
static char *hexit = 0;
int buflen;
/* No passwd means don't encrypt */ /* No passwd means don't encrypt */
if (buf == NULL || *buf == NUL) if (buf == NULL || *buf == NUL)
return ""; return (char_u *)"";
/* if password is "0", reuse previous hash, for user convienience. */ return sha256_bytes(buf, STRLEN(buf));
if (!strcmp(buf, "0") && hexit)
return hexit;
buflen = strlen(buf);
hexit = sha256_bytes(buf, buflen);
return hexit;
} }
/* /*
...@@ -353,7 +347,7 @@ sha256_self_test() ...@@ -353,7 +347,7 @@ sha256_self_test()
char_u buf[1000]; char_u buf[1000];
char_u sha256sum[32]; char_u sha256sum[32];
static int failures = 0; static int failures = 0;
char *hexit; char_u *hexit;
static int sha256_self_tested = 0; static int sha256_self_tested = 0;
if (sha256_self_tested > 0) if (sha256_self_tested > 0)
...@@ -364,9 +358,9 @@ sha256_self_test() ...@@ -364,9 +358,9 @@ sha256_self_test()
{ {
if (i < 2) if (i < 2)
{ {
hexit = sha256_bytes(sha_self_test_msg[i], hexit = sha256_bytes((char_u *)sha_self_test_msg[i],
strlen(sha_self_test_msg[i])); STRLEN(sha_self_test_msg[i]));
strcpy(output, hexit); STRCPY(output, hexit);
} }
else else
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment