151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 230350d69719039aafc65e9c783f56b46d9d8725bSergio Giro * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.security.x509; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.OutputStream; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 316d63dcb838153e1fa57dd0047485c576036e4a6aPrzemyslaw Szczepaniakimport java.util.Collections; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.DerOutputStream; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.DerValue; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The Subject Information Access Extension (OID = 1.3.6.1.5.5.7.1.11). 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The subject information access extension indicates how to access 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * information and services for the subject of the certificate in which 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the extension appears. When the subject is a CA, information and 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * services may include certificate validation services and CA policy 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * data. When the subject is an end entity, the information describes 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the type of services offered and how to access them. In this case, 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the contents of this extension are defined in the protocol 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specifications for the supported services. This extension may be 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * included in end entity or CA certificates. Conforming CAs MUST mark 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this extension as non-critical. 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This extension is defined in <a href="http://www.ietf.org/rfc/rfc3280.txt"> 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Internet X.509 PKI Certificate and Certificate Revocation List 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (CRL) Profile</a>. The profile permits 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the extension to be included in end-entity or CA certificates, 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and it must be marked as non-critical. Its ASN.1 definition is as follows: 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * id-pe-subjectInfoAccess OBJECT IDENTIFIER ::= { id-pe 11 } 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * SubjectInfoAccessSyntax ::= 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * SEQUENCE SIZE (1..MAX) OF AccessDescription 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AccessDescription ::= SEQUENCE { 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accessMethod OBJECT IDENTIFIER, 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accessLocation GeneralName } 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Extension 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CertAttrSet 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class SubjectInfoAccessExtension extends Extension 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implements CertAttrSet<String> { 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Identifier for this attribute, to be used with the 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * get, set, delete methods of Certificate, x509 type. 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String IDENT = 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "x509.info.extensions.SubjectInfoAccess"; 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Attribute name. 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String NAME = "SubjectInfoAccess"; 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String DESCRIPTIONS = "descriptions"; 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The List of AccessDescription objects. 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private List<AccessDescription> accessDescriptions; 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create an SubjectInfoAccessExtension from a List of 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AccessDescription; the criticality is set to false. 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param accessDescriptions the List of AccessDescription 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException on error 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SubjectInfoAccessExtension( 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<AccessDescription> accessDescriptions) throws IOException { 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = PKIXExtensions.SubjectInfoAccess_Id; 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = false; 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.accessDescriptions = accessDescriptions; 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create the extension from the passed DER encoded value of the same. 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param critical true if the extension is to be treated as critical. 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value Array of DER encoded bytes of the actual value. 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on error. 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SubjectInfoAccessExtension(Boolean critical, Object value) 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException { 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = PKIXExtensions.SubjectInfoAccess_Id; 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = critical.booleanValue(); 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(value instanceof byte[])) { 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Illegal argument type"); 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensionValue = (byte[])value; 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerValue val = new DerValue(extensionValue); 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (val.tag != DerValue.tag_Sequence) { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Invalid encoding for " + 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "SubjectInfoAccessExtension."); 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski accessDescriptions = new ArrayList<AccessDescription>(); 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (val.data.available() != 0) { 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerValue seq = val.data.getDerValue(); 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AccessDescription accessDescription = new AccessDescription(seq); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski accessDescriptions.add(accessDescription); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the list of AccessDescription objects. 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public List<AccessDescription> getAccessDescriptions() { 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return accessDescriptions; 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the name of this attribute. 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getName() { 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return NAME; 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Write the extension to the DerOutputStream. 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the DerOutputStream to write the extension to. 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on encoding errors. 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void encode(OutputStream out) throws IOException { 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerOutputStream tmp = new DerOutputStream(); 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (this.extensionValue == null) { 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = PKIXExtensions.SubjectInfoAccess_Id; 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = false; 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.encode(tmp); 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.write(tmp.toByteArray()); 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the attribute value. 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17130350d69719039aafc65e9c783f56b46d9d8725bSergio Giro @SuppressWarnings("unchecked") // Checked with instanceof 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void set(String name, Object obj) throws IOException { 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name.equalsIgnoreCase(DESCRIPTIONS)) { 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(obj instanceof List)) { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute value should be of type List."); 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski accessDescriptions = (List<AccessDescription>)obj; 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute name [" + name + 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "] not recognized by " + 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "CertAttrSet:SubjectInfoAccessExtension."); 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the attribute value. 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18930350d69719039aafc65e9c783f56b46d9d8725bSergio Giro public List<AccessDescription> get(String name) throws IOException { 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name.equalsIgnoreCase(DESCRIPTIONS)) { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return accessDescriptions; 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute name [" + name + 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "] not recognized by " + 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "CertAttrSet:SubjectInfoAccessExtension."); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Delete the attribute value. 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void delete(String name) throws IOException { 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name.equalsIgnoreCase(DESCRIPTIONS)) { 2046d63dcb838153e1fa57dd0047485c576036e4a6aPrzemyslaw Szczepaniak accessDescriptions = 2056d63dcb838153e1fa57dd0047485c576036e4a6aPrzemyslaw Szczepaniak Collections.<AccessDescription>emptyList(); 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute name [" + name + 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "] not recognized by " + 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "CertAttrSet:SubjectInfoAccessExtension."); 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return an enumeration of names of attributes existing within this 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attribute. 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Enumeration<String> getElements() { 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AttributeNameEnumeration elements = new AttributeNameEnumeration(); 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements.addElement(DESCRIPTIONS); 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements.elements(); 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Encode this extension value 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void encodeThis() throws IOException { 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (accessDescriptions.isEmpty()) { 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionValue = null; 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerOutputStream ads = new DerOutputStream(); 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (AccessDescription accessDescription : accessDescriptions) { 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski accessDescription.encode(ads); 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerOutputStream seq = new DerOutputStream(); 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski seq.write(DerValue.tag_Sequence, ads); 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionValue = seq.toByteArray(); 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the extension as user readable string. 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.toString() + "SubjectInfoAccess [\n " 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + accessDescriptions + "\n]\n"; 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 248