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 }