]> git.stg.codes - stg.git/blobdiff - stglibs/crypto.lib/blowfish.c
Ticket 12. The 'StopOnError' parameter added.
[stg.git] / stglibs / crypto.lib / blowfish.c
index 6a60b6387bf3d26501488c7fb5592838230ffd53..384d3a10e0d45cbb667bcdc5144c641939625121 100644 (file)
@@ -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;
     }
 }
 //-----------------------------------------------------------------------------