Para melhorar a segurança, alguns dispositivos têm um Elemento de segurança (SE) incorporado, que é um hardware dedicado e separado resistente a adulterações para armazenar dados criptográficos. A API Open Mobile é uma API padrão usada para se comunicar com o Elemento de segurança de um dispositivo. O Android 9 adiciona suporte a essa API e oferece uma implementação de back-end, incluindo o serviço de elemento de segurança e a HAL do elemento de segurança.
O serviço Elemento de segurança verifica o suporte a elementos de segurança compatíveis com a plataforma global, conferindo se os dispositivos têm uma implementação SE HAL e, em caso afirmativo, quantas. Ele é usado como a base para testar a API e a implementação do elemento de segurança subjacente.
Casos de teste da API Open Mobile
Os casos de teste da API Open Mobile (OMAPI, link em inglês) são usados para aplicar as diretrizes da API e
confirmar se a
implementação de elementos de segurança atende à especificação da API
Open Mobile. Esses casos de teste exigem a instalação de um applet especial, um aplicativo Java
Card no elemento seguro, que
é usado pelo aplicativo CTS para comunicação. Para a instalação, use o
applet de exemplo encontrado em
google-cardlet.cap
.
Para passar nos casos de teste da OMAPI, o serviço de elemento de segurança e o SE precisam ser capazes de fazer o seguinte:
- Todos os nomes de leitores de elementos seguros precisam começar com SIM, eSE ou SD.
- Leitores não baseados em SIM devem ser capazes de abrir canais básicos.
CtsOmapiTestCases.apk
não pode selecionar o AID A000000476416E64726F6964435453FF:- O
CtsOmapiTestCases.apk
precisa ser capaz de selecionar um applet com os seguintes identificadores de aplicativo (AIDs):- 0xA000000476416E64726F696443545331
- O applet precisa gerar uma exceção de segurança quando receber a
seguinte unidade de dados de protocolo de aplicativo (APDU, na sigla em inglês) em
android.se.omapi.Channel.Transmit
(Transmit):- 0x00700000
- 0x00708000
- 0x00A40404104A535231373754657374657220312E30
- O applet não deve retornar dados quando receber as seguintes
APDUs em Transmit:
- 0x00060000
- 0x80060000
- 0xA0060000
- 0x94060000
- 0x000A000001AA
- 0x800A000001AA
- 0xA00A000001AA
- 0x940A000001AA
- O miniaplicativo precisa retornar dados de 256 bytes para as seguintes APDUs de
transmissão:
- 0x0008000000
- 0x8008000000
- 0xA008000000
- 0x9408000000
- 0x000C000001AA00
- 0x800C000001AA00
- 0xA00C000001AA00
- 0x940C000001AA00
- O applet precisa retornar as seguintes respostas de palavras de status para a APDU Transmit respectiva:
Transmitir APDU Palavra de status Dados 0x00F30106 0x6200 Não 0x00F30206 0x6281 Não 0x00F30306 0x6282 Não 0x00F30406 0x6283 Não 0x00F30506 0 x 6.285 Não 0x00F30606 0x62F1 Não 0x00F30706 0x62F2 Não 0x00F30806 0x63F1 Não 0x00F30906 0x63F2 Não 0x00F30A06 0x63C2 Não 0x00F30B06 0x6202 Não 0x00F30C06 0 x 6.280 Não 0x00F30D06 0 x 6.284 Não 0x00F30E06 0x6286 Não 0x00F30F06 0 x 6.300 Não 0x00F31006 0x6.381 Não 0x00F3010A01AA 0 x 6.200 Não 0x00F3020A01AA 0 x 6.281 Não 0x00F3030A01AA 0x6282 Não 0x00F3040A01AA 0x6283 Não 0x00F3050A01AA 0x6285 Não 0x00F3060A01AA 0x62F1 Não 0x00F3070A01AA 0x62F2 Não 0x00F3080A01AA 0x63F1 Não 0x00F3090A01AA 0x63F2 Não 0x00F30A0A01AA 0x63C2 Não 0x00F30B0A01AA 0 x 6.202 Não 0x00F30C0A01AA 0x6280 Não 0x00F30D0A01AA 0x6284 Não 0x00F30E0A01AA 0x6286 Não 0x00F30F0A01AA 0x6300 Não 0x00F3100A01AA 0x6.381 Não 0x00F3010800 0x6200 Sim 0x00F3020800 0 x 6.281 Sim 0x00F3030800 0x6282 Sim 0x00F3040800 0 x 6.283 Sim 0x00F3050800 0x6285 Sim 0x00F3060800 0x62F1 Sim 0x00F3070800 0x62F2 Sim 0x00F3080800 0x63F1 Sim 0x00F3090800 0x63F2 Sim 0x00F30A0800 0x63C2 Sim 0x00F30B0800 0x6202 Sim 0x00F30C0800 0 x 6.280 Sim 0x00F30D0800 0x6284 Sim 0x00F30E0800 0x6286 Sim 0x00F30F0800 0x6300 Sim 0x00F3100800 0x6381 Sim 0x00F3010C01AA00 0 x 6.200 Sim* 0x00F3020C01AA00 0 x 6.281 Sim* 0x00F3030C01AA00 0x6282 Sim* 0x00F3040C01AA00 0x6283 Sim* 0x00F3050C01AA00 0x6285 Sim* 0x00F3060C01AA00 0x62F1 Sim* 0x00F3070C01AA00 0x62F2 Sim* 0x00F3080C01AA00 0x63F1 Sim* 0x00F3090C01AA00 0x63F2 Sim* 0x00F30A0C01AA00 0x63C2 Sim* 0x00F30B0C01AA00 0x6202 Sim* 0x00F30C0C01AA00 0x6280 Sim* 0x00F30D0C01AA00 0 x 6.284 Sim* 0x00F30E0C01AA00 0 x 6.286 Sim* 0x00F30F0C01AA00 0x6300 Sim* 0x00F3100C01AA00 0x6381 Sim* - O applet precisa retornar respostas segmentadas com
0xFF
como o último byte de dados e ter as respectivas palavras de status e comprimentos de resposta para as APDUs a seguir.APDU Palavra de status Comprimento da resposta (bytes) 0x00C2080000 0 x 9.000 2048 0x00C4080002123400 0x9000 2048 0x00C6080000 0 x 9.000 2048 0x00C8080002123400 0x9000 2048 0x00C27FFF00 0x9000 32767 0x00CF080000 0x9000 2048 0x94C2080000 0x9000 2048 - O applet precisa retornar o valor de P2 recebido no comando SELECT
+ a palavra de status de sucesso (ou seja,
0x009000
) para a APDU especificada: 0x00F4000000
- O applet precisa gerar uma exceção de segurança quando receber a
seguinte unidade de dados de protocolo de aplicativo (APDU, na sigla em inglês) em
- A000000476416E64726F696443545332
- Quando selecionado, esse AID retorna uma resposta selecionada maior do que 2 bytes que estão corretamente formatadas usando regras básicas de codificação (BER, na sigla em inglês) e valor de comprimento da tag (TLV).
- 0xA000000476416E64726F696443545331
CtsOmapiTestCases
- Hash do APK:0x5cc49e0bc83927486fbb3a17ed37276cbbceb290
Casos de teste de controle de acesso
O uso do controle de acesso configurado no elemento de segurança garante que apenas o aplicativo com acesso a um applet possa se comunicar com ele. Além disso, o Android oferece suporte à configuração de regras para APDUs específicas que podem ser trocadas pelo APK.
Para passar nesses testes, configure regras de controle de acesso especiais, como o mestre de aplicativo de regra de acesso (ARA) ou o arquivo de regra de acesso (ARF). Use o miniaplicativo usado nos testes OMAPI, já que os mesmos comandos precisam de suporte para serem aprovados nos testes de controle de acesso.
Crie uma instância do applet com estes AIDs:
- 0xA000000476416E64726F696443545340
- 0xA000000476416E64726F696443545341
- 0xA000000476416E64726F696443545342
- 0xA000000476416E64726F696443545343
- 0xA000000476416E64726F696443545344
- 0xA000000476416E64726F696443545345
- 0xA000000476416E64726F696443545346
- 0xA000000476416E64726F696443545347
- 0xA000000476416E64726F696443545348
- 0xA000000476416E64726F696443545349
- 0xA000000476416E64726F69644354534A
- 0xA000000476416E64726F69644354534B
- 0xA000000476416E64726F69644354534C
- 0xA000000476416E64726F69644354534D
- 0xA000000476416E64726F69644354534E
- 0xA000000476416E64726F69644354534F
Quando selecionados, qualquer um desses AIDs precisa retornar uma resposta selecionada maior que 2 bytes corretamente formatadas usando BER e TLV.
CtsSecureElementAccessControlTestCases1
- Hash do APK:0x4bbe31beb2f753cfe71ec6bf112548687bb6c34e
AIDs autorizados
0xA000000476416E64726F696443545340
APDUs autorizadas:
- 0x00060000
- 0xA0060000
APDUs não autorizadas:
- 0x0008000000
- 0x80060000
- 0xA008000000
- 0x9406000000
0xA000000476416E64726F696443545341
APDUs autorizadas:
- 0x94060000
- 0x9408000000
- 0x940C000001AA00
- 0x940A000001AA
APDUs não autorizadas:
- 0x00060000
- 0x80060000
- 0xA0060000
- 0x0008000000
- 0x000A000001AA
- 0x800A000001AA
- 0xA00A000001AA
- 0x8008000000
- 0xA008000000
- 0x000C0000001AA00
- 0x800C000001AA00
- 0xA00C000001AA00
0xA000000476416E64726F696443545342
0xA000000476416E64726F696443545344
0xA000000476416E64726F696443545345
0xA000000476416E64726F696443545347
0xA000000476416E64726F696443545348
0xA000000476416E64726F696443545349
0xA000000476416E64726F69644354534A
0xA000000476416E64726F69644354534B
0xA000000476416E64726F69644354534C
0xA000000476416E64726F69644354534D
0xA000000476416E64726F69644354534E
0xA000000476416E64726F69644354534F
AIDs não autorizadas
- 0xA000000476416E64726F696443545343
- 0xA000000476416E64726F696443545346
CtsSecureElementAccessControlTestCases2
- Hash do APK:0x93b0ff2260babd4c2a92c68aaa0039dc514d8a33
AIDs autorizados:
0xA000000476416E64726F696443545340
APDUs autorizadas:
- 0x00060000
- 0xA0060000
APDUs não autorizadas:
- 0x0008000000
- 0x80060000
- 0xA008000000
- 0x9406000000
0xA000000476416E64726F696443545341
APDUs autorizadas:
- 0x94060000
- 0x9408000000
- 0x940C000001AA00
- 0x940A000001AA
APDUs não autorizadas:
- 0x0006000
- 0x80060000
- 0xA0060000
- 0x0008000000
- 0x000A000001AA
- 0x800A000001AA
- 0xA00A000001AA
- 0x8008000000
- 0xA008000000
- 0x000C000001AA00
- 0x800C000001AA00
- 0xA00C000001AA00
0xA000000476416E64726F696443545343
0xA000000476416E64726F696443545345
0xA000000476416E64726F696443545346
AIDs não autorizadas
- 0xA000000476416E64726F696443545342
- 0xA000000476416E64726F696443545344
- 0xA000000476416E64726F696443545347
- 0xA000000476416E64726F696443545348
- 0xA000000476416E64726F696443545349
- 0xA000000476416E64726F69644354534A
- 0xA000000476416E64726F69644354534B
- 0xA000000476416E64726F69644354534C
- 0xA000000476416E64726F69644354534D
- 0xA000000476416E64726F69644354534E
- 0xA000000476416E64726F69644354534F
CtsSecureElementAccessControlTestCases3
- Hash do APK:0x5528ca826da49d0d7329f8117481ccb27b8833aa
AIDs autorizados:
0xA000000476416E64726F696443545340
APDUs autorizadas:
- 0x00060000
- 0x80060000
- 0xA0060000
- 0x94060000
- 0x000A000001AA
- 0x800A000001AA
- 0xA00A000001AA
- 0x940A000001AA
- 0x0008000000
- 0x8008000000
- 0xA008000000
- 0x9408000000
- 0x000C000001AA00
- 0x800C000001AA00
- A00C000001AA00
- 940C000001AA00
0xA000000476416E64726F696443545341
APDUs autorizadas:
- 0x94060000
- 0x9408000000
- 0x940C000001AA00
- 0x940A00000aAA
APDUs não autorizadas:
- 0x00060000
- 0x80060000
- 0xA0060000
- 0x0008000000
- 0x000A000001AA
- 0x800A000001AA
- 0xA00A000001AA
- 0x8008000000
- 0xA008000000
- 0x000C000001AA00
- 0x800C000001AA00
- 0xA00C000001AA00
0xA000000476416E64726F696443545345
0xA000000476416E64726F696443545346
AIDs não autorizadas
- 0xA000000476416E64726F696443545342
- 0xA000000476416E64726F696443545343
- 0xA000000476416E64726F696443545344
- 0xA000000476416E64726F696443545347
- 0xA000000476416E64726F696443545348
- 0xA000000476416E64726F696443545349
- 0xA000000476416E64726F69644354534A
- 0xA000000476416E64726F69644354534B
- 0xA000000476416E64726F69644354534C
- 0xA000000476416E64726F69644354534D
- 0xA000000476416E64726F69644354534E
- 0xA000000476416E64726F69644354534F
Apêndice
Exemplo de applet e etapas de instalação para o cartão de circuito integrado UMTS (UICC)
1. Especificação do pacote
Nome do arquivo:google-cardlet.cap
AID do pacote: 6F 6D 61 70 69 63 61 72 64 6C 65 74
Versão: 1.63
Hash: 5F72E0A073BA9E61A7358F2FE3F031A99F3F81E9
Applets:
6F 6D 61 70 69 4A 53 52 31 37 37 = módulo SelectResponse
6F 6D 61 70 69 43 61 63 68 69 6E 67 = módulo XXLResponse
Importações:
javacard.framework v1.3 - A0000000620101
java.lang v1.0 - A0000000620001
uicc.hci.framework v1.0 - A0000000090005FFFFFFFF8916010000
uicc.hci.services.cardemulation v1.0 - A0000000090005FFFFFFFF8916020100
uicc.hci.services.connectivity v1.0 - A0000000090005FFFFFFFF8916020200
Tamanho no cartão:39597
2. Etapas da instalação
Carregue o arquivo
google-cardlet.cap
no chip usando o procedimento
adequado (consulte os fabricantes do SE).
Execute o comando de instalação para cada applet.
Testes OMAPI
Comando para instalar o miniaplicativo
80E60C00300C6F6D617069636172646C65740Bmodule_AID10AID01000EEF0AA008810101A5038201C0C9000000
Module_AID: 6F 6D 61 70 69 4A 53 52 31 37 37
AID: A000000476416E64726F696443545331
80E60C00310C6F6D617069636172646C65740Bmodule_AID10AID010002C9000
Module_AID: 6F 6D 61 70 69 43 61 63 68 69 6E 67
AID: A000000476416E64726F696443545332
Testes de AccessControl (modelo que usa a estrutura PKCS#15)
80E60C003C0C6F6D617069636172646C65740Bmodule_AID10AID01000EEF0AA008810101A5038201C0C9000000
Module_AID: 6F 6D 61 70 69 4A 53 52 31 37 37
AIDs:
- 0xA000000476416E64726F696443545340
- 0xA000000476416E64726F696443545341
- 0xA000000476416E64726F696443545342
- 0xA000000476416E64726F696443545344
- 0xA000000476416E64726F696443545345
- 0xA000000476416E64726F696443545347
- 0xA000000476416E64726F696443545348
- 0xA000000476416E64726F696443545349
- 0xA000000476416E64726F69644354534A
- 0xA000000476416E64726F69644354534B
- 0xA000000476416E64726F69644354534C
- 0xA000000476416E64726F69644354534D
- 0xA000000476416E64726F69644354534E
- 0xA000000476416E64726F69644354534F
Para ver comandos passo a passo para configurar a estrutura PKCS#15 correspondente aos testes CTS, consulte Comandos do PKCS#15.