// This code is derived from jcifs smb client library // Ported by J. Arturo // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using System.Text; namespace SharpCifs.Util { public class Base64 { private static readonly string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// Base-64 encodes the supplied block of data. /// /// Base-64 encodes the supplied block of data. Line wrapping is not /// applied on output. /// /// The block of data that is to be Base-64 encoded. /// A String containing the encoded data. public static string Encode(byte[] bytes) { int length = bytes.Length; if (length == 0) { return string.Empty; } StringBuilder buffer = new StringBuilder((int)Math.Ceiling(length / 3d) * 4); int remainder = length % 3; length -= remainder; int block; int i = 0; while (i < length) { block = ((bytes[i++] & unchecked(0xff)) << 16) | ((bytes[i++] & unchecked( 0xff)) << 8) | (bytes[i++] & unchecked(0xff)); buffer.Append(Alphabet[(int)(((uint)block) >> 18)]); buffer.Append(Alphabet[((int)(((uint)block) >> 12)) & unchecked(0x3f)]); buffer.Append(Alphabet[((int)(((uint)block) >> 6)) & unchecked(0x3f)]); buffer.Append(Alphabet[block & unchecked(0x3f)]); } if (remainder == 0) { return buffer.ToString(); } if (remainder == 1) { block = (bytes[i] & unchecked(0xff)) << 4; buffer.Append(Alphabet[(int)(((uint)block) >> 6)]); buffer.Append(Alphabet[block & unchecked(0x3f)]); buffer.Append("=="); return buffer.ToString(); } block = (((bytes[i++] & unchecked(0xff)) << 8) | ((bytes[i]) & unchecked(0xff))) << 2; buffer.Append(Alphabet[(int)(((uint)block) >> 12)]); buffer.Append(Alphabet[((int)(((uint)block) >> 6)) & unchecked(0x3f)]); buffer.Append(Alphabet[block & unchecked(0x3f)]); buffer.Append("="); return buffer.ToString(); } /// Decodes the supplied Base-64 encoded string. /// Decodes the supplied Base-64 encoded string. /// The Base-64 encoded string that is to be decoded. /// A byte[] containing the decoded data block. public static byte[] Decode(string @string) { int length = @string.Length; if (length == 0) { return new byte[0]; } int pad = (@string[length - 2] == '=') ? 2 : (@string[length - 1] == '=') ? 1 : 0; int size = length * 3 / 4 - pad; byte[] buffer = new byte[size]; int block; int i = 0; int index = 0; while (i < length) { block = (Alphabet.IndexOf(@string[i++]) & unchecked(0xff)) << 18 | (Alphabet .IndexOf(@string[i++]) & unchecked(0xff)) << 12 | (Alphabet.IndexOf(@string [i++]) & unchecked(0xff)) << 6 | (Alphabet.IndexOf(@string[i++]) & unchecked( 0xff)); buffer[index++] = unchecked((byte)((int)(((uint)block) >> 16))); if (index < size) { buffer[index++] = unchecked((byte)(((int)(((uint)block) >> 8)) & unchecked(0xff))); } if (index < size) { buffer[index++] = unchecked((byte)(block & unchecked(0xff))); } } return buffer; } } }