X509ExtensionUtil.java revision 44021512997b337e6079e46fd4230ce979c20b6f
1package org.bouncycastle.x509.extension; 2 3import java.io.IOException; 4// BEGIN android-added 5import java.net.InetAddress; 6import java.net.UnknownHostException; 7// END android-added 8import java.security.cert.CertificateParsingException; 9import java.security.cert.X509Certificate; 10import java.util.ArrayList; 11import java.util.Collection; 12import java.util.Collections; 13import java.util.Enumeration; 14import java.util.List; 15 16import org.bouncycastle.asn1.ASN1ObjectIdentifier; 17import org.bouncycastle.asn1.ASN1OctetString; 18import org.bouncycastle.asn1.ASN1Primitive; 19import org.bouncycastle.asn1.ASN1String; 20import org.bouncycastle.asn1.DEROctetString; 21import org.bouncycastle.asn1.DERSequence; 22import org.bouncycastle.asn1.x500.X500Name; 23import org.bouncycastle.asn1.x509.GeneralName; 24import org.bouncycastle.asn1.x509.X509Extension; 25// BEGIN android-added 26import org.bouncycastle.asn1.x509.X509Name; 27// END android-added 28 29 30public class X509ExtensionUtil 31{ 32 public static ASN1Primitive fromExtensionValue( 33 byte[] encodedValue) 34 throws IOException 35 { 36 ASN1OctetString octs = (ASN1OctetString)ASN1Primitive.fromByteArray(encodedValue); 37 38 return ASN1Primitive.fromByteArray(octs.getOctets()); 39 } 40 41 public static Collection getIssuerAlternativeNames(X509Certificate cert) 42 throws CertificateParsingException 43 { 44 byte[] extVal = cert.getExtensionValue(X509Extension.issuerAlternativeName.getId()); 45 46 return getAlternativeNames(extVal); 47 } 48 49 public static Collection getSubjectAlternativeNames(X509Certificate cert) 50 throws CertificateParsingException 51 { 52 byte[] extVal = cert.getExtensionValue(X509Extension.subjectAlternativeName.getId()); 53 54 return getAlternativeNames(extVal); 55 } 56 57 private static Collection getAlternativeNames(byte[] extVal) 58 throws CertificateParsingException 59 { 60 if (extVal == null) 61 { 62 // BEGIN android-changed 63 return null; 64 // END android-changed 65 } 66 try 67 { 68 Collection temp = new ArrayList(); 69 Enumeration it = DERSequence.getInstance(fromExtensionValue(extVal)).getObjects(); 70 while (it.hasMoreElements()) 71 { 72 GeneralName genName = GeneralName.getInstance(it.nextElement()); 73 List list = new ArrayList(); 74 // BEGIN android-changed 75 list.add(Integer.valueOf(genName.getTagNo())); 76 // END android-changed 77 switch (genName.getTagNo()) 78 { 79 case GeneralName.ediPartyName: 80 case GeneralName.x400Address: 81 case GeneralName.otherName: 82 // BEGIN android-changed 83 list.add(genName.getEncoded()); 84 // END android-changed 85 break; 86 case GeneralName.directoryName: 87 // BEGIN android-changed 88 list.add(X509Name.getInstance(genName.getName()).toString(true, 89 X509Name.DefaultSymbols)); 90 // END android-changed 91 break; 92 case GeneralName.dNSName: 93 case GeneralName.rfc822Name: 94 case GeneralName.uniformResourceIdentifier: 95 list.add(((ASN1String)genName.getName()).getString()); 96 break; 97 case GeneralName.registeredID: 98 list.add(ASN1ObjectIdentifier.getInstance(genName.getName()).getId()); 99 break; 100 case GeneralName.iPAddress: 101 // BEGIN android-changed 102 byte[] addrBytes = DEROctetString.getInstance(genName.getName()).getOctets(); 103 final String addr; 104 try { 105 addr = InetAddress.getByAddress(addrBytes).getHostAddress(); 106 } catch (UnknownHostException e) { 107 continue; 108 } 109 list.add(addr); 110 // END android-changed 111 break; 112 default: 113 throw new IOException("Bad tag number: " + genName.getTagNo()); 114 } 115 116 temp.add(list); 117 } 118 // BEGIN android-added 119 if (temp.size() == 0) { 120 return null; 121 } 122 // END android-added 123 return Collections.unmodifiableCollection(temp); 124 } 125 catch (Exception e) 126 { 127 throw new CertificateParsingException(e.getMessage()); 128 } 129 } 130} 131