151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 20310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro * Copyright (c) 1998, 2015, 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 Jastrzebskiimport java.util.*; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.*; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Represents Netscape Certificate Type Extension. 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The details are defined 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <a href=http://www.netscape.com/eng/security/comm4-cert-exts.html> 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * here </a>. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This extension, if present, defines both the purpose 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.g., encipherment, signature, certificate signing) and the application 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.g., SSL, S/Mime or Object Signing of the key contained in the 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * certificate. This extension has been superseded by IETF PKIX extensions 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * but is provided here for compatibility reasons. 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Hemma Prafullchandra 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Extension 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CertAttrSet 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class NetscapeCertTypeExtension extends Extension 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimplements CertAttrSet<String> { 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Identifier for this attribute, to be used with the 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * get, set, delete methods of Certificate, x509 type. 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String IDENT = "x509.info.extensions.NetscapeCertType"; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Attribute names. 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String NAME = "NetscapeCertType"; 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String SSL_CLIENT = "ssl_client"; 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String SSL_SERVER = "ssl_server"; 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String S_MIME = "s_mime"; 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String OBJECT_SIGNING = "object_signing"; 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String SSL_CA = "ssl_ca"; 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String S_MIME_CA = "s_mime_ca"; 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String OBJECT_SIGNING_CA = "object_signing_ca"; 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int CertType_data[] = { 2, 16, 840, 1, 113730, 1, 1 }; 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Object identifier for the Netscape-Cert-Type extension. 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static ObjectIdentifier NetscapeCertType_Id; 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NetscapeCertType_Id = new ObjectIdentifier(CertType_data); 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException ioe) { 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // should not happen 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean[] bitString; 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static class MapEntry { 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String mName; 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int mPosition; 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski MapEntry(String name, int position) { 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mName = name; 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mPosition = position; 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static MapEntry[] mMapData = { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(SSL_CLIENT, 0), 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(SSL_SERVER, 1), 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(S_MIME, 2), 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(OBJECT_SIGNING, 3), 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // note that bit 4 is reserved 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(SSL_CA, 5), 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(S_MIME_CA, 6), 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new MapEntry(OBJECT_SIGNING_CA, 7), 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final Vector<String> mAttributeNames = new Vector<String>(); 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (MapEntry entry : mMapData) { 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mAttributeNames.add(entry.mName); 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static int getPosition(String name) throws IOException { 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < mMapData.length; i++) { 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name.equalsIgnoreCase(mMapData[i].mName)) 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return mMapData[i].mPosition; 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute name [" + name 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "] not recognized by CertAttrSet:NetscapeCertType."); 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Encode this extension value 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void encodeThis() throws IOException { 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerOutputStream os = new DerOutputStream(); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski os.putTruncatedUnalignedBitString(new BitArray(this.bitString)); 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionValue = os.toByteArray(); 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Check if bit is set. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param position the position in the bit string to check. 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean isSet(int position) { 1390310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro return (position < bitString.length) && 1400310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro bitString[position]; 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the bit at the specified position. 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void set(int position, boolean val) { 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // enlarge bitString if necessary 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (position >= bitString.length) { 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean[] tmp = new boolean[position+1]; 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.arraycopy(bitString, 0, tmp, 0, bitString.length); 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bitString = tmp; 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bitString[position] = val; 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a NetscapeCertTypeExtension with the passed bit settings. 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The criticality is set to true. 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param bitString the bits to be set for the extension. 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public NetscapeCertTypeExtension(byte[] bitString) throws IOException { 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new BitArray(bitString.length*8, bitString).toBooleanArray(); 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = NetscapeCertType_Id; 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = true; 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a NetscapeCertTypeExtension with the passed bit settings. 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The criticality is set to true. 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param bitString the bits to be set for the extension. 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public NetscapeCertTypeExtension(boolean[] bitString) throws IOException { 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = bitString; 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = NetscapeCertType_Id; 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = true; 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create the extension from the passed DER encoded value of the same. 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param critical true if the extension is to be treated as critical. 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value an array of DER encoded bytes of the actual value. 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception ClassCastException if value is not an array of bytes 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on error. 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public NetscapeCertTypeExtension(Boolean critical, Object value) 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException { 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = NetscapeCertType_Id; 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = critical.booleanValue(); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionValue = (byte[]) value; 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerValue val = new DerValue(this.extensionValue); 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = val.getUnalignedBitString().toBooleanArray(); 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a default key usage. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public NetscapeCertTypeExtension() { 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensionId = NetscapeCertType_Id; 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski critical = true; 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bitString = new boolean[0]; 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the attribute value. 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void set(String name, Object obj) throws IOException { 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(obj instanceof Boolean)) 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute must be of type Boolean."); 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean val = ((Boolean)obj).booleanValue(); 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski set(getPosition(name), val); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the attribute value. 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22413489c24eb6d80ad0d754e6a8be7812ecda8e72dSergio Giro public Boolean get(String name) throws IOException { 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return Boolean.valueOf(isSet(getPosition(name))); 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Delete the attribute value. 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void delete(String name) throws IOException { 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski set(getPosition(name), false); 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a printable representation of the NetscapeCertType. 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 2400310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro StringBuilder sb = new StringBuilder(); 2410310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(super.toString()); 2420310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append("NetscapeCertType [\n"); 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2440310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(0)) { 2450310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" SSL client\n"); 2460310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2470310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(1)) { 2480310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" SSL server\n"); 2490310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2500310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(2)) { 2510310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" S/MIME\n"); 2520310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2530310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(3)) { 2540310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Object Signing\n"); 2550310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2560310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(5)) { 2570310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" SSL CA\n"); 2580310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2590310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(6)) { 2600310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" S/MIME CA\n"); 2610310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2620310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(7)) { 2630310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Object Signing CA"); 2640310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2650310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro 2660310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append("]\n"); 2670310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro return sb.toString(); 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Write the extension to the DerOutputStream. 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the DerOutputStream to write the extension to. 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on encoding errors. 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void encode(OutputStream out) throws IOException { 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerOutputStream tmp = new DerOutputStream(); 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (this.extensionValue == null) { 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensionId = NetscapeCertType_Id; 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.critical = true; 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski encodeThis(); 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.encode(tmp); 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.write(tmp.toByteArray()); 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return an enumeration of names of attributes existing within this 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attribute. 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Enumeration<String> getElements() { 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return mAttributeNames.elements(); 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the name of this attribute. 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getName() { 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (NAME); 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get a boolean array representing the bits of this extension, 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as it maps to the KeyUsage extension. 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the bit values of this extension mapped to the bit values 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the KeyUsage extension as an array of booleans. 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean[] getKeyUsageMappedBits() { 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyUsageExtension keyUsage = new KeyUsageExtension(); 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Boolean val = Boolean.TRUE; 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isSet(getPosition(SSL_CLIENT)) || 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isSet(getPosition(S_MIME)) || 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isSet(getPosition(OBJECT_SIGNING))) 31713489c24eb6d80ad0d754e6a8be7812ecda8e72dSergio Giro keyUsage.set(KeyUsageExtension.DIGITAL_SIGNATURE, val); 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isSet(getPosition(SSL_SERVER))) 32013489c24eb6d80ad0d754e6a8be7812ecda8e72dSergio Giro keyUsage.set(KeyUsageExtension.KEY_ENCIPHERMENT, val); 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isSet(getPosition(SSL_CA)) || 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isSet(getPosition(S_MIME_CA)) || 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isSet(getPosition(OBJECT_SIGNING_CA))) 32513489c24eb6d80ad0d754e6a8be7812ecda8e72dSergio Giro keyUsage.set(KeyUsageExtension.KEY_CERTSIGN, val); 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException e) { } 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return keyUsage.getBits(); 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 330