[Suggestion] Fix setWpa3EnterpriseConfig
Add missing support for standard WPA3-Enterprise networks, which are basically WPA2-Enterprise networks + PMF. Add missing support in the Specifier as well, and add unit tests and CTS tests to cover these use cases. The logic detects 192-bit or standard mode by looking at the certificates. If the certificates are Suite-B, then the 192-bit mode is enabled. Otherwise, standard mode is enabled. Bug: 166670837 Test: atest WifiNetworkSuggestionTest WifiNetworkSpecifierTest Change-Id: I875d0d0584d71fe6dd3fedc8f5371e0b5ed2e5e5
This commit is contained in:
@@ -30,6 +30,9 @@ import java.lang.annotation.RetentionPolicy;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.security.interfaces.ECPublicKey;
|
||||
import java.security.interfaces.RSAPublicKey;
|
||||
import java.security.spec.ECParameterSpec;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -1442,4 +1445,50 @@ public class WifiEnterpriseConfig implements Parcelable {
|
||||
}
|
||||
return TextUtils.isEmpty(getCaPath());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a given certificate Get the Suite-B cipher from the certificate
|
||||
*
|
||||
* @param x509Certificate Certificate to process
|
||||
* @return true if the certificate OID matches the Suite-B requirements for RSA or ECDSA
|
||||
* certificates, or false otherwise.
|
||||
* @hide
|
||||
*/
|
||||
public static boolean isSuiteBCipherCert(@Nullable X509Certificate x509Certificate) {
|
||||
if (x509Certificate == null) {
|
||||
return false;
|
||||
}
|
||||
final String sigAlgOid = x509Certificate.getSigAlgOID();
|
||||
|
||||
// Wi-Fi alliance requires the use of both ECDSA secp384r1 and RSA 3072 certificates
|
||||
// in WPA3-Enterprise 192-bit security networks, which are also known as Suite-B-192
|
||||
// networks, even though NSA Suite-B-192 mandates ECDSA only. The use of the term
|
||||
// Suite-B was already coined in the IEEE 802.11-2016 specification for
|
||||
// AKM 00-0F-AC but the test plan for WPA3-Enterprise 192-bit for APs mandates
|
||||
// support for both RSA and ECDSA, and for STAs it mandates ECDSA and optionally
|
||||
// RSA. In order to be compatible with all WPA3-Enterprise 192-bit deployments,
|
||||
// we are supporting both types here.
|
||||
if (sigAlgOid.equals("1.2.840.113549.1.1.12")) {
|
||||
// sha384WithRSAEncryption
|
||||
if (x509Certificate.getPublicKey() instanceof RSAPublicKey) {
|
||||
final RSAPublicKey rsaPublicKey = (RSAPublicKey) x509Certificate.getPublicKey();
|
||||
if (rsaPublicKey.getModulus() != null
|
||||
&& rsaPublicKey.getModulus().bitLength() >= 3072) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if (sigAlgOid.equals("1.2.840.10045.4.3.3")) {
|
||||
// ecdsa-with-SHA384
|
||||
if (x509Certificate.getPublicKey() instanceof ECPublicKey) {
|
||||
final ECPublicKey ecPublicKey = (ECPublicKey) x509Certificate.getPublicKey();
|
||||
final ECParameterSpec ecParameterSpec = ecPublicKey.getParams();
|
||||
|
||||
if (ecParameterSpec != null && ecParameterSpec.getOrder() != null
|
||||
&& ecParameterSpec.getOrder().bitLength() >= 384) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,12 +78,12 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
|
||||
private @Nullable String mWpa3SaePassphrase;
|
||||
/**
|
||||
* The enterprise configuration details specifying the EAP method,
|
||||
* certificates and other settings associated with the WPA-EAP networks.
|
||||
* certificates and other settings associated with the WPA/WPA2-Enterprise networks.
|
||||
*/
|
||||
private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
|
||||
/**
|
||||
* The enterprise configuration details specifying the EAP method,
|
||||
* certificates and other settings associated with the SuiteB networks.
|
||||
* certificates and other settings associated with the WPA3-Enterprise networks.
|
||||
*/
|
||||
private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
|
||||
/**
|
||||
@@ -243,7 +243,11 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
|
||||
|
||||
/**
|
||||
* Set the associated enterprise configuration for this network. Needed for authenticating
|
||||
* to WPA3-SuiteB networks. See {@link WifiEnterpriseConfig} for description.
|
||||
* to WPA3-Enterprise networks (standard and 192-bit security). See
|
||||
* {@link WifiEnterpriseConfig} for description. For 192-bit security networks, both the
|
||||
* client and CA certificates must be provided, and must be of type of either
|
||||
* sha384WithRSAEncryption (OID 1.2.840.113549.1.1.12) or ecdsa-with-SHA384
|
||||
* (OID 1.2.840.10045.4.3.3).
|
||||
*
|
||||
* @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
|
||||
* @return Instance of {@link Builder} to enable chaining of the builder method.
|
||||
@@ -284,8 +288,25 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
|
||||
} else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
|
||||
configuration.enterpriseConfig = mWpa2EnterpriseConfig;
|
||||
} else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
|
||||
} else if (mWpa3EnterpriseConfig != null) { // WPA3-Enterprise
|
||||
if (mWpa3EnterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS
|
||||
&& WifiEnterpriseConfig.isSuiteBCipherCert(
|
||||
mWpa3EnterpriseConfig.getClientCertificate())
|
||||
&& WifiEnterpriseConfig.isSuiteBCipherCert(
|
||||
mWpa3EnterpriseConfig.getCaCertificate())) {
|
||||
// WPA3-Enterprise in 192-bit security mode (Suite-B)
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
|
||||
} else {
|
||||
// WPA3-Enterprise
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
|
||||
configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
|
||||
configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
|
||||
configuration.allowedPairwiseCiphers.set(
|
||||
WifiConfiguration.PairwiseCipher.GCMP_256);
|
||||
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
|
||||
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
|
||||
configuration.requirePmf = true;
|
||||
}
|
||||
configuration.enterpriseConfig = mWpa3EnterpriseConfig;
|
||||
} else if (mIsEnhancedOpen) { // OWE network
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
|
||||
|
||||
@@ -72,12 +72,12 @@ public final class WifiNetworkSuggestion implements Parcelable {
|
||||
private @Nullable String mWpa3SaePassphrase;
|
||||
/**
|
||||
* The enterprise configuration details specifying the EAP method,
|
||||
* certificates and other settings associated with the WPA-EAP networks.
|
||||
* certificates and other settings associated with the WPA/WPA2-Enterprise networks.
|
||||
*/
|
||||
private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
|
||||
/**
|
||||
* The enterprise configuration details specifying the EAP method,
|
||||
* certificates and other settings associated with the SuiteB networks.
|
||||
* certificates and other settings associated with the WPA3-Enterprise networks.
|
||||
*/
|
||||
private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
|
||||
/**
|
||||
@@ -282,7 +282,11 @@ public final class WifiNetworkSuggestion implements Parcelable {
|
||||
|
||||
/**
|
||||
* Set the associated enterprise configuration for this network. Needed for authenticating
|
||||
* to WPA3 enterprise networks. See {@link WifiEnterpriseConfig} for description.
|
||||
* to WPA3-Enterprise networks (standard and 192-bit security). See
|
||||
* {@link WifiEnterpriseConfig} for description. For 192-bit security networks, both the
|
||||
* client and CA certificates must be provided, and must be of type of either
|
||||
* sha384WithRSAEncryption (OID 1.2.840.113549.1.1.12) or ecdsa-with-SHA384
|
||||
* (OID 1.2.840.10045.4.3.3).
|
||||
*
|
||||
* @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
|
||||
* @return Instance of {@link Builder} to enable chaining of the builder method.
|
||||
@@ -541,8 +545,25 @@ public final class WifiNetworkSuggestion implements Parcelable {
|
||||
} else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
|
||||
configuration.enterpriseConfig = mWpa2EnterpriseConfig;
|
||||
} else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
|
||||
} else if (mWpa3EnterpriseConfig != null) { // WPA3-Enterprise
|
||||
if (mWpa3EnterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS
|
||||
&& WifiEnterpriseConfig.isSuiteBCipherCert(
|
||||
mWpa3EnterpriseConfig.getClientCertificate())
|
||||
&& WifiEnterpriseConfig.isSuiteBCipherCert(
|
||||
mWpa3EnterpriseConfig.getCaCertificate())) {
|
||||
// WPA3-Enterprise in 192-bit security mode (Suite-B)
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
|
||||
} else {
|
||||
// WPA3-Enterprise
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
|
||||
configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
|
||||
configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
|
||||
configuration.allowedPairwiseCiphers.set(
|
||||
WifiConfiguration.PairwiseCipher.GCMP_256);
|
||||
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
|
||||
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
|
||||
configuration.requirePmf = true;
|
||||
}
|
||||
configuration.enterpriseConfig = mWpa3EnterpriseConfig;
|
||||
} else if (mIsEnhancedOpen) { // OWE network
|
||||
configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
|
||||
|
||||
@@ -212,7 +212,57 @@ public class FakeKeys {
|
||||
(byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
|
||||
(byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
|
||||
};
|
||||
public static final PrivateKey RSA_KEY1 = loadPrivateRSAKey(FAKE_RSA_KEY_1);
|
||||
public static final PrivateKey RSA_KEY1 = loadPrivateKey("RSA", FAKE_RSA_KEY_1);
|
||||
|
||||
private static final String CA_SUITE_B_RSA3072_CERT_STRING =
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIEnTCCAwWgAwIBAgIUD87Y8fFLzLr1HQ/64aEnjNq2R/4wDQYJKoZIhvcNAQEM\n"
|
||||
+ "BQAwXjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAO\n"
|
||||
+ "BgNVBAoMB0FuZHJvaWQxDjAMBgNVBAsMBVdpLUZpMRIwEAYDVQQDDAl1bml0ZXN0\n"
|
||||
+ "Q0EwHhcNMjAwNzIxMDIxNzU0WhcNMzAwNTMwMDIxNzU0WjBeMQswCQYDVQQGEwJV\n"
|
||||
+ "UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA01UVjEQMA4GA1UECgwHQW5kcm9pZDEO\n"
|
||||
+ "MAwGA1UECwwFV2ktRmkxEjAQBgNVBAMMCXVuaXRlc3RDQTCCAaIwDQYJKoZIhvcN\n"
|
||||
+ "AQEBBQADggGPADCCAYoCggGBAMtrsT0otlxh0QS079KpRRbU1PQjCihSoltXnrxF\n"
|
||||
+ "sTWZs2weVEeYVyYU5LaauCDDgISCMtjtfbfylMBeYjpWB5hYzYQOiTzo0anWhMyb\n"
|
||||
+ "Ngb7gpMVZuIl6lwMYRyVRKwHWnTo2EUg1ZzW5rGe5fs/KHj6//hoNFm+3Oju0TQd\n"
|
||||
+ "nraQULpoERPF5B7p85Cssk8uNbviBfZXvtCuJ4N6w7PNceOY/9bbwc1mC+pPZmzV\n"
|
||||
+ "SOAg0vvbIQRzChm63C3jBC3xmxSOOZVrKN4zKDG2s8P0oCNGt0NlgRMrgbPRekzg\n"
|
||||
+ "4avkbA0vTuc2AyriTEYkdea/Mt4EpRg9XuOb43U/GJ/d/vQv2/9fsxhXmsZrn8kr\n"
|
||||
+ "Qo5MMHJFUd96GgHmvYSU3Mf/5r8gF626lvqHioGuTAuHUSnr02ri1WUxZ15LDRgY\n"
|
||||
+ "quMjDCFZfucjJPDAdtiHcFSej/4SLJlN39z8oKKNPn3aL9Gv49oAKs9S8tfDVzMk\n"
|
||||
+ "fDLROQFHFuW715GnnMgEAoOpRwIDAQABo1MwUTAdBgNVHQ4EFgQUeVuGmSVN4ARs\n"
|
||||
+ "mesUMWSJ2qWLbxUwHwYDVR0jBBgwFoAUeVuGmSVN4ARsmesUMWSJ2qWLbxUwDwYD\n"
|
||||
+ "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQwFAAOCAYEAit1Lo/hegZpPuT9dlWZJ\n"
|
||||
+ "bC8JvAf95O8lnn6LFb69pgYOHCLgCIlvYXu9rdBUJgZo+V1MzJJljiO6RxWRfKbQ\n"
|
||||
+ "8WBYkoqR1EqriR3Kn8q/SjIZCdFSaznTyU1wQMveBQ6RJWXSUhYVfE9RjyFTp7B4\n"
|
||||
+ "UyH2uCluR/0T06HQNGfH5XpIYQqCk1Zgng5lmEmheLDPoJpa92lKeQFJMC6eYz9g\n"
|
||||
+ "lF1GHxPxkPfbMJ6ZDp5X6Yopu6Q6uEXhVKM/iQVcgzRkx9rid+xTYl+nOKyK/XfC\n"
|
||||
+ "z8P0/TFIoPTW02DLge5wKagdoCpy1B7HdrAXyUjoH4B8MsUkq3kYPFSjPzScuTtV\n"
|
||||
+ "kUuDw5ipCNeXCRnhbYqRDk6PX5GUu2cmN9jtaH3tbgm3fKNOsd/BO1fLIl7qjXlR\n"
|
||||
+ "27HHbC0JXjNvlm2DLp23v4NTxS7WZGYsxyUj5DZrxBxqCsTXu/01w1BrQKWKh9FM\n"
|
||||
+ "aVrlA8omfVODK2CSuw+KhEMHepRv/AUgsLl4L4+RMoa+\n"
|
||||
+ "-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CA_SUITE_B_RSA3072_CERT =
|
||||
loadCertificate(CA_SUITE_B_RSA3072_CERT_STRING);
|
||||
|
||||
private static final String CA_SUITE_B_ECDSA_CERT_STRING =
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIICTzCCAdSgAwIBAgIUdnLttwNPnQzFufplGOr9bTrGCqMwCgYIKoZIzj0EAwMw\n"
|
||||
+ "XjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNV\n"
|
||||
+ "BAoMB0FuZHJvaWQxDjAMBgNVBAsMBVdpLUZpMRIwEAYDVQQDDAl1bml0ZXN0Q0Ew\n"
|
||||
+ "HhcNMjAwNzIxMDIyNDA1WhcNMzAwNTMwMDIyNDA1WjBeMQswCQYDVQQGEwJVUzEL\n"
|
||||
+ "MAkGA1UECAwCQ0ExDDAKBgNVBAcMA01UVjEQMA4GA1UECgwHQW5kcm9pZDEOMAwG\n"
|
||||
+ "A1UECwwFV2ktRmkxEjAQBgNVBAMMCXVuaXRlc3RDQTB2MBAGByqGSM49AgEGBSuB\n"
|
||||
+ "BAAiA2IABFmntXwk9icqhDQFUP1xy04WyEpaGW4q6Q+8pujlSl/X3iotPZ++GZfp\n"
|
||||
+ "Mfv3YDHDBl6sELPQ2BEjyPXmpsKjOUdiUe69e88oGEdeqT2xXiQ6uzpTfJD4170i\n"
|
||||
+ "O/TwLrQGKKNTMFEwHQYDVR0OBBYEFCjptsX3g4g5W0L4oEP6N3gfyiZXMB8GA1Ud\n"
|
||||
+ "IwQYMBaAFCjptsX3g4g5W0L4oEP6N3gfyiZXMA8GA1UdEwEB/wQFMAMBAf8wCgYI\n"
|
||||
+ "KoZIzj0EAwMDaQAwZgIxAK61brUYRbLmQKiaEboZgrHtnPAcGo7Yzx3MwHecx3Dm\n"
|
||||
+ "5soIeLVYc8bPYN1pbhXW1gIxALdEe2sh03nBHyQH4adYoZungoCwt8mp/7sJFxou\n"
|
||||
+ "9UnRegyBgGzf74ROWdpZHzh+Pg==\n"
|
||||
+ "-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CA_SUITE_B_ECDSA_CERT =
|
||||
loadCertificate(CA_SUITE_B_ECDSA_CERT_STRING);
|
||||
|
||||
private static final String CLIENT_SUITE_B_RSA3072_CERT_STRING =
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
@@ -243,6 +293,363 @@ public class FakeKeys {
|
||||
public static final X509Certificate CLIENT_SUITE_B_RSA3072_CERT =
|
||||
loadCertificate(CLIENT_SUITE_B_RSA3072_CERT_STRING);
|
||||
|
||||
private static final byte[] CLIENT_SUITE_B_RSA3072_KEY_DATA = new byte[]{
|
||||
(byte) 0x30, (byte) 0x82, (byte) 0x06, (byte) 0xfe, (byte) 0x02, (byte) 0x01,
|
||||
(byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
|
||||
(byte) 0x06, (byte) 0xe8, (byte) 0x30, (byte) 0x82, (byte) 0x06, (byte) 0xe4,
|
||||
(byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x82, (byte) 0x01,
|
||||
(byte) 0x81, (byte) 0x00, (byte) 0xc1, (byte) 0x22, (byte) 0xb7, (byte) 0x0b,
|
||||
(byte) 0x92, (byte) 0xb9, (byte) 0xb9, (byte) 0xdb, (byte) 0x42, (byte) 0x29,
|
||||
(byte) 0x39, (byte) 0xc4, (byte) 0xd7, (byte) 0x87, (byte) 0xbc, (byte) 0xcf,
|
||||
(byte) 0x67, (byte) 0x19, (byte) 0xbf, (byte) 0x09, (byte) 0x81, (byte) 0xe1,
|
||||
(byte) 0x77, (byte) 0xbe, (byte) 0x6b, (byte) 0xcf, (byte) 0xbb, (byte) 0x40,
|
||||
(byte) 0xbb, (byte) 0x9d, (byte) 0x1e, (byte) 0x8a, (byte) 0x1c, (byte) 0xfe,
|
||||
(byte) 0x54, (byte) 0x33, (byte) 0x0a, (byte) 0x58, (byte) 0x0a, (byte) 0xe0,
|
||||
(byte) 0xc6, (byte) 0xd5, (byte) 0x50, (byte) 0x2d, (byte) 0x03, (byte) 0xdc,
|
||||
(byte) 0x51, (byte) 0x3e, (byte) 0x53, (byte) 0x7d, (byte) 0x82, (byte) 0xef,
|
||||
(byte) 0xc4, (byte) 0xb1, (byte) 0x2a, (byte) 0x84, (byte) 0xda, (byte) 0x45,
|
||||
(byte) 0x6b, (byte) 0x6f, (byte) 0x3e, (byte) 0x63, (byte) 0x66, (byte) 0xf9,
|
||||
(byte) 0x46, (byte) 0x85, (byte) 0x4f, (byte) 0xc2, (byte) 0xa4, (byte) 0xc3,
|
||||
(byte) 0x25, (byte) 0x27, (byte) 0xa3, (byte) 0xf7, (byte) 0x6f, (byte) 0xfb,
|
||||
(byte) 0x65, (byte) 0xc3, (byte) 0xa5, (byte) 0xdf, (byte) 0xf3, (byte) 0x01,
|
||||
(byte) 0x14, (byte) 0x3e, (byte) 0xdc, (byte) 0x5c, (byte) 0x00, (byte) 0x7d,
|
||||
(byte) 0x6a, (byte) 0x29, (byte) 0x02, (byte) 0x11, (byte) 0x32, (byte) 0x09,
|
||||
(byte) 0x54, (byte) 0xb1, (byte) 0xc2, (byte) 0xc0, (byte) 0x9a, (byte) 0xfa,
|
||||
(byte) 0xc9, (byte) 0x50, (byte) 0xe2, (byte) 0x3b, (byte) 0x91, (byte) 0x20,
|
||||
(byte) 0xc2, (byte) 0x2e, (byte) 0x50, (byte) 0x2d, (byte) 0x4c, (byte) 0x9b,
|
||||
(byte) 0x43, (byte) 0x5a, (byte) 0xa6, (byte) 0xd6, (byte) 0x72, (byte) 0x33,
|
||||
(byte) 0x74, (byte) 0xe3, (byte) 0xfc, (byte) 0x80, (byte) 0x90, (byte) 0x11,
|
||||
(byte) 0xfa, (byte) 0x64, (byte) 0xa3, (byte) 0xda, (byte) 0x95, (byte) 0x21,
|
||||
(byte) 0xb8, (byte) 0x8a, (byte) 0xe9, (byte) 0xea, (byte) 0x09, (byte) 0x31,
|
||||
(byte) 0x39, (byte) 0x18, (byte) 0xf0, (byte) 0x45, (byte) 0x9f, (byte) 0x02,
|
||||
(byte) 0x7e, (byte) 0xd1, (byte) 0x4c, (byte) 0x57, (byte) 0x5f, (byte) 0x47,
|
||||
(byte) 0x53, (byte) 0x8b, (byte) 0xb8, (byte) 0xed, (byte) 0x26, (byte) 0x54,
|
||||
(byte) 0xe8, (byte) 0xe0, (byte) 0x2d, (byte) 0x6f, (byte) 0x7f, (byte) 0xfa,
|
||||
(byte) 0xea, (byte) 0x58, (byte) 0xbf, (byte) 0xa8, (byte) 0x59, (byte) 0xd7,
|
||||
(byte) 0xd9, (byte) 0xc0, (byte) 0x30, (byte) 0x0c, (byte) 0x70, (byte) 0xe1,
|
||||
(byte) 0x04, (byte) 0xc9, (byte) 0xc7, (byte) 0xb9, (byte) 0x4b, (byte) 0xc0,
|
||||
(byte) 0x02, (byte) 0xd7, (byte) 0xec, (byte) 0x1f, (byte) 0xad, (byte) 0x0d,
|
||||
(byte) 0x83, (byte) 0x44, (byte) 0x64, (byte) 0x70, (byte) 0xea, (byte) 0x60,
|
||||
(byte) 0xbd, (byte) 0xb3, (byte) 0xca, (byte) 0xf4, (byte) 0x16, (byte) 0x02,
|
||||
(byte) 0x3d, (byte) 0x87, (byte) 0x0a, (byte) 0x57, (byte) 0xab, (byte) 0x7b,
|
||||
(byte) 0xc4, (byte) 0x18, (byte) 0x20, (byte) 0xbc, (byte) 0x64, (byte) 0xbe,
|
||||
(byte) 0x4b, (byte) 0x60, (byte) 0x06, (byte) 0x0d, (byte) 0x9c, (byte) 0xac,
|
||||
(byte) 0x42, (byte) 0x49, (byte) 0x7b, (byte) 0x85, (byte) 0xdb, (byte) 0x0c,
|
||||
(byte) 0x7e, (byte) 0xcb, (byte) 0x03, (byte) 0x7a, (byte) 0xeb, (byte) 0x5e,
|
||||
(byte) 0x6b, (byte) 0x22, (byte) 0xa9, (byte) 0xfd, (byte) 0x59, (byte) 0x6d,
|
||||
(byte) 0xf1, (byte) 0x45, (byte) 0x13, (byte) 0x32, (byte) 0xbd, (byte) 0x34,
|
||||
(byte) 0x5a, (byte) 0xa8, (byte) 0xbc, (byte) 0xbf, (byte) 0xaa, (byte) 0x1a,
|
||||
(byte) 0x1f, (byte) 0xb3, (byte) 0x20, (byte) 0xff, (byte) 0xb9, (byte) 0xf3,
|
||||
(byte) 0xc4, (byte) 0xa1, (byte) 0x24, (byte) 0x53, (byte) 0xbd, (byte) 0x1f,
|
||||
(byte) 0xf4, (byte) 0x43, (byte) 0x9c, (byte) 0x3a, (byte) 0x62, (byte) 0x4e,
|
||||
(byte) 0x70, (byte) 0x05, (byte) 0x4d, (byte) 0x65, (byte) 0xd0, (byte) 0x75,
|
||||
(byte) 0x3c, (byte) 0x20, (byte) 0xb3, (byte) 0x34, (byte) 0x92, (byte) 0xd1,
|
||||
(byte) 0x5c, (byte) 0x36, (byte) 0x3c, (byte) 0x1f, (byte) 0x89, (byte) 0xa8,
|
||||
(byte) 0x40, (byte) 0x01, (byte) 0x01, (byte) 0xaf, (byte) 0x43, (byte) 0x78,
|
||||
(byte) 0xcb, (byte) 0xd7, (byte) 0x4f, (byte) 0x53, (byte) 0xb2, (byte) 0xf8,
|
||||
(byte) 0xd6, (byte) 0x37, (byte) 0x22, (byte) 0xd3, (byte) 0xc7, (byte) 0xcb,
|
||||
(byte) 0x2e, (byte) 0xb7, (byte) 0x9d, (byte) 0x06, (byte) 0x55, (byte) 0x23,
|
||||
(byte) 0x6a, (byte) 0xd7, (byte) 0x00, (byte) 0xdc, (byte) 0x38, (byte) 0x36,
|
||||
(byte) 0x1c, (byte) 0x12, (byte) 0xd1, (byte) 0x9e, (byte) 0x83, (byte) 0x17,
|
||||
(byte) 0xe4, (byte) 0x2c, (byte) 0x4c, (byte) 0xda, (byte) 0xe3, (byte) 0xf8,
|
||||
(byte) 0x65, (byte) 0x3b, (byte) 0x7b, (byte) 0x84, (byte) 0x86, (byte) 0xfc,
|
||||
(byte) 0x41, (byte) 0x91, (byte) 0xf1, (byte) 0x2b, (byte) 0xe5, (byte) 0x76,
|
||||
(byte) 0x36, (byte) 0x1f, (byte) 0x41, (byte) 0x35, (byte) 0x85, (byte) 0x2e,
|
||||
(byte) 0x0d, (byte) 0x65, (byte) 0xfd, (byte) 0x44, (byte) 0xf5, (byte) 0x84,
|
||||
(byte) 0xe3, (byte) 0xa4, (byte) 0x41, (byte) 0x9c, (byte) 0x1d, (byte) 0xb1,
|
||||
(byte) 0xa5, (byte) 0xb5, (byte) 0xce, (byte) 0x02, (byte) 0xb2, (byte) 0x7a,
|
||||
(byte) 0xe8, (byte) 0x85, (byte) 0x07, (byte) 0x62, (byte) 0x9d, (byte) 0x32,
|
||||
(byte) 0x66, (byte) 0xc0, (byte) 0x4a, (byte) 0xaf, (byte) 0x94, (byte) 0xc7,
|
||||
(byte) 0x52, (byte) 0xf5, (byte) 0x28, (byte) 0x80, (byte) 0xa8, (byte) 0xd0,
|
||||
(byte) 0x88, (byte) 0x25, (byte) 0xc1, (byte) 0x67, (byte) 0x01, (byte) 0xff,
|
||||
(byte) 0xc9, (byte) 0xe7, (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00,
|
||||
(byte) 0x01, (byte) 0x02, (byte) 0x82, (byte) 0x01, (byte) 0x80, (byte) 0x04,
|
||||
(byte) 0xb1, (byte) 0xcc, (byte) 0x53, (byte) 0x3a, (byte) 0xb0, (byte) 0xcb,
|
||||
(byte) 0x04, (byte) 0xba, (byte) 0x59, (byte) 0xf8, (byte) 0x2e, (byte) 0x81,
|
||||
(byte) 0xb2, (byte) 0xa9, (byte) 0xf3, (byte) 0x3c, (byte) 0xa5, (byte) 0x52,
|
||||
(byte) 0x90, (byte) 0x6f, (byte) 0x98, (byte) 0xc4, (byte) 0x69, (byte) 0x5b,
|
||||
(byte) 0x83, (byte) 0x84, (byte) 0x20, (byte) 0xb1, (byte) 0xae, (byte) 0xc3,
|
||||
(byte) 0x04, (byte) 0x46, (byte) 0x6a, (byte) 0x24, (byte) 0x2f, (byte) 0xcd,
|
||||
(byte) 0x6b, (byte) 0x90, (byte) 0x70, (byte) 0x20, (byte) 0x45, (byte) 0x25,
|
||||
(byte) 0x1a, (byte) 0xc3, (byte) 0x02, (byte) 0x42, (byte) 0xf3, (byte) 0x49,
|
||||
(byte) 0xe2, (byte) 0x3e, (byte) 0x21, (byte) 0x87, (byte) 0xdd, (byte) 0x6a,
|
||||
(byte) 0x94, (byte) 0x2a, (byte) 0x1e, (byte) 0x0f, (byte) 0xdb, (byte) 0x77,
|
||||
(byte) 0x5f, (byte) 0xc1, (byte) 0x2c, (byte) 0x03, (byte) 0xfb, (byte) 0xcf,
|
||||
(byte) 0x91, (byte) 0x82, (byte) 0xa1, (byte) 0xbf, (byte) 0xb0, (byte) 0x73,
|
||||
(byte) 0xfa, (byte) 0xda, (byte) 0xbc, (byte) 0xf8, (byte) 0x9f, (byte) 0x45,
|
||||
(byte) 0xd3, (byte) 0xe8, (byte) 0xbb, (byte) 0x38, (byte) 0xfb, (byte) 0xc2,
|
||||
(byte) 0x2d, (byte) 0x76, (byte) 0x51, (byte) 0x96, (byte) 0x18, (byte) 0x03,
|
||||
(byte) 0x15, (byte) 0xd9, (byte) 0xea, (byte) 0x82, (byte) 0x25, (byte) 0x83,
|
||||
(byte) 0xff, (byte) 0x5c, (byte) 0x85, (byte) 0x06, (byte) 0x09, (byte) 0xb2,
|
||||
(byte) 0x46, (byte) 0x12, (byte) 0x64, (byte) 0x02, (byte) 0x74, (byte) 0x4f,
|
||||
(byte) 0xbc, (byte) 0x9a, (byte) 0x25, (byte) 0x18, (byte) 0x01, (byte) 0x07,
|
||||
(byte) 0x17, (byte) 0x25, (byte) 0x55, (byte) 0x7c, (byte) 0xdc, (byte) 0xe1,
|
||||
(byte) 0xd1, (byte) 0x5a, (byte) 0x2f, (byte) 0x25, (byte) 0xaf, (byte) 0xf6,
|
||||
(byte) 0x8f, (byte) 0xa4, (byte) 0x9a, (byte) 0x5a, (byte) 0x3a, (byte) 0xfe,
|
||||
(byte) 0x2e, (byte) 0x93, (byte) 0x24, (byte) 0xa0, (byte) 0x27, (byte) 0xac,
|
||||
(byte) 0x07, (byte) 0x75, (byte) 0x33, (byte) 0x01, (byte) 0x54, (byte) 0x23,
|
||||
(byte) 0x0f, (byte) 0xe8, (byte) 0x9f, (byte) 0xfa, (byte) 0x36, (byte) 0xe6,
|
||||
(byte) 0x3a, (byte) 0xd5, (byte) 0x78, (byte) 0xb0, (byte) 0xe4, (byte) 0x6a,
|
||||
(byte) 0x16, (byte) 0x50, (byte) 0xbd, (byte) 0x0f, (byte) 0x9f, (byte) 0x32,
|
||||
(byte) 0xa1, (byte) 0x6b, (byte) 0xf5, (byte) 0xa4, (byte) 0x34, (byte) 0x58,
|
||||
(byte) 0xb6, (byte) 0xa4, (byte) 0xb3, (byte) 0xc3, (byte) 0x83, (byte) 0x08,
|
||||
(byte) 0x18, (byte) 0xc7, (byte) 0xef, (byte) 0x95, (byte) 0xe2, (byte) 0x1b,
|
||||
(byte) 0xba, (byte) 0x35, (byte) 0x61, (byte) 0xa3, (byte) 0xb4, (byte) 0x30,
|
||||
(byte) 0xe0, (byte) 0xd1, (byte) 0xc1, (byte) 0xa2, (byte) 0x3a, (byte) 0xc6,
|
||||
(byte) 0xb4, (byte) 0xd2, (byte) 0x80, (byte) 0x5a, (byte) 0xaf, (byte) 0xa4,
|
||||
(byte) 0x54, (byte) 0x3c, (byte) 0x66, (byte) 0x5a, (byte) 0x1c, (byte) 0x4d,
|
||||
(byte) 0xe1, (byte) 0xd9, (byte) 0x98, (byte) 0x44, (byte) 0x01, (byte) 0x1b,
|
||||
(byte) 0x8c, (byte) 0xe9, (byte) 0x80, (byte) 0x54, (byte) 0x83, (byte) 0x3d,
|
||||
(byte) 0x96, (byte) 0x25, (byte) 0x41, (byte) 0x1c, (byte) 0xad, (byte) 0xae,
|
||||
(byte) 0x3b, (byte) 0x7a, (byte) 0xd7, (byte) 0x9d, (byte) 0x10, (byte) 0x7c,
|
||||
(byte) 0xd1, (byte) 0xa7, (byte) 0x96, (byte) 0x39, (byte) 0xa5, (byte) 0x2f,
|
||||
(byte) 0xbe, (byte) 0xc3, (byte) 0x2c, (byte) 0x64, (byte) 0x01, (byte) 0xfe,
|
||||
(byte) 0xa2, (byte) 0xd1, (byte) 0x6a, (byte) 0xcf, (byte) 0x4c, (byte) 0x76,
|
||||
(byte) 0x3b, (byte) 0xc8, (byte) 0x35, (byte) 0x21, (byte) 0xda, (byte) 0x98,
|
||||
(byte) 0xcf, (byte) 0xf9, (byte) 0x29, (byte) 0xff, (byte) 0x30, (byte) 0x59,
|
||||
(byte) 0x36, (byte) 0x53, (byte) 0x0b, (byte) 0xbb, (byte) 0xfa, (byte) 0xba,
|
||||
(byte) 0xc4, (byte) 0x03, (byte) 0x23, (byte) 0xe0, (byte) 0xd3, (byte) 0x33,
|
||||
(byte) 0xff, (byte) 0x32, (byte) 0xdb, (byte) 0x30, (byte) 0x64, (byte) 0xc7,
|
||||
(byte) 0x56, (byte) 0xca, (byte) 0x55, (byte) 0x14, (byte) 0xee, (byte) 0x58,
|
||||
(byte) 0xfe, (byte) 0x96, (byte) 0x7e, (byte) 0x1c, (byte) 0x34, (byte) 0x16,
|
||||
(byte) 0xeb, (byte) 0x76, (byte) 0x26, (byte) 0x48, (byte) 0xe2, (byte) 0xe5,
|
||||
(byte) 0x5c, (byte) 0xd5, (byte) 0x83, (byte) 0x37, (byte) 0xd9, (byte) 0x09,
|
||||
(byte) 0x71, (byte) 0xbc, (byte) 0x54, (byte) 0x25, (byte) 0xca, (byte) 0x2e,
|
||||
(byte) 0xdb, (byte) 0x36, (byte) 0x39, (byte) 0xcc, (byte) 0x3a, (byte) 0x81,
|
||||
(byte) 0x95, (byte) 0x9e, (byte) 0xf4, (byte) 0x01, (byte) 0xa7, (byte) 0xc0,
|
||||
(byte) 0x20, (byte) 0xce, (byte) 0x70, (byte) 0x55, (byte) 0x2c, (byte) 0xe0,
|
||||
(byte) 0x93, (byte) 0x72, (byte) 0xa6, (byte) 0x25, (byte) 0xda, (byte) 0x64,
|
||||
(byte) 0x19, (byte) 0x18, (byte) 0xd2, (byte) 0x31, (byte) 0xe2, (byte) 0x7c,
|
||||
(byte) 0xf2, (byte) 0x30, (byte) 0x9e, (byte) 0x8d, (byte) 0xc6, (byte) 0x14,
|
||||
(byte) 0x8a, (byte) 0x38, (byte) 0xf0, (byte) 0x94, (byte) 0xeb, (byte) 0xf4,
|
||||
(byte) 0x64, (byte) 0x92, (byte) 0x3d, (byte) 0x67, (byte) 0xa6, (byte) 0x2c,
|
||||
(byte) 0x52, (byte) 0xfc, (byte) 0x60, (byte) 0xca, (byte) 0x2a, (byte) 0xcf,
|
||||
(byte) 0x24, (byte) 0xd5, (byte) 0x42, (byte) 0x5f, (byte) 0xc7, (byte) 0x9f,
|
||||
(byte) 0xf3, (byte) 0xb4, (byte) 0xdf, (byte) 0x76, (byte) 0x6e, (byte) 0x53,
|
||||
(byte) 0xa1, (byte) 0x7b, (byte) 0xae, (byte) 0xa5, (byte) 0x84, (byte) 0x1f,
|
||||
(byte) 0xfa, (byte) 0xc0, (byte) 0xb4, (byte) 0x6c, (byte) 0xc9, (byte) 0x02,
|
||||
(byte) 0x81, (byte) 0xc1, (byte) 0x00, (byte) 0xf3, (byte) 0x17, (byte) 0xd9,
|
||||
(byte) 0x48, (byte) 0x17, (byte) 0x87, (byte) 0x84, (byte) 0x16, (byte) 0xea,
|
||||
(byte) 0x2d, (byte) 0x31, (byte) 0x1b, (byte) 0xce, (byte) 0xec, (byte) 0xaf,
|
||||
(byte) 0xdc, (byte) 0x6b, (byte) 0xaf, (byte) 0xc8, (byte) 0xf1, (byte) 0x40,
|
||||
(byte) 0xa7, (byte) 0x4f, (byte) 0xef, (byte) 0x48, (byte) 0x08, (byte) 0x5e,
|
||||
(byte) 0x9a, (byte) 0xd1, (byte) 0xc0, (byte) 0xb1, (byte) 0xfe, (byte) 0xe7,
|
||||
(byte) 0x03, (byte) 0xd5, (byte) 0x96, (byte) 0x01, (byte) 0xe8, (byte) 0x40,
|
||||
(byte) 0xca, (byte) 0x78, (byte) 0xcb, (byte) 0xb3, (byte) 0x28, (byte) 0x1a,
|
||||
(byte) 0xf0, (byte) 0xe5, (byte) 0xf6, (byte) 0x46, (byte) 0xef, (byte) 0xcd,
|
||||
(byte) 0x1a, (byte) 0x0f, (byte) 0x13, (byte) 0x2d, (byte) 0x38, (byte) 0xf8,
|
||||
(byte) 0xf7, (byte) 0x88, (byte) 0x21, (byte) 0x15, (byte) 0xce, (byte) 0x48,
|
||||
(byte) 0xf4, (byte) 0x92, (byte) 0x7e, (byte) 0x9b, (byte) 0x2e, (byte) 0x2f,
|
||||
(byte) 0x22, (byte) 0x3e, (byte) 0x5c, (byte) 0x67, (byte) 0xd7, (byte) 0x58,
|
||||
(byte) 0xf6, (byte) 0xef, (byte) 0x1f, (byte) 0xb4, (byte) 0x04, (byte) 0xc7,
|
||||
(byte) 0xfd, (byte) 0x8c, (byte) 0x4e, (byte) 0x27, (byte) 0x9e, (byte) 0xb9,
|
||||
(byte) 0xef, (byte) 0x0f, (byte) 0xf7, (byte) 0x4a, (byte) 0xc2, (byte) 0xf4,
|
||||
(byte) 0x64, (byte) 0x6b, (byte) 0xe0, (byte) 0xfb, (byte) 0xe3, (byte) 0x45,
|
||||
(byte) 0xd5, (byte) 0x37, (byte) 0xa0, (byte) 0x2a, (byte) 0xc6, (byte) 0xf3,
|
||||
(byte) 0xf6, (byte) 0xcc, (byte) 0xb5, (byte) 0x94, (byte) 0xbf, (byte) 0x56,
|
||||
(byte) 0xa0, (byte) 0x61, (byte) 0x36, (byte) 0x88, (byte) 0x35, (byte) 0xd5,
|
||||
(byte) 0xa5, (byte) 0xad, (byte) 0x20, (byte) 0x48, (byte) 0xda, (byte) 0x70,
|
||||
(byte) 0x35, (byte) 0xd9, (byte) 0x75, (byte) 0x66, (byte) 0xa5, (byte) 0xac,
|
||||
(byte) 0x86, (byte) 0x7a, (byte) 0x75, (byte) 0x49, (byte) 0x88, (byte) 0x40,
|
||||
(byte) 0xce, (byte) 0xb0, (byte) 0x6f, (byte) 0x57, (byte) 0x15, (byte) 0x54,
|
||||
(byte) 0xd3, (byte) 0x2f, (byte) 0x11, (byte) 0x9b, (byte) 0xe3, (byte) 0x87,
|
||||
(byte) 0xc8, (byte) 0x8d, (byte) 0x98, (byte) 0xc6, (byte) 0xe0, (byte) 0xbc,
|
||||
(byte) 0x85, (byte) 0xb9, (byte) 0x04, (byte) 0x43, (byte) 0xa9, (byte) 0x41,
|
||||
(byte) 0xce, (byte) 0x42, (byte) 0x1a, (byte) 0x57, (byte) 0x10, (byte) 0xd8,
|
||||
(byte) 0xe4, (byte) 0x6a, (byte) 0x51, (byte) 0x10, (byte) 0x0a, (byte) 0xec,
|
||||
(byte) 0xe4, (byte) 0x57, (byte) 0xc7, (byte) 0xee, (byte) 0xe9, (byte) 0xd6,
|
||||
(byte) 0xcb, (byte) 0x3e, (byte) 0xba, (byte) 0xfa, (byte) 0xe9, (byte) 0x0e,
|
||||
(byte) 0xed, (byte) 0x87, (byte) 0x04, (byte) 0x9a, (byte) 0x48, (byte) 0xba,
|
||||
(byte) 0xaf, (byte) 0x08, (byte) 0xf5, (byte) 0x02, (byte) 0x81, (byte) 0xc1,
|
||||
(byte) 0x00, (byte) 0xcb, (byte) 0x63, (byte) 0xd6, (byte) 0x54, (byte) 0xb6,
|
||||
(byte) 0xf3, (byte) 0xf3, (byte) 0x8c, (byte) 0xf8, (byte) 0xd0, (byte) 0xd2,
|
||||
(byte) 0x84, (byte) 0xc1, (byte) 0xf5, (byte) 0x12, (byte) 0xe0, (byte) 0x02,
|
||||
(byte) 0x80, (byte) 0x42, (byte) 0x92, (byte) 0x4e, (byte) 0xa4, (byte) 0x5c,
|
||||
(byte) 0xa5, (byte) 0x64, (byte) 0xec, (byte) 0xb7, (byte) 0xdc, (byte) 0xe0,
|
||||
(byte) 0x2d, (byte) 0x5d, (byte) 0xac, (byte) 0x0e, (byte) 0x24, (byte) 0x48,
|
||||
(byte) 0x13, (byte) 0x05, (byte) 0xe8, (byte) 0xff, (byte) 0x96, (byte) 0x93,
|
||||
(byte) 0xba, (byte) 0x3c, (byte) 0x88, (byte) 0xcc, (byte) 0x80, (byte) 0xf9,
|
||||
(byte) 0xdb, (byte) 0xa8, (byte) 0x4d, (byte) 0x86, (byte) 0x47, (byte) 0xc8,
|
||||
(byte) 0xbf, (byte) 0x34, (byte) 0x2d, (byte) 0xda, (byte) 0xb6, (byte) 0x28,
|
||||
(byte) 0xf0, (byte) 0x1e, (byte) 0xd2, (byte) 0x46, (byte) 0x0d, (byte) 0x6f,
|
||||
(byte) 0x36, (byte) 0x8e, (byte) 0x84, (byte) 0xd8, (byte) 0xaf, (byte) 0xf7,
|
||||
(byte) 0x69, (byte) 0x23, (byte) 0x77, (byte) 0xfb, (byte) 0xc5, (byte) 0x04,
|
||||
(byte) 0x08, (byte) 0x18, (byte) 0xac, (byte) 0x85, (byte) 0x80, (byte) 0x87,
|
||||
(byte) 0x1c, (byte) 0xfe, (byte) 0x8e, (byte) 0x5d, (byte) 0x00, (byte) 0x7f,
|
||||
(byte) 0x5b, (byte) 0x33, (byte) 0xf5, (byte) 0xdf, (byte) 0x70, (byte) 0x81,
|
||||
(byte) 0xad, (byte) 0x81, (byte) 0xf4, (byte) 0x5a, (byte) 0x37, (byte) 0x8a,
|
||||
(byte) 0x79, (byte) 0x09, (byte) 0xc5, (byte) 0x55, (byte) 0xab, (byte) 0x58,
|
||||
(byte) 0x7c, (byte) 0x47, (byte) 0xca, (byte) 0xa5, (byte) 0x80, (byte) 0x49,
|
||||
(byte) 0x5f, (byte) 0x71, (byte) 0x83, (byte) 0xfb, (byte) 0x3b, (byte) 0x06,
|
||||
(byte) 0xec, (byte) 0x75, (byte) 0x23, (byte) 0xc4, (byte) 0x32, (byte) 0xc7,
|
||||
(byte) 0x18, (byte) 0xf6, (byte) 0x82, (byte) 0x95, (byte) 0x98, (byte) 0x39,
|
||||
(byte) 0xf7, (byte) 0x92, (byte) 0x31, (byte) 0xc0, (byte) 0x89, (byte) 0xba,
|
||||
(byte) 0xd4, (byte) 0xd4, (byte) 0x58, (byte) 0x4e, (byte) 0x38, (byte) 0x35,
|
||||
(byte) 0x10, (byte) 0xb9, (byte) 0xf1, (byte) 0x27, (byte) 0xdc, (byte) 0xff,
|
||||
(byte) 0xc7, (byte) 0xb2, (byte) 0xba, (byte) 0x1f, (byte) 0x27, (byte) 0xaf,
|
||||
(byte) 0x99, (byte) 0xd5, (byte) 0xb0, (byte) 0x39, (byte) 0xe7, (byte) 0x43,
|
||||
(byte) 0x88, (byte) 0xd3, (byte) 0xce, (byte) 0x38, (byte) 0xc2, (byte) 0x99,
|
||||
(byte) 0x43, (byte) 0xfc, (byte) 0x8a, (byte) 0xe3, (byte) 0x60, (byte) 0x0d,
|
||||
(byte) 0x0a, (byte) 0xb8, (byte) 0xc4, (byte) 0x29, (byte) 0xca, (byte) 0x0d,
|
||||
(byte) 0x30, (byte) 0xaf, (byte) 0xca, (byte) 0xd0, (byte) 0xaa, (byte) 0x67,
|
||||
(byte) 0xb1, (byte) 0xdd, (byte) 0xdb, (byte) 0x7a, (byte) 0x11, (byte) 0xad,
|
||||
(byte) 0xeb, (byte) 0x02, (byte) 0x81, (byte) 0xc0, (byte) 0x71, (byte) 0xb8,
|
||||
(byte) 0xcf, (byte) 0x72, (byte) 0x35, (byte) 0x67, (byte) 0xb5, (byte) 0x38,
|
||||
(byte) 0x8f, (byte) 0x16, (byte) 0xd3, (byte) 0x29, (byte) 0x82, (byte) 0x35,
|
||||
(byte) 0x21, (byte) 0xd4, (byte) 0x49, (byte) 0x20, (byte) 0x74, (byte) 0x2d,
|
||||
(byte) 0xc0, (byte) 0xa4, (byte) 0x44, (byte) 0xf5, (byte) 0xd8, (byte) 0xc9,
|
||||
(byte) 0xe9, (byte) 0x90, (byte) 0x1d, (byte) 0xde, (byte) 0x3a, (byte) 0xa6,
|
||||
(byte) 0xd7, (byte) 0xe5, (byte) 0xe8, (byte) 0x4e, (byte) 0x83, (byte) 0xd7,
|
||||
(byte) 0xe6, (byte) 0x2f, (byte) 0x92, (byte) 0x31, (byte) 0x21, (byte) 0x3f,
|
||||
(byte) 0xfa, (byte) 0xd2, (byte) 0x85, (byte) 0x92, (byte) 0x1f, (byte) 0xff,
|
||||
(byte) 0x61, (byte) 0x00, (byte) 0xf6, (byte) 0xda, (byte) 0x6e, (byte) 0xc6,
|
||||
(byte) 0x7f, (byte) 0x5a, (byte) 0x35, (byte) 0x79, (byte) 0xdc, (byte) 0xdc,
|
||||
(byte) 0xa3, (byte) 0x2e, (byte) 0x9f, (byte) 0x35, (byte) 0xd1, (byte) 0x5c,
|
||||
(byte) 0xda, (byte) 0xb9, (byte) 0xf7, (byte) 0x58, (byte) 0x7d, (byte) 0x4f,
|
||||
(byte) 0xb6, (byte) 0x13, (byte) 0xd7, (byte) 0x2c, (byte) 0x0a, (byte) 0xa8,
|
||||
(byte) 0x4d, (byte) 0xf2, (byte) 0xe4, (byte) 0x67, (byte) 0x4f, (byte) 0x8b,
|
||||
(byte) 0xa6, (byte) 0xca, (byte) 0x1a, (byte) 0xbb, (byte) 0x02, (byte) 0x63,
|
||||
(byte) 0x8f, (byte) 0xb7, (byte) 0x46, (byte) 0xec, (byte) 0x7a, (byte) 0x8a,
|
||||
(byte) 0x09, (byte) 0x0a, (byte) 0x45, (byte) 0x3a, (byte) 0x8d, (byte) 0xa8,
|
||||
(byte) 0x83, (byte) 0x4b, (byte) 0x0a, (byte) 0xdb, (byte) 0x4b, (byte) 0x99,
|
||||
(byte) 0xf3, (byte) 0x69, (byte) 0x95, (byte) 0xf0, (byte) 0xcf, (byte) 0xe9,
|
||||
(byte) 0xf7, (byte) 0x67, (byte) 0xc9, (byte) 0x45, (byte) 0x18, (byte) 0x2f,
|
||||
(byte) 0xf0, (byte) 0x5c, (byte) 0x90, (byte) 0xbd, (byte) 0xa6, (byte) 0x66,
|
||||
(byte) 0x8c, (byte) 0xfe, (byte) 0x60, (byte) 0x5d, (byte) 0x6c, (byte) 0x27,
|
||||
(byte) 0xec, (byte) 0xc1, (byte) 0x84, (byte) 0xb2, (byte) 0xa1, (byte) 0x97,
|
||||
(byte) 0x9e, (byte) 0x16, (byte) 0x29, (byte) 0xa7, (byte) 0xe0, (byte) 0x38,
|
||||
(byte) 0xa2, (byte) 0x36, (byte) 0x05, (byte) 0x5f, (byte) 0xda, (byte) 0x72,
|
||||
(byte) 0x1a, (byte) 0x5f, (byte) 0xa8, (byte) 0x7d, (byte) 0x41, (byte) 0x35,
|
||||
(byte) 0xf6, (byte) 0x4e, (byte) 0x0a, (byte) 0x88, (byte) 0x8e, (byte) 0x00,
|
||||
(byte) 0x98, (byte) 0xa6, (byte) 0xca, (byte) 0xc1, (byte) 0xdf, (byte) 0x72,
|
||||
(byte) 0x6c, (byte) 0xfe, (byte) 0x29, (byte) 0xbe, (byte) 0xa3, (byte) 0x9b,
|
||||
(byte) 0x0b, (byte) 0x5c, (byte) 0x0b, (byte) 0x9d, (byte) 0xa7, (byte) 0x71,
|
||||
(byte) 0xce, (byte) 0x04, (byte) 0xfa, (byte) 0xac, (byte) 0x01, (byte) 0x8d,
|
||||
(byte) 0x52, (byte) 0xa0, (byte) 0x3d, (byte) 0xdd, (byte) 0x02, (byte) 0x81,
|
||||
(byte) 0xc1, (byte) 0x00, (byte) 0xc1, (byte) 0xc0, (byte) 0x2e, (byte) 0xa9,
|
||||
(byte) 0xee, (byte) 0xca, (byte) 0xff, (byte) 0xe4, (byte) 0xf8, (byte) 0x15,
|
||||
(byte) 0xfd, (byte) 0xa5, (byte) 0x68, (byte) 0x1b, (byte) 0x2d, (byte) 0x4a,
|
||||
(byte) 0xe6, (byte) 0x37, (byte) 0x06, (byte) 0xb3, (byte) 0xd7, (byte) 0x64,
|
||||
(byte) 0xad, (byte) 0xb9, (byte) 0x05, (byte) 0x26, (byte) 0x97, (byte) 0x94,
|
||||
(byte) 0x3a, (byte) 0x9e, (byte) 0x1c, (byte) 0xd0, (byte) 0xcd, (byte) 0x7b,
|
||||
(byte) 0xf4, (byte) 0x88, (byte) 0xe2, (byte) 0xa5, (byte) 0x6d, (byte) 0xed,
|
||||
(byte) 0x24, (byte) 0x77, (byte) 0x52, (byte) 0x39, (byte) 0x43, (byte) 0x0f,
|
||||
(byte) 0x4e, (byte) 0x75, (byte) 0xd8, (byte) 0xa3, (byte) 0x59, (byte) 0x5a,
|
||||
(byte) 0xc2, (byte) 0xba, (byte) 0x9a, (byte) 0x5b, (byte) 0x60, (byte) 0x31,
|
||||
(byte) 0x0d, (byte) 0x58, (byte) 0x89, (byte) 0x13, (byte) 0xe8, (byte) 0x95,
|
||||
(byte) 0xdd, (byte) 0xae, (byte) 0xcc, (byte) 0x1f, (byte) 0x73, (byte) 0x48,
|
||||
(byte) 0x55, (byte) 0xd8, (byte) 0xfb, (byte) 0x67, (byte) 0xce, (byte) 0x18,
|
||||
(byte) 0x85, (byte) 0x59, (byte) 0xad, (byte) 0x1f, (byte) 0x93, (byte) 0xe1,
|
||||
(byte) 0xb7, (byte) 0x54, (byte) 0x80, (byte) 0x8e, (byte) 0x5f, (byte) 0xbc,
|
||||
(byte) 0x1c, (byte) 0x96, (byte) 0x66, (byte) 0x2e, (byte) 0x40, (byte) 0x17,
|
||||
(byte) 0x2e, (byte) 0x01, (byte) 0x7a, (byte) 0x7d, (byte) 0xaa, (byte) 0xff,
|
||||
(byte) 0xa3, (byte) 0xd2, (byte) 0xdf, (byte) 0xe2, (byte) 0xf3, (byte) 0x54,
|
||||
(byte) 0x51, (byte) 0xeb, (byte) 0xba, (byte) 0x7c, (byte) 0x2a, (byte) 0x22,
|
||||
(byte) 0xc6, (byte) 0x42, (byte) 0xbc, (byte) 0xa1, (byte) 0x6c, (byte) 0xcf,
|
||||
(byte) 0x73, (byte) 0x2e, (byte) 0x07, (byte) 0xfc, (byte) 0xf5, (byte) 0x67,
|
||||
(byte) 0x25, (byte) 0xd0, (byte) 0xfa, (byte) 0xeb, (byte) 0xb4, (byte) 0xd4,
|
||||
(byte) 0x19, (byte) 0xcc, (byte) 0x64, (byte) 0xa1, (byte) 0x2e, (byte) 0x78,
|
||||
(byte) 0x45, (byte) 0xd9, (byte) 0x7f, (byte) 0x1b, (byte) 0x4c, (byte) 0x10,
|
||||
(byte) 0x31, (byte) 0x44, (byte) 0xe8, (byte) 0xcc, (byte) 0xf9, (byte) 0x1b,
|
||||
(byte) 0x87, (byte) 0x31, (byte) 0xd6, (byte) 0x69, (byte) 0x85, (byte) 0x4a,
|
||||
(byte) 0x49, (byte) 0xf6, (byte) 0xb2, (byte) 0xe0, (byte) 0xb8, (byte) 0x98,
|
||||
(byte) 0x3c, (byte) 0xf6, (byte) 0x78, (byte) 0x46, (byte) 0xc8, (byte) 0x3d,
|
||||
(byte) 0x60, (byte) 0xc1, (byte) 0xaa, (byte) 0x2f, (byte) 0x28, (byte) 0xa1,
|
||||
(byte) 0x14, (byte) 0x6b, (byte) 0x75, (byte) 0x4d, (byte) 0xb1, (byte) 0x3d,
|
||||
(byte) 0x80, (byte) 0x49, (byte) 0x33, (byte) 0xfd, (byte) 0x71, (byte) 0xc0,
|
||||
(byte) 0x13, (byte) 0x1e, (byte) 0x16, (byte) 0x69, (byte) 0x80, (byte) 0xa4,
|
||||
(byte) 0x9c, (byte) 0xd7, (byte) 0x02, (byte) 0x81, (byte) 0xc1, (byte) 0x00,
|
||||
(byte) 0x8c, (byte) 0x33, (byte) 0x2d, (byte) 0xd9, (byte) 0xf3, (byte) 0x42,
|
||||
(byte) 0x4d, (byte) 0xca, (byte) 0x5e, (byte) 0x60, (byte) 0x14, (byte) 0x10,
|
||||
(byte) 0xf6, (byte) 0xf3, (byte) 0x71, (byte) 0x15, (byte) 0x88, (byte) 0x54,
|
||||
(byte) 0x84, (byte) 0x21, (byte) 0x04, (byte) 0xb1, (byte) 0xaf, (byte) 0x02,
|
||||
(byte) 0x11, (byte) 0x7f, (byte) 0x42, (byte) 0x3e, (byte) 0x86, (byte) 0xcb,
|
||||
(byte) 0x6c, (byte) 0xf5, (byte) 0x57, (byte) 0x78, (byte) 0x4a, (byte) 0x03,
|
||||
(byte) 0x9b, (byte) 0x80, (byte) 0xc2, (byte) 0x04, (byte) 0x3a, (byte) 0x6b,
|
||||
(byte) 0xb3, (byte) 0x30, (byte) 0x31, (byte) 0x7e, (byte) 0xc3, (byte) 0x89,
|
||||
(byte) 0x09, (byte) 0x4e, (byte) 0x86, (byte) 0x59, (byte) 0x41, (byte) 0xb5,
|
||||
(byte) 0xae, (byte) 0xd5, (byte) 0xc6, (byte) 0x38, (byte) 0xbc, (byte) 0xd7,
|
||||
(byte) 0xd7, (byte) 0x8e, (byte) 0xa3, (byte) 0x1a, (byte) 0xde, (byte) 0x32,
|
||||
(byte) 0xad, (byte) 0x8d, (byte) 0x15, (byte) 0x81, (byte) 0xfe, (byte) 0xac,
|
||||
(byte) 0xbd, (byte) 0xd0, (byte) 0xca, (byte) 0xbc, (byte) 0xd8, (byte) 0x6a,
|
||||
(byte) 0xe1, (byte) 0xfe, (byte) 0xda, (byte) 0xc4, (byte) 0xd8, (byte) 0x62,
|
||||
(byte) 0x71, (byte) 0x20, (byte) 0xa3, (byte) 0xd3, (byte) 0x06, (byte) 0x11,
|
||||
(byte) 0xa9, (byte) 0x53, (byte) 0x7a, (byte) 0x44, (byte) 0x89, (byte) 0x3d,
|
||||
(byte) 0x28, (byte) 0x5e, (byte) 0x7d, (byte) 0xf0, (byte) 0x60, (byte) 0xeb,
|
||||
(byte) 0xb5, (byte) 0xdf, (byte) 0xed, (byte) 0x4f, (byte) 0x6d, (byte) 0x05,
|
||||
(byte) 0x59, (byte) 0x06, (byte) 0xb0, (byte) 0x62, (byte) 0x50, (byte) 0x1c,
|
||||
(byte) 0xb7, (byte) 0x2c, (byte) 0x44, (byte) 0xa4, (byte) 0x49, (byte) 0xf8,
|
||||
(byte) 0x4f, (byte) 0x4b, (byte) 0xab, (byte) 0x71, (byte) 0x5b, (byte) 0xcb,
|
||||
(byte) 0x31, (byte) 0x10, (byte) 0x41, (byte) 0xe0, (byte) 0x1a, (byte) 0x15,
|
||||
(byte) 0xdc, (byte) 0x4c, (byte) 0x5d, (byte) 0x4f, (byte) 0x62, (byte) 0x83,
|
||||
(byte) 0xa4, (byte) 0x80, (byte) 0x06, (byte) 0x36, (byte) 0xba, (byte) 0xc9,
|
||||
(byte) 0xe2, (byte) 0xa4, (byte) 0x11, (byte) 0x98, (byte) 0x6b, (byte) 0x4c,
|
||||
(byte) 0xe9, (byte) 0x90, (byte) 0x55, (byte) 0x18, (byte) 0xde, (byte) 0xe1,
|
||||
(byte) 0x42, (byte) 0x38, (byte) 0x28, (byte) 0xa3, (byte) 0x54, (byte) 0x56,
|
||||
(byte) 0x31, (byte) 0xaf, (byte) 0x5a, (byte) 0xd6, (byte) 0xf0, (byte) 0x26,
|
||||
(byte) 0xe0, (byte) 0x7a, (byte) 0xd9, (byte) 0x6c, (byte) 0x64, (byte) 0xca,
|
||||
(byte) 0x5d, (byte) 0x6d, (byte) 0x3d, (byte) 0x9a, (byte) 0xfe, (byte) 0x36,
|
||||
(byte) 0x93, (byte) 0x9e, (byte) 0x62, (byte) 0x94, (byte) 0xc6, (byte) 0x07,
|
||||
(byte) 0x83, (byte) 0x96, (byte) 0xd6, (byte) 0x27, (byte) 0xa6, (byte) 0xd8
|
||||
};
|
||||
public static final PrivateKey CLIENT_SUITE_B_RSA3072_KEY =
|
||||
loadPrivateKey("RSA", CLIENT_SUITE_B_RSA3072_KEY_DATA);
|
||||
|
||||
private static final String CLIENT_SUITE_B_ECDSA_CERT_STRING =
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIB9zCCAX4CFDpfSZh3AH07BEfGWuMDa7Ynz6y+MAoGCCqGSM49BAMDMF4xCzAJ\n"
|
||||
+ "BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDTVRWMRAwDgYDVQQKDAdB\n"
|
||||
+ "bmRyb2lkMQ4wDAYDVQQLDAVXaS1GaTESMBAGA1UEAwwJdW5pdGVzdENBMB4XDTIw\n"
|
||||
+ "MDcyMTAyMjk1MFoXDTMwMDUzMDAyMjk1MFowYjELMAkGA1UEBhMCVVMxCzAJBgNV\n"
|
||||
+ "BAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNVBAoMB0FuZHJvaWQxDjAMBgNVBAsM\n"
|
||||
+ "BVdpLUZpMRYwFAYDVQQDDA11bml0ZXN0Q2xpZW50MHYwEAYHKoZIzj0CAQYFK4EE\n"
|
||||
+ "ACIDYgAEhxhVJ7dcSqrto0X+dgRxtd8BWG8cWmPjBji3MIxDLfpcMDoIB84ae1Ew\n"
|
||||
+ "gJn4YUYHrWsUDiVNihv8j7a/Ol1qcIY2ybH7tbezefLmagqA4vXEUXZXoUyL4ZNC\n"
|
||||
+ "DWcdw6LrMAoGCCqGSM49BAMDA2cAMGQCMH4aP73HrriRUJRguiuRic+X4Cqj/7YQ\n"
|
||||
+ "ueJmP87KF92/thhoQ9OrRo8uJITPmNDswwIwP2Q1AZCSL4BI9dYrqu07Ar+pSkXE\n"
|
||||
+ "R7oOqGdZR+d/MvXcFSrbIaLKEoHXmQamIHLe\n"
|
||||
+ "-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CLIENT_SUITE_B_ECDSA_CERT =
|
||||
loadCertificate(CLIENT_SUITE_B_ECDSA_CERT_STRING);
|
||||
|
||||
private static final byte[] CLIENT_SUITE_B_ECC_KEY_DATA = new byte[]{
|
||||
(byte) 0x30, (byte) 0x81, (byte) 0xb6, (byte) 0x02, (byte) 0x01, (byte) 0x00,
|
||||
(byte) 0x30, (byte) 0x10, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
|
||||
(byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
|
||||
(byte) 0x05, (byte) 0x2b, (byte) 0x81, (byte) 0x04, (byte) 0x00, (byte) 0x22,
|
||||
(byte) 0x04, (byte) 0x81, (byte) 0x9e, (byte) 0x30, (byte) 0x81, (byte) 0x9b,
|
||||
(byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x30, (byte) 0xea,
|
||||
(byte) 0x6c, (byte) 0x4b, (byte) 0x6d, (byte) 0x43, (byte) 0xf9, (byte) 0x6c,
|
||||
(byte) 0x91, (byte) 0xdc, (byte) 0x2d, (byte) 0x6e, (byte) 0x87, (byte) 0x4f,
|
||||
(byte) 0x0a, (byte) 0x0b, (byte) 0x97, (byte) 0x25, (byte) 0x1c, (byte) 0x79,
|
||||
(byte) 0xa2, (byte) 0x07, (byte) 0xdc, (byte) 0x94, (byte) 0xc2, (byte) 0xee,
|
||||
(byte) 0x64, (byte) 0x51, (byte) 0x6d, (byte) 0x4e, (byte) 0x35, (byte) 0x1c,
|
||||
(byte) 0x22, (byte) 0x2f, (byte) 0xc0, (byte) 0xea, (byte) 0x09, (byte) 0x47,
|
||||
(byte) 0x3e, (byte) 0xb9, (byte) 0xb6, (byte) 0xb8, (byte) 0x83, (byte) 0x9e,
|
||||
(byte) 0xed, (byte) 0x59, (byte) 0xe5, (byte) 0xe7, (byte) 0x0f, (byte) 0xa1,
|
||||
(byte) 0x64, (byte) 0x03, (byte) 0x62, (byte) 0x00, (byte) 0x04, (byte) 0x87,
|
||||
(byte) 0x18, (byte) 0x55, (byte) 0x27, (byte) 0xb7, (byte) 0x5c, (byte) 0x4a,
|
||||
(byte) 0xaa, (byte) 0xed, (byte) 0xa3, (byte) 0x45, (byte) 0xfe, (byte) 0x76,
|
||||
(byte) 0x04, (byte) 0x71, (byte) 0xb5, (byte) 0xdf, (byte) 0x01, (byte) 0x58,
|
||||
(byte) 0x6f, (byte) 0x1c, (byte) 0x5a, (byte) 0x63, (byte) 0xe3, (byte) 0x06,
|
||||
(byte) 0x38, (byte) 0xb7, (byte) 0x30, (byte) 0x8c, (byte) 0x43, (byte) 0x2d,
|
||||
(byte) 0xfa, (byte) 0x5c, (byte) 0x30, (byte) 0x3a, (byte) 0x08, (byte) 0x07,
|
||||
(byte) 0xce, (byte) 0x1a, (byte) 0x7b, (byte) 0x51, (byte) 0x30, (byte) 0x80,
|
||||
(byte) 0x99, (byte) 0xf8, (byte) 0x61, (byte) 0x46, (byte) 0x07, (byte) 0xad,
|
||||
(byte) 0x6b, (byte) 0x14, (byte) 0x0e, (byte) 0x25, (byte) 0x4d, (byte) 0x8a,
|
||||
(byte) 0x1b, (byte) 0xfc, (byte) 0x8f, (byte) 0xb6, (byte) 0xbf, (byte) 0x3a,
|
||||
(byte) 0x5d, (byte) 0x6a, (byte) 0x70, (byte) 0x86, (byte) 0x36, (byte) 0xc9,
|
||||
(byte) 0xb1, (byte) 0xfb, (byte) 0xb5, (byte) 0xb7, (byte) 0xb3, (byte) 0x79,
|
||||
(byte) 0xf2, (byte) 0xe6, (byte) 0x6a, (byte) 0x0a, (byte) 0x80, (byte) 0xe2,
|
||||
(byte) 0xf5, (byte) 0xc4, (byte) 0x51, (byte) 0x76, (byte) 0x57, (byte) 0xa1,
|
||||
(byte) 0x4c, (byte) 0x8b, (byte) 0xe1, (byte) 0x93, (byte) 0x42, (byte) 0x0d,
|
||||
(byte) 0x67, (byte) 0x1d, (byte) 0xc3, (byte) 0xa2, (byte) 0xeb
|
||||
};
|
||||
public static final PrivateKey CLIENT_SUITE_B_ECC_KEY =
|
||||
loadPrivateKey("EC", CLIENT_SUITE_B_ECC_KEY_DATA);
|
||||
|
||||
private static X509Certificate loadCertificate(String blob) {
|
||||
try {
|
||||
final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
|
||||
@@ -255,9 +662,9 @@ public class FakeKeys {
|
||||
}
|
||||
}
|
||||
|
||||
private static PrivateKey loadPrivateRSAKey(byte[] fakeKey) {
|
||||
private static PrivateKey loadPrivateKey(String algorithm, byte[] fakeKey) {
|
||||
try {
|
||||
KeyFactory kf = KeyFactory.getInstance("RSA");
|
||||
KeyFactory kf = KeyFactory.getInstance(algorithm);
|
||||
return kf.generatePrivate(new PKCS8EncodedKeySpec(fakeKey));
|
||||
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
|
||||
return null;
|
||||
|
||||
@@ -22,6 +22,8 @@ import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import android.net.MacAddress;
|
||||
@@ -35,6 +37,8 @@ import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link android.net.wifi.WifiNetworkSpecifier}.
|
||||
*/
|
||||
@@ -45,6 +49,7 @@ public class WifiNetworkSpecifierTest {
|
||||
private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00";
|
||||
private static final String TEST_BSSID = "12:12:12:12:12:12";
|
||||
private static final String TEST_PRESHARED_KEY = "\"Test123\"";
|
||||
private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch";
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSpecifier object created by
|
||||
@@ -135,6 +140,106 @@ public class WifiNetworkSpecifierTest {
|
||||
wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getPhase2Method());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSuggestion object created by
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise network.
|
||||
*/
|
||||
@Test
|
||||
public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
|
||||
enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
|
||||
enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
|
||||
|
||||
NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
|
||||
.setSsid(TEST_SSID)
|
||||
.setWpa3EnterpriseConfig(enterpriseConfig)
|
||||
.build();
|
||||
|
||||
assertTrue(specifier instanceof WifiNetworkSpecifier);
|
||||
WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
|
||||
|
||||
assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.IEEE8021X));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.WPA_EAP));
|
||||
assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
|
||||
.get(WifiConfiguration.GroupCipher.CCMP));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
|
||||
assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
|
||||
assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSuggestion object created by
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network.
|
||||
*/
|
||||
@Test
|
||||
public void testWifiNetworkSuggestionBuilderForWpa3SuiteBRsaEapNetwork() {
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
|
||||
enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
|
||||
enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
|
||||
new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
|
||||
|
||||
enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
|
||||
|
||||
NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
|
||||
.setSsid(TEST_SSID)
|
||||
.setWpa3EnterpriseConfig(enterpriseConfig)
|
||||
.build();
|
||||
|
||||
assertTrue(specifier instanceof WifiNetworkSpecifier);
|
||||
WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
|
||||
|
||||
assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
|
||||
.get(WifiConfiguration.GroupCipher.GCMP_256));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
|
||||
.get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
|
||||
assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
|
||||
assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSuggestion object created by
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network.
|
||||
*/
|
||||
@Test
|
||||
public void testWifiNetworkSuggestionBuilderForWpa3SuiteBEccEapNetwork() {
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
|
||||
enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
|
||||
enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
|
||||
new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
|
||||
|
||||
enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
|
||||
|
||||
NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
|
||||
.setSsid(TEST_SSID)
|
||||
.setWpa3EnterpriseConfig(enterpriseConfig)
|
||||
.build();
|
||||
|
||||
assertTrue(specifier instanceof WifiNetworkSpecifier);
|
||||
WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
|
||||
|
||||
assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
|
||||
.get(WifiConfiguration.GroupCipher.GCMP_256));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
|
||||
.get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
|
||||
assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
|
||||
assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
|
||||
assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure {@link WifiNetworkSpecifier.Builder#setSsid(String)} throws an exception
|
||||
|
||||
@@ -32,6 +32,8 @@ import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link android.net.wifi.WifiNetworkSuggestion}.
|
||||
*/
|
||||
@@ -212,19 +214,89 @@ public class WifiNetworkSuggestionTest {
|
||||
assertNull(suggestion.getEnterpriseConfig());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSuggestion object created by
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for SuiteB network.
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise network.
|
||||
*/
|
||||
@Test
|
||||
public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
|
||||
enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
|
||||
enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
|
||||
enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
|
||||
|
||||
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
|
||||
.setSsid(TEST_SSID)
|
||||
.setWpa3EnterpriseConfig(enterpriseConfig)
|
||||
.build();
|
||||
|
||||
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
|
||||
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.IEEE8021X));
|
||||
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.WPA_EAP));
|
||||
assertFalse(suggestion.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
|
||||
assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
|
||||
.get(WifiConfiguration.GroupCipher.CCMP));
|
||||
assertTrue(suggestion.wifiConfiguration.requirePmf);
|
||||
assertNull(suggestion.wifiConfiguration.preSharedKey);
|
||||
// allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested
|
||||
// here.
|
||||
assertTrue(suggestion.isUserAllowedToManuallyConnect);
|
||||
assertTrue(suggestion.isInitialAutoJoinEnabled);
|
||||
assertNotNull(suggestion.getEnterpriseConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSuggestion object created by
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network.
|
||||
*/
|
||||
@Test
|
||||
public void testWifiNetworkSuggestionBuilderForWpa3SuiteBRsaEapNetwork() {
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
|
||||
enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
|
||||
enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
|
||||
new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
|
||||
|
||||
enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
|
||||
|
||||
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
|
||||
.setSsid(TEST_SSID)
|
||||
.setWpa3EnterpriseConfig(enterpriseConfig)
|
||||
.build();
|
||||
|
||||
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
|
||||
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
|
||||
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
|
||||
assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
|
||||
.get(WifiConfiguration.GroupCipher.GCMP_256));
|
||||
assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
|
||||
.get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
|
||||
assertTrue(suggestion.wifiConfiguration.requirePmf);
|
||||
assertNull(suggestion.wifiConfiguration.preSharedKey);
|
||||
// allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested
|
||||
// here.
|
||||
assertTrue(suggestion.isUserAllowedToManuallyConnect);
|
||||
assertTrue(suggestion.isInitialAutoJoinEnabled);
|
||||
assertNotNull(suggestion.getEnterpriseConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate correctness of WifiNetworkSuggestion object created by
|
||||
* {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network.
|
||||
*/
|
||||
@Test
|
||||
public void testWifiNetworkSuggestionBuilderForWpa3SuiteBEccEapNetwork() {
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
|
||||
enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
|
||||
enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
|
||||
new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
|
||||
|
||||
enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
|
||||
|
||||
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
|
||||
.setSsid(TEST_SSID)
|
||||
.setWpa3EnterpriseConfig(enterpriseConfig)
|
||||
|
||||
Reference in New Issue
Block a user