code: static boolean matches(CodeSigner[] signers, CodeSigner[] oldSigners,
          CodeSigner[] newSigners) {
  
          // special case
          if ((oldSigners == null) && (signers == newSigners))
              return true;
  
          boolean match;
  
          // make sure all oldSigners are in signers
          if ((oldSigners != null) && !isSubSet(oldSigners, signers))
              return false;
  
          // make sure all newSigners are in signers
          if (!isSubSet(newSigners, signers)) {
              return false;
          }
  
          // now make sure all the code signers in signers are
          // also in oldSigners or newSigners
  
          for (int i = 0; i < signers.length; i++) {
              boolean found =
                  ((oldSigners != null) && contains(oldSigners, signers[i])) ||
                  contains(newSigners, signers[i]);
              if (!found)
                  return false;
          }
          return true;
      }
docs: returns true if signer contains exactly the same code signers as
  oldSigner and newSigner, false otherwise. oldSigner
  is allowed to be null.