From 3199c132d57cb7a7c7d289c03512ecb9426ec7b1 Mon Sep 17 00:00:00 2001
From: Veniamin Gvozdikov <vgvozdikov@tarantool.org>
Date: Thu, 25 Sep 2014 12:59:10 +0000
Subject: [PATCH] Fix base64 endcode/decode sizes, and added more tests

---
 src/lua/digest.lua       |  6 +++---
 test/box/digest.result   | 32 ++++++++++++++++++++++++++++++++
 test/box/digest.test.lua |  9 +++++++++
 3 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/src/lua/digest.lua b/src/lua/digest.lua
index 3ed17ae92d..dd942480c2 100644
--- a/src/lua/digest.lua
+++ b/src/lua/digest.lua
@@ -73,12 +73,12 @@ end
 local m = {
     base64_encode = function(bin)
         if bin == nil then
-            bin = ''
+            error('Usage: base64.encode(str)')
         else
             -- note: need add check size of bin, bin might containe any binary data
             if type(bin) == 'string' then
                 local blen = string.len(bin)
-                local slen = math.ceil(blen * 4 / 3) + 1
+                local slen = math.ceil(blen * 4 / 3) + 2
                 local so  = ffi.new('char[?]', slen)
                 local len = ffi.C.base64_encode(bin, blen, so, slen)
                 bin = ffi.string(so, len)
@@ -94,7 +94,7 @@ local m = {
             data = ''
         else
             local slen = string.len(data)
-            local blen = math.ceil((slen - 1) * 4 / 3)
+            local blen = math.ceil(slen * 3 / 4)
             local bo  = ffi.new('char[?]', blen)
             local len = ffi.C.base64_decode(data, slen, bo, blen)
             data = ffi.string(bo, len)
diff --git a/test/box/digest.result b/test/box/digest.result
index 81d2414971..018d9e1083 100644
--- a/test/box/digest.result
+++ b/test/box/digest.result
@@ -157,6 +157,38 @@ digest.base64_decode('MTIzNDU=')
 ---
 - '12345'
 ...
+digest.base64_encode('asdfl asdf adfa zxc vzxcvz llll')
+---
+- YXNkZmwgYXNkZiBhZGZhIHp4YyB2enhjdnogbGxsbA==
+...
+digest.base64_decode('YXNkZmwgYXNkZiBhZGZhIHp4YyB2enhjdnogbGxsbA==')
+---
+- asdfl asdf adfa zxc vzxcvz llll
+...
+digest.base64_encode('11 00 11 00 abcdef ABCDEF 00 11 00 11')
+---
+- MTEgMDAgMTEgMDAgYWJjZGVmIEFCQ0RFRiAwMCAxMSAwMCAxMQ==
+...
+digest.base64_decode('MTEgMDAgMTEgMDAgYWJjZGVmIEFCQ0RFRiAwMCAxMSAwMCAxMQ==')
+---
+- 11 00 11 00 abcdef ABCDEF 00 11 00 11
+...
+digest.base64_decode(nil)
+---
+-
+...
+digest.base64_encode(nil)
+---
+- error: 'builtin/digest.lua:76: Usage: base64.encode(str)'
+...
+digest.base64_encode(123)
+---
+-
+...
+digest.base64_decode(123)
+---
+-
+...
 digest = nil
 ---
 ...
diff --git a/test/box/digest.test.lua b/test/box/digest.test.lua
index cc63c16280..f988abc98b 100644
--- a/test/box/digest.test.lua
+++ b/test/box/digest.test.lua
@@ -46,4 +46,13 @@ digest.crc32_update(digest.crc32('abc'), 'cde')
 
 digest.base64_encode('12345')
 digest.base64_decode('MTIzNDU=')
+digest.base64_encode('asdfl asdf adfa zxc vzxcvz llll')
+digest.base64_decode('YXNkZmwgYXNkZiBhZGZhIHp4YyB2enhjdnogbGxsbA==')
+digest.base64_encode('11 00 11 00 abcdef ABCDEF 00 11 00 11')
+digest.base64_decode('MTEgMDAgMTEgMDAgYWJjZGVmIEFCQ0RFRiAwMCAxMSAwMCAxMQ==')
+digest.base64_decode(nil)
+digest.base64_encode(nil)
+digest.base64_encode(123)
+digest.base64_decode(123)
+
 digest = nil
-- 
GitLab