Application de test : APK
Bugs liés :

Code concerné :

Code sur GitHub : Repo GitHub
Références :
RFC4186 : EAP-SIM
Liste des MNC en France

Android :
1 2a 2b 3 4 5

Configuration générée dans /data/misc/wifi/wpa_supplicant.conf :
network={
	ssid="FreeWifi_secure"
	key_mgmt=WPA-EAP IEEE8021X
	eap=SIM
	identity="1208150000XXXXXX" # Oh, on dirait 1+mon IMSI
	proactive_key_caching=1
}

Permissions requises (dans le Manifest) :
    <uses-feature android:name="android.hardware.telephony" />
    <uses-feature android:name="android.hardware.wifi" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

Classes à importer :
import java.util.List;

import android.content.Context;
import android.telephony.TelephonyManager;

import android.net.wifi.WifiManager;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiConfiguration;

Code :
        String ssid = new String("");
        TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String simOperator = tel.getSimOperator(); // Not getNetworkOperator wrt Roaming

        if (simOperator != null) {
            int mcc = Integer.parseInt(simOperator.substring(0, 3));
            int mnc = Integer.parseInt(simOperator.substring(3));
            if ( mcc == 208 )
            {
                if ( ( mnc >=  9 ) && ( mnc <= 13 ) ) { ssid = new String("SFR WiFi Mobile"); }
                if ( ( mnc >= 15 ) && ( mnc <= 16 ) ) { ssid = new String("FreeWifi_secure"); }
            }

            if ( !ssid.isEmpty() ) {
                WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
                enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); // EAP SIM / AKA for Mobile Phones

                // IMSI : 208(mcc) + 15(mnc) + 0000XXXXXX
                enterpriseConfig.setIdentity("1"+tel.getSubscriberId()); // Use 1 + IMSI (See RFC4186)

                WifiConfiguration wifiConfig = new WifiConfiguration();
                wifiConfig.SSID = ssid;
                //wifiConfig.priority = 0; // Use lower priority than known APs
                wifiConfig.status = WifiConfiguration.Status.ENABLED;
                wifiConfig.allowedKeyManagement.clear();
                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
                wifiConfig.enterpriseConfig = enterpriseConfig;

                WifiManager wfMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                wfMgr.setWifiEnabled(true);
                wfMgr.disconnect();

                List list = wfMgr.getConfiguredNetworks();
                for( WifiConfiguration i : list ) {
                    if (i.SSID != null && i.SSID.equals("\"" + ssid + "\"")) {
                        wfMgr.removeNetwork(i.networkId);
                    }
                }
                int networkId = wfMgr.addNetwork(wifiConfig);
                if (networkId != -1) {
                    wfMgr.reconnect();
                    wfMgr.enableNetwork(networkId, true);
                }
            }
        }