Skip to content

Commit b77d970

Browse files
committed
Refactor extensions code in X.509 types
1 parent 85493d1 commit b77d970

File tree

22 files changed

+535
-763
lines changed

22 files changed

+535
-763
lines changed

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/x509/X509CRLEntryObject.java

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.bouncycastle.asn1.ASN1Enumerated;
1616
import org.bouncycastle.asn1.ASN1InputStream;
1717
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
18+
import org.bouncycastle.asn1.ASN1OctetString;
1819
import org.bouncycastle.asn1.util.ASN1Dump;
1920
import org.bouncycastle.asn1.x500.X500Name;
2021
import org.bouncycastle.asn1.x509.CRLReason;
@@ -78,9 +79,9 @@ protected X509CRLEntryObject(
7879
*/
7980
public boolean hasUnsupportedCriticalExtension()
8081
{
81-
Set extns = getCriticalExtensionOIDs();
82+
Extensions extensions = c.getExtensions();
8283

83-
return extns != null && !extns.isEmpty();
84+
return extensions != null && extensions.hasAnyCriticalExtensions();
8485
}
8586

8687
private X500Name loadCertificateIssuer(boolean isIndirect, X500Name previousCertificateIssuer)
@@ -90,15 +91,15 @@ private X500Name loadCertificateIssuer(boolean isIndirect, X500Name previousCert
9091
return null;
9192
}
9293

93-
Extension ext = getExtension(Extension.certificateIssuer);
94-
if (ext == null)
94+
ASN1OctetString extValue = Extensions.getExtensionValue(c.getExtensions(), Extension.certificateIssuer);
95+
if (extValue == null)
9596
{
9697
return previousCertificateIssuer;
9798
}
9899

99100
try
100101
{
101-
GeneralName[] names = GeneralNames.getInstance(ext.getParsedValue()).getNames();
102+
GeneralName[] names = GeneralNames.getInstance(extValue.getOctets()).getNames();
102103
for (int i = 0; i < names.length; i++)
103104
{
104105
if (names[i].getTagNo() == GeneralName.directoryName)
@@ -166,35 +167,9 @@ public Set getNonCriticalExtensionOIDs()
166167
return getExtensionOIDs(false);
167168
}
168169

169-
private Extension getExtension(ASN1ObjectIdentifier oid)
170-
{
171-
Extensions exts = c.getExtensions();
172-
173-
if (exts != null)
174-
{
175-
return exts.getExtension(oid);
176-
}
177-
178-
return null;
179-
}
180-
181170
public byte[] getExtensionValue(String oid)
182171
{
183-
Extension ext = getExtension(new ASN1ObjectIdentifier(oid));
184-
185-
if (ext != null)
186-
{
187-
try
188-
{
189-
return ext.getExtnValue().getEncoded();
190-
}
191-
catch (Exception e)
192-
{
193-
throw new IllegalStateException("Exception encoding: " + e.toString());
194-
}
195-
}
196-
197-
return null;
172+
return X509SignatureUtil.getExtensionValue(c.getExtensions(), oid);
198173
}
199174

200175
/**

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/x509/X509CRLImpl.java

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.bouncycastle.jcajce.util.JcaJceHelper;
5555
import org.bouncycastle.jce.X509Principal;
5656
import org.bouncycastle.util.Arrays;
57-
import org.bouncycastle.util.Exceptions;
5857
import org.bouncycastle.util.Strings;
5958

6059
/**
@@ -84,30 +83,41 @@ abstract class X509CRLImpl
8483
this.isIndirect = isIndirect;
8584
}
8685

87-
/**
88-
* Will return true if any extensions are present and marked
89-
* as critical as we currently dont handle any extensions!
90-
*/
9186
public boolean hasUnsupportedCriticalExtension()
9287
{
93-
Set extns = getCriticalExtensionOIDs();
94-
95-
if (extns == null)
88+
if (getVersion() == 2)
9689
{
97-
return false;
98-
}
90+
Extensions extensions = c.getExtensions();
91+
if (extensions != null)
92+
{
93+
Enumeration e = extensions.oids();
94+
while (e.hasMoreElements())
95+
{
96+
ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement();
9997

100-
extns.remove(Extension.issuingDistributionPoint.getId());
101-
extns.remove(Extension.deltaCRLIndicator.getId());
98+
if (Extension.issuingDistributionPoint.equals(oid) ||
99+
Extension.deltaCRLIndicator.equals(oid))
100+
{
101+
continue;
102+
}
103+
104+
Extension ext = extensions.getExtension(oid);
105+
if (ext.isCritical())
106+
{
107+
return true;
108+
}
109+
}
110+
}
111+
}
102112

103-
return !extns.isEmpty();
113+
return false;
104114
}
105115

106116
private Set getExtensionOIDs(boolean critical)
107117
{
108118
if (this.getVersion() == 2)
109119
{
110-
Extensions extensions = c.getTBSCertList().getExtensions();
120+
Extensions extensions = c.getExtensions();
111121

112122
if (extensions != null)
113123
{
@@ -144,26 +154,7 @@ public Set getNonCriticalExtensionOIDs()
144154

145155
public byte[] getExtensionValue(String oid)
146156
{
147-
if (oid != null)
148-
{
149-
ASN1ObjectIdentifier asn1Oid = ASN1ObjectIdentifier.tryFromID(oid);
150-
if (asn1Oid != null)
151-
{
152-
ASN1OctetString extValue = getExtensionValue(c, asn1Oid);
153-
if (null != extValue)
154-
{
155-
try
156-
{
157-
return extValue.getEncoded();
158-
}
159-
catch (Exception e)
160-
{
161-
throw Exceptions.illegalStateException("error parsing " + e.getMessage(), e);
162-
}
163-
}
164-
}
165-
}
166-
return null;
157+
return X509SignatureUtil.getExtensionValue(c.getExtensions(), oid);
167158
}
168159

169160
public void verify(PublicKey key)
@@ -548,7 +539,7 @@ public String toString()
548539

549540
X509SignatureUtil.prettyPrintSignature(this.getSignature(), buf, nl);
550541

551-
Extensions extensions = c.getTBSCertList().getExtensions();
542+
Extensions extensions = c.getExtensions();
552543

553544
if (extensions != null)
554545
{
@@ -708,25 +699,8 @@ public boolean isRevoked(Certificate cert)
708699

709700
static byte[] getExtensionOctets(CertificateList c, ASN1ObjectIdentifier oid)
710701
{
711-
ASN1OctetString extValue = getExtensionValue(c, oid);
712-
if (null != extValue)
713-
{
714-
return extValue.getOctets();
715-
}
716-
return null;
717-
}
702+
ASN1OctetString extValue = Extensions.getExtensionValue(c.getExtensions(), oid);
718703

719-
static ASN1OctetString getExtensionValue(CertificateList c, ASN1ObjectIdentifier oid)
720-
{
721-
Extensions exts = c.getTBSCertList().getExtensions();
722-
if (null != exts)
723-
{
724-
Extension ext = exts.getExtension(oid);
725-
if (null != ext)
726-
{
727-
return ext.getExtnValue();
728-
}
729-
}
730-
return null;
704+
return extValue == null ? null : extValue.getOctets();
731705
}
732706
}

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/x509/X509CertificateImpl.java

Lines changed: 22 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public boolean[] getKeyUsage()
271271
return Arrays.clone(keyUsage);
272272
}
273273

274-
public List getExtendedKeyUsage()
274+
public List getExtendedKeyUsage()
275275
throws CertificateParsingException
276276
{
277277
byte[] extOctets = getExtensionOctets(c, Extension.extendedKeyUsage);
@@ -330,7 +330,7 @@ public Set getCriticalExtensionOIDs()
330330
if (this.getVersion() == 3)
331331
{
332332
Set set = new HashSet();
333-
Extensions extensions = c.getTBSCertificate().getExtensions();
333+
Extensions extensions = c.getExtensions();
334334

335335
if (extensions != null)
336336
{
@@ -356,34 +356,15 @@ public Set getCriticalExtensionOIDs()
356356

357357
public byte[] getExtensionValue(String oid)
358358
{
359-
if (oid != null)
360-
{
361-
ASN1ObjectIdentifier asn1Oid = ASN1ObjectIdentifier.tryFromID(oid);
362-
if (asn1Oid != null)
363-
{
364-
ASN1OctetString extValue = getExtensionValue(c, asn1Oid);
365-
if (null != extValue)
366-
{
367-
try
368-
{
369-
return extValue.getEncoded();
370-
}
371-
catch (Exception e)
372-
{
373-
throw Exceptions.illegalStateException("error parsing " + e.getMessage(), e);
374-
}
375-
}
376-
}
377-
}
378-
return null;
359+
return X509SignatureUtil.getExtensionValue(c.getExtensions(), oid);
379360
}
380361

381362
public Set getNonCriticalExtensionOIDs()
382363
{
383364
if (this.getVersion() == 3)
384365
{
385366
Set set = new HashSet();
386-
Extensions extensions = c.getTBSCertificate().getExtensions();
367+
Extensions extensions = c.getExtensions();
387368

388369
if (extensions != null)
389370
{
@@ -409,35 +390,32 @@ public Set getNonCriticalExtensionOIDs()
409390

410391
public boolean hasUnsupportedCriticalExtension()
411392
{
412-
if (this.getVersion() == 3)
393+
if (getVersion() == 3)
413394
{
414-
Extensions extensions = c.getTBSCertificate().getExtensions();
415-
395+
Extensions extensions = c.getExtensions();
416396
if (extensions != null)
417397
{
418-
Enumeration e = extensions.oids();
419-
398+
Enumeration e = extensions.oids();
420399
while (e.hasMoreElements())
421400
{
422401
ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement();
423402

424-
if (oid.equals(Extension.keyUsage)
425-
|| oid.equals(Extension.certificatePolicies)
426-
|| oid.equals(Extension.policyMappings)
427-
|| oid.equals(Extension.inhibitAnyPolicy)
428-
|| oid.equals(Extension.cRLDistributionPoints)
429-
|| oid.equals(Extension.issuingDistributionPoint)
430-
|| oid.equals(Extension.deltaCRLIndicator)
431-
|| oid.equals(Extension.policyConstraints)
432-
|| oid.equals(Extension.basicConstraints)
433-
|| oid.equals(Extension.subjectAlternativeName)
434-
|| oid.equals(Extension.nameConstraints))
403+
if (Extension.keyUsage.equals(oid) ||
404+
Extension.certificatePolicies.equals(oid) ||
405+
Extension.policyMappings.equals(oid) ||
406+
Extension.inhibitAnyPolicy.equals(oid) ||
407+
Extension.cRLDistributionPoints.equals(oid) ||
408+
Extension.issuingDistributionPoint.equals(oid) ||
409+
Extension.deltaCRLIndicator.equals(oid) ||
410+
Extension.policyConstraints.equals(oid) ||
411+
Extension.basicConstraints.equals(oid) ||
412+
Extension.subjectAlternativeName.equals(oid) ||
413+
Extension.nameConstraints.equals(oid))
435414
{
436415
continue;
437416
}
438417

439-
Extension ext = extensions.getExtension(oid);
440-
418+
Extension ext = extensions.getExtension(oid);
441419
if (ext.isCritical())
442420
{
443421
return true;
@@ -477,7 +455,7 @@ public String toString()
477455

478456
X509SignatureUtil.prettyPrintSignature(this.getSignature(), buf, nl);
479457

480-
Extensions extensions = c.getTBSCertificate().getExtensions();
458+
Extensions extensions = c.getExtensions();
481459

482460
if (extensions != null)
483461
{
@@ -852,25 +830,8 @@ private static Collection getAlternativeNames(org.bouncycastle.asn1.x509.Certifi
852830

853831
static byte[] getExtensionOctets(org.bouncycastle.asn1.x509.Certificate c, ASN1ObjectIdentifier oid)
854832
{
855-
ASN1OctetString extValue = getExtensionValue(c, oid);
856-
if (null != extValue)
857-
{
858-
return extValue.getOctets();
859-
}
860-
return null;
861-
}
833+
ASN1OctetString extValue = Extensions.getExtensionValue(c.getExtensions(), oid);
862834

863-
static ASN1OctetString getExtensionValue(org.bouncycastle.asn1.x509.Certificate c, ASN1ObjectIdentifier oid)
864-
{
865-
Extensions exts = c.getTBSCertificate().getExtensions();
866-
if (null != exts)
867-
{
868-
Extension ext = exts.getExtension(oid);
869-
if (null != ext)
870-
{
871-
return ext.getExtnValue();
872-
}
873-
}
874-
return null;
835+
return extValue == null ? null : extValue.getOctets();
875836
}
876837
}

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/x509/X509SignatureUtil.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@
1515

1616
import org.bouncycastle.asn1.ASN1Encodable;
1717
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
18+
import org.bouncycastle.asn1.ASN1OctetString;
1819
import org.bouncycastle.asn1.DERNull;
1920
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
2021
import org.bouncycastle.asn1.pkcs.RSASSAPSSparams;
2122
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
23+
import org.bouncycastle.asn1.x509.Extensions;
2224
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
2325
import org.bouncycastle.internal.asn1.edec.EdECObjectIdentifiers;
2426
import org.bouncycastle.internal.asn1.misc.MiscObjectIdentifiers;
2527
import org.bouncycastle.internal.asn1.oiw.OIWObjectIdentifiers;
2628
import org.bouncycastle.jcajce.util.MessageDigestUtils;
2729
import org.bouncycastle.jce.provider.BouncyCastleProvider;
30+
import org.bouncycastle.util.Exceptions;
2831
import org.bouncycastle.util.Objects;
2932
import org.bouncycastle.util.Properties;
3033
import org.bouncycastle.util.encoders.Hex;
@@ -59,6 +62,30 @@ static boolean areEquivalentAlgorithms(AlgorithmIdentifier id1, AlgorithmIdentif
5962
return Objects.areEqual(id1.getParameters(), id2.getParameters());
6063
}
6164

65+
static byte[] getExtensionValue(Extensions extensions, String oid)
66+
{
67+
if (oid != null)
68+
{
69+
ASN1ObjectIdentifier asn1Oid = ASN1ObjectIdentifier.tryFromID(oid);
70+
if (asn1Oid != null)
71+
{
72+
ASN1OctetString extValue = Extensions.getExtensionValue(extensions, asn1Oid);
73+
if (null != extValue)
74+
{
75+
try
76+
{
77+
return extValue.getEncoded();
78+
}
79+
catch (Exception e)
80+
{
81+
throw Exceptions.illegalStateException("error parsing " + e.getMessage(), e);
82+
}
83+
}
84+
}
85+
}
86+
return null;
87+
}
88+
6289
private static boolean isAbsentOrEmptyParameters(ASN1Encodable parameters)
6390
{
6491
return parameters == null || DERNull.INSTANCE.equals(parameters);

0 commit comments

Comments
 (0)