summaryrefslogblamecommitdiffstats
path: root/src/org/uic/barcode/utils/AlgorithmNameResolver.java
blob: 300bf7d6dd0ddf578f73b0890ff5089af868924c (plain) (tree)












































































































































































                                                                                                        
package org.uic.barcode.utils;

import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AlgorithmNameResolver {
	
	
	public static final String TYPE_KEY_GENERATOR_ALG = "KeyPairGenerator";
	public static final String TYPE_SIGNATURE_ALG = "Signature";
	
	
    private static final Pattern KEY_TYPE_PATTERN = Pattern.compile("^(\\w+)[.].*$");
    private static final Pattern KEY_ALIAS_TYPE_PATTERN = Pattern.compile("^Alg[.]Alias[.](\\w+).*$");
    private static final Pattern KEY_OID_PATTERN = Pattern.compile(".*?(\\d+(?:[.]\\d+){3,})$");

    public static String getSignatureAlgorithmName (String oid) throws Exception {
    	
		Provider[] provs = Security.getProviders();
		for (Provider prov : provs) {
		       Service service = prov.getService(AlgorithmNameResolver.TYPE_SIGNATURE_ALG,oid);
		       if (service != null) {
		    	   return service.getAlgorithm();
		       }
		}
		return null;
    	
    }
    	

    public static String getName(String type, String oid) throws Exception {
    	
    	Provider[] provs = Security.getProviders();

        for (Provider prov : provs) {
	        	
	       		SortedSet<String> typeAndOID = getTypeAndOIDStrings(prov);

	       		for (String entry : typeAndOID) {
	       			String[] typeAndOIDArray = entry.split("-");
	       			String ptype = typeAndOIDArray[0];   
	       			if (ptype.equalsIgnoreCase(type)) {
		       			String poid = typeAndOIDArray[1];
		       			Service pservice = prov.getService(ptype, poid);
		       			String palgo = pservice.getAlgorithm();	

	       				if (ptype.equalsIgnoreCase(type) && poid.equals(oid)) {
	       					return palgo;
	       				}
	       			}
	       		}
        }
        
        
		if (oid.startsWith("1.2.840.10045")) {
			return "ECDSA";
		} else if (oid.startsWith("1.2.840.10040")) {
			return "DSA";
		}
		
        return null;
	        	
	}    
    
    public static String getName(String type, String oid, String providerName) throws Exception {
	
    	Provider[] provs = Security.getProviders();

        for (Provider prov : provs) {
	        	
	       	if (providerName == null || prov.getName().equals(providerName)) {

	       		SortedSet<String> typeAndOID = getTypeAndOIDStrings(prov);

	       		for (String entry : typeAndOID) {
	       			String[] typeAndOIDArray = entry.split("-");
	       			String ptype = typeAndOIDArray[0];   
	       			if (ptype.equalsIgnoreCase(type)) {
		       			String poid = typeAndOIDArray[1];
		       			Service pservice = prov.getService(ptype, poid);
		       			String palgo = pservice.getAlgorithm();	

	       				if (ptype.equalsIgnoreCase(type) && poid.equals(oid)) {
	       					return palgo;
	       				}
	       			}
	       		}
	       	}
        }
        
        
		if (oid.startsWith("1.2.840.10045")) {
			return "ECDSA";
		} else if (oid.startsWith("1.2.840.10040")) {
			return "DSA";
		}
		
        return null;
	        	
	}

    private static SortedSet<String> getTypeAndOIDStrings(Provider prov) {
    	
    	SortedSet<String> typeAndOID = new TreeSet<>();

    	Set<Object> keys = prov.keySet();
    	for (Object key : keys) {
    		String keyString = key.toString();
    		Matcher oidMatcher = KEY_OID_PATTERN.matcher(keyString);
    		if (oidMatcher.matches()) {
    			// get OID from matched keyString
    			String oid = oidMatcher.group(1);
    			
    			// determine type
    			String type;
    			Matcher aliasTypeMatcher = KEY_ALIAS_TYPE_PATTERN.matcher(keyString);
    			if (aliasTypeMatcher.matches()) {
                    type = aliasTypeMatcher.group(1);
                } else {
                    Matcher typeMatcher = KEY_TYPE_PATTERN.matcher(keyString);
                    typeMatcher.matches();
                    type = typeMatcher.group(1);
                }
                // algorithm parameters are not algorithms, so skip them
                if (type.equals("AlgorithmParameters")) {
                    continue;
                }

                // auto-removes dupes
                typeAndOID.add(type + "-" + oid);
            }
        }
        return typeAndOID;
	}
    

    public static String getSecurityNames() throws Exception {
    	
        	Provider[] provs = Security.getProviders();
        	
        	StringBuilder sb = new StringBuilder();

            for (Provider prov : provs) {

   	       		SortedSet<String> typeAndOID = getTypeAndOIDStrings(prov);

   	       		for (String entry : typeAndOID) {
   	       			String[] typeAndOIDArray = entry.split("-");
   	       			String ptype = typeAndOIDArray[0];   
   	       			String poid = typeAndOIDArray[1];
   		       		Service pservice = prov.getService(ptype, poid);
   		       	    String palgo = "";
   		       		if ( pservice != null) {
   		       			palgo = pservice.getAlgorithm();	
   		       		}
   		       		sb.append(prov).append(";");
   		       		sb.append(ptype).append(";");
   		       		sb.append(poid).append(";");
   		       		sb.append(palgo).append(";");
   		       		sb.append("\r\n");

    	       	}
            }
            return sb.toString();
    	        	
    	}
}