Mercurial > 510Connectbot
comparison src/ch/ethz/ssh2/crypto/Base64.java @ 308:42b15aaa7ac7 ganymed
merge
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Wed, 30 Jul 2014 14:21:50 -0700 |
parents | 071eccdff8ea |
children |
comparison
equal
deleted
inserted
replaced
306:90e47d99ea54 | 308:42b15aaa7ac7 |
---|---|
7 import java.io.CharArrayWriter; | 7 import java.io.CharArrayWriter; |
8 import java.io.IOException; | 8 import java.io.IOException; |
9 | 9 |
10 /** | 10 /** |
11 * Basic Base64 Support. | 11 * Basic Base64 Support. |
12 * | 12 * |
13 * @author Christian Plattner | 13 * @author Christian Plattner |
14 * @version 2.50, 03/15/10 | 14 * @version 2.50, 03/15/10 |
15 */ | 15 */ |
16 public class Base64 | 16 public class Base64 { |
17 { | 17 static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); |
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 | 18 |
24 int idx = 0; | 19 public static char[] encode(byte[] content) { |
25 | 20 CharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3); |
26 int x = 0; | 21 int idx = 0; |
22 int x = 0; | |
27 | 23 |
28 for (int i = 0; i < content.length; i++) | 24 for (int i = 0; i < content.length; i++) { |
29 { | 25 if (idx == 0) |
30 if (idx == 0) | 26 x = (content[i] & 0xff) << 16; |
31 x = (content[i] & 0xff) << 16; | 27 else if (idx == 1) |
32 else if (idx == 1) | 28 x = x | ((content[i] & 0xff) << 8); |
33 x = x | ((content[i] & 0xff) << 8); | 29 else |
34 else | 30 x = x | (content[i] & 0xff); |
35 x = x | (content[i] & 0xff); | |
36 | 31 |
37 idx++; | 32 idx++; |
38 | 33 |
39 if (idx == 3) | 34 if (idx == 3) { |
40 { | 35 cw.write(alphabet[x >> 18]); |
41 cw.write(alphabet[x >> 18]); | 36 cw.write(alphabet[(x >> 12) & 0x3f]); |
42 cw.write(alphabet[(x >> 12) & 0x3f]); | 37 cw.write(alphabet[(x >> 6) & 0x3f]); |
43 cw.write(alphabet[(x >> 6) & 0x3f]); | 38 cw.write(alphabet[x & 0x3f]); |
44 cw.write(alphabet[x & 0x3f]); | 39 idx = 0; |
40 } | |
41 } | |
45 | 42 |
46 idx = 0; | 43 if (idx == 1) { |
47 } | 44 cw.write(alphabet[x >> 18]); |
48 } | 45 cw.write(alphabet[(x >> 12) & 0x3f]); |
46 cw.write('='); | |
47 cw.write('='); | |
48 } | |
49 | 49 |
50 if (idx == 1) | 50 if (idx == 2) { |
51 { | 51 cw.write(alphabet[x >> 18]); |
52 cw.write(alphabet[x >> 18]); | 52 cw.write(alphabet[(x >> 12) & 0x3f]); |
53 cw.write(alphabet[(x >> 12) & 0x3f]); | 53 cw.write(alphabet[(x >> 6) & 0x3f]); |
54 cw.write('='); | 54 cw.write('='); |
55 cw.write('='); | 55 } |
56 } | |
57 | 56 |
58 if (idx == 2) | 57 return cw.toCharArray(); |
59 { | 58 } |
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 | 59 |
66 return cw.toCharArray(); | 60 public static byte[] decode(char[] message) throws IOException { |
67 } | 61 byte buff[] = new byte[4]; |
62 byte dest[] = new byte[message.length]; | |
63 int bpos = 0; | |
64 int destpos = 0; | |
68 | 65 |
69 public static byte[] decode(char[] message) throws IOException | 66 for (int i = 0; i < message.length; i++) { |
70 { | 67 int c = message[i]; |
71 byte buff[] = new byte[4]; | |
72 byte dest[] = new byte[message.length]; | |
73 | 68 |
74 int bpos = 0; | 69 if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t')) |
75 int destpos = 0; | 70 continue; |
76 | 71 |
77 for (int i = 0; i < message.length; i++) | 72 if ((c >= 'A') && (c <= 'Z')) { |
78 { | 73 buff[bpos++] = (byte)(c - 'A'); |
79 int c = message[i]; | 74 } |
75 else if ((c >= 'a') && (c <= 'z')) { | |
76 buff[bpos++] = (byte)((c - 'a') + 26); | |
77 } | |
78 else if ((c >= '0') && (c <= '9')) { | |
79 buff[bpos++] = (byte)((c - '0') + 52); | |
80 } | |
81 else if (c == '+') { | |
82 buff[bpos++] = 62; | |
83 } | |
84 else if (c == '/') { | |
85 buff[bpos++] = 63; | |
86 } | |
87 else if (c == '=') { | |
88 buff[bpos++] = 64; | |
89 } | |
90 else { | |
91 throw new IOException("Illegal char in base64 code."); | |
92 } | |
80 | 93 |
81 if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t')) | 94 if (bpos == 4) { |
82 continue; | 95 bpos = 0; |
83 | 96 |
84 if ((c >= 'A') && (c <= 'Z')) | 97 if (buff[0] == 64) |
85 { | 98 break; |
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 | 99 |
113 if (bpos == 4) | 100 if (buff[1] == 64) |
114 { | 101 throw new IOException("Unexpected '=' in base64 code."); |
115 bpos = 0; | |
116 | 102 |
117 if (buff[0] == 64) | 103 if (buff[2] == 64) { |
118 break; | 104 int v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f))); |
105 dest[destpos++] = (byte)(v >> 4); | |
106 break; | |
107 } | |
108 else if (buff[3] == 64) { | |
109 int v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f))); | |
110 dest[destpos++] = (byte)(v >> 10); | |
111 dest[destpos++] = (byte)(v >> 2); | |
112 break; | |
113 } | |
114 else { | |
115 int v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f))); | |
116 dest[destpos++] = (byte)(v >> 16); | |
117 dest[destpos++] = (byte)(v >> 8); | |
118 dest[destpos++] = (byte)(v); | |
119 } | |
120 } | |
121 } | |
119 | 122 |
120 if (buff[1] == 64) | 123 byte[] res = new byte[destpos]; |
121 throw new IOException("Unexpected '=' in base64 code."); | 124 System.arraycopy(dest, 0, res, 0, destpos); |
122 | 125 return res; |
123 if (buff[2] == 64) | 126 } |
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 } | 127 } |