OSDN Git Service

Initial import from http://code.google.com/p/connectbot/ (r416)
[android-x86/packages-apps-ConnectBot.git] / src / com / trilead / ssh2 / crypto / Base64.java
1 \r
2 package com.trilead.ssh2.crypto;\r
3 \r
4 import java.io.CharArrayWriter;\r
5 import java.io.IOException;\r
6 \r
7 /**\r
8  * Basic Base64 Support.\r
9  * \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
12  */\r
13 public class Base64\r
14 {\r
15         static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();\r
16         \r
17         public static char[] encode(byte[] content)\r
18         {\r
19                 CharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3);\r
20 \r
21                 int idx = 0;\r
22                                         \r
23                 int x = 0;\r
24 \r
25                 for (int i = 0; i < content.length; i++)\r
26                 {\r
27                         if (idx == 0)\r
28                                 x = (content[i] & 0xff) << 16;\r
29                         else if (idx == 1)\r
30                                 x = x | ((content[i] & 0xff) << 8);\r
31                         else\r
32                                 x = x | (content[i] & 0xff);\r
33 \r
34                         idx++;\r
35 \r
36                         if (idx == 3)\r
37                         {\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
42 \r
43                                 idx = 0;\r
44                         }\r
45                 }\r
46 \r
47                 if (idx == 1)\r
48                 {\r
49                         cw.write(alphabet[x >> 18]);\r
50                         cw.write(alphabet[(x >> 12) & 0x3f]);\r
51                         cw.write('=');\r
52                         cw.write('=');\r
53                 }\r
54 \r
55                 if (idx == 2)\r
56                 {\r
57                         cw.write(alphabet[x >> 18]);\r
58                         cw.write(alphabet[(x >> 12) & 0x3f]);\r
59                         cw.write(alphabet[(x >> 6) & 0x3f]);\r
60                         cw.write('=');\r
61                 }\r
62 \r
63                 return cw.toCharArray();\r
64         }\r
65 \r
66         public static byte[] decode(char[] message) throws IOException\r
67         {\r
68                 byte buff[] = new byte[4];\r
69                 byte dest[] = new byte[message.length];\r
70 \r
71                 int bpos = 0;\r
72                 int destpos = 0;\r
73 \r
74                 for (int i = 0; i < message.length; i++)\r
75                 {\r
76                         int c = message[i];\r
77 \r
78                         if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t'))\r
79                                 continue;\r
80 \r
81                         if ((c >= 'A') && (c <= 'Z'))\r
82                         {\r
83                                 buff[bpos++] = (byte) (c - 'A');\r
84                         }\r
85                         else if ((c >= 'a') && (c <= 'z'))\r
86                         {\r
87                                 buff[bpos++] = (byte) ((c - 'a') + 26);\r
88                         }\r
89                         else if ((c >= '0') && (c <= '9'))\r
90                         {\r
91                                 buff[bpos++] = (byte) ((c - '0') + 52);\r
92                         }\r
93                         else if (c == '+')\r
94                         {\r
95                                 buff[bpos++] = 62;\r
96                         }\r
97                         else if (c == '/')\r
98                         {\r
99                                 buff[bpos++] = 63;\r
100                         }\r
101                         else if (c == '=')\r
102                         {\r
103                                 buff[bpos++] = 64;\r
104                         }\r
105                         else\r
106                         {\r
107                                 throw new IOException("Illegal char in base64 code.");\r
108                         }\r
109 \r
110                         if (bpos == 4)\r
111                         {\r
112                                 bpos = 0;\r
113 \r
114                                 if (buff[0] == 64)\r
115                                         break;\r
116 \r
117                                 if (buff[1] == 64)\r
118                                         throw new IOException("Unexpected '=' in base64 code.");\r
119 \r
120                                 if (buff[2] == 64)\r
121                                 {\r
122                                         int v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f)));\r
123                                         dest[destpos++] = (byte) (v >> 4);\r
124                                         break;\r
125                                 }\r
126                                 else if (buff[3] == 64)\r
127                                 {\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
131                                         break;\r
132                                 }\r
133                                 else\r
134                                 {\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
139                                 }\r
140                         }\r
141                 }\r
142 \r
143                 byte[] res = new byte[destpos];\r
144                 System.arraycopy(dest, 0, res, 0, destpos);\r
145 \r
146                 return res;\r
147         }\r
148 }\r