address merge conflicts
[captive-validator.git] / src / com / verisign / tat / dnssec / NSEC3ValUtils.java
index 5d25c0a..b7f5386 100644 (file)
@@ -34,17 +34,16 @@ import java.security.NoSuchAlgorithmException;
 
 import java.util.*;
 
-
 public class NSEC3ValUtils {
     // FIXME: should probably refactor to handle different NSEC3 parameters more
     // efficiently.
     // Given a list of NSEC3 RRs, they should be grouped according to
     // parameters. The idea is to hash and compare for each group independently,
     // instead of having to skip NSEC3 RRs with the wrong parameters.
-    private static Name   asterisk_label = Name.fromConstantString("*");
-    private static Logger st_log         = Logger.getLogger(NSEC3ValUtils.class);
-    private static final base32 b32      = new base32(base32.Alphabet.BASE32HEX,
-                                                      false, false);
+    private static Name asterisk_label = Name.fromConstantString("*");
+    private static Logger st_log = Logger.getLogger(NSEC3ValUtils.class);
+    private static final base32 b32 = new base32(base32.Alphabet.BASE32HEX,
+            false, false);
 
     public static boolean supportsHashAlgorithm(int alg) {
         if (alg == NSEC3Record.SHA1_DIGEST_ID) {
@@ -76,7 +75,7 @@ public class NSEC3ValUtils {
      * Given a list of NSEC3Records that are part of a message, determine the
      * NSEC3 parameters (hash algorithm, iterations, and salt) present. If there
      * is more than one distinct grouping, return null;
-     *
+     * 
      * @param nsec3s
      *            A list of NSEC3Record object.
      * @return A set containing a number of objects (NSEC3Parameter objects)
@@ -88,9 +87,9 @@ public class NSEC3ValUtils {
             return null;
         }
 
-        NSEC3Parameters     params = new NSEC3Parameters((NSEC3Record) nsec3s.get(
-                    0));
-        ByteArrayComparator bac    = new ByteArrayComparator();
+        NSEC3Parameters params = new NSEC3Parameters((NSEC3Record) nsec3s
+                .get(0));
+        ByteArrayComparator bac = new ByteArrayComparator();
 
         for (NSEC3Record nsec3 : nsec3s) {
             if (!params.match(nsec3, bac)) {
@@ -103,14 +102,14 @@ public class NSEC3ValUtils {
 
     /**
      * Given a hash and an a zone name, construct an NSEC3 ownername.
-     *
+     * 
      * @param hash
      *            The hash of an original name.
      * @param zonename
      *            The zone to use in constructing the NSEC3 name.
      * @return The NSEC3 name.
      */
-    private static Name hashName(byte [] hash, Name zonename) {
+    private static Name hashName(byte[] hash, Name zonename) {
         try {
             return new Name(b32.toString(hash).toLowerCase(), zonename);
         } catch (TextParseException e) {
@@ -121,14 +120,14 @@ public class NSEC3ValUtils {
 
     /**
      * Given a set of NSEC3 parameters, hash a name.
-     *
+     * 
      * @param name
      *            The name to hash.
      * @param params
      *            The parameters to hash with.
      * @return The hash.
      */
-    private static byte [] hash(Name name, NSEC3Parameters params) {
+    private static byte[] hash(Name name, NSEC3Parameters params) {
         try {
             return params.hash(name);
         } catch (NoSuchAlgorithmException e) {
@@ -142,7 +141,8 @@ public class NSEC3ValUtils {
         try {
             return nsec3.hashName(name);
         } catch (NoSuchAlgorithmException e) {
-            st_log.warn("Did not recognize hash algorithm: " + nsec3.getHashAlgorithm());
+            st_log.warn("Did not recognize hash algorithm: "
+                    + nsec3.getHashAlgorithm());
 
             return null;
         }
@@ -150,7 +150,7 @@ public class NSEC3ValUtils {
 
     /**
      * Given the name of a closest encloser, return the name *.closest_encloser.
-     *
+     * 
      * @param closestEncloser
      *            The name to start with.
      * @return The wildcard name.
@@ -169,7 +169,7 @@ public class NSEC3ValUtils {
      * Given a qname and its proven closest encloser, calculate the "next
      * closest" name. Basically, this is the name that is one label longer than
      * the closest encloser that is still a subdomain of qname.
-     *
+     * 
      * @param qname
      *            The qname.
      * @param closestEncloser
@@ -184,7 +184,7 @@ public class NSEC3ValUtils {
 
     /**
      * Find the NSEC3Record that matches a hash of a name.
-     *
+     * 
      * @param hash
      *            The pre-calculated hash of a name.
      * @param zonename
@@ -196,12 +196,12 @@ public class NSEC3ValUtils {
      * @param bac
      *            An already allocated ByteArrayComparator, for reuse. This may
      *            be null.
-     *
+     * 
      * @return The matching NSEC3Record, if one is present.
      */
-    private static NSEC3Record findMatchingNSEC3(byte [] hash, Name zonename,
-        List<NSEC3Record> nsec3s, NSEC3Parameters params,
-        ByteArrayComparator bac) {
+    private static NSEC3Record findMatchingNSEC3(byte[] hash, Name zonename,
+            List<NSEC3Record> nsec3s, NSEC3Parameters params,
+            ByteArrayComparator bac) {
         Name n = hashName(hash, zonename);
 
         for (NSEC3Record nsec3 : nsec3s) {
@@ -222,7 +222,7 @@ public class NSEC3ValUtils {
      * Given a hash and a candidate NSEC3Record, determine if that NSEC3Record
      * covers the hash. Covers specifically means that the hash is in between
      * the owner and next hashes and does not equal either.
-     *
+     * 
      * @param nsec3
      *            The candidate NSEC3Record.
      * @param hash
@@ -243,9 +243,8 @@ public class NSEC3ValUtils {
         }
         // this is the end of zone case: next < owner && hash > owner || hash <
         // next
-        if ((bac.compare(next, owner) <= 0) &&
-                ((bac.compare(hash, next) < 0) ||
-                (bac.compare(owner, hash) < 0))) {
+        if ((bac.compare(next, owner) <= 0)
+                && ((bac.compare(hash, next) < 0) || (bac.compare(owner, hash) < 0))) {
             return true;
         }
 
@@ -256,7 +255,7 @@ public class NSEC3ValUtils {
     /**
      * Given a pre-hashed name, find a covering NSEC3 from among a list of
      * NSEC3s.
-     *
+     * 
      * @param hash
      *            The hash to consider.
      * @param zonename
@@ -266,12 +265,12 @@ public class NSEC3ValUtils {
      * @param params
      *            The NSEC3 parameters used to generate the hash -- NSEC3s that
      *            do not use those parameters will be skipped.
-     *
+     * 
      * @return A covering NSEC3 if one is present, null otherwise.
      */
-    private static NSEC3Record findCoveringNSEC3(byte [] hash, Name zonename,
-        List<NSEC3Record> nsec3s, NSEC3Parameters params,
-        ByteArrayComparator bac) {
+    private static NSEC3Record findCoveringNSEC3(byte[] hash, Name zonename,
+            List<NSEC3Record> nsec3s, NSEC3Parameters params,
+            ByteArrayComparator bac) {
         ByteArrayComparator comparator = new ByteArrayComparator();
 
         for (NSEC3Record nsec3 : nsec3s) {
@@ -291,7 +290,7 @@ public class NSEC3ValUtils {
      * Given a name and a list of NSEC3s, find the candidate closest encloser.
      * This will be the first ancestor of 'name' (including itself) to have a
      * matching NSEC3 RR.
-     *
+     * 
      * @param name
      *            The name the start with.
      * @param zonename
@@ -302,14 +301,14 @@ public class NSEC3ValUtils {
      *            The NSEC3 parameters.
      * @param bac
      *            A pre-allocated comparator. May be null.
-     *
+     * 
      * @return A CEResponse containing the closest encloser name and the NSEC3
      *         RR that matched it, or null if there wasn't one.
      */
     private static CEResponse findClosestEncloser(Name name, Name zonename,
-        List<NSEC3Record> nsec3s, NSEC3Parameters params,
-        ByteArrayComparator bac) {
-        Name        n     = name;
+            List<NSEC3Record> nsec3s, NSEC3Parameters params,
+            ByteArrayComparator bac) {
+        Name n = name;
 
         NSEC3Record nsec3;
 
@@ -333,7 +332,7 @@ public class NSEC3ValUtils {
 
     /**
      * Given a List of nsec3 RRs, find and prove the closest encloser to qname.
-     *
+     * 
      * @param qname
      *            The qname in question.
      * @param zonename
@@ -399,10 +398,10 @@ public class NSEC3ValUtils {
         }
 
         // Otherwise, we need to show that the next closer name is covered.
-        Name    nextClosest = nextClosest(qname, candidate.closestEncloser);
+        Name nextClosest = nextClosest(qname, candidate.closestEncloser);
 
-        byte [] nc_hash     = hash(nextClosest, params);
-        candidate.nc_nsec3  = findCoveringNSEC3(nc_hash, zonename, nsec3s,
+        byte[] nc_hash = hash(nextClosest, params);
+        candidate.nc_nsec3 = findCoveringNSEC3(nc_hash, zonename, nsec3s,
                 params, bac);
 
         if (candidate.nc_nsec3 == null) {
@@ -419,41 +418,41 @@ public class NSEC3ValUtils {
 
     private static int maxIterations(int baseAlg, int keysize) {
         switch (baseAlg) {
-            case DnsSecVerifier.RSA:
+        case DnsSecVerifier.RSA:
 
-                if (keysize == 0) {
-                    return 2500; // the max at 4096
-                }
+            if (keysize == 0) {
+                return 2500; // the max at 4096
+            }
 
-                if (keysize > 2048) {
-                    return 2500;
-                }
+            if (keysize > 2048) {
+                return 2500;
+            }
 
-                if (keysize > 1024) {
-                    return 500;
-                }
+            if (keysize > 1024) {
+                return 500;
+            }
 
-                if (keysize > 0) {
-                    return 150;
-                }
+            if (keysize > 0) {
+                return 150;
+            }
 
-                break;
+            break;
 
-            case DnsSecVerifier.DSA:
+        case DnsSecVerifier.DSA:
 
-                if (keysize == 0) {
-                    return 5000; // the max at 2048;
-                }
+            if (keysize == 0) {
+                return 5000; // the max at 2048;
+            }
 
-                if (keysize > 1024) {
-                    return 5000;
-                }
+            if (keysize > 1024) {
+                return 5000;
+            }
 
-                if (keysize > 0) {
-                    return 1500;
-                }
+            if (keysize > 0) {
+                return 1500;
+            }
 
-                break;
+            break;
         }
 
         return -1;
@@ -461,17 +460,16 @@ public class NSEC3ValUtils {
 
     @SuppressWarnings("unchecked")
     private static boolean validIterations(NSEC3Parameters nsec3params,
-        RRset dnskey_rrset, DnsSecVerifier verifier) {
+            RRset dnskey_rrset, DnsSecVerifier verifier) {
         // for now, we return the maximum iterations based simply on the key
         // algorithms that may have been used to sign the NSEC3 RRsets.
         int max_iterations = 0;
 
         for (Iterator i = dnskey_rrset.rrs(); i.hasNext();) {
-            DNSKEYRecord dnskey  = (DNSKEYRecord) i.next();
-            int          baseAlg = verifier.baseAlgorithm(dnskey.getAlgorithm());
-            int          iters   = maxIterations(baseAlg, 0);
-            max_iterations       = (max_iterations < iters) ? iters
-                                                            : max_iterations;
+            DNSKEYRecord dnskey = (DNSKEYRecord) i.next();
+            int baseAlg = verifier.baseAlgorithm(dnskey.getAlgorithm());
+            int iters = maxIterations(baseAlg, 0);
+            max_iterations = (max_iterations < iters) ? iters : max_iterations;
         }
 
         if (nsec3params.iterations > max_iterations) {
@@ -485,7 +483,7 @@ public class NSEC3ValUtils {
      * Determine if all of the NSEC3s in a response are legally ignoreable
      * (i.e., their presence should lead to an INSECURE result). Currently, this
      * is solely based on iterations.
-     *
+     * 
      * @param nsec3s
      *            The list of NSEC3s. If there is more than one set of NSEC3
      *            parameters present, this test will not be performed.
@@ -497,7 +495,7 @@ public class NSEC3ValUtils {
      * @return true if all of the NSEC3s can be legally ignored, false if not.
      */
     public static boolean allNSEC3sIgnoreable(List<NSEC3Record> nsec3s,
-        RRset dnskey_rrset, DnsSecVerifier verifier) {
+            RRset dnskey_rrset, DnsSecVerifier verifier) {
         NSEC3Parameters params = nsec3Parameters(nsec3s);
 
         if (params == null) {
@@ -512,7 +510,7 @@ public class NSEC3ValUtils {
      * ERROR. This means that the NSEC3s prove a) the closest encloser exists,
      * b) the direct child of the closest encloser towards qname doesn't exist,
      * and c) *.closest encloser does not exist.
-     *
+     * 
      * @param nsec3s
      *            The list of NSEC3s.
      * @param qname
@@ -558,9 +556,9 @@ public class NSEC3ValUtils {
         // At this point, we know that qname does not exist. Now we need to
         // prove
         // that the wildcard does not exist.
-        Name        wc      = ceWildcard(ce.closestEncloser);
-        byte []     wc_hash = hash(wc, nsec3params);
-        NSEC3Record nsec3   = findCoveringNSEC3(wc_hash, zonename, nsec3s,
+        Name wc = ceWildcard(ce.closestEncloser);
+        byte[] wc_hash = hash(wc, nsec3params);
+        NSEC3Record nsec3 = findCoveringNSEC3(wc_hash, zonename, nsec3s,
                 nsec3params, bac);
 
         if (nsec3 == null) {
@@ -577,23 +575,23 @@ public class NSEC3ValUtils {
     /**
      * Determine if the NSEC3s provided in a response prove the NOERROR/NODATA
      * status. There are a number of different variants to this:
-     *
+     * 
      * 1) Normal NODATA -- qname is matched to an NSEC3 record, type is not
      * present.
-     *
+     * 
      * 2) ENT NODATA -- because there must be NSEC3 record for
      * empty-non-terminals, this is the same as #1.
-     *
+     * 
      * 3) NSEC3 ownername NODATA -- qname matched an existing, lone NSEC3
      * ownername, but qtype was not NSEC3. NOTE: as of nsec-05, this case no
      * longer exists.
-     *
+     * 
      * 4) Wildcard NODATA -- A wildcard matched the name, but not the type.
-     *
+     * 
      * 5) Opt-In DS NODATA -- the qname is covered by an opt-in span and qtype
      * == DS. (or maybe some future record with the same parent-side-only
      * property)
-     *
+     * 
      * @param nsec3s
      *            The NSEC3Records to consider.
      * @param qname
@@ -613,29 +611,29 @@ public class NSEC3ValUtils {
         NSEC3Parameters nsec3params = nsec3Parameters(nsec3s);
 
         if (nsec3params == null) {
-            st_log.debug("could not find a single set of " +
-                "NSEC3 parameters (multiple parameters present)");
+            st_log.debug("could not find a single set of "
+                    + "NSEC3 parameters (multiple parameters present)");
 
             return false;
         }
 
-        ByteArrayComparator bac   = new ByteArrayComparator();
+        ByteArrayComparator bac = new ByteArrayComparator();
 
-        NSEC3Record         nsec3 = findMatchingNSEC3(hash(qname, nsec3params),
+        NSEC3Record nsec3 = findMatchingNSEC3(hash(qname, nsec3params),
                 zonename, nsec3s, nsec3params, bac);
 
         // Cases 1 & 2.
         if (nsec3 != null) {
             if (nsec3.hasType(qtype)) {
-                st_log.debug(
-                    "proveNodata: Matching NSEC3 proved that type existed!");
+                st_log
+                        .debug("proveNodata: Matching NSEC3 proved that type existed!");
 
                 return false;
             }
 
             if (nsec3.hasType(Type.CNAME)) {
-                st_log.debug("proveNodata: Matching NSEC3 proved " +
-                    "that a CNAME existed!");
+                st_log.debug("proveNodata: Matching NSEC3 proved "
+                        + "that a CNAME existed!");
 
                 return false;
             }
@@ -652,8 +650,8 @@ public class NSEC3ValUtils {
         // At this point, not finding a match or a proven closest encloser is a
         // problem.
         if (ce == null) {
-            st_log.debug("proveNodata: did not match qname, " +
-                "nor found a proven closest encloser.");
+            st_log.debug("proveNodata: did not match qname, "
+                    + "nor found a proven closest encloser.");
 
             return false;
         }
@@ -677,16 +675,17 @@ public class NSEC3ValUtils {
 
         // Case 5.
         if (qtype != Type.DS) {
-            st_log.debug("proveNodata: could not find matching NSEC3, " +
-                "nor matching wildcard, and qtype is not DS -- no more options.");
+            st_log
+                    .debug("proveNodata: could not find matching NSEC3, "
+                            + "nor matching wildcard, and qtype is not DS -- no more options.");
 
             return false;
         }
 
         // We need to make sure that the covering NSEC3 is opt-in.
         if (!isOptOut(ce.nc_nsec3)) {
-            st_log.debug("proveNodata: covering NSEC3 was not " +
-                "opt-in in an opt-in DS NOERROR/NODATA case.");
+            st_log.debug("proveNodata: covering NSEC3 was not "
+                    + "opt-in in an opt-in DS NOERROR/NODATA case.");
 
             return false;
         }
@@ -697,7 +696,7 @@ public class NSEC3ValUtils {
     /**
      * Prove that a positive wildcard match was appropriate (no direct match
      * RRset).
-     *
+     * 
      * @param nsec3s
      *            The NSEC3 records to work with.
      * @param qname
@@ -758,16 +757,16 @@ public class NSEC3ValUtils {
 
     /**
      * Prove that a DS response either had no DS, or wasn't a delegation point.
-     *
+     * 
      * Fundamentally there are two cases here: normal NODATA and Opt-In NODATA.
-     *
+     * 
      * @param nsec3s
      *            The NSEC3 RRs to examine.
      * @param qname
      *            The name of the DS in question.
      * @param zonename
      *            The name of the zone that the NSEC3 RRs come from.
-     *
+     * 
      * @return SecurityStatus.SECURE if it was proven that there is no DS in a
      *         secure (i.e., not opt-in) way, SecurityStatus.INSECURE if there
      *         was no DS in an insecure (i.e., opt-in) way,
@@ -841,18 +840,18 @@ public class NSEC3ValUtils {
      * algorithm, iterations, and salt.
      */
     private static class NSEC3Parameters {
-        public int     alg;
-        public byte [] salt;
-        public int     iterations;
+        public int alg;
+        public byte[] salt;
+        public int iterations;
         private NSEC3PARAMRecord nsec3paramrec;
 
         public NSEC3Parameters(NSEC3Record r) {
-            alg            = r.getHashAlgorithm();
-            salt           = r.getSalt();
-            iterations     = r.getIterations();
+            alg = r.getHashAlgorithm();
+            salt = r.getSalt();
+            iterations = r.getIterations();
 
-            nsec3paramrec = new NSEC3PARAMRecord(Name.root, DClass.IN, 0,
-                                                 alg, 0, iterations, salt);
+            nsec3paramrec = new NSEC3PARAMRecord(Name.root, DClass.IN, 0, alg,
+                    0, iterations, salt);
         }
 
         public boolean match(NSEC3Record r, ByteArrayComparator bac) {
@@ -889,13 +888,13 @@ public class NSEC3ValUtils {
      * encloser proof.
      */
     private static class CEResponse {
-        public Name        closestEncloser;
+        public Name closestEncloser;
         public NSEC3Record ce_nsec3;
         public NSEC3Record nc_nsec3;
 
         public CEResponse(Name ce, NSEC3Record nsec3) {
-            this.closestEncloser     = ce;
-            this.ce_nsec3            = nsec3;
+            this.closestEncloser = ce;
+            this.ce_nsec3 = nsec3;
         }
     }
 }