All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.firefly.codec.http2.stream.HTTP2Cipher Maven / Gradle / Ivy

There is a newer version: 4.0.3.2
Show newest version
package com.firefly.codec.http2.stream;

import java.util.Comparator;

import com.firefly.utils.collection.ArrayTrie;
import com.firefly.utils.collection.Trie;

public class HTTP2Cipher {
	public static final Comparator COMPARATOR = new CipherComparator();

	private final static Trie blackProtocols = new ArrayTrie<>(6 * 5);
	private final static Trie blackCiphers = new ArrayTrie<>(275 * 40);

	static {
		for (String p : new String[] {"TLSv1.1", "TLSv1", "SSL", "SSLv2", "SSLv3" }) {
			blackProtocols.put(p, Boolean.TRUE);
		}

		for (String c : new String[] {
				 "TLS_NULL_WITH_NULL_NULL",
		            "TLS_RSA_WITH_NULL_MD5",
		            "TLS_RSA_WITH_NULL_SHA",
		            "TLS_RSA_EXPORT_WITH_RC4_40_MD5",
		            "TLS_RSA_WITH_RC4_128_MD5",
		            "TLS_RSA_WITH_RC4_128_SHA",
		            "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5",
		            "TLS_RSA_WITH_IDEA_CBC_SHA",
		            "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA",
		            "TLS_RSA_WITH_DES_CBC_SHA",
		            "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA",
		            "TLS_DH_DSS_WITH_DES_CBC_SHA",
		            "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA",
		            "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA",
		            "TLS_DH_RSA_WITH_DES_CBC_SHA",
		            "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
		            "TLS_DHE_DSS_WITH_DES_CBC_SHA",
		            "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
		            "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
		            "TLS_DHE_RSA_WITH_DES_CBC_SHA",
		            "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5",
		            "TLS_DH_anon_WITH_RC4_128_MD5",
		            "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
		            "TLS_DH_anon_WITH_DES_CBC_SHA",
		            "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA",
		            "TLS_KRB5_WITH_DES_CBC_SHA",
		            "TLS_KRB5_WITH_3DES_EDE_CBC_SHA",
		            "TLS_KRB5_WITH_RC4_128_SHA",
		            "TLS_KRB5_WITH_IDEA_CBC_SHA",
		            "TLS_KRB5_WITH_DES_CBC_MD5",
		            "TLS_KRB5_WITH_3DES_EDE_CBC_MD5",
		            "TLS_KRB5_WITH_RC4_128_MD5",
		            "TLS_KRB5_WITH_IDEA_CBC_MD5",
		            "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA",
		            "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA",
		            "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
		            "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5",
		            "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5",
		            "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
		            "TLS_PSK_WITH_NULL_SHA",
		            "TLS_DHE_PSK_WITH_NULL_SHA",
		            "TLS_RSA_PSK_WITH_NULL_SHA",
		            "TLS_RSA_WITH_AES_128_CBC_SHA",
		            "TLS_DH_DSS_WITH_AES_128_CBC_SHA",
		            "TLS_DH_RSA_WITH_AES_128_CBC_SHA",
		            "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
		            "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
		            "TLS_DH_anon_WITH_AES_128_CBC_SHA",
		            "TLS_RSA_WITH_AES_256_CBC_SHA",
		            "TLS_DH_DSS_WITH_AES_256_CBC_SHA",
		            "TLS_DH_RSA_WITH_AES_256_CBC_SHA",
		            "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
		            "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
		            "TLS_DH_anon_WITH_AES_256_CBC_SHA",
		            "TLS_RSA_WITH_NULL_SHA256",
		            "TLS_RSA_WITH_AES_128_CBC_SHA256",
		            "TLS_RSA_WITH_AES_256_CBC_SHA256",
		            "TLS_DH_DSS_WITH_AES_128_CBC_SHA256",
		            "TLS_DH_RSA_WITH_AES_128_CBC_SHA256",
		            "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
		            "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",
		            "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA",
		            "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA",
		            "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA",
		            "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",
		            "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA",
		            "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
		            "TLS_DH_DSS_WITH_AES_256_CBC_SHA256",
		            "TLS_DH_RSA_WITH_AES_256_CBC_SHA256",
		            "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
		            "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
		            "TLS_DH_anon_WITH_AES_128_CBC_SHA256",
		            "TLS_DH_anon_WITH_AES_256_CBC_SHA256",
		            "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",
		            "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA",
		            "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA",
		            "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA",
		            "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",
		            "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA",
		            "TLS_PSK_WITH_RC4_128_SHA",
		            "TLS_PSK_WITH_3DES_EDE_CBC_SHA",
		            "TLS_PSK_WITH_AES_128_CBC_SHA",
		            "TLS_PSK_WITH_AES_256_CBC_SHA",
		            "TLS_DHE_PSK_WITH_RC4_128_SHA",
		            "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA",
		            "TLS_DHE_PSK_WITH_AES_128_CBC_SHA",
		            "TLS_DHE_PSK_WITH_AES_256_CBC_SHA",
		            "TLS_RSA_PSK_WITH_RC4_128_SHA",
		            "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA",
		            "TLS_RSA_PSK_WITH_AES_128_CBC_SHA",
		            "TLS_RSA_PSK_WITH_AES_256_CBC_SHA",
		            "TLS_RSA_WITH_SEED_CBC_SHA",
		            "TLS_DH_DSS_WITH_SEED_CBC_SHA",
		            "TLS_DH_RSA_WITH_SEED_CBC_SHA",
		            "TLS_DHE_DSS_WITH_SEED_CBC_SHA",
		            "TLS_DHE_RSA_WITH_SEED_CBC_SHA",
		            "TLS_DH_anon_WITH_SEED_CBC_SHA",
		            "TLS_RSA_WITH_AES_128_GCM_SHA256",
		            "TLS_RSA_WITH_AES_256_GCM_SHA384",
		            "TLS_DH_RSA_WITH_AES_128_GCM_SHA256",
		            "TLS_DH_RSA_WITH_AES_256_GCM_SHA384",
		            "TLS_DH_DSS_WITH_AES_128_GCM_SHA256",
		            "TLS_DH_DSS_WITH_AES_256_GCM_SHA384",
		            "TLS_DH_anon_WITH_AES_128_GCM_SHA256",
		            "TLS_DH_anon_WITH_AES_256_GCM_SHA384",
		            "TLS_PSK_WITH_AES_128_GCM_SHA256",
		            "TLS_PSK_WITH_AES_256_GCM_SHA384",
		            "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256",
		            "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384",
		            "TLS_PSK_WITH_AES_128_CBC_SHA256",
		            "TLS_PSK_WITH_AES_256_CBC_SHA384",
		            "TLS_PSK_WITH_NULL_SHA256",
		            "TLS_PSK_WITH_NULL_SHA384",
		            "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",
		            "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",
		            "TLS_DHE_PSK_WITH_NULL_SHA256",
		            "TLS_DHE_PSK_WITH_NULL_SHA384",
		            "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256",
		            "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384",
		            "TLS_RSA_PSK_WITH_NULL_SHA256",
		            "TLS_RSA_PSK_WITH_NULL_SHA384",
		            "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",
		            "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256",
		            "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256",
		            "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256",
		            "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",
		            "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256",
		            "TLS_EMPTY_RENEGOTIATION_INFO_SCSV",
		            "TLS_ECDH_ECDSA_WITH_NULL_SHA",
		            "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
		            "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
		            "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
		            "TLS_ECDHE_ECDSA_WITH_NULL_SHA",
		            "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
		            "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
		            "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
		            "TLS_ECDH_RSA_WITH_NULL_SHA",
		            "TLS_ECDH_RSA_WITH_RC4_128_SHA",
		            "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
		            "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
		            "TLS_ECDHE_RSA_WITH_NULL_SHA",
		            "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
		            "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
		            "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
		            "TLS_ECDH_anon_WITH_NULL_SHA",
		            "TLS_ECDH_anon_WITH_RC4_128_SHA",
		            "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA",
		            "TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
		            "TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
		            "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA",
		            "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA",
		            "TLS_SRP_SHA_WITH_AES_128_CBC_SHA",
		            "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA",
		            "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA",
		            "TLS_SRP_SHA_WITH_AES_256_CBC_SHA",
		            "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA",
		            "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA",
		            "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
		            "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
		            "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
		            "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
		            "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
		            "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
		            "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
		            "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
		            "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
		            "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
		            "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
		            "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
		            "TLS_ECDHE_PSK_WITH_RC4_128_SHA",
		            "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA",
		            "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
		            "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
		            "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",
		            "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384",
		            "TLS_ECDHE_PSK_WITH_NULL_SHA",
		            "TLS_ECDHE_PSK_WITH_NULL_SHA256",
		            "TLS_ECDHE_PSK_WITH_NULL_SHA384",
		            "TLS_RSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_RSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256",
		            "TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384",
		            "TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256",
		            "TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384",
		            "TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_DH_anon_WITH_ARIA_128_CBC_SHA256",
		            "TLS_DH_anon_WITH_ARIA_256_CBC_SHA384",
		            "TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256",
		            "TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384",
		            "TLS_RSA_WITH_ARIA_128_GCM_SHA256",
		            "TLS_RSA_WITH_ARIA_256_GCM_SHA384",
		            "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256",
		            "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384",
		            "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256",
		            "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384",
		            "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256",
		            "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384",
		            "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256",
		            "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384",
		            "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256",
		            "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384",
		            "TLS_PSK_WITH_ARIA_128_CBC_SHA256",
		            "TLS_PSK_WITH_ARIA_256_CBC_SHA384",
		            "TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256",
		            "TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384",
		            "TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256",
		            "TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384",
		            "TLS_PSK_WITH_ARIA_128_GCM_SHA256",
		            "TLS_PSK_WITH_ARIA_256_GCM_SHA384",
		            "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256",
		            "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384",
		            "TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256",
		            "TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384",
		            "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256",
		            "TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384",
		            "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256",
		            "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384",
		            "TLS_RSA_WITH_AES_128_CCM",
		            "TLS_RSA_WITH_AES_256_CCM",
		            "TLS_RSA_WITH_AES_128_CCM_8",
		            "TLS_RSA_WITH_AES_256_CCM_8",
		            "TLS_PSK_WITH_AES_128_CCM",
		            "TLS_PSK_WITH_AES_256_CCM",
		            "TLS_PSK_WITH_AES_128_CCM_8",
		            "TLS_PSK_WITH_AES_256_CCM_8"
		}) {
			blackCiphers.put(c, Boolean.TRUE);
		}
	}

	public static boolean isBlackListProtocol(String tlsProtocol) {
		Boolean b = blackProtocols.get(tlsProtocol);
		return b != null && b;
	}

	public static boolean isBlackListCipher(String tlsCipher) {
		Boolean b = blackCiphers.get(tlsCipher);
		return b != null && b;
	}

	/**
	 * Comparator that orders non blacklisted ciphers before blacklisted ones.
	 */
	public static class CipherComparator implements Comparator {
		@Override
		public int compare(String c1, String c2) {
			boolean b1 = isBlackListCipher(c1);
			boolean b2 = isBlackListCipher(c2);
			if (b1 == b2)
				return 0;
			if (b1)
				return 1;
			return -1;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy