View Javadoc
1   /*
2    * Copyright 2012 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  /*
17   * Written by Robert Harder and released to the public domain, as explained at
18   * http://creativecommons.org/licenses/publicdomain
19   */
20  package io.netty.handler.codec.base64;
21  
22  /**
23   * Enumeration of supported Base64 dialects.
24   * <p>
25   * The internal lookup tables in this class has been derived from
26   * <a href="http://iharder.sourceforge.net/current/java/base64/">Robert Harder's Public Domain
27   * Base64 Encoder/Decoder</a>.
28   */
29  public enum Base64Dialect {
30      /**
31       * Standard Base64 encoding as described in the Section 3 of
32       * <a href="http://www.faqs.org/rfcs/rfc3548.html">RFC3548</a>.
33       */
34      STANDARD(new byte[] {
35              (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E',
36              (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J',
37              (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O',
38              (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T',
39              (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',
40              (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd',
41              (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',
42              (byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n',
43              (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's',
44              (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x',
45              (byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2',
46              (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',
47              (byte) '8', (byte) '9', (byte) '+', (byte) '/' },
48              new byte[] {
49              -9, -9, -9, -9, -9, -9,
50              -9, -9, -9, // Decimal  0 -  8
51              -5, -5, // Whitespace: Tab and Linefeed
52              -9, -9, // Decimal 11 - 12
53              -5, // Whitespace: Carriage Return
54              -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
55              -9, -9, -9, -9, -9, // Decimal 27 - 31
56              -5, // Whitespace: Space
57              -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
58              62, // Plus sign at decimal 43
59              -9, -9, -9, // Decimal 44 - 46
60              63, // Slash at decimal 47
61              52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
62              -9, -9, -9, // Decimal 58 - 60
63              -1, // Equals sign at decimal 61
64              -9, -9, -9, // Decimal 62 - 64
65               0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
66              14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
67              -9, -9, -9, -9, -9, -9, // Decimal 91 - 96
68              26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
69              39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
70              -9, -9, -9, -9, // Decimal 123 - 126
71           /* -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 127 - 139
72              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 140 - 152
73              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 153 - 165
74              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 166 - 178
75              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 179 - 191
76              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 192 - 204
77              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 205 - 217
78              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 218 - 230
79              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 231 - 243
80              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9         // Decimal 244 - 255 */
81              }, true),
82      /**
83       * Base64-like encoding that is URL-safe as described in the Section 4 of
84       * <a href="http://www.faqs.org/rfcs/rfc3548.html">RFC3548</a>.  It is
85       * important to note that data encoded this way is <em>not</em> officially
86       * valid Base64, or at the very least should not be called Base64 without
87       * also specifying that is was encoded using the URL-safe dialect.
88       */
89      URL_SAFE(new byte[] {
90              (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E',
91              (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J',
92              (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O',
93              (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T',
94              (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',
95              (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd',
96              (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',
97              (byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n',
98              (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's',
99              (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x',
100             (byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2',
101             (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',
102             (byte) '8', (byte) '9', (byte) '-', (byte) '_' },
103             new byte[] {
104             -9, -9, -9, -9, -9, -9,
105             -9, -9, -9, // Decimal  0 -  8
106             -5, -5, // Whitespace: Tab and Linefeed
107             -9, -9, // Decimal 11 - 12
108             -5, // Whitespace: Carriage Return
109             -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
110             -9, -9, -9, -9, -9, // Decimal 27 - 31
111             -5, // Whitespace: Space
112             -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
113             -9, // Plus sign at decimal 43
114             -9, // Decimal 44
115             62, // Minus sign at decimal 45
116             -9, // Decimal 46
117             -9, // Slash at decimal 47
118             52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
119             -9, -9, -9, // Decimal 58 - 60
120             -1, // Equals sign at decimal 61
121             -9, -9, -9, // Decimal 62 - 64
122              0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
123             14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
124             -9, -9, -9, -9, // Decimal 91 - 94
125             63, // Underscore at decimal 95
126             -9, // Decimal 96
127             26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
128             39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
129             -9, -9, -9, -9, // Decimal 123 - 126
130           /*-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 127 - 139
131             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 140 - 152
132             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 153 - 165
133             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 166 - 178
134             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 179 - 191
135             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 192 - 204
136             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 205 - 217
137             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 218 - 230
138             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 231 - 243
139             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9         // Decimal 244 - 255 */
140             }, false),
141     /**
142      * Special "ordered" dialect of Base64 described in
143      * <a href="http://www.faqs.org/qa/rfcc-1940.html">RFC1940</a>.
144      */
145     ORDERED(new byte[] {
146             (byte) '-', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
147             (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
148             (byte) '9', (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D',
149             (byte) 'E', (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I',
150             (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N',
151             (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S',
152             (byte) 'T', (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X',
153             (byte) 'Y', (byte) 'Z', (byte) '_', (byte) 'a', (byte) 'b',
154             (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g',
155             (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k', (byte) 'l',
156             (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', (byte) 'q',
157             (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v',
158             (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z' },
159             new byte[] {
160             -9, -9, -9, -9, -9, -9,
161             -9, -9, -9, // Decimal  0 -  8
162             -5, -5, // Whitespace: Tab and Linefeed
163             -9, -9, // Decimal 11 - 12
164             -5, // Whitespace: Carriage Return
165             -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
166             -9, -9, -9, -9, -9, // Decimal 27 - 31
167             -5, // Whitespace: Space
168             -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
169             -9, // Plus sign at decimal 43
170             -9, // Decimal 44
171              0, // Minus sign at decimal 45
172             -9, // Decimal 46
173             -9, // Slash at decimal 47
174              1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // Numbers zero through nine
175             -9, -9, -9, // Decimal 58 - 60
176             -1, // Equals sign at decimal 61
177             -9, -9, -9, // Decimal 62 - 64
178             11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, // Letters 'A' through 'M'
179             24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, // Letters 'N' through 'Z'
180             -9, -9, -9, -9, // Decimal 91 - 94
181             37, // Underscore at decimal 95
182             -9, // Decimal 96
183             38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // Letters 'a' through 'm'
184             51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // Letters 'n' through 'z'
185             -9, -9, -9, -9, // Decimal 123 - 126
186          /* -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 127 - 139
187             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 140 - 152
188             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 153 - 165
189             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 166 - 178
190             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 179 - 191
191             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 192 - 204
192             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 205 - 217
193             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 218 - 230
194             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 231 - 243
195             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9         // Decimal 244 - 255 */
196             }, true);
197 
198     final byte[] alphabet;
199     final byte[] decodabet;
200     final boolean breakLinesByDefault;
201 
202     Base64Dialect(byte[] alphabet, byte[] decodabet, boolean breakLinesByDefault) {
203         this.alphabet = alphabet;
204         this.decodabet = decodabet;
205         this.breakLinesByDefault = breakLinesByDefault;
206     }
207 }