Как получить аутентификацию icc?

Я нашел некоторые интересные методы в классе 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");
    }
}


}

Пожалуйста, добавьте несколько блоков кода.

Emre Aktürk 02.10.2018 22:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
772
1

Ответы 1

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

Requires Permission: READ_PRIVILEGED_PHONE_STATE or that the calling app has carrier privileges (see hasCarrierPrivileges()).

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

Хорошо, у меня есть рутированное устройство, и я запрашиваю права суперпользователя, просто выполнив команду «su». Но что дальше?

Domin 02.10.2018 22:44

Приложению не нужен root, его необходимо установить в системный каталог Privlidged apps (удалите его, adb переместите apk в нужное место, перезагрузите устройство). Затем он может вызывать эту функцию, пока запрашивается разрешение READ_PRIVLIDGED_PHONE_STATE. Однако этого, вероятно, будет недостаточно, поскольку похоже, что третий параметр - это пароль base64, который проверяется физической SIM-картой в устройстве.

Gabe Sechan 02.10.2018 22:48

Хорошо, спасибо за объяснение. Так что все, что мне нужно, это сгенерированный пароль base64, проверенный сим-картой, да? Этот пароль постоянный или генерируется по-разному для каждого устройства?

Domin 03.10.2018 09:47

Не уверен. Я предполагаю, что это будет связано с конкретным устройством или учетной записью телекоммуникационной сети, и SIM-карта проверяет это с данными, которые она загружает при настройке. Константу слишком легко взломать

Gabe Sechan 03.10.2018 09:51

Другие вопросы по теме