1 package org.bouncycastle.asn1; 2 3 import java.io.IOException; 4 5 public abstract class ASN1Util 6 { checkTag(ASN1TaggedObject taggedObject, int tagClass, int tagNo)7 static ASN1TaggedObject checkTag(ASN1TaggedObject taggedObject, int tagClass, int tagNo) 8 { 9 if (!taggedObject.hasTag(tagClass, tagNo)) 10 { 11 String expected = getTagText(tagClass, tagNo); 12 String found = getTagText(taggedObject); 13 throw new IllegalStateException("Expected " + expected + " tag but found " + found); 14 } 15 return taggedObject; 16 } 17 checkTag(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)18 static ASN1TaggedObjectParser checkTag(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo) 19 { 20 if (!taggedObjectParser.hasTag(tagClass, tagNo)) 21 { 22 String expected = getTagText(tagClass, tagNo); 23 String found = getTagText(taggedObjectParser); 24 throw new IllegalStateException("Expected " + expected + " tag but found " + found); 25 } 26 return taggedObjectParser; 27 } 28 29 30 /* 31 * Tag text methods 32 */ 33 getTagText(ASN1Tag tag)34 static String getTagText(ASN1Tag tag) 35 { 36 return getTagText(tag.getTagClass(), tag.getTagNumber()); 37 } 38 getTagText(ASN1TaggedObject taggedObject)39 public static String getTagText(ASN1TaggedObject taggedObject) 40 { 41 return getTagText(taggedObject.getTagClass(), taggedObject.getTagNo()); 42 } 43 getTagText(ASN1TaggedObjectParser taggedObjectParser)44 public static String getTagText(ASN1TaggedObjectParser taggedObjectParser) 45 { 46 return getTagText(taggedObjectParser.getTagClass(), taggedObjectParser.getTagNo()); 47 } 48 getTagText(int tagClass, int tagNo)49 public static String getTagText(int tagClass, int tagNo) 50 { 51 switch (tagClass) 52 { 53 case BERTags.APPLICATION: 54 return "[APPLICATION " + tagNo + "]"; 55 case BERTags.CONTEXT_SPECIFIC: 56 return "[CONTEXT " + tagNo + "]"; 57 case BERTags.PRIVATE: 58 return "[PRIVATE " + tagNo + "]"; 59 default: 60 return "[UNIVERSAL " + tagNo + "]"; 61 } 62 } 63 64 65 /* 66 * Wrappers for ASN1TaggedObject#getExplicitBaseObject 67 */ 68 getExplicitBaseObject(ASN1TaggedObject taggedObject, int tagClass, int tagNo)69 public static ASN1Object getExplicitBaseObject(ASN1TaggedObject taggedObject, int tagClass, int tagNo) 70 { 71 return checkTag(taggedObject, tagClass, tagNo).getExplicitBaseObject(); 72 } 73 getExplicitContextBaseObject(ASN1TaggedObject taggedObject, int tagNo)74 public static ASN1Object getExplicitContextBaseObject(ASN1TaggedObject taggedObject, int tagNo) 75 { 76 return getExplicitBaseObject(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo); 77 } 78 tryGetExplicitBaseObject(ASN1TaggedObject taggedObject, int tagClass, int tagNo)79 public static ASN1Object tryGetExplicitBaseObject(ASN1TaggedObject taggedObject, int tagClass, int tagNo) 80 { 81 if (!taggedObject.hasTag(tagClass, tagNo)) 82 { 83 return null; 84 } 85 86 return taggedObject.getExplicitBaseObject(); 87 } 88 tryGetExplicitContextBaseObject(ASN1TaggedObject taggedObject, int tagNo)89 public static ASN1Object tryGetExplicitContextBaseObject(ASN1TaggedObject taggedObject, int tagNo) 90 { 91 return tryGetExplicitBaseObject(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo); 92 } 93 94 95 /* 96 * Wrappers for ASN1TaggedObject#getExplicitBaseTagged 97 */ 98 getExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo)99 public static ASN1TaggedObject getExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo) 100 { 101 return checkTag(taggedObject, tagClass, tagNo).getExplicitBaseTagged(); 102 } 103 getExplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo)104 public static ASN1TaggedObject getExplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo) 105 { 106 return getExplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo); 107 } 108 tryGetExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo)109 public static ASN1TaggedObject tryGetExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo) 110 { 111 if (!taggedObject.hasTag(tagClass, tagNo)) 112 { 113 return null; 114 } 115 116 return taggedObject.getExplicitBaseTagged(); 117 } 118 tryGetExplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo)119 public static ASN1TaggedObject tryGetExplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo) 120 { 121 return tryGetExplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo); 122 } 123 124 125 /* 126 * Wrappers for ASN1TaggedObject#getImplicitBaseTagged 127 */ 128 getImplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo, int baseTagClass, int baseTagNo)129 public static ASN1TaggedObject getImplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo, 130 int baseTagClass, int baseTagNo) 131 { 132 return checkTag(taggedObject, tagClass, tagNo).getImplicitBaseTagged(baseTagClass, baseTagNo); 133 } 134 getImplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo, int baseTagClass, int baseTagNo)135 public static ASN1TaggedObject getImplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo, 136 int baseTagClass, int baseTagNo) 137 { 138 return getImplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo, baseTagClass, baseTagNo); 139 } 140 tryGetImplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo, int baseTagClass, int baseTagNo)141 public static ASN1TaggedObject tryGetImplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo, 142 int baseTagClass, int baseTagNo) 143 { 144 if (!taggedObject.hasTag(tagClass, tagNo)) 145 { 146 return null; 147 } 148 149 return taggedObject.getImplicitBaseTagged(baseTagClass, baseTagNo); 150 } 151 tryGetImplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo, int baseTagClass, int baseTagNo)152 public static ASN1TaggedObject tryGetImplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo, 153 int baseTagClass, int baseTagNo) 154 { 155 return tryGetImplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo, baseTagClass, baseTagNo); 156 } 157 158 159 /* 160 * Wrappers for ASN1TaggedObject#getBaseUniversal 161 */ 162 getBaseUniversal(ASN1TaggedObject taggedObject, int tagClass, int tagNo, boolean declaredExplicit, int baseTagNo)163 public static ASN1Primitive getBaseUniversal(ASN1TaggedObject taggedObject, int tagClass, int tagNo, 164 boolean declaredExplicit, int baseTagNo) 165 { 166 return checkTag(taggedObject, tagClass, tagNo).getBaseUniversal(declaredExplicit, baseTagNo); 167 } 168 getContextBaseUniversal(ASN1TaggedObject taggedObject, int tagNo, boolean declaredExplicit, int baseTagNo)169 public static ASN1Primitive getContextBaseUniversal(ASN1TaggedObject taggedObject, int tagNo, 170 boolean declaredExplicit, int baseTagNo) 171 { 172 return getBaseUniversal(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo, declaredExplicit, baseTagNo); 173 } 174 tryGetBaseUniversal(ASN1TaggedObject taggedObject, int tagClass, int tagNo, boolean declaredExplicit, int baseTagNo)175 public static ASN1Primitive tryGetBaseUniversal(ASN1TaggedObject taggedObject, int tagClass, int tagNo, 176 boolean declaredExplicit, int baseTagNo) 177 { 178 if (!taggedObject.hasTag(tagClass, tagNo)) 179 { 180 return null; 181 } 182 183 return taggedObject.getBaseUniversal(declaredExplicit, baseTagNo); 184 } 185 tryGetContextBaseUniversal(ASN1TaggedObject taggedObject, int tagNo, boolean declaredExplicit, int baseTagNo)186 public static ASN1Primitive tryGetContextBaseUniversal(ASN1TaggedObject taggedObject, int tagNo, 187 boolean declaredExplicit, int baseTagNo) 188 { 189 return tryGetBaseUniversal(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo, declaredExplicit, baseTagNo); 190 } 191 192 193 /* 194 * Wrappers for ASN1TaggedObjectParser#parseExplicitBaseTagged 195 */ 196 parseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)197 public static ASN1TaggedObjectParser parseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 198 int tagClass, int tagNo) throws IOException 199 { 200 return checkTag(taggedObjectParser, tagClass, tagNo).parseExplicitBaseTagged(); 201 } 202 parseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagNo)203 public static ASN1TaggedObjectParser parseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 204 int tagNo) throws IOException 205 { 206 return parseExplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo); 207 } 208 tryParseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)209 public static ASN1TaggedObjectParser tryParseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 210 int tagClass, int tagNo) throws IOException 211 { 212 if (!taggedObjectParser.hasTag(tagClass, tagNo)) 213 { 214 return null; 215 } 216 217 return taggedObjectParser.parseExplicitBaseTagged(); 218 } 219 tryParseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagNo)220 public static ASN1TaggedObjectParser tryParseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 221 int tagNo) throws IOException 222 { 223 return tryParseExplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo); 224 } 225 226 227 /* 228 * Wrappers for ASN1TaggedObjectParser#parseImplicitBaseTagged 229 */ 230 parseImplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, int baseTagClass, int baseTagNo)231 public static ASN1TaggedObjectParser parseImplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 232 int tagClass, int tagNo, int baseTagClass, int baseTagNo) throws IOException 233 { 234 return checkTag(taggedObjectParser, tagClass, tagNo).parseImplicitBaseTagged(baseTagClass, baseTagNo); 235 } 236 parseImplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagNo, int baseTagClass, int baseTagNo)237 public static ASN1TaggedObjectParser parseImplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 238 int tagNo, int baseTagClass, int baseTagNo) throws IOException 239 { 240 return parseImplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo, baseTagClass, baseTagNo); 241 } 242 tryParseImplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, int baseTagClass, int baseTagNo)243 public static ASN1TaggedObjectParser tryParseImplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 244 int tagClass, int tagNo, int baseTagClass, int baseTagNo) throws IOException 245 { 246 if (!taggedObjectParser.hasTag(tagClass, tagNo)) 247 { 248 return null; 249 } 250 251 return taggedObjectParser.parseImplicitBaseTagged(baseTagClass, baseTagNo); 252 } 253 tryParseImplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, int tagNo, int baseTagClass, int baseTagNo)254 public static ASN1TaggedObjectParser tryParseImplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser, 255 int tagNo, int baseTagClass, int baseTagNo) throws IOException 256 { 257 return tryParseImplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo, baseTagClass, baseTagNo); 258 } 259 260 261 /* 262 * Wrappers for ASN1TaggedObjectParser#parseBaseUniversal 263 */ 264 parseBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, boolean declaredExplicit, int baseTagNo)265 public static ASN1Encodable parseBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagClass, 266 int tagNo, boolean declaredExplicit, int baseTagNo) throws IOException 267 { 268 return checkTag(taggedObjectParser, tagClass, tagNo).parseBaseUniversal(declaredExplicit, baseTagNo); 269 } 270 parseContextBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagNo, boolean declaredExplicit, int baseTagNo)271 public static ASN1Encodable parseContextBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagNo, 272 boolean declaredExplicit, int baseTagNo) throws IOException 273 { 274 return parseBaseUniversal(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo, declaredExplicit, baseTagNo); 275 } 276 tryParseBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, boolean declaredExplicit, int baseTagNo)277 public static ASN1Encodable tryParseBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagClass, 278 int tagNo, boolean declaredExplicit, int baseTagNo) throws IOException 279 { 280 if (!taggedObjectParser.hasTag(tagClass, tagNo)) 281 { 282 return null; 283 } 284 285 return taggedObjectParser.parseBaseUniversal(declaredExplicit, baseTagNo); 286 } 287 tryParseContextBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagNo, boolean declaredExplicit, int baseTagNo)288 public static ASN1Encodable tryParseContextBaseUniversal(ASN1TaggedObjectParser taggedObjectParser, int tagNo, 289 boolean declaredExplicit, int baseTagNo) throws IOException 290 { 291 return tryParseBaseUniversal(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo, declaredExplicit, baseTagNo); 292 } 293 294 295 /* 296 * Wrappers for ASN1TaggedObjectParser#parseExplicitBaseObject 297 */ 298 parseExplicitBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)299 public static ASN1Encodable parseExplicitBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagClass, 300 int tagNo) throws IOException 301 { 302 return checkTag(taggedObjectParser, tagClass, tagNo).parseExplicitBaseObject(); 303 } 304 parseExplicitContextBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagNo)305 public static ASN1Encodable parseExplicitContextBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagNo) 306 throws IOException 307 { 308 return parseExplicitBaseObject(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo); 309 } 310 tryParseExplicitBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)311 public static ASN1Encodable tryParseExplicitBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagClass, 312 int tagNo) throws IOException 313 { 314 if (!taggedObjectParser.hasTag(tagClass, tagNo)) 315 { 316 return null; 317 } 318 319 return taggedObjectParser.parseExplicitBaseObject(); 320 } 321 tryParseExplicitContextBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagNo)322 public static ASN1Encodable tryParseExplicitContextBaseObject(ASN1TaggedObjectParser taggedObjectParser, int tagNo) 323 throws IOException 324 { 325 return tryParseExplicitBaseObject(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo); 326 } 327 } 328