예제 #1
0
 /**
  * Returns the array of providers which meet the user supplied set of filters. The filter must be
  * supplied in one of two formats: <nl>
  * <li>CRYPTO_SERVICE_NAME.ALGORITHM_OR_TYPE
  *
  *     <p>for example: "MessageDigest.SHA" The value associated with the key must be an empty
  *     string.
  * <li>CRYPTO_SERVICE_NAME.ALGORITHM_OR_TYPE ATTR_NAME:ATTR_VALUE
  *
  *     <p>for example: "Signature.MD2withRSA KeySize:512" where "KeySize:512" is the value of the
  *     filter map entry. </nl>
  *
  * @param filter case-insensitive filter.
  * @return the providers which meet the user supplied string filter {@code filter}. A {@code null}
  *     value signifies that none of the installed providers meets the filter specification.
  * @throws InvalidParameterException if an unusable filter is supplied.
  * @throws NullPointerException if {@code filter} is {@code null}.
  */
 public static synchronized Provider[] getProviders(Map<String, String> filter) {
   if (filter == null) {
     throw new NullPointerException();
   }
   if (filter.isEmpty()) {
     return null;
   }
   java.util.List<Provider> result = Services.getProvidersList();
   Set<Entry<String, String>> keys = filter.entrySet();
   Map.Entry<String, String> entry;
   for (Iterator<Entry<String, String>> it = keys.iterator(); it.hasNext(); ) {
     entry = it.next();
     String key = entry.getKey();
     String val = entry.getValue();
     String attribute = null;
     int i = key.indexOf(' ');
     int j = key.indexOf('.');
     if (j == -1) {
       throw new InvalidParameterException();
     }
     if (i == -1) { // <crypto_service>.<algorithm_or_type>
       if (val.length() != 0) {
         throw new InvalidParameterException();
       }
     } else { // <crypto_service>.<algorithm_or_type> <attribute_name>
       if (val.length() == 0) {
         throw new InvalidParameterException();
       }
       attribute = key.substring(i + 1);
       if (attribute.trim().length() == 0) {
         throw new InvalidParameterException();
       }
       key = key.substring(0, i);
     }
     String serv = key.substring(0, j);
     String alg = key.substring(j + 1);
     if (serv.length() == 0 || alg.length() == 0) {
       throw new InvalidParameterException();
     }
     Provider p;
     for (int k = 0; k < result.size(); k++) {
       try {
         p = result.get(k);
       } catch (IndexOutOfBoundsException e) {
         break;
       }
       if (!p.implementsAlg(serv, alg, attribute, val)) {
         result.remove(p);
         k--;
       }
     }
   }
   if (result.size() > 0) {
     return result.toArray(new Provider[result.size()]);
   }
   return null;
 }