}
}
//-----------------------------------------------------------------------------
-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];
*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;
}
}
//-----------------------------------------------------------------------------