Segurança e Criptografia Componentes Algoritmos de Criptografia • O Palm OS Cobalt prevê suporte ao uso de diversos algoritmos de criptografia, integrados pelo Cryptographic Provider Manager (CPM) Algoritmos de Criptografia • O provider padrão, que vem com o Palm OS Cobalt, foi desenvolvido pela RSA Security e inclui um gerador de números pseudorandômicos e suporte a RC4 de 128 bits, SHA-1 hashing e RSA public key operations • Se necessário, Providers adicionais podem ser adicionados tanto estática quanto dinamicamente (DLLs assinadas) ao Cryptographic Provider Manager Cryptographic Provider Manager (CPM) • Provê uma API unificada para acesso a funções de criptografar, descriptografar, assinar e verificar assinaturas Cryptographic Provider Manager (CPM) • Seu uso é simples, abstraindo os detalhes de implementação dos algoritmos de criptografia CPM - Funcionalidades 1. Permite ao usuário descobrir quais os Providers presentes CPM - Funcionalidades uint32_t *providers; APProviderInfoType providerInfo; uint16_t nProviders = 0; CPMLibOpen(&nProviders); DbgPrintf("SSFD: CPMLibOpen - 0x%x providers returned\n", nProviders ); providers = MemPtrNew(sizeof(uint32_t) * nProviders ); CPMLibEnumerateProviders(providers, &nProviders ); DbgPrintf("SSFD: CPMLibEnumerateProviders - 0x%x providers returned\n", nProviders); for (i=0; i < temp; i++) { CPMLibGetProviderInfo(providers[i], &providerInfo); DbgPrintf("\t%s\n", providerInfo.name); DbgPrintf("\t%s\n", providerInfo.other); DbgPrintf("\tAlgs: %d\n",providerInfo.numAlgorithms); DbgPrintf("\tHardware?: %s\n", providerInfo.bHardware?"yes":"no"); } CPM - Funcionalidades 2. Permite gerar chaves abstraindo o algoritmo utilizado CPM - Funcionalidades APKeyInfoType keyInfo; uint8_t *seedData; uint32_t seedDataLength; /* KeyInfo provê as funcionalidades para as chaves do algoritmo utilizado. */ MemSet(&keyInfo, sizeof(APKeyInfoType), 0); keyInfo.type = apSymmetricTypeRijndael; keyInfo.length = 32; /* bytes */ /* Pega uma seed do gerador pseudo-randomico padrão */ GetSomeSeedData(seedData, seedDataLength); /* Gera a chave e armazena em KeyInfo */ CPMLibGenerateKey(seedData, seedDataLength, &keyInfo); CPM - Funcionalidades 3. Permite o uso de Message Digests (hashes) CPM - Funcionalidades status_t err; uint32_t size; uint8_t data[] = ( 'f', 'o', 'o' ); /* Aloca um buffer de 0 bytes */ uint8_t *md = NULL; size = 0; err = CPMLibHash(apHashTypeSHA1, NULL, data, sizeof(data), md, &size); /* Se o tamanho do buffer for menor que o necessário (que é o caso), o CPM modifica o valor de size para o tamanho mínimo e retorna um código de erro */ if (err == cpmErrBufTooSmall) { md = MemPtrNew(size); CPMLibHash(apHashTypeSHA1, NULL, data, sizeof(data), md, &size); } CPM - Funcionalidades 4. Permite o uso de funções para encriptar dados a partir de uma chave gerada... CPM - Funcionalidades status_t err; uint8_t key[] = {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E,0x57}; uint8_t plain[] = {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67,0x42}; uint32_t index, size; uint8_t *output = NULL; APKeyInfoType keyInfo; MemSet(&keyInfo, sizeof(APKeyInfoType), 0); keyInfo.type = apSymmetricTypeDES; CPMLibImportKeyInfo(IMPORT_EXPORT_TYPE_RAW, key, 8, &keyInfo); size = 0; err = CPMLibEncrypt(&keyInfo, NULL, plain, 8, output,&size); if (err = cpmErrBufTooSmall) { output = MemPtrNew(size); if (output != NULL) { err = CPMLibEncrypt(&keyInfo, NULL, plain, 8, output, &size); MemPtrFree(output); } CPM - Funcionalidades 5. ...E descriptografá-los. CPM - Funcionalidades status_t err; uint8_t key[] = {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E,0x57}; uint8_t cipher[] = {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93,0x9B}; uint32_t index, size; uint8_t *output = NULL; /* Obtêm ou inicializa KeyInfo */ APKeyInfoType keyInfo; (...) size = 0; err = CPMLibDecrypt(&keyInfo, NULL, cipher, 8, output,&size); if (err = cpmErrBufTooSmall) { output = MemPtrNew(size); if (output != NULL) { err = CPMLibDecrypt(&keyInfo, NULL, cipher, 8, output, &size); MemPtrFree(output); } Certificate Manager • Armazena, importa, exporta e verifica certificados DERencoded X.509 • Por ter uma funcionalidade muito específica, normalmente é usado apenas pelas APIs de SSL e Signature Verify Library • Quando necessário, utiliza as funcionalidades da Data Manager para evitar mudanças nos certificados armazenados SSL • O módulo de SSL provê suporte nativo ao protocolo de rede homônimo Signature Verify Library • Provê um módulo para aplicações acessarem assinaturas e certificados de maneira simples Autenticação e assinaturas de sistema Código assinado • Aplicações são assinadas quando a integridade do código é uma preocupação • Dependendo do dispositivo, parte do código – como um patch do sistema – deve ser assinado • Além disso, base de dados seguras podem ser configuradas de maneira a permitir acesso apenas a um grupo particular de aplicações assinadas O que pode ser assinado? • • • • • Applications System patches Shared libraries System components System drivers Para que servem assinaturas? • No Palm, assinaturas normalmente indicam aprovação e compatibilidade • Não indicam necessariamente o autor do código ou recurso Authentication Manager (AM) • Responsável por autenticar usuários ou aplicações • Responde a questão “Você é X?” através de métodos como senhas e assinaturas de código Authentication Manager (AM) • É o AM o responsável por verificar a assinatura do código, garantindo que os patches e objetos modificáveis mais importantes do sistema tenham uma assinatura de uma autoridade conhecida Authorization Manager (AZM) Authorization Manager (AZM) • Controla árvores baseadas em autenticações • A árvore ao lado, dá autorização a uma aplicação com a assinatura “A” ou “B” Data Manager • Dá suporte a banco de dados seguros • Utiliza o Authorization Manager para tratar as permissões de acesso aos dados Banco de dados seguros • Quando se cria uma base de dados segura, o acesso aos dados é dado apenas ao criador, que é o único que tem permissão de modificar as regras de controle de acesso • Dessa forma, uma aplicação que crie um banco de dados seguros deve modificar as regras de controle que desejar disponibilizar para outras Banco de dados seguros AzmRuleSetType dbRuleSet; AmTokenType usertoken; UInt32 action = dbActionRead | dbActionWrite | dbActionDelete | dbActionBackup | dbActionRestore | dbActionEditSchema; // Create DB – get AZM ruleset reference DbCreateSecureDatabase(“My DB”, ‘crea’, ‘type’, numSchemas, schemaList, &dbRuleSet, &dbID); // Set user password required for ALL actions AmGetTokenBySystemId(&usertoken, SysUserToken); AzmAddRule(dbRuleSet, action , "%t", usertoken); Componentes Segurança e Criptografia Dúvidas? Dúvidas