--Wraps all I/O using base64 encoding. return { b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', base64enc = function (self, data) return ((data:gsub('.', function (x) local r, b = '', x:byte() for i = 8, 1, -1 do r = r .. (b % 2^i - b % 2^(i - 1) > 0 and '1' or '0') end return r end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function (x) if #x < 6 then return '' end local c = 0 for i = 1, 6 do c = c + (x:sub(i, i) == '1' and 2^(6 - i) or 0) end return self.b:sub(c + 1, c + 1) end) .. ({ '', '==', '=', })[#data % 3 + 1]) end, base64dec = function (self, data) data = string.gsub(data, '[^' .. self.b .. '=]', '') return (data:gsub('.', function (x) if x == '=' then return '' end local r, f = '', (self.b:find(x) - 1) for i = 6, 1, -1 do r = r .. (f % 2^i - f % 2^(i - 1) > 0 and '1' or '0') end return r end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function (x) if #x ~= 8 then return '' end local c = 0 for i = 1, 8 do c = c + (x:sub(i, i) == '1' and 2^(8 - i) or 0) end return string.char(c) end)) end, recv = function (self) local line, err = self.super:recv() if line == nil then return line, err end return self:base64dec(line) end, send = function (self, data) return self.super:send(self:base64enc(data)) end, }