Teste CTS para o Elemento de segurança

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:

  1. Todos os nomes de leitores de elementos seguros precisam começar com SIM, eSE ou SD.
  2. Leitores não baseados em SIM devem ser capazes de abrir canais básicos.
  3. CtsOmapiTestCases.apk não pode selecionar o AID A000000476416E64726F6964435453FF:
  4. O CtsOmapiTestCases.apk precisa ser capaz de selecionar um applet com os seguintes identificadores de aplicativo (AIDs):
    1. 0xA000000476416E64726F696443545331
      1. 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):
        1. 0x00700000
        2. 0x00708000
        3. 0x00A40404104A535231373754657374657220312E30
      2. O applet não deve retornar dados quando receber as seguintes APDUs em Transmit:
        1. 0x00060000
        2. 0x80060000
        3. 0xA0060000
        4. 0x94060000
        5. 0x000A000001AA
        6. 0x800A000001AA
        7. 0xA00A000001AA
        8. 0x940A000001AA
      3. O miniaplicativo precisa retornar dados de 256 bytes para as seguintes APDUs de transmissão:
        1. 0x0008000000
        2. 0x8008000000
        3. 0xA008000000
        4. 0x9408000000
        5. 0x000C000001AA00
        6. 0x800C000001AA00
        7. 0xA00C000001AA00
        8. 0x940C000001AA00
      4. 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*
        *A resposta precisa conter dados iguais aos da APDU de entrada, exceto o primeiro byte, que é 0x01 em vez de 0x00.
      5. 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
      6. 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
    2. A000000476416E64726F696443545332
      1. 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).

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

      1. APDUs autorizadas:

        1. 0x00060000
        2. 0xA0060000
      2. APDUs não autorizadas:

        1. 0x0008000000
        2. 0x80060000
        3. 0xA008000000
        4. 0x9406000000
    • 0xA000000476416E64726F696443545341

      1. APDUs autorizadas:

        1. 0x94060000
        2. 0x9408000000
        3. 0x940C000001AA00
        4. 0x940A000001AA
      2. APDUs não autorizadas:

        1. 0x00060000
        2. 0x80060000
        3. 0xA0060000
        4. 0x0008000000
        5. 0x000A000001AA
        6. 0x800A000001AA
        7. 0xA00A000001AA
        8. 0x8008000000
        9. 0xA008000000
        10. 0x000C0000001AA00
        11. 0x800C000001AA00
        12. 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

      1. APDUs autorizadas:

        1. 0x00060000
        2. 0xA0060000
      2. APDUs não autorizadas:

        1. 0x0008000000
        2. 0x80060000
        3. 0xA008000000
        4. 0x9406000000
    • 0xA000000476416E64726F696443545341

      1. APDUs autorizadas:

        1. 0x94060000
        2. 0x9408000000
        3. 0x940C000001AA00
        4. 0x940A000001AA
      2. APDUs não autorizadas:

        1. 0x0006000
        2. 0x80060000
        3. 0xA0060000
        4. 0x0008000000
        5. 0x000A000001AA
        6. 0x800A000001AA
        7. 0xA00A000001AA
        8. 0x8008000000
        9. 0xA008000000
        10. 0x000C000001AA00
        11. 0x800C000001AA00
        12. 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

      1. APDUs autorizadas:

        1. 0x00060000
        2. 0x80060000
        3. 0xA0060000
        4. 0x94060000
        5. 0x000A000001AA
        6. 0x800A000001AA
        7. 0xA00A000001AA
        8. 0x940A000001AA
        9. 0x0008000000
        10. 0x8008000000
        11. 0xA008000000
        12. 0x9408000000
        13. 0x000C000001AA00
        14. 0x800C000001AA00
        15. A00C000001AA00
        16. 940C000001AA00
    • 0xA000000476416E64726F696443545341

      1. APDUs autorizadas:

        1. 0x94060000
        2. 0x9408000000
        3. 0x940C000001AA00
        4. 0x940A00000aAA
      2. APDUs não autorizadas:

        1. 0x00060000
        2. 0x80060000
        3. 0xA0060000
        4. 0x0008000000
        5. 0x000A000001AA
        6. 0x800A000001AA
        7. 0xA00A000001AA
        8. 0x8008000000
        9. 0xA008000000
        10. 0x000C000001AA00
        11. 0x800C000001AA00
        12. 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.