Как получить icc аутентификацию? - PullRequest
0 голосов
/ 02 октября 2018

Я нашел несколько интересных методов в классе telephonyManager, таких как включение / выключение мобильных данных, но при попытке их использования это, очевидно, приводит к исключению безопасности («Нет привилегии оператора»).Я прогуглил это, но не нашел никакого полезного решения.Потому что это привилегия оператора связи, я думал, что возможно получить его разрешение по telephonyManager.getIccAuthentication(int appType, int authType, String data), но у меня проблемы с входными параметрами, потому что я не могу понять, что я должен передать, чтобы заставить его работать.

От документации к первому параметру будет передаваться TelephonyManager.APPTYPE_SIM или / и TelephonyManager.APPTYPE_USIM в зависимости от того, имеет ли он большое значение при использовании setDataEnabled(boolean).Если бы я передал TelephonyManager.APPTYPE_SIM в качестве первого аргумента, я думаю, что я должен передать TelephonyManager.AUTHTYPE_EAP_SIM в качестве второго аргумента (поправьте меня, если я ошибаюсь) и наоборот, когда TelephonyManager.APPTYPE_USIM в качестве первого, а TelephonyManager.AUTHTYPE_EAP_AKA в качестве второго.

И вот третий аргумент.Там должно быть закодировано Base64 в строку.В TelephonyProvider я нашел следующую строку кода: String base64Challenge = Base64.encodeToString(byteParam, Base64.NO_WRAP);, где byteParam - это входной байт другого метода, которому предшествуют тысячи других методов.Если я передаю «» в качестве третьего параметра в метод getIccAuthentication, я снова получаю securityException (это, очевидно, неправильный параметр), но это приводит к отсутствию getIccSimChallengeResponse.Я боюсь, что это может быть бесконечный цикл методов, но, может быть, кто-то имеет какие-либо идеи или помочь мне прорвать это?

Мой пример кода:

public class MainActivity extends AppCompatActivity {


private static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.buttonPanel);
    button.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onClick(View view) {
            try {
                Process p = Runtime.getRuntime().exec("su");
                tel();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

}

@RequiresApi(api = Build.VERSION_CODES.O)
private void tel(){
//        String base64Challenge = Base64.encodeToString(, 
Base64.NO_WRAP);
    TelephonyManager telephonyManager = (TelephonyManager)
            getSystemService(Context.TELEPHONY_SERVICE);
    boolean isCarrier = telephonyManager.hasCarrierPrivileges();
    String authentication = 
telephonyManager.getIccAuthentication(TelephonyManager.APPTYPE_SIM, 
TelephonyManager.AUTHTYPE_EAP_SIM, "");
    Log.v(TAG, authentication);
    if (isCarrier) {
        Log.v(TAG, "privs granted");
        telephonyManager.setDataEnabled(false);
    } else {
        Log.v(TAG, "no privilegies");
    }
}


}

1 Ответ

0 голосов
/ 02 октября 2018

Из документов:

Требуется разрешение: READ_PRIVILEGED_PHONE_STATE или наличие у вызывающего приложения привилегий оператора (см. HasCarrierPrivileges ()).

Для первого из них требуется, чтобы выбыть установленным как привилегированное системное приложение (требуется root или владелец системного сертификата).Второй требует, чтобы ваш UID был оператором.Без этого никакая комбинация параметров не будет работать.

...