1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.harmony.security.x509; 19 20 import java.io.IOException; 21 import java.util.Iterator; 22 import java.util.List; 23 import org.apache.harmony.security.asn1.ASN1Oid; 24 import org.apache.harmony.security.asn1.ASN1SequenceOf; 25 import org.apache.harmony.security.asn1.ASN1Type; 26 import org.apache.harmony.security.asn1.BerInputStream; 27 import org.apache.harmony.security.asn1.ObjectIdentifier; 28 29 /** 30 * Extended Key Usage Extension (OID == 2.5.29.37). 31 * 32 * The ASN.1 definition for Extended Key Usage Extension is: 33 * 34 * <pre> 35 * id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } 36 * 37 * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId 38 * 39 * KeyPurposeId ::= OBJECT IDENTIFIER 40 * </pre> 41 * (as specified in RFC 3280 http://www.ietf.org/rfc/rfc3280.txt 42 */ 43 public final class ExtendedKeyUsage extends ExtensionValue { 44 45 // the value of extension 46 private List<String> keys; 47 48 /** 49 * Creates the extension object on the base of its encoded form. 50 */ 51 public ExtendedKeyUsage(byte[] encoding) { 52 super(encoding); 53 } 54 55 /** 56 * Returns the list of string representation of OIDs corresponding 57 * to key purpose IDs. 58 */ 59 public List<String> getExtendedKeyUsage() throws IOException { 60 if (keys == null) { 61 keys = (List<String>) ASN1.decode(getEncoded()); 62 } 63 return keys; 64 } 65 66 @Override public byte[] getEncoded() { 67 if (encoding == null) { 68 encoding = ASN1.encode(keys); 69 } 70 return encoding; 71 } 72 73 @Override public void dumpValue(StringBuilder sb, String prefix) { 74 sb.append(prefix).append("Extended Key Usage: "); 75 if (keys == null) { 76 try { 77 keys = getExtendedKeyUsage(); 78 } catch (IOException e) { 79 // incorrect extension value encoding 80 super.dumpValue(sb); 81 return; 82 } 83 } 84 sb.append('['); 85 for (Iterator<?> it = keys.iterator(); it.hasNext();) { 86 sb.append(" \"").append(it.next()).append('"'); 87 if (it.hasNext()) { 88 sb.append(','); 89 } 90 } 91 sb.append(" ]\n"); 92 } 93 94 /** 95 * ASN.1 Encoder/Decoder. 96 */ 97 public static final ASN1Type ASN1 = new ASN1SequenceOf(new ASN1Oid() { 98 public Object getDecodedObject(BerInputStream in) throws IOException { 99 int[] oid = (int[]) super.getDecodedObject(in); 100 return ObjectIdentifier.toString(oid); 101 } 102 }); 103 } 104