package org.bouncycastle.asn1.x509; import com.google.common.primitives.UnsignedBytes; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.bouncycastle.asn1.ASN1OctetString; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.DERIA5String; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.Integers; import org.bouncycastle.util.Strings; /* loaded from: classes6.dex */ public class PKIXNameConstraintValidator implements NameConstraintValidator { private Set permittedSubtreesDN; private Set permittedSubtreesDNS; private Set permittedSubtreesEmail; private Set permittedSubtreesIP; private Set permittedSubtreesURI; private Set excludedSubtreesDN = new HashSet(); private Set excludedSubtreesDNS = new HashSet(); private Set excludedSubtreesEmail = new HashSet(); private Set excludedSubtreesURI = new HashSet(); private Set excludedSubtreesIP = new HashSet(); public String toString() { String str; if (this.permittedSubtreesDN != null) { StringBuilder sb = new StringBuilder("permitted:\nDN:\n"); sb.append(this.permittedSubtreesDN.toString()); sb.append("\n"); str = sb.toString(); } else { str = "permitted:\n"; } if (this.permittedSubtreesDNS != null) { StringBuilder sb2 = new StringBuilder(); sb2.append(str); sb2.append("DNS:\n"); String obj = sb2.toString(); StringBuilder sb3 = new StringBuilder(); sb3.append(obj); sb3.append(this.permittedSubtreesDNS.toString()); sb3.append("\n"); str = sb3.toString(); } if (this.permittedSubtreesEmail != null) { StringBuilder sb4 = new StringBuilder(); sb4.append(str); sb4.append("Email:\n"); String obj2 = sb4.toString(); StringBuilder sb5 = new StringBuilder(); sb5.append(obj2); sb5.append(this.permittedSubtreesEmail.toString()); sb5.append("\n"); str = sb5.toString(); } if (this.permittedSubtreesURI != null) { StringBuilder sb6 = new StringBuilder(); sb6.append(str); sb6.append("URI:\n"); String obj3 = sb6.toString(); StringBuilder sb7 = new StringBuilder(); sb7.append(obj3); sb7.append(this.permittedSubtreesURI.toString()); sb7.append("\n"); str = sb7.toString(); } if (this.permittedSubtreesIP != null) { StringBuilder sb8 = new StringBuilder(); sb8.append(str); sb8.append("IP:\n"); String obj4 = sb8.toString(); StringBuilder sb9 = new StringBuilder(); sb9.append(obj4); sb9.append(stringifyIPCollection(this.permittedSubtreesIP)); sb9.append("\n"); str = sb9.toString(); } StringBuilder sb10 = new StringBuilder(); sb10.append(str); sb10.append("excluded:\n"); String obj5 = sb10.toString(); if (!this.excludedSubtreesDN.isEmpty()) { StringBuilder sb11 = new StringBuilder(); sb11.append(obj5); sb11.append("DN:\n"); String obj6 = sb11.toString(); StringBuilder sb12 = new StringBuilder(); sb12.append(obj6); sb12.append(this.excludedSubtreesDN.toString()); sb12.append("\n"); obj5 = sb12.toString(); } if (!this.excludedSubtreesDNS.isEmpty()) { StringBuilder sb13 = new StringBuilder(); sb13.append(obj5); sb13.append("DNS:\n"); String obj7 = sb13.toString(); StringBuilder sb14 = new StringBuilder(); sb14.append(obj7); sb14.append(this.excludedSubtreesDNS.toString()); sb14.append("\n"); obj5 = sb14.toString(); } if (!this.excludedSubtreesEmail.isEmpty()) { StringBuilder sb15 = new StringBuilder(); sb15.append(obj5); sb15.append("Email:\n"); String obj8 = sb15.toString(); StringBuilder sb16 = new StringBuilder(); sb16.append(obj8); sb16.append(this.excludedSubtreesEmail.toString()); sb16.append("\n"); obj5 = sb16.toString(); } if (!this.excludedSubtreesURI.isEmpty()) { StringBuilder sb17 = new StringBuilder(); sb17.append(obj5); sb17.append("URI:\n"); String obj9 = sb17.toString(); StringBuilder sb18 = new StringBuilder(); sb18.append(obj9); sb18.append(this.excludedSubtreesURI.toString()); sb18.append("\n"); obj5 = sb18.toString(); } if (this.excludedSubtreesIP.isEmpty()) { return obj5; } StringBuilder sb19 = new StringBuilder(); sb19.append(obj5); sb19.append("IP:\n"); String obj10 = sb19.toString(); StringBuilder sb20 = new StringBuilder(); sb20.append(obj10); sb20.append(stringifyIPCollection(this.excludedSubtreesIP)); sb20.append("\n"); return sb20.toString(); } @Override // org.bouncycastle.asn1.x509.NameConstraintValidator public void intersectPermittedSubtree(GeneralSubtree[] generalSubtreeArr) { HashMap hashMap = new HashMap(); for (int i = 0; i != generalSubtreeArr.length; i++) { GeneralSubtree generalSubtree = generalSubtreeArr[i]; Integer valueOf = Integers.valueOf(generalSubtree.getBase().getTagNo()); if (hashMap.get(valueOf) == null) { hashMap.put(valueOf, new HashSet()); } ((Set) hashMap.get(valueOf)).add(generalSubtree); } for (Map.Entry entry : hashMap.entrySet()) { int intValue = ((Integer) entry.getKey()).intValue(); if (intValue == 1) { this.permittedSubtreesEmail = intersectEmail(this.permittedSubtreesEmail, (Set) entry.getValue()); } else if (intValue == 2) { this.permittedSubtreesDNS = intersectDNS(this.permittedSubtreesDNS, (Set) entry.getValue()); } else if (intValue == 4) { this.permittedSubtreesDN = intersectDN(this.permittedSubtreesDN, (Set) entry.getValue()); } else if (intValue == 6) { this.permittedSubtreesURI = intersectURI(this.permittedSubtreesURI, (Set) entry.getValue()); } else if (intValue == 7) { this.permittedSubtreesIP = intersectIP(this.permittedSubtreesIP, (Set) entry.getValue()); } } } @Override // org.bouncycastle.asn1.x509.NameConstraintValidator public void intersectPermittedSubtree(GeneralSubtree generalSubtree) { intersectPermittedSubtree(new GeneralSubtree[]{generalSubtree}); } @Override // org.bouncycastle.asn1.x509.NameConstraintValidator public void intersectEmptyPermittedSubtree(int i) { if (i == 1) { this.permittedSubtreesEmail = new HashSet(); return; } if (i == 2) { this.permittedSubtreesDNS = new HashSet(); return; } if (i == 4) { this.permittedSubtreesDN = new HashSet(); } else if (i == 6) { this.permittedSubtreesURI = new HashSet(); } else if (i == 7) { this.permittedSubtreesIP = new HashSet(); } } public int hashCode() { return hashCollection(this.excludedSubtreesDN) + hashCollection(this.excludedSubtreesDNS) + hashCollection(this.excludedSubtreesEmail) + hashCollection(this.excludedSubtreesIP) + hashCollection(this.excludedSubtreesURI) + hashCollection(this.permittedSubtreesDN) + hashCollection(this.permittedSubtreesDNS) + hashCollection(this.permittedSubtreesEmail) + hashCollection(this.permittedSubtreesIP) + hashCollection(this.permittedSubtreesURI); } public boolean equals(Object obj) { if (!(obj instanceof PKIXNameConstraintValidator)) { return false; } PKIXNameConstraintValidator pKIXNameConstraintValidator = (PKIXNameConstraintValidator) obj; return collectionsAreEqual(pKIXNameConstraintValidator.excludedSubtreesDN, this.excludedSubtreesDN) && collectionsAreEqual(pKIXNameConstraintValidator.excludedSubtreesDNS, this.excludedSubtreesDNS) && collectionsAreEqual(pKIXNameConstraintValidator.excludedSubtreesEmail, this.excludedSubtreesEmail) && collectionsAreEqual(pKIXNameConstraintValidator.excludedSubtreesIP, this.excludedSubtreesIP) && collectionsAreEqual(pKIXNameConstraintValidator.excludedSubtreesURI, this.excludedSubtreesURI) && collectionsAreEqual(pKIXNameConstraintValidator.permittedSubtreesDN, this.permittedSubtreesDN) && collectionsAreEqual(pKIXNameConstraintValidator.permittedSubtreesDNS, this.permittedSubtreesDNS) && collectionsAreEqual(pKIXNameConstraintValidator.permittedSubtreesEmail, this.permittedSubtreesEmail) && collectionsAreEqual(pKIXNameConstraintValidator.permittedSubtreesIP, this.permittedSubtreesIP) && collectionsAreEqual(pKIXNameConstraintValidator.permittedSubtreesURI, this.permittedSubtreesURI); } @Override // org.bouncycastle.asn1.x509.NameConstraintValidator public void checkPermitted(GeneralName generalName) throws NameConstraintValidatorException { int tagNo = generalName.getTagNo(); if (tagNo == 1) { checkPermittedEmail(this.permittedSubtreesEmail, extractNameAsString(generalName)); return; } if (tagNo == 2) { checkPermittedDNS(this.permittedSubtreesDNS, DERIA5String.getInstance(generalName.getName()).getString()); return; } if (tagNo == 4) { checkPermittedDN(X500Name.getInstance(generalName.getName())); return; } if (tagNo == 6) { checkPermittedURI(this.permittedSubtreesURI, DERIA5String.getInstance(generalName.getName()).getString()); } else if (tagNo == 7) { checkPermittedIP(this.permittedSubtreesIP, ASN1OctetString.getInstance(generalName.getName()).getOctets()); } } @Override // org.bouncycastle.asn1.x509.NameConstraintValidator public void checkExcluded(GeneralName generalName) throws NameConstraintValidatorException { int tagNo = generalName.getTagNo(); if (tagNo == 1) { checkExcludedEmail(this.excludedSubtreesEmail, extractNameAsString(generalName)); return; } if (tagNo == 2) { checkExcludedDNS(this.excludedSubtreesDNS, DERIA5String.getInstance(generalName.getName()).getString()); return; } if (tagNo == 4) { checkExcludedDN(X500Name.getInstance(generalName.getName())); return; } if (tagNo == 6) { checkExcludedURI(this.excludedSubtreesURI, DERIA5String.getInstance(generalName.getName()).getString()); } else if (tagNo == 7) { checkExcludedIP(this.excludedSubtreesIP, ASN1OctetString.getInstance(generalName.getName()).getOctets()); } } @Override // org.bouncycastle.asn1.x509.NameConstraintValidator public void addExcludedSubtree(GeneralSubtree generalSubtree) { GeneralName base = generalSubtree.getBase(); int tagNo = base.getTagNo(); if (tagNo == 1) { this.excludedSubtreesEmail = unionEmail(this.excludedSubtreesEmail, extractNameAsString(base)); return; } if (tagNo == 2) { this.excludedSubtreesDNS = unionDNS(this.excludedSubtreesDNS, extractNameAsString(base)); return; } if (tagNo == 4) { this.excludedSubtreesDN = unionDN(this.excludedSubtreesDN, (ASN1Sequence) base.getName().toASN1Primitive()); } else if (tagNo == 6) { this.excludedSubtreesURI = unionURI(this.excludedSubtreesURI, extractNameAsString(base)); } else if (tagNo == 7) { this.excludedSubtreesIP = unionIP(this.excludedSubtreesIP, ASN1OctetString.getInstance(base.getName()).getOctets()); } } private boolean withinDomain(String str, String str2) { if (str2.startsWith(".")) { str2 = str2.substring(1); } String[] split = Strings.split(str2, '.'); String[] split2 = Strings.split(str, '.'); if (split2.length <= split.length) { return false; } int length = split2.length - split.length; for (int i = -1; i < split.length; i++) { if (i == -1) { if (split2[i + length].equals("")) { return false; } } else if (!split[i].equalsIgnoreCase(split2[i + length])) { return false; } } return true; } private static boolean withinDNSubtree(ASN1Sequence aSN1Sequence, ASN1Sequence aSN1Sequence2) { if (aSN1Sequence2.size() <= 0 || aSN1Sequence2.size() > aSN1Sequence.size()) { return false; } for (int size = aSN1Sequence2.size() - 1; size >= 0; size--) { if (!aSN1Sequence2.getObjectAt(size).equals(aSN1Sequence.getObjectAt(size))) { return false; } } return true; } /* JADX WARN: Code restructure failed: missing block: B:11:0x00a0, code lost: r7.add(r5); */ /* JADX WARN: Code restructure failed: missing block: B:12:0x00a3, code lost: return; */ /* JADX WARN: Code restructure failed: missing block: B:24:0x0053, code lost: if (withinDomain(r6.substring(r5.indexOf(64) + 1), r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:32:0x006c, code lost: if (withinDomain(r6, r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:34:0x0073, code lost: if (withinDomain(r6, r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:38:0x008a, code lost: if (r6.substring(r5.indexOf(64) + 1).equalsIgnoreCase(r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:42:0x0097, code lost: if (withinDomain(r5, r6) != false) goto L51; */ /* JADX WARN: Code restructure failed: missing block: B:44:0x009e, code lost: if (r5.equalsIgnoreCase(r6) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:6:0x001f, code lost: if (r5.equalsIgnoreCase(r6) != false) goto L48; */ /* Code decompiled incorrectly, please refer to instructions dump. To view partially-correct add '--show-bad-code' argument */ private void unionURI(java.lang.String r5, java.lang.String r6, java.util.Set r7) { /* r4 = this; r0 = 64 int r1 = r5.indexOf(r0) java.lang.String r2 = "." r3 = -1 if (r1 == r3) goto L39 int r1 = r5.indexOf(r0) int r1 = r1 + 1 java.lang.String r1 = r5.substring(r1) int r0 = r6.indexOf(r0) if (r0 == r3) goto L23 boolean r0 = r5.equalsIgnoreCase(r6) if (r0 == 0) goto La4 goto La0 L23: boolean r0 = r6.startsWith(r2) if (r0 == 0) goto L31 boolean r0 = r4.withinDomain(r1, r6) if (r0 == 0) goto La4 goto La7 L31: boolean r0 = r1.equalsIgnoreCase(r6) if (r0 == 0) goto La4 goto La7 L39: boolean r1 = r5.startsWith(r2) if (r1 == 0) goto L76 int r1 = r6.indexOf(r0) if (r1 == r3) goto L56 int r0 = r5.indexOf(r0) int r0 = r0 + 1 java.lang.String r0 = r6.substring(r0) boolean r0 = r4.withinDomain(r0, r5) if (r0 == 0) goto La4 goto La0 L56: boolean r0 = r6.startsWith(r2) if (r0 == 0) goto L6f boolean r0 = r4.withinDomain(r5, r6) if (r0 != 0) goto La7 boolean r0 = r5.equalsIgnoreCase(r6) if (r0 != 0) goto La7 boolean r0 = r4.withinDomain(r6, r5) if (r0 == 0) goto La4 goto La0 L6f: boolean r0 = r4.withinDomain(r6, r5) if (r0 == 0) goto La4 goto La0 L76: int r1 = r6.indexOf(r0) if (r1 == r3) goto L8d int r0 = r5.indexOf(r0) int r0 = r0 + 1 java.lang.String r0 = r6.substring(r0) boolean r0 = r0.equalsIgnoreCase(r5) if (r0 == 0) goto La4 goto La0 L8d: boolean r0 = r6.startsWith(r2) if (r0 == 0) goto L9a boolean r0 = r4.withinDomain(r5, r6) if (r0 == 0) goto La4 goto La7 L9a: boolean r0 = r5.equalsIgnoreCase(r6) if (r0 == 0) goto La4 La0: r7.add(r5) return La4: r7.add(r5) La7: r7.add(r6) return */ throw new UnsupportedOperationException("Method not decompiled: org.bouncycastle.asn1.x509.PKIXNameConstraintValidator.unionURI(java.lang.String, java.lang.String, java.util.Set):void"); } private Set unionURI(Set set, String str) { if (set.isEmpty()) { if (str == null) { return set; } set.add(str); return set; } HashSet hashSet = new HashSet(); Iterator it = set.iterator(); while (it.hasNext()) { unionURI((String) it.next(), str, hashSet); } return hashSet; } private Set unionIPRange(byte[] bArr, byte[] bArr2) { HashSet hashSet = new HashSet(); boolean areEqual = Arrays.areEqual(bArr, bArr2); hashSet.add(bArr); if (!areEqual) { hashSet.add(bArr2); } return hashSet; } private Set unionIP(Set set, byte[] bArr) { if (set.isEmpty()) { if (bArr == null) { return set; } set.add(bArr); return set; } HashSet hashSet = new HashSet(); Iterator it = set.iterator(); while (it.hasNext()) { hashSet.addAll(unionIPRange((byte[]) it.next(), bArr)); } return hashSet; } /* JADX WARN: Code restructure failed: missing block: B:11:0x00a0, code lost: r7.add(r5); */ /* JADX WARN: Code restructure failed: missing block: B:12:0x00a3, code lost: return; */ /* JADX WARN: Code restructure failed: missing block: B:24:0x0053, code lost: if (withinDomain(r6.substring(r5.indexOf(64) + 1), r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:32:0x006c, code lost: if (withinDomain(r6, r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:34:0x0073, code lost: if (withinDomain(r6, r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:38:0x008a, code lost: if (r6.substring(r5.indexOf(64) + 1).equalsIgnoreCase(r5) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:42:0x0097, code lost: if (withinDomain(r5, r6) != false) goto L51; */ /* JADX WARN: Code restructure failed: missing block: B:44:0x009e, code lost: if (r5.equalsIgnoreCase(r6) != false) goto L48; */ /* JADX WARN: Code restructure failed: missing block: B:6:0x001f, code lost: if (r5.equalsIgnoreCase(r6) != false) goto L48; */ /* Code decompiled incorrectly, please refer to instructions dump. To view partially-correct add '--show-bad-code' argument */ private void unionEmail(java.lang.String r5, java.lang.String r6, java.util.Set r7) { /* r4 = this; r0 = 64 int r1 = r5.indexOf(r0) java.lang.String r2 = "." r3 = -1 if (r1 == r3) goto L39 int r1 = r5.indexOf(r0) int r1 = r1 + 1 java.lang.String r1 = r5.substring(r1) int r0 = r6.indexOf(r0) if (r0 == r3) goto L23 boolean r0 = r5.equalsIgnoreCase(r6) if (r0 == 0) goto La4 goto La0 L23: boolean r0 = r6.startsWith(r2) if (r0 == 0) goto L31 boolean r0 = r4.withinDomain(r1, r6) if (r0 == 0) goto La4 goto La7 L31: boolean r0 = r1.equalsIgnoreCase(r6) if (r0 == 0) goto La4 goto La7 L39: boolean r1 = r5.startsWith(r2) if (r1 == 0) goto L76 int r1 = r6.indexOf(r0) if (r1 == r3) goto L56 int r0 = r5.indexOf(r0) int r0 = r0 + 1 java.lang.String r0 = r6.substring(r0) boolean r0 = r4.withinDomain(r0, r5) if (r0 == 0) goto La4 goto La0 L56: boolean r0 = r6.startsWith(r2) if (r0 == 0) goto L6f boolean r0 = r4.withinDomain(r5, r6) if (r0 != 0) goto La7 boolean r0 = r5.equalsIgnoreCase(r6) if (r0 != 0) goto La7 boolean r0 = r4.withinDomain(r6, r5) if (r0 == 0) goto La4 goto La0 L6f: boolean r0 = r4.withinDomain(r6, r5) if (r0 == 0) goto La4 goto La0 L76: int r1 = r6.indexOf(r0) if (r1 == r3) goto L8d int r0 = r5.indexOf(r0) int r0 = r0 + 1 java.lang.String r0 = r6.substring(r0) boolean r0 = r0.equalsIgnoreCase(r5) if (r0 == 0) goto La4 goto La0 L8d: boolean r0 = r6.startsWith(r2) if (r0 == 0) goto L9a boolean r0 = r4.withinDomain(r5, r6) if (r0 == 0) goto La4 goto La7 L9a: boolean r0 = r5.equalsIgnoreCase(r6) if (r0 == 0) goto La4 La0: r7.add(r5) return La4: r7.add(r5) La7: r7.add(r6) return */ throw new UnsupportedOperationException("Method not decompiled: org.bouncycastle.asn1.x509.PKIXNameConstraintValidator.unionEmail(java.lang.String, java.lang.String, java.util.Set):void"); } private Set unionEmail(Set set, String str) { if (set.isEmpty()) { if (str == null) { return set; } set.add(str); return set; } HashSet hashSet = new HashSet(); Iterator it = set.iterator(); while (it.hasNext()) { unionEmail((String) it.next(), str, hashSet); } return hashSet; } private Set unionDNS(Set set, String str) { if (set.isEmpty()) { if (str == null) { return set; } set.add(str); return set; } HashSet hashSet = new HashSet(); Iterator it = set.iterator(); while (it.hasNext()) { String str2 = (String) it.next(); if (!withinDomain(str2, str)) { boolean withinDomain = withinDomain(str, str2); hashSet.add(str2); if (withinDomain) { } } hashSet.add(str); } return hashSet; } private Set unionDN(Set set, ASN1Sequence aSN1Sequence) { if (set.isEmpty()) { if (aSN1Sequence == null) { return set; } set.add(aSN1Sequence); return set; } HashSet hashSet = new HashSet(); Iterator it = set.iterator(); while (it.hasNext()) { ASN1Sequence aSN1Sequence2 = (ASN1Sequence) it.next(); if (withinDNSubtree(aSN1Sequence, aSN1Sequence2)) { hashSet.add(aSN1Sequence2); } else { if (!withinDNSubtree(aSN1Sequence2, aSN1Sequence)) { hashSet.add(aSN1Sequence2); } hashSet.add(aSN1Sequence); } } return hashSet; } private String stringifyIPCollection(Set set) { Iterator it = set.iterator(); String str = "["; while (it.hasNext()) { StringBuilder sb = new StringBuilder(); sb.append(str); sb.append(stringifyIP((byte[]) it.next())); sb.append(","); str = sb.toString(); } if (str.length() > 1) { str = str.substring(0, str.length() - 1); } StringBuilder sb2 = new StringBuilder(); sb2.append(str); sb2.append("]"); return sb2.toString(); } private String stringifyIP(byte[] bArr) { String str = ""; for (int i = 0; i < bArr.length / 2; i++) { StringBuilder sb = new StringBuilder(); sb.append(str); sb.append(Integer.toString(bArr[i] & UnsignedBytes.MAX_VALUE)); sb.append("."); str = sb.toString(); } String substring = str.substring(0, str.length() - 1); StringBuilder sb2 = new StringBuilder(); sb2.append(substring); sb2.append("/"); String obj = sb2.toString(); for (int length = bArr.length / 2; length < bArr.length; length++) { StringBuilder sb3 = new StringBuilder(); sb3.append(obj); sb3.append(Integer.toString(bArr[length] & UnsignedBytes.MAX_VALUE)); sb3.append("."); obj = sb3.toString(); } return obj.substring(0, obj.length() - 1); } private static byte[] or(byte[] bArr, byte[] bArr2) { byte[] bArr3 = new byte[bArr.length]; for (int i = 0; i < bArr.length; i++) { bArr3[i] = (byte) (bArr[i] | bArr2[i]); } return bArr3; } private byte[][] minMaxIPs(byte[] bArr, byte[] bArr2, byte[] bArr3, byte[] bArr4) { int length = bArr.length; byte[] bArr5 = new byte[length]; byte[] bArr6 = new byte[length]; byte[] bArr7 = new byte[length]; byte[] bArr8 = new byte[length]; for (int i = 0; i < length; i++) { bArr5[i] = (byte) (bArr[i] & bArr2[i]); byte b = bArr[i]; byte b2 = bArr2[i]; bArr6[i] = (byte) ((b & b2) | (~b2)); bArr7[i] = (byte) (bArr3[i] & bArr4[i]); byte b3 = bArr3[i]; byte b4 = bArr4[i]; bArr8[i] = (byte) ((b3 & b4) | (~b4)); } return new byte[][]{bArr5, bArr6, bArr7, bArr8}; } private static byte[] min(byte[] bArr, byte[] bArr2) { for (int i = 0; i < bArr.length; i++) { if ((bArr[i] & UnsignedBytes.MAX_VALUE) < (65535 & bArr2[i])) { return bArr; } } return bArr2; } private static byte[] max(byte[] bArr, byte[] bArr2) { for (int i = 0; i < bArr.length; i++) { if ((bArr[i] & UnsignedBytes.MAX_VALUE) > (65535 & bArr2[i])) { return bArr; } } return bArr2; } private boolean isUriConstrained(String str, String str2) { String extractHostFromURL = extractHostFromURL(str); return !str2.startsWith(".") ? extractHostFromURL.equalsIgnoreCase(str2) : withinDomain(extractHostFromURL, str2); } private boolean isIPConstrained(byte[] bArr, byte[] bArr2) { int length = bArr.length; if (length != bArr2.length / 2) { return false; } byte[] bArr3 = new byte[length]; System.arraycopy(bArr2, length, bArr3, 0, length); byte[] bArr4 = new byte[length]; byte[] bArr5 = new byte[length]; for (int i = 0; i < length; i++) { bArr4[i] = (byte) (bArr2[i] & bArr3[i]); bArr5[i] = (byte) (bArr[i] & bArr3[i]); } return Arrays.areEqual(bArr4, bArr5); } private byte[] ipWithSubnetMask(byte[] bArr, byte[] bArr2) { int length = bArr.length; byte[] bArr3 = new byte[length << 1]; System.arraycopy(bArr, 0, bArr3, 0, length); System.arraycopy(bArr2, 0, bArr3, length, length); return bArr3; } private void intersectURI(String str, String str2, Set set) { if (str.indexOf(64) != -1) { String substring = str.substring(str.indexOf(64) + 1); if (str2.indexOf(64) != -1) { if (!str.equalsIgnoreCase(str2)) { return; } } else if (str2.startsWith(".")) { if (!withinDomain(substring, str2)) { return; } } else if (!substring.equalsIgnoreCase(str2)) { return; } } else { if (str.startsWith(".")) { if (str2.indexOf(64) != -1) { if (!withinDomain(str2.substring(str.indexOf(64) + 1), str)) { return; } } else if (str2.startsWith(".")) { if (!withinDomain(str, str2) && !str.equalsIgnoreCase(str2)) { if (!withinDomain(str2, str)) { return; } } } else if (!withinDomain(str2, str)) { return; } set.add(str2); return; } if (str2.indexOf(64) != -1) { if (!str2.substring(str2.indexOf(64) + 1).equalsIgnoreCase(str)) { return; } set.add(str2); return; } else if (str2.startsWith(".")) { if (!withinDomain(str, str2)) { return; } } else if (!str.equalsIgnoreCase(str2)) { return; } } set.add(str); } private Set intersectURI(Set set, Set set2) { HashSet hashSet = new HashSet(); Iterator it = set2.iterator(); while (it.hasNext()) { String extractNameAsString = extractNameAsString(((GeneralSubtree) it.next()).getBase()); if (set != null) { Iterator it2 = set.iterator(); while (it2.hasNext()) { intersectURI((String) it2.next(), extractNameAsString, hashSet); } } else if (extractNameAsString != null) { hashSet.add(extractNameAsString); } } return hashSet; } private Set intersectIPRange(byte[] bArr, byte[] bArr2) { if (bArr.length != bArr2.length) { return Collections.EMPTY_SET; } byte[][] extractIPsAndSubnetMasks = extractIPsAndSubnetMasks(bArr, bArr2); byte[] bArr3 = extractIPsAndSubnetMasks[0]; byte[] bArr4 = extractIPsAndSubnetMasks[1]; byte[] bArr5 = extractIPsAndSubnetMasks[2]; byte[] bArr6 = extractIPsAndSubnetMasks[3]; byte[][] minMaxIPs = minMaxIPs(bArr3, bArr4, bArr5, bArr6); return compareTo(max(minMaxIPs[0], minMaxIPs[2]), min(minMaxIPs[1], minMaxIPs[3])) == 1 ? Collections.EMPTY_SET : Collections.singleton(ipWithSubnetMask(or(minMaxIPs[0], minMaxIPs[2]), or(bArr4, bArr6))); } private Set intersectIP(Set set, Set set2) { HashSet hashSet = new HashSet(); Iterator it = set2.iterator(); while (it.hasNext()) { byte[] octets = ASN1OctetString.getInstance(((GeneralSubtree) it.next()).getBase().getName()).getOctets(); if (set != null) { Iterator it2 = set.iterator(); while (it2.hasNext()) { hashSet.addAll(intersectIPRange((byte[]) it2.next(), octets)); } } else if (octets != null) { hashSet.add(octets); } } return hashSet; } private void intersectEmail(String str, String str2, Set set) { if (str.indexOf(64) != -1) { String substring = str.substring(str.indexOf(64) + 1); if (str2.indexOf(64) != -1) { if (!str.equalsIgnoreCase(str2)) { return; } } else if (str2.startsWith(".")) { if (!withinDomain(substring, str2)) { return; } } else if (!substring.equalsIgnoreCase(str2)) { return; } } else { if (str.startsWith(".")) { if (str2.indexOf(64) != -1) { if (!withinDomain(str2.substring(str.indexOf(64) + 1), str)) { return; } } else if (str2.startsWith(".")) { if (!withinDomain(str, str2) && !str.equalsIgnoreCase(str2)) { if (!withinDomain(str2, str)) { return; } } } else if (!withinDomain(str2, str)) { return; } set.add(str2); return; } if (str2.indexOf(64) != -1) { if (!str2.substring(str2.indexOf(64) + 1).equalsIgnoreCase(str)) { return; } set.add(str2); return; } else if (str2.startsWith(".")) { if (!withinDomain(str, str2)) { return; } } else if (!str.equalsIgnoreCase(str2)) { return; } } set.add(str); } private Set intersectEmail(Set set, Set set2) { HashSet hashSet = new HashSet(); Iterator it = set2.iterator(); while (it.hasNext()) { String extractNameAsString = extractNameAsString(((GeneralSubtree) it.next()).getBase()); if (set != null) { Iterator it2 = set.iterator(); while (it2.hasNext()) { intersectEmail(extractNameAsString, (String) it2.next(), hashSet); } } else if (extractNameAsString != null) { hashSet.add(extractNameAsString); } } return hashSet; } private Set intersectDNS(Set set, Set set2) { HashSet hashSet = new HashSet(); Iterator it = set2.iterator(); while (it.hasNext()) { String extractNameAsString = extractNameAsString(((GeneralSubtree) it.next()).getBase()); if (set != null) { Iterator it2 = set.iterator(); while (it2.hasNext()) { String str = (String) it2.next(); if (withinDomain(str, extractNameAsString)) { hashSet.add(str); } else if (withinDomain(extractNameAsString, str)) { hashSet.add(extractNameAsString); } } } else if (extractNameAsString != null) { hashSet.add(extractNameAsString); } } return hashSet; } private Set intersectDN(Set set, Set set2) { HashSet hashSet = new HashSet(); Iterator it = set2.iterator(); while (it.hasNext()) { ASN1Sequence aSN1Sequence = ASN1Sequence.getInstance(((GeneralSubtree) it.next()).getBase().getName().toASN1Primitive()); if (set != null) { Iterator it2 = set.iterator(); while (it2.hasNext()) { ASN1Sequence aSN1Sequence2 = (ASN1Sequence) it2.next(); if (withinDNSubtree(aSN1Sequence, aSN1Sequence2)) { hashSet.add(aSN1Sequence); } else if (withinDNSubtree(aSN1Sequence2, aSN1Sequence)) { hashSet.add(aSN1Sequence2); } } } else if (aSN1Sequence != null) { hashSet.add(aSN1Sequence); } } return hashSet; } private int hashCollection(Collection collection) { int i = 0; if (collection == null) { return 0; } for (Object obj : collection) { i += obj instanceof byte[] ? Arrays.hashCode((byte[]) obj) : obj.hashCode(); } return i; } private String extractNameAsString(GeneralName generalName) { return DERIA5String.getInstance(generalName.getName()).getString(); } private byte[][] extractIPsAndSubnetMasks(byte[] bArr, byte[] bArr2) { int length = bArr.length / 2; byte[] bArr3 = new byte[length]; byte[] bArr4 = new byte[length]; System.arraycopy(bArr, 0, bArr3, 0, length); System.arraycopy(bArr, length, bArr4, 0, length); byte[] bArr5 = new byte[length]; byte[] bArr6 = new byte[length]; System.arraycopy(bArr2, 0, bArr5, 0, length); System.arraycopy(bArr2, length, bArr6, 0, length); return new byte[][]{bArr3, bArr4, bArr5, bArr6}; } private static String extractHostFromURL(String str) { String substring = str.substring(str.indexOf(58) + 1); if (substring.indexOf("//") != -1) { substring = substring.substring(substring.indexOf("//") + 2); } if (substring.lastIndexOf(58) != -1) { substring = substring.substring(0, substring.lastIndexOf(58)); } String substring2 = substring.substring(substring.indexOf(58) + 1); String substring3 = substring2.substring(substring2.indexOf(64) + 1); return substring3.indexOf(47) != -1 ? substring3.substring(0, substring3.indexOf(47)) : substring3; } private boolean equals(Object obj, Object obj2) { if (obj == obj2) { return true; } if (obj == null || obj2 == null) { return false; } return ((obj instanceof byte[]) && (obj2 instanceof byte[])) ? Arrays.areEqual((byte[]) obj, (byte[]) obj2) : obj.equals(obj2); } private boolean emailIsConstrained(String str, String str2) { String substring = str.substring(str.indexOf(64) + 1); if (str2.indexOf(64) != -1) { if (str.equalsIgnoreCase(str2)) { return true; } } else if (str2.charAt(0) != '.') { if (substring.equalsIgnoreCase(str2)) { return true; } } else if (withinDomain(substring, str2)) { return true; } return false; } private static int compareTo(byte[] bArr, byte[] bArr2) { if (Arrays.areEqual(bArr, bArr2)) { return 0; } return Arrays.areEqual(max(bArr, bArr2), bArr) ? 1 : -1; } private boolean collectionsAreEqual(Collection collection, Collection collection2) { if (collection == collection2) { return true; } if (collection == null || collection2 == null || collection.size() != collection2.size()) { return false; } for (Object obj : collection) { Iterator it = collection2.iterator(); while (it.hasNext()) { if (equals(obj, it.next())) { break; } } return false; } return true; } private void checkPermittedURI(Set set, String str) throws NameConstraintValidatorException { if (set == null) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (isUriConstrained(str, (String) it.next())) { return; } } if (str.length() != 0 || set.size() != 0) { throw new NameConstraintValidatorException("URI is not from a permitted subtree."); } } private void checkPermittedIP(Set set, byte[] bArr) throws NameConstraintValidatorException { if (set == null) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (isIPConstrained(bArr, (byte[]) it.next())) { return; } } if (bArr.length != 0 || set.size() != 0) { throw new NameConstraintValidatorException("IP is not from a permitted subtree."); } } private void checkPermittedEmail(Set set, String str) throws NameConstraintValidatorException { if (set == null) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (emailIsConstrained(str, (String) it.next())) { return; } } if (str.length() != 0 || set.size() != 0) { throw new NameConstraintValidatorException("Subject email address is not from a permitted subtree."); } } private void checkPermittedDNS(Set set, String str) throws NameConstraintValidatorException { if (set == null) { return; } Iterator it = set.iterator(); while (it.hasNext()) { String str2 = (String) it.next(); if (withinDomain(str, str2) || str.equalsIgnoreCase(str2)) { return; } } if (str.length() != 0 || set.size() != 0) { throw new NameConstraintValidatorException("DNS is not from a permitted subtree."); } } private void checkPermittedDN(X500Name x500Name) throws NameConstraintValidatorException { checkPermittedDN(this.permittedSubtreesDN, ASN1Sequence.getInstance(x500Name.toASN1Primitive())); } private void checkPermittedDN(Set set, ASN1Sequence aSN1Sequence) throws NameConstraintValidatorException { if (set == null) { return; } if (set.isEmpty() && aSN1Sequence.size() == 0) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (withinDNSubtree(aSN1Sequence, (ASN1Sequence) it.next())) { return; } } throw new NameConstraintValidatorException("Subject distinguished name is not from a permitted subtree"); } private void checkExcludedURI(Set set, String str) throws NameConstraintValidatorException { if (set.isEmpty()) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (isUriConstrained(str, (String) it.next())) { throw new NameConstraintValidatorException("URI is from an excluded subtree."); } } } private void checkExcludedIP(Set set, byte[] bArr) throws NameConstraintValidatorException { if (set.isEmpty()) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (isIPConstrained(bArr, (byte[]) it.next())) { throw new NameConstraintValidatorException("IP is from an excluded subtree."); } } } private void checkExcludedEmail(Set set, String str) throws NameConstraintValidatorException { if (set.isEmpty()) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (emailIsConstrained(str, (String) it.next())) { throw new NameConstraintValidatorException("Email address is from an excluded subtree."); } } } private void checkExcludedDNS(Set set, String str) throws NameConstraintValidatorException { if (set.isEmpty()) { return; } Iterator it = set.iterator(); while (it.hasNext()) { String str2 = (String) it.next(); if (withinDomain(str, str2) || str.equalsIgnoreCase(str2)) { throw new NameConstraintValidatorException("DNS is from an excluded subtree."); } } } private void checkExcludedDN(X500Name x500Name) throws NameConstraintValidatorException { checkExcludedDN(this.excludedSubtreesDN, ASN1Sequence.getInstance(x500Name)); } private void checkExcludedDN(Set set, ASN1Sequence aSN1Sequence) throws NameConstraintValidatorException { if (set.isEmpty()) { return; } Iterator it = set.iterator(); while (it.hasNext()) { if (withinDNSubtree(aSN1Sequence, (ASN1Sequence) it.next())) { throw new NameConstraintValidatorException("Subject distinguished name is from an excluded subtree"); } } } }