/****************************************************************************** * The MIT License * Copyright (c) 2003 Novell Inc. www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the Software), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *******************************************************************************/ // // Novell.Directory.Ldap.Utilclass.Base64.cs // // Author: // Sunil Kumar (Sunilk@novell.com) // // (C) 2003 Novell, Inc (http://www.novell.com) // using System; namespace Novell.Directory.Ldap.Utilclass { /// <summary> The Base64 utility class performs base64 encoding and decoding. /// /// The Base64 Content-Transfer-Encoding is designed to represent /// arbitrary sequences of octets in a form that need not be humanly /// readable. The encoding and decoding algorithms are simple, but the /// encoded data are consistently only about 33 percent larger than the /// unencoded data. The base64 encoding algorithm is defined by /// RFC 2045. /// </summary> public class Base64 { /// <summary> Checks if the input byte array contains only safe values, that is, /// the data does not need to be encoded for use with LDIF. /// The rules for checking safety are based on the rules for LDIF /// (Ldap Data Interchange Format) per RFC 2849. The data does /// not need to be encoded if all the following are true: /// /// The data cannot start with the following byte values: /// <pre> /// 00 (NUL) /// 10 (LF) /// 13 (CR) /// 32 (SPACE) /// 58 (:) /// 60 (LESSTHAN) /// Any character with value greater than 127 /// (Negative for a byte value) /// </pre> /// The data cannot contain any of the following byte values: /// <pre> /// 00 (NUL) /// 10 (LF) /// 13 (CR) /// Any character with value greater than 127 /// (Negative for a byte value) /// </pre> /// The data cannot end with a space. /// /// </summary> /// <param name="bytes">the bytes to be checked. /// /// </param> /// <returns> true if encoding not required for LDIF /// </returns> [CLSCompliantAttribute(false)] public static bool isLDIFSafe(sbyte[] bytes) { int len = bytes.Length; if (len > 0) { int testChar = bytes[0]; // unsafe if first character is a NON-SAFE-INIT-CHAR if ((testChar == 0x00) || (testChar == 0x0A) || (testChar == 0x0D) || (testChar == 0x20) || (testChar == 0x3A) || (testChar == 0x3C) || (testChar < 0)) { // non ascii (>127 is negative) return false; } // unsafe if last character is a space if (bytes[len - 1] == ' ') { return false; } // unsafe if contains any non safe character if (len > 1) { for (int i = 1; i < bytes.Length; i++) { testChar = bytes[i]; if ((testChar == 0x00) || (testChar == 0x0A) || (testChar == 0x0D) || (testChar < 0)) { // non ascii (>127 is negative) return false; } } } } return true; } } }