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.io.IOException; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.x500.X500Principal; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Choice; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Implicit; 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 Projectimport org.apache.harmony.security.x501.Name; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 34f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * The class encapsulates the ASN.1 DER encoding/decoding work 35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * with the DistributionPointName structure which is the part 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of X.509 CRL 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (as specified in RFC 3280 - 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Internet X.509 Public Key Infrastructure. 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Certificate and Certificate Revocation List (CRL) Profile. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.ietf.org/rfc/rfc3280.txt): 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DistributionPoint ::= SEQUENCE { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributionPoint [0] DistributionPointName OPTIONAL, 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reasons [1] ReasonFlags OPTIONAL, 48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * cRLIssuer [2] GeneralNames OPTIONAL 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * } 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DistributionPointName ::= CHOICE { 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fullName [0] GeneralNames, 53f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * nameRelativeToCRLIssuer [1] RelativeDistinguishedName 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * } 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ReasonFlags ::= BIT STRING { 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unused (0), 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * keyCompromise (1), 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * cACompromise (2), 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * affiliationChanged (3), 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * superseded (4), 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * cessationOfOperation (5), 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * certificateHold (6), 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * privilegeWithdrawn (7), 65f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * aACompromise (8) 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 695c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class DistributionPointName { 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final GeneralNames fullName; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Name nameRelativeToCRLIssuer; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DistributionPointName(GeneralNames fullName) { 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fullName = fullName; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.nameRelativeToCRLIssuer = null; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 77f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DistributionPointName(Name nameRelativeToCRLIssuer) { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fullName = null; 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.nameRelativeToCRLIssuer = nameRelativeToCRLIssuer; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 838216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes public void dumpValue(StringBuilder sb, String prefix) { 848216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(prefix); 858216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append("Distribution Point Name: [\n"); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (fullName != null) { 878216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes fullName.dumpValue(sb, prefix + " "); 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 898216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(prefix); 908216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(" "); 918216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(nameRelativeToCRLIssuer.getName(X500Principal.RFC2253)); 92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } 938216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append(prefix); 948216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes sb.append("]\n"); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final ASN1Choice ASN1 = new ASN1Choice(new ASN1Type[] { 98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes new ASN1Implicit(0, GeneralNames.ASN1), 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new ASN1Implicit(1, Name.ASN1_RDN) }) { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getIndex(java.lang.Object object) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DistributionPointName dpn = (DistributionPointName) object; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (dpn.fullName == null) ? 1 : 0; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1065c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override protected Object getDecodedObject(BerInputStream in) throws IOException { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DistributionPointName result = null; 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (in.choiceIndex == 0) { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = new DistributionPointName((GeneralNames) in.content); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 111f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes // note: ASN.1 decoder will report an error if index 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // is neither 0 or 1 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = new DistributionPointName((Name) in.content); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getObjectToEncode(Object object) { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DistributionPointName dpn = (DistributionPointName) object; 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (dpn.fullName == null) { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return dpn.nameRelativeToCRLIssuer; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return dpn.fullName; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 128