1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Alexander Y. Kleymenov 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$ 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/ 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.x509; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1SequenceOf; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.BerInputStream; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 34f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * The class encapsulates the ASN.1 DER encoding/decoding work 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the GeneralNames structure which is a part of X.509 certificate 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (as specified in RFC 3280 - 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Internet X.509 Public Key Infrastructure. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Certificate and Certificate Revocation List (CRL) Profile. 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.ietf.org/rfc/rfc3280.txt): 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 41f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 45f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.apache.harmony.security.x509.NameConstraints 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.apache.harmony.security.x509.GeneralSubtree 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 495c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class GeneralNames { 505c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the values of GeneralName */ 515c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private List<GeneralName> generalNames; 525c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the ASN.1 encoded form of GeneralNames */ 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] encoding; 54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public GeneralNames() { 565c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson generalNames = new ArrayList<GeneralName>(); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 595c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson public GeneralNames(List<GeneralName> generalNames) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.generalNames = generalNames; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 635c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private GeneralNames(List<GeneralName> generalNames, byte[] encoding) { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.generalNames = generalNames; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.encoding = encoding; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the list of values. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 715c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson public List<GeneralName> getNames() { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((generalNames == null) || (generalNames.size() == 0)) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 755c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson return new ArrayList<GeneralName>(generalNames); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the collection of pairs: (Integer (tag), Object (name value))* 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 815c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson public Collection<List<?>> getPairsList() { 825c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson Collection<List<?>> result = new ArrayList<List<?>>(); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (generalNames == null) { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 865c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson for (GeneralName generalName : generalNames) { 873b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root /* 883b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root * If we have an error decoding one of the GeneralNames, we'll just 893b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root * omit it from the final list. 903b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root */ 913b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root final List<Object> genNameList; 923b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root try { 933b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root genNameList = generalName.getAsList(); 943b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root } catch (IllegalArgumentException ignored) { 953b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root continue; 963b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root } 973b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root 983b14c4bd5c7ce28ed3485bd24285c58424c074afKenny Root result.add(genNameList); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void addName(GeneralName name) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project encoding = null; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (generalNames == null) { 1065c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson generalNames = new ArrayList<GeneralName>(); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project generalNames.add(name); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns ASN.1 encoded form of this X.509 GeneralNames value. 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getEncoded() { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (encoding == null) { 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project encoding = ASN1.encode(this); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return encoding; 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1218216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes public void dumpValue(StringBuilder sb, String prefix) { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (generalNames == null) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1255c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson for (GeneralName generalName : generalNames) { 1268216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(prefix); 1278216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(generalName); 1288216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append('\n'); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ASN.1 DER X.509 GeneralNames encoder/decoder class. 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final ASN1Type ASN1 = new ASN1SequenceOf(GeneralName.ASN1) { 1365c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override public Object getDecodedObject(BerInputStream in) { 1375c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson return new GeneralNames((List<GeneralName>) in.content, in.getEncoded()); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1405c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override public Collection getValues(Object object) { 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project GeneralNames gns = (GeneralNames) object; 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return gns.generalNames; 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 146