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    *   https://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   * https://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, -9 // Decimal 123 - 127
71           /* -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 128 - 140
72              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 141 - 153
73              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 154 - 166
74              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 167 - 179
75              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 180 - 192
76              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 193 - 205
77              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 206 - 218
78              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 219 - 231
79              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 232 - 244
80              -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9            // Decimal 245 - 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, -9, // Decimal 123 - 127
130          /* -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 128 - 140
131             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 141 - 153
132             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 154 - 166
133             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 167 - 179
134             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 180 - 192
135             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 193 - 205
136             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 206 - 218
137             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 219 - 231
138             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 232 - 244
139             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9            // Decimal 245 - 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, -9 // Decimal 123 - 127
186          /* -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 128 - 140
187             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 141 - 153
188             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 154 - 166
189             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 167 - 179
190             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 180 - 192
191             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 193 - 205
192             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 206 - 218
193             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 219 - 231
194             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 232 - 244
195             -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9            // Decimal 245 - 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 }