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