2 package com.trilead.ssh2.crypto;
\r
4 import java.io.CharArrayWriter;
\r
5 import java.io.IOException;
\r
8 * Basic Base64 Support.
\r
10 * @author Christian Plattner, plattner@trilead.com
\r
11 * @version $Id: Base64.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $
\r
15 static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
\r
17 public static char[] encode(byte[] content)
\r
19 CharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3);
\r
25 for (int i = 0; i < content.length; i++)
\r
28 x = (content[i] & 0xff) << 16;
\r
30 x = x | ((content[i] & 0xff) << 8);
\r
32 x = x | (content[i] & 0xff);
\r
38 cw.write(alphabet[x >> 18]);
\r
39 cw.write(alphabet[(x >> 12) & 0x3f]);
\r
40 cw.write(alphabet[(x >> 6) & 0x3f]);
\r
41 cw.write(alphabet[x & 0x3f]);
\r
49 cw.write(alphabet[x >> 18]);
\r
50 cw.write(alphabet[(x >> 12) & 0x3f]);
\r
57 cw.write(alphabet[x >> 18]);
\r
58 cw.write(alphabet[(x >> 12) & 0x3f]);
\r
59 cw.write(alphabet[(x >> 6) & 0x3f]);
\r
63 return cw.toCharArray();
\r
66 public static byte[] decode(char[] message) throws IOException
\r
68 byte buff[] = new byte[4];
\r
69 byte dest[] = new byte[message.length];
\r
74 for (int i = 0; i < message.length; i++)
\r
78 if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t'))
\r
81 if ((c >= 'A') && (c <= 'Z'))
\r
83 buff[bpos++] = (byte) (c - 'A');
\r
85 else if ((c >= 'a') && (c <= 'z'))
\r
87 buff[bpos++] = (byte) ((c - 'a') + 26);
\r
89 else if ((c >= '0') && (c <= '9'))
\r
91 buff[bpos++] = (byte) ((c - '0') + 52);
\r
107 throw new IOException("Illegal char in base64 code.");
\r
118 throw new IOException("Unexpected '=' in base64 code.");
\r
122 int v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f)));
\r
123 dest[destpos++] = (byte) (v >> 4);
\r
126 else if (buff[3] == 64)
\r
128 int v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f)));
\r
129 dest[destpos++] = (byte) (v >> 10);
\r
130 dest[destpos++] = (byte) (v >> 2);
\r
135 int v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f)));
\r
136 dest[destpos++] = (byte) (v >> 16);
\r
137 dest[destpos++] = (byte) (v >> 8);
\r
138 dest[destpos++] = (byte) (v);
\r
143 byte[] res = new byte[destpos];
\r
144 System.arraycopy(dest, 0, res, 0, destpos);
\r