X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/bc0e5117261113416f9ba335de4296df186d9eb1..1890cc7d2037b5ea90e67a63b24b377244565322:/stglibs/crypto.lib/blowfish.c diff --git a/stglibs/crypto.lib/blowfish.c b/stglibs/crypto.lib/blowfish.c index 6a60b638..384d3a10 100644 --- a/stglibs/crypto.lib/blowfish.c +++ b/stglibs/crypto.lib/blowfish.c @@ -437,7 +437,7 @@ for (i = 0; i < 4; ++i) } } //----------------------------------------------------------------------------- -void EnDecodeInit(const char * passwd, size_t length, BLOWFISH_CTX *ctx) +void InitContext(const char * passwd, size_t length, BLOWFISH_CTX * ctx) { unsigned char keyL[PASSWD_LEN]; @@ -467,47 +467,62 @@ void block2bytes(uint32_t t, char * c) *c = t >> 24 & 0x000000FF; } //----------------------------------------------------------------------------- -void DecodeString(char * d, const char * s, const BLOWFISH_CTX *ctx) +void DecryptBlock(void * d, const void * s, const BLOWFISH_CTX *ctx) { -uint32_t a = bytes2block(s); -uint32_t b = bytes2block(s + 4); +const char * src = s; +char * dest = d; +uint32_t a = bytes2block(src); +uint32_t b = bytes2block(src + 4); Blowfish_Decrypt(ctx, &a, &b); -block2bytes(a, d); -block2bytes(b, d + 4); +block2bytes(a, dest); +block2bytes(b, dest + 4); } //----------------------------------------------------------------------------- -void EncodeString(char * d, const char * s, const BLOWFISH_CTX *ctx) +void EncryptBlock(void * d, const void * s, const BLOWFISH_CTX *ctx) { -uint32_t a = bytes2block(s); -uint32_t b = bytes2block(s + 4); +const char * src = s; +char * dest = d; +uint32_t a = bytes2block(src); +uint32_t b = bytes2block(src + 4); Blowfish_Encrypt(ctx, &a, &b); -block2bytes(a, d); -block2bytes(b, d + 4); +block2bytes(a, dest); +block2bytes(b, dest + 4); } //----------------------------------------------------------------------------- -void DecodeFullString(void * d, const void * s, size_t length, const BLOWFISH_CTX &ctx) +void DecryptString(void * d, const void * s, size_t length, const BLOWFISH_CTX * ctx) { +const char * src = s; +char * dest = d; size_t pos = 0; while (pos < length) { - size_t chunkLength = std::min(length - pos, sizeof(buf)); - DecodeString(d + pos, s + pos, &ctx); - pos += chunkLength; + DecryptBlock(dest + pos, src + pos, ctx); + pos += 8; } } //----------------------------------------------------------------------------- -void EncodeFullString(void * d, const void * s, size_t length, const BLOWFISH_CTX &ctx) +void EncryptString(void * d, const void * s, size_t length, const BLOWFISH_CTX * ctx) { +const char * src = s; +char * dest = d; size_t pos = 0; while (pos < length) { - size_t chunkLength = std::min(length - pos, sizeof(buf)); - EncodeString(d + pos, s + pos, &ctx); - pos += chunkLength; + if (pos + 8 < length) + EncryptBlock(dest + pos, src + pos, ctx); + else + { + // Short string, use 0-padded buffer. + char buf[8]; + memset(buf, 0, sizeof(buf)); + memcpy(buf, src + pos, length - pos); + EncryptBlock(dest + pos, buf, ctx); + } + pos += 8; } } //-----------------------------------------------------------------------------