1  /**
     2   * com.sekati.crypt.Base64
     3   * @version 3.0.1
     4   * @author jason m horwitz | sekati.com 
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   * 
     8   * Sourced from ascrypt for dependencies only - version 2.0, author Mika Pamu
     9   * Original Javascript implementation:
    10   * Aardwulf Systems, www.aardwulf.com
    11   * @see http://www.aardwulf.com/tutor/base64/base64.html 
    12   */
    13  
    14  import com.sekati.crypt.ICipher;
    15  
    16  /**
    17   * Encodes and decodes a base64 string.
    18   */
    19  class com.sekati.crypt.Base64 implements ICipher {
    20  
    21  	private static var base64chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    22  
    23  	/**
    24  	 * Encodes a base64 string.
    25  	 * @param src (String) - string to encode
    26  	 * @return String
    27  	 */
    28  	public static function encode(src:String):String {
    29  		var i:Number = 0;
    30  		var output:String = new String( "" );
    31  		var chr1:Number, chr2:Number, chr3:Number;
    32  		var enc1:Number, enc2:Number, enc3:Number, enc4:Number;
    33  		while (i < src.length) {
    34  			chr1 = src.charCodeAt( i++ );
    35  			chr2 = src.charCodeAt( i++ );
    36  			chr3 = src.charCodeAt( i++ );
    37  			enc1 = chr1 >> 2;
    38  			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    39  			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    40  			enc4 = chr3 & 63;
    41  			if(isNaN( chr2 )) enc3 = enc4 = 64;
    42  			else if(isNaN( chr3 )) enc4 = 64;
    43  			output += base64chars.charAt( enc1 ) + base64chars.charAt( enc2 );
    44  			output += base64chars.charAt( enc3 ) + base64chars.charAt( enc4 );
    45  		}
    46  		return output;
    47  	}
    48  
    49  	/**
    50  	 * Decodes a base64 string
    51  	 * @param src (String) - string to decode
    52  	 * @return String
    53  	 */
    54  	public static function decode(src:String):String {
    55  		var i:Number = 0;
    56  		var output:String = new String( "" );
    57  		var chr1:Number, chr2:Number, chr3:Number;
    58  		var enc1:Number, enc2:Number, enc3:Number, enc4:Number;
    59  		while (i < src.length) {
    60  			enc1 = base64chars.indexOf( src.charAt( i++ ) );
    61  			enc2 = base64chars.indexOf( src.charAt( i++ ) );
    62  			enc3 = base64chars.indexOf( src.charAt( i++ ) );
    63  			enc4 = base64chars.indexOf( src.charAt( i++ ) );
    64  			chr1 = (enc1 << 2) | (enc2 >> 4);
    65  			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    66  			chr3 = ((enc3 & 3) << 6) | enc4;
    67  			output += String.fromCharCode( chr1 );
    68  			if (enc3 != 64) output = output + String.fromCharCode( chr2 );
    69  			if (enc4 != 64) output = output + String.fromCharCode( chr3 );
    70  		}
    71  		return output;
    72  	}
    73  
    74  	private function Base64() {
    75  	}
    76  }