Cleanup commit to remove @SkipPresubmit and fix nits am: 74ded77039

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/14991452

Change-Id: I342d1bbdd1f2a654a98d454f71a5e5e9654dba95
This commit is contained in:
Lorenzo Colitti
2021-06-16 12:00:03 +00:00
committed by Automerger Merge Worker
3 changed files with 35 additions and 49 deletions

View File

@@ -86,7 +86,7 @@ public class IpSecAlgorithmImplTest extends IpSecBaseTest {
InetAddress.parseNumericAddress("2001:db8:1::2"); InetAddress.parseNumericAddress("2001:db8:1::2");
private static final int REMOTE_PORT = 12345; private static final int REMOTE_PORT = 12345;
private static final IpSecManager IPSEC_MANAGER = private static final IpSecManager sIpSecManager =
InstrumentationRegistry.getContext().getSystemService(IpSecManager.class); InstrumentationRegistry.getContext().getSystemService(IpSecManager.class);
private static class CheckCryptoImplTest implements TestNetworkRunnable.Test { private static class CheckCryptoImplTest implements TestNetworkRunnable.Test {
@@ -96,7 +96,7 @@ public class IpSecAlgorithmImplTest extends IpSecBaseTest {
private final EspCipher mEspCipher; private final EspCipher mEspCipher;
private final EspAuth mEspAuth; private final EspAuth mEspAuth;
public CheckCryptoImplTest( CheckCryptoImplTest(
IpSecAlgorithm ipsecEncryptAlgo, IpSecAlgorithm ipsecEncryptAlgo,
IpSecAlgorithm ipsecAuthAlgo, IpSecAlgorithm ipsecAuthAlgo,
IpSecAlgorithm ipsecAeadAlgo, IpSecAlgorithm ipsecAeadAlgo,
@@ -149,19 +149,19 @@ public class IpSecAlgorithmImplTest extends IpSecBaseTest {
} }
} }
try (final IpSecManager.SecurityParameterIndex outSpi = try (IpSecManager.SecurityParameterIndex outSpi =
IPSEC_MANAGER.allocateSecurityParameterIndex(REMOTE_ADDRESS); sIpSecManager.allocateSecurityParameterIndex(REMOTE_ADDRESS);
final IpSecManager.SecurityParameterIndex inSpi = IpSecManager.SecurityParameterIndex inSpi =
IPSEC_MANAGER.allocateSecurityParameterIndex(LOCAL_ADDRESS); sIpSecManager.allocateSecurityParameterIndex(LOCAL_ADDRESS);
final IpSecTransform outTransform = IpSecTransform outTransform =
transformBuilder.buildTransportModeTransform(LOCAL_ADDRESS, outSpi); transformBuilder.buildTransportModeTransform(LOCAL_ADDRESS, outSpi);
final IpSecTransform inTransform = IpSecTransform inTransform =
transformBuilder.buildTransportModeTransform(REMOTE_ADDRESS, inSpi); transformBuilder.buildTransportModeTransform(REMOTE_ADDRESS, inSpi);
// Bind localSocket to a random available port. // Bind localSocket to a random available port.
final DatagramSocket localSocket = new DatagramSocket(0)) { DatagramSocket localSocket = new DatagramSocket(0)) {
IPSEC_MANAGER.applyTransportModeTransform( sIpSecManager.applyTransportModeTransform(
localSocket, IpSecManager.DIRECTION_IN, inTransform); localSocket, IpSecManager.DIRECTION_IN, inTransform);
IPSEC_MANAGER.applyTransportModeTransform( sIpSecManager.applyTransportModeTransform(
localSocket, IpSecManager.DIRECTION_OUT, outTransform); localSocket, IpSecManager.DIRECTION_OUT, outTransform);
// Send ESP packet // Send ESP packet
@@ -174,7 +174,7 @@ public class IpSecAlgorithmImplTest extends IpSecBaseTest {
tunUtils.awaitEspPacket(outSpi.getSpi(), false /* useEncap */); tunUtils.awaitEspPacket(outSpi.getSpi(), false /* useEncap */);
// Remove transform for good hygiene // Remove transform for good hygiene
IPSEC_MANAGER.removeTransportModeTransforms(localSocket); sIpSecManager.removeTransportModeTransforms(localSocket);
// Get the kernel-generated ESP payload // Get the kernel-generated ESP payload
final byte[] outEspPayload = new byte[outEspPacket.length - IP6_HDRLEN]; final byte[] outEspPayload = new byte[outEspPacket.length - IP6_HDRLEN];

View File

@@ -74,7 +74,6 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.testutils.DevSdkIgnoreRule; import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import com.android.testutils.SkipPresubmit;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@@ -771,7 +770,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcHmacMd5Tcp6() throws Exception { public void testAesCbcHmacMd5Tcp6() throws Exception {
IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY); IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96); IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
@@ -804,7 +802,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcHmacSha1Tcp6() throws Exception { public void testAesCbcHmacSha1Tcp6() throws Exception {
IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY); IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96); IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
@@ -837,7 +834,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcHmacSha256Tcp6() throws Exception { public void testAesCbcHmacSha256Tcp6() throws Exception {
IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY); IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128); IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
@@ -870,7 +866,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcHmacSha384Tcp6() throws Exception { public void testAesCbcHmacSha384Tcp6() throws Exception {
IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY); IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192); IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
@@ -903,7 +898,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcHmacSha512Tcp6() throws Exception { public void testAesCbcHmacSha512Tcp6() throws Exception {
IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY); IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256); IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
@@ -947,7 +941,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCtrHmacSha512Tcp6() throws Exception { public void testAesCtrHmacSha512Tcp6() throws Exception {
assumeTrue(hasIpSecAlgorithm(CRYPT_AES_CTR)); assumeTrue(hasIpSecAlgorithm(CRYPT_AES_CTR));
@@ -1002,7 +995,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcAesXCbcTcp6() throws Exception { public void testAesCbcAesXCbcTcp6() throws Exception {
assumeTrue(hasIpSecAlgorithm(AUTH_AES_XCBC)); assumeTrue(hasIpSecAlgorithm(AUTH_AES_XCBC));
@@ -1043,7 +1035,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesCbcAesCmacTcp6() throws Exception { public void testAesCbcAesCmacTcp6() throws Exception {
assumeTrue(hasIpSecAlgorithm(AUTH_AES_CMAC)); assumeTrue(hasIpSecAlgorithm(AUTH_AES_CMAC));
@@ -1082,7 +1073,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesGcm64Tcp6() throws Exception { public void testAesGcm64Tcp6() throws Exception {
IpSecAlgorithm authCrypt = IpSecAlgorithm authCrypt =
new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64); new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
@@ -1115,7 +1105,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesGcm96Tcp6() throws Exception { public void testAesGcm96Tcp6() throws Exception {
IpSecAlgorithm authCrypt = IpSecAlgorithm authCrypt =
new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96); new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
@@ -1148,7 +1137,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAesGcm128Tcp6() throws Exception { public void testAesGcm128Tcp6() throws Exception {
IpSecAlgorithm authCrypt = IpSecAlgorithm authCrypt =
new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128); new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
@@ -1187,7 +1175,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testChaCha20Poly1305Tcp6() throws Exception { public void testChaCha20Poly1305Tcp6() throws Exception {
assumeTrue(hasIpSecAlgorithm(AUTH_CRYPT_CHACHA20_POLY1305)); assumeTrue(hasIpSecAlgorithm(AUTH_CRYPT_CHACHA20_POLY1305));
@@ -1463,7 +1450,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testCryptTcp6() throws Exception { public void testCryptTcp6() throws Exception {
IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY); IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, null, null, false, 1, false); checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, null, null, false, 1, false);
@@ -1471,7 +1457,6 @@ public class IpSecManagerTest extends IpSecBaseTest {
} }
@Test @Test
@SkipPresubmit(reason = "b/186608065 - kernel 5.10 regression in TrafficStats with ipsec")
public void testAuthTcp6() throws Exception { public void testAuthTcp6() throws Exception {
IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128); IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, auth, null, false, 1, false); checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, auth, null, false, 1, false);

View File

@@ -19,6 +19,8 @@ package android.net.cts;
import static android.system.OsConstants.IPPROTO_IPV6; import static android.system.OsConstants.IPPROTO_IPV6;
import static android.system.OsConstants.IPPROTO_UDP; import static android.system.OsConstants.IPPROTO_UDP;
import android.util.ArraySet;
import com.android.internal.net.ipsec.ike.crypto.AesXCbcImpl; import com.android.internal.net.ipsec.ike.crypto.AesXCbcImpl;
import java.net.Inet4Address; import java.net.Inet4Address;
@@ -29,7 +31,6 @@ import java.nio.ShortBuffer;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Set; import java.util.Set;
import javax.crypto.Cipher; import javax.crypto.Cipher;
@@ -502,7 +503,7 @@ public class PacketUtils {
public final byte[] key; public final byte[] key;
public final int ivLen; public final int ivLen;
public final int saltLen; public final int saltLen;
protected byte[] iv; protected byte[] mIv;
public EspCipher(String algoName, int blockSize, byte[] key, int ivLen, int saltLen) { public EspCipher(String algoName, int blockSize, byte[] key, int ivLen, int saltLen) {
this.algoName = algoName; this.algoName = algoName;
@@ -510,11 +511,11 @@ public class PacketUtils {
this.key = key; this.key = key;
this.ivLen = ivLen; this.ivLen = ivLen;
this.saltLen = saltLen; this.saltLen = saltLen;
this.iv = getIv(ivLen); this.mIv = getIv(ivLen);
} }
public void updateIv(byte[] iv) { public void updateIv(byte[] iv) {
this.iv = iv; this.mIv = iv;
} }
public static byte[] getPaddedPayload(int nextHeader, byte[] payload, int blockSize) { public static byte[] getPaddedPayload(int nextHeader, byte[] payload, int blockSize) {
@@ -545,19 +546,19 @@ public class PacketUtils {
throws GeneralSecurityException; throws GeneralSecurityException;
} }
public static class EspCipherNull extends EspCipher { public static final class EspCipherNull extends EspCipher {
private static final String CRYPT_NULL = "CRYPT_NULL"; private static final String CRYPT_NULL = "CRYPT_NULL";
private static final int IV_LEN_UNUSED = 0; private static final int IV_LEN_UNUSED = 0;
private static final byte[] KEY_UNUSED = new byte[0]; private static final byte[] KEY_UNUSED = new byte[0];
private static final EspCipherNull INSTANCE = new EspCipherNull(); private static final EspCipherNull sInstance = new EspCipherNull();
private EspCipherNull() { private EspCipherNull() {
super(CRYPT_NULL, ESP_BLK_SIZE, KEY_UNUSED, IV_LEN_UNUSED, SALT_LEN_UNUSED); super(CRYPT_NULL, ESP_BLK_SIZE, KEY_UNUSED, IV_LEN_UNUSED, SALT_LEN_UNUSED);
} }
public static EspCipherNull getInstance() { public static EspCipherNull getInstance() {
return INSTANCE; return sInstance;
} }
@Override @Override
@@ -567,7 +568,7 @@ public class PacketUtils {
} }
} }
public static class EspCryptCipher extends EspCipher { public static final class EspCryptCipher extends EspCipher {
public EspCryptCipher(String algoName, int blockSize, byte[] key, int ivLen) { public EspCryptCipher(String algoName, int blockSize, byte[] key, int ivLen) {
this(algoName, blockSize, key, ivLen, SALT_LEN_UNUSED); this(algoName, blockSize, key, ivLen, SALT_LEN_UNUSED);
} }
@@ -583,7 +584,7 @@ public class PacketUtils {
final SecretKeySpec secretKeySpec; final SecretKeySpec secretKeySpec;
if (AES_CBC.equals(algoName)) { if (AES_CBC.equals(algoName)) {
ivParameterSpec = new IvParameterSpec(iv); ivParameterSpec = new IvParameterSpec(mIv);
secretKeySpec = new SecretKeySpec(key, algoName); secretKeySpec = new SecretKeySpec(key, algoName);
} else if (AES_CTR.equals(algoName)) { } else if (AES_CTR.equals(algoName)) {
// Provided key consists of encryption/decryption key plus 4-byte salt. Salt is used // Provided key consists of encryption/decryption key plus 4-byte salt. Salt is used
@@ -593,9 +594,9 @@ public class PacketUtils {
secretKeySpec = new SecretKeySpec(secretKey, algoName); secretKeySpec = new SecretKeySpec(secretKey, algoName);
final ByteBuffer ivParameterBuffer = final ByteBuffer ivParameterBuffer =
ByteBuffer.allocate(iv.length + saltLen + AES_CTR_INITIAL_COUNTER.length); ByteBuffer.allocate(mIv.length + saltLen + AES_CTR_INITIAL_COUNTER.length);
ivParameterBuffer.put(salt); ivParameterBuffer.put(salt);
ivParameterBuffer.put(iv); ivParameterBuffer.put(mIv);
ivParameterBuffer.put(AES_CTR_INITIAL_COUNTER); ivParameterBuffer.put(AES_CTR_INITIAL_COUNTER);
ivParameterSpec = new IvParameterSpec(ivParameterBuffer.array()); ivParameterSpec = new IvParameterSpec(ivParameterBuffer.array());
} else { } else {
@@ -609,15 +610,15 @@ public class PacketUtils {
cipher.doFinal(getPaddedPayload(nextHeader, payload, blockSize)); cipher.doFinal(getPaddedPayload(nextHeader, payload, blockSize));
// Build ciphertext // Build ciphertext
final ByteBuffer cipherText = ByteBuffer.allocate(iv.length + encrypted.length); final ByteBuffer cipherText = ByteBuffer.allocate(mIv.length + encrypted.length);
cipherText.put(iv); cipherText.put(mIv);
cipherText.put(encrypted); cipherText.put(encrypted);
return getByteArrayFromBuffer(cipherText); return getByteArrayFromBuffer(cipherText);
} }
} }
public static class EspAeadCipher extends EspCipher { public static final class EspAeadCipher extends EspCipher {
public final int icvLen; public final int icvLen;
public EspAeadCipher( public EspAeadCipher(
@@ -636,9 +637,9 @@ public class PacketUtils {
final SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, algoName); final SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, algoName);
final ByteBuffer ivParameterBuffer = ByteBuffer.allocate(saltLen + iv.length); final ByteBuffer ivParameterBuffer = ByteBuffer.allocate(saltLen + mIv.length);
ivParameterBuffer.put(salt); ivParameterBuffer.put(salt);
ivParameterBuffer.put(iv); ivParameterBuffer.put(mIv);
final IvParameterSpec ivParameterSpec = new IvParameterSpec(ivParameterBuffer.array()); final IvParameterSpec ivParameterSpec = new IvParameterSpec(ivParameterBuffer.array());
final ByteBuffer aadBuffer = ByteBuffer.allocate(ESP_HDRLEN); final ByteBuffer aadBuffer = ByteBuffer.allocate(ESP_HDRLEN);
@@ -654,8 +655,8 @@ public class PacketUtils {
// Build ciphertext // Build ciphertext
final ByteBuffer cipherText = final ByteBuffer cipherText =
ByteBuffer.allocate(iv.length + encryptedTextAndIcv.length); ByteBuffer.allocate(mIv.length + encryptedTextAndIcv.length);
cipherText.put(iv); cipherText.put(mIv);
cipherText.put(encryptedTextAndIcv); cipherText.put(encryptedTextAndIcv);
return getByteArrayFromBuffer(cipherText); return getByteArrayFromBuffer(cipherText);
@@ -667,7 +668,7 @@ public class PacketUtils {
public final byte[] key; public final byte[] key;
public final int icvLen; public final int icvLen;
private static final Set<String> JCE_SUPPORTED_MACS = new HashSet<>(); private static final Set<String> JCE_SUPPORTED_MACS = new ArraySet<>();
static { static {
JCE_SUPPORTED_MACS.add(HMAC_MD5); JCE_SUPPORTED_MACS.add(HMAC_MD5);
@@ -703,20 +704,20 @@ public class PacketUtils {
} }
} }
public static class EspAuthNull extends EspAuth { public static final class EspAuthNull extends EspAuth {
private static final String AUTH_NULL = "AUTH_NULL"; private static final String AUTH_NULL = "AUTH_NULL";
private static final int ICV_LEN_UNUSED = 0; private static final int ICV_LEN_UNUSED = 0;
private static final byte[] KEY_UNUSED = new byte[0]; private static final byte[] KEY_UNUSED = new byte[0];
private static final byte[] ICV_EMPTY = new byte[0]; private static final byte[] ICV_EMPTY = new byte[0];
private static final EspAuthNull INSTANCE = new EspAuthNull(); private static final EspAuthNull sInstance = new EspAuthNull();
private EspAuthNull() { private EspAuthNull() {
super(AUTH_NULL, KEY_UNUSED, ICV_LEN_UNUSED); super(AUTH_NULL, KEY_UNUSED, ICV_LEN_UNUSED);
} }
public static EspAuthNull getInstance() { public static EspAuthNull getInstance() {
return INSTANCE; return sInstance;
} }
@Override @Override