1 /* 2 * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. 3 * Please refer to the LICENSE.txt for licensing details. 4 */ 5 package ch.ethz.ssh2.crypto; 6 7 import java.io.CharArrayWriter; 8 import java.io.IOException; 9 10 /** 11 * Basic Base64 Support. 12 * 13 * @author Christian Plattner 14 * @version 2.50, 03/15/10 15 */ 16 public class Base64 17 { 18 static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); 19 20 public static char[] encode(byte[] content) 21 { 22 CharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3); 23 24 int idx = 0; 25 26 int x = 0; 27 28 for (int i = 0; i < content.length; i++) 29 { 30 if (idx == 0) 31 x = (content[i] & 0xff) << 16; 32 else if (idx == 1) 33 x = x | ((content[i] & 0xff) << 8); 34 else 35 x = x | (content[i] & 0xff); 36 37 idx++; 38 39 if (idx == 3) 40 { 41 cw.write(alphabet[x >> 18]); 42 cw.write(alphabet[(x >> 12) & 0x3f]); 43 cw.write(alphabet[(x >> 6) & 0x3f]); 44 cw.write(alphabet[x & 0x3f]); 45 46 idx = 0; 47 } 48 } 49 50 if (idx == 1) 51 { 52 cw.write(alphabet[x >> 18]); 53 cw.write(alphabet[(x >> 12) & 0x3f]); 54 cw.write('='); 55 cw.write('='); 56 } 57 58 if (idx == 2) 59 { 60 cw.write(alphabet[x >> 18]); 61 cw.write(alphabet[(x >> 12) & 0x3f]); 62 cw.write(alphabet[(x >> 6) & 0x3f]); 63 cw.write('='); 64 } 65 66 return cw.toCharArray(); 67 } 68 69 public static byte[] decode(char[] message) throws IOException 70 { 71 byte buff[] = new byte[4]; 72 byte dest[] = new byte[message.length]; 73 74 int bpos = 0; 75 int destpos = 0; 76 77 for (int i = 0; i < message.length; i++) 78 { 79 int c = message[i]; 80 81 if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t')) 82 continue; 83 84 if ((c >= 'A') && (c <= 'Z')) 85 { 86 buff[bpos++] = (byte) (c - 'A'); 87 } 88 else if ((c >= 'a') && (c <= 'z')) 89 { 90 buff[bpos++] = (byte) ((c - 'a') + 26); 91 } 92 else if ((c >= '0') && (c <= '9')) 93 { 94 buff[bpos++] = (byte) ((c - '0') + 52); 95 } 96 else if (c == '+') 97 { 98 buff[bpos++] = 62; 99 } 100 else if (c == '/') 101 { 102 buff[bpos++] = 63; 103 } 104 else if (c == '=') 105 { 106 buff[bpos++] = 64; 107 } 108 else 109 { 110 throw new IOException("Illegal char in base64 code."); 111 } 112 113 if (bpos == 4) 114 { 115 bpos = 0; 116 117 if (buff[0] == 64) 118 break; 119 120 if (buff[1] == 64) 121 throw new IOException("Unexpected '=' in base64 code."); 122 123 if (buff[2] == 64) 124 { 125 int v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f))); 126 dest[destpos++] = (byte) (v >> 4); 127 break; 128 } 129 else if (buff[3] == 64) 130 { 131 int v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f))); 132 dest[destpos++] = (byte) (v >> 10); 133 dest[destpos++] = (byte) (v >> 2); 134 break; 135 } 136 else 137 { 138 int v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f))); 139 dest[destpos++] = (byte) (v >> 16); 140 dest[destpos++] = (byte) (v >> 8); 141 dest[destpos++] = (byte) (v); 142 } 143 } 144 } 145 146 byte[] res = new byte[destpos]; 147 System.arraycopy(dest, 0, res, 0, destpos); 148 149 return res; 150 } 151 } 152