Home | History | Annotate | Download | only in config
      1 page.title=UICC Carrier Privileges
      2 @jd:body
      3 
      4 <!--
      5     Copyright 2015 The Android Open Source Project
      6 
      7     Licensed under the Apache License, Version 2.0 (the "License");
      8     you may not use this file except in compliance with the License.
      9     You may obtain a copy of the License at
     10 
     11         http://www.apache.org/licenses/LICENSE-2.0
     12 
     13     Unless required by applicable law or agreed to in writing, software
     14     distributed under the License is distributed on an "AS IS" BASIS,
     15     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16     See the License for the specific language governing permissions and
     17     limitations under the License.
     18 -->
     19 <div id="qv-wrapper">
     20   <div id="qv">
     21     <h2>In this document</h2>
     22     <ol id="auto-toc">
     23     </ol>
     24   </div>
     25 </div>
     26 
     27 <p>Android 5.1 introduced a new mechanism to grant special privileges for APIs relevant
     28 to the Universal Integrated Circuit Card (UICC) owners apps. The Android platform will load
     29 certificates stored on a UICC and grant
     30 permission to apps signed by these certificates to make calls to a handful of
     31 special APIs. Since carriers have full control of the UICC, this mechanism
     32 provides a secure and flexible way to manage apps from the Mobile Network
     33 Operator (MNO) hosted on generic application distribution channels such as
     34 Google Play but still have special privileges on devices without the need for
     35 the apps to be signed by the per-device platform certificate or be
     36 pre-installed as a system app.</p>
     37 
     38 <h2 id=rules_on_uicc>Rules on UICC</h2>
     39 
     40 <p>Storage on the UICC is compatible with the <a
     41 href="http://www.globalplatform.org/specificationsdevice.asp">GlobalPlatform
     42 Secure Element Access Control specification</a>. The application identifier
     43 (AID) on card is A00000015141434C00, and the standard GET DATA command is used
     44 to fetch rules stored on the card. You may update these rules via card
     45 over-the-air (OTA) update.  Data hierarchy is as follows (noting the
     46 two-character letter and number combination in parentheses is the object tag).
     47 (An extension to spec is under review.)</p>
     48 
     49 <p>Each rule is a REF-AR-DO (E2) and consists of a concatenation of a REF-DO and
     50 an AR-DO:</p>
     51 
     52 <ul>
     53   <li>REF-DO (E1) contains a DeviceAppID-REF-DO or a concatenation of a
     54 DeviceAppID-REF-DO and a PKG-REF-DO.
     55   <ul>
     56     <li>DeviceAppID-REF-DO (C1) stores the SHA1 (20 bytes) or SHA256 (32 bytes)
     57 signature of the certificate.
     58     <li>PKG-REF-DO (CA) is the full package name string defined in manifest, ASCII
     59 encoded, max length 127 bytes.
     60   </ul>
     61   <li>AR-DO (E3) is extended to include PERM-AR-DO (DB), which is an 8-byte bit mask
     62 representing 64 separate permissions.
     63 </ul>
     64 
     65 <p>If PKG-REF-DO is not present, any app signed by the certificate will be granted
     66 access; otherwise both certificate and package name need to match.</p>
     67 
     68 <h3 id=example>Example</h3>
     69 
     70 <p>App name: com.google.android.apps.myapp<br>
     71 Sha1 of certificate in hex string:</p>
     72 <pre>
     73 AB:CD:92:CB:B1:56:B2:80:FA:4E:14:29:A6:EC:EE:B6:E5:C1:BF:E4</pre>
     74 
     75 <p>Rule on UICC in hex string:</p>
     76 <pre>
     77 E243 &lt;= 43 is value length in hex
     78   E135
     79     C114 ABCD92CBB156B280FA4E1429A6ECEEB6E5C1BFE4
     80     CA1D 636F6D2E676F6F676C652E616E64726F69642E617070732E6D79617070
     81   E30A
     82     DB08 0000000000000001
     83 </pre>
     84 
     85 <h2 id=enabled_apis>Enabled APIs</h2>
     86 
     87 <p>Currently we support the following APIs, listed below (refer to
     88 developer.android.com for more details).</p>
     89 
     90 <h3 id=telephonymanager>TelephonyManager</h3>
     91 
     92 <p>API to check whether calling application has been granted carrier privileges:</p>
     93 
     94 <pre>
     95 <a
     96 href="http://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()">hasCarrierPrivileges</a>
     97 </pre>
     98 
     99 <p>APIs for brand and number override:</p>
    100 
    101 <pre>
    102 setOperatorBrandOverride
    103 setLine1NumberForDisplay
    104 setVoiceMailNumber
    105 </pre>
    106 
    107 <p>APIs for direct UICC communication:</p>
    108 
    109 <pre>
    110 iccOpenLogicalChannel
    111 iccCloseLogicalChannel
    112 iccExchangeSimIO
    113 iccTransmitApduLogicalChannel
    114 iccTransmitApduBasicChannel
    115 sendEnvelopeWithStatus
    116 </pre>
    117 
    118 <p>API to set device mode to global:</p>
    119 
    120 <pre>
    121 setPreferredNetworkTypeToGlobal
    122 </pre>
    123 
    124 <h3 id=smsmanager>SmsManager</h3>
    125 
    126 <p>API allows caller to create new incoming SMS messages:</p>
    127 
    128 <pre>
    129 injectSmsPdu
    130 </pre>
    131 
    132 <h4 id=carriermessagingservice>CarrierMessagingService</h4>
    133 
    134 <p>A service that receives calls from the system when new SMS and MMS are
    135 sent or
    136 received. To extend this class, you must declare the service in your manifest
    137 file with the android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE
    138 permission and include an intent filter with the #SERVICE_INTERFACE action.</p>
    139 
    140 <pre>
    141 onFilterSms
    142 onSendTextSms
    143 onSendDataSms
    144 onSendMultipartTextSms
    145 onSendMms
    146 onDownloadMms
    147 </pre>
    148 
    149 <h4 id=telephonyprovider>TelephonyProvider</h4>
    150 
    151 <p>Content provider APIs that allow modification to the telephony database, value
    152 fields are defined at Telephony.Carriers:</p>
    153 
    154 <pre>
    155 insert, delete, update, query
    156 </pre>
    157 
    158 <p>See the <a
    159 href="https://developer.android.com/reference/android/provider/Telephony.html">Telephony
    160 reference on developer.android.com</a> for additional information.</p>
    161 
    162 <h2 id=android_platform>Android platform</h2>
    163 
    164 <p>On a detected UICC, the platform will construct internal UICC objects that
    165 include carrier privilege rules as part of the UICC. <a
    166 href="https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java">UiccCarrierPrivilegeRules.java</a>
    167 will load rules, parse them from the UICC card, and cache them in memory. When
    168 a privilege check is needed, UiccCarrierPrivilegeRules will compare the caller
    169 certificate with its own rules one by one. If the UICC is removed, rules will
    170 be destroyed along with the UICC object.</p>
    171 
    172 <h2 id=faq>FAQ</h2>
    173 
    174 <p><strong>How can certificates be updated on the UICC?
    175 </strong></p>
    176 
    177 <p><em>A: Use existing card OTA update mechanism.
    178 </em></p>
    179 
    180 <p><strong>Can it co-exist with other rules?
    181 </strong></p>
    182 
    183 <p><em>A: Its fine to have other security rules on the UICC under same AID; the
    184 platform will filter them out automatically.
    185 </em></p>
    186 
    187 <p><strong>What happens when the UICC is removed for an app that relies on the
    188 certificates on it?
    189 </strong></p>
    190 
    191 <p><em>A: The app will lose its privileges because the rules associated with the UICC
    192 are destroyed on UICC removal.
    193 </em></p>
    194 
    195 <p><strong>Is there a limit on the number of certificates on the UICC?
    196 </strong></p>
    197 
    198 <p><em>A: The platform doesnt limit the number of certificates; but because the check
    199 is linear, too many rules may incur a latency for check.
    200 </em></p>
    201 
    202 <p><strong>Is there a limit to number of APIs we can support via this method?
    203 </strong></p>
    204 
    205 <p><em>A: No, but we limit the scope of APIs to carrier related.
    206 </em></p>
    207 
    208 <p><strong>Are there some APIs prohibited from using this method? If so, how do you
    209 enforce them? (ie. Will you have tests to validate which APIs are supported via
    210 this method?)
    211 </strong></p>
    212 
    213 <p><em>A: Please refer to the "API Behavioral Compatibility" section of the <a
    214 href="{@docRoot}compatibility/android-cdd.pdf">Android Compatibility Definition
    215 Document CDD)</a>. We have some CTS tests to make sure the permission model of
    216 the APIs is not changed.
    217 </em></p>
    218 
    219 <p><strong>How does this work with the multi-SIM feature?
    220 </strong></p>
    221 
    222 <p><em>A: The default SIM that gets set by the user will be used.</em></p>
    223 
    224 <p><strong>Does this in any way interact or overlap with other SE access technologies e.g.
    225 SEEK?
    226 <em>A: As an example, SEEK uses the same AID as on the UICC. So the rules co-exist
    227 and are filtered by either SEEK or UiccCarrierPrivileges.</em>
    228 </strong></p>
    229 
    230 <p><strong>When is it a good time to check carrier privileges?
    231 <em>A: After the SIM state loaded broadcast.</em>
    232 </strong></p>
    233 
    234 <p><strong>Can OEMs disable part of carrier APIs?
    235 </strong></p>
    236 
    237 <p><em>A: No. We believe current APIs are the minimal set, and we plan to use the bit
    238 mask for finer granularity control in the future.
    239 </em></p>
    240 
    241 <p><strong>Does setOperatorBrandOverride override ALL other forms of operator name
    242 strings? For example, SE13, UICC SPN, network based NITZ, etc.?
    243 </strong></p>
    244 
    245 <p><em>A: See the SPN entry within TelephonyManager:
    246 <a
    247 href="http://developer.android.com/reference/android/telephony/TelephonyManager.html">http://developer.android.com/reference/android/telephony/TelephonyManager.html</a>
    248 </em></p>
    249 
    250 <p><strong>What does the injectSmsPdu method call do?
    251 </strong></p>
    252 
    253 <p><em>A: This facilitates SMS backup/restore in the cloud. The injectSmsPdu call
    254 enables the restore function.
    255 </em></p>
    256 
    257 <p><strong>For SMS filtering, is the onFilterSms call based on SMS UDH port filtering? Or
    258 would carrier apps have access to ALL incoming SMS?
    259 </strong></p>
    260 
    261 <p><em>A: Carriers have access to all SMS data.</em></p>
    262 
    263 <p><strong>Since the extension of DeviceAppID-REF-DO to support 32 bytes appears
    264 incompatible with the current GP spec (which allows 0 or 20 bytes only) why are
    265 you introducing this change? Do you not consider SHA-1 to be good enough to
    266 avoid collisions?  Have you proposed this change to GP already, as this could
    267 be backwards incompatible with existing ARA-M / ARF?
    268 </strong></p>
    269 
    270 <p><em>A: For providing future proof security this extension introduces SHA-256 for
    271 DeviceAppID-REF-DO in addition to SHA-1 which is currently the only option in
    272 the GP SEAC standard. It is highly recommended to use SHA-256.</em></p>
    273 
    274 <p><strong>If DeviceAppID is 0 (empty), would you really apply the rule to all device
    275 applications not covered by a specific rule?
    276 </strong></p>
    277 
    278 <p><em>A: Carrier apis require deviceappid-ref-do be non-empty. Being empty is
    279 intended for test purpose and is not recommended for operational deployments.</em></p>
    280 
    281 <p><strong>According to your spec, PKG-REF-DO used just by itself, without
    282 DeviceAppID-REF-DO, should not be accepted. But it is still described in Table
    283 6-4 as extending the definition of REF-DO. Is this on purpose? What will be the
    284 behavior of the code when only a PKG-REF-DO is used in a REF-DO?
    285 </strong></p>
    286 
    287 <p><em>A: The option of having PKG-REF-DO as a single value item in REF-DO was removed
    288 in the latest version. PKG-REF-DO should only occur in combination with
    289 DeviceAppID-REF-DO.
    290 </em></p>
    291 
    292 <p><strong>We assume we can grant access to all carrier-based permissions or have a
    293 finer-grained control. What will define the mapping between the bit mask and
    294 the actual permissions then? One permission per class? One permission per
    295 method specifically? Will 64 separate permissions be enough in the long run?
    296 </strong></p>
    297 
    298 <p><em>A: This is reserved for the future, and we welcome suggestions.</em></p>
    299 
    300 <p><strong>Can you further define the DeviceAppID for Android specifically? Since this is
    301 the SHA-1 (20 bytes) hash value of the Publisher certificate used to signed the
    302 given app, shouldn't the name reflect that purpose? (The name could be
    303 confusing to many readers as the rule will be applicable then to all apps
    304 signed with that same Publisher certificate.)
    305 </strong></p>
    306 
    307 <p><em>A: See the  <a
    308 href="#rules_on_uicc">Rules on UICC</a> section for details. The deviceAppID storing
    309 certificates is already supported by the existing spec. We tried to minimize
    310 spec changes to lower barrier for adoption. </em></p>
    311