Escolar Documentos
Profissional Documentos
Cultura Documentos
4 O MiddlewaredoCartaodeCidadao Manualtecnico
4 O MiddlewaredoCartaodeCidadao Manualtecnico
Este documento apresenta a descrio das interfaces disponibilizadas pelo middlewaredo Carto de Cidado. Destina-se a tcnicos, analistas e arquitectos de tecnologias de informao com o objectivo de promover o desenvolvimento de aplicaes que interajam com o novo documento de identificao nacional.
Tabela de Contedos
1. 2. Viso Global.........................................................................................................4 Documentao CSP.............................................................................................6 2.1. 2.2. Introduo ...................................................................................................6 A interface Crypto API ..............................................................................6 CryptAcquireContext..........................................................................7 CryptReleaseContext...........................................................................8 CryptGenerateKey...............................................................................8 CryptDeriveKey...................................................................................9 CryptDestroyKey.................................................................................9 CryptSetKeyParam..............................................................................9 CryptGetKeyParam ...........................................................................10 CryptSetProvParam...........................................................................10 CryptGetProvParam..........................................................................10 CryptSetHashParam..........................................................................11 CryptGetHashParam.........................................................................11 CryptExportKey.................................................................................11 CryptImportKey ................................................................................12 CryptEncrypt......................................................................................12 CryptDecrypt......................................................................................13 CryptCreateHash...............................................................................13 CryptHashData ..................................................................................14 CryptHashSessionKey ......................................................................14 CryptSignHash...................................................................................14 CryptDestroyHash ............................................................................15 CryptVerifySignature........................................................................15 CryptGenRandom .............................................................................15 CryptGetUserKey ..............................................................................16 CryptDuplicateHash .........................................................................16 CryptDuplicateKey............................................................................16
2.2.1. 2.2.2. 2.2.3. 2.2.4. 2.2.5. 2.2.6. 2.2.7. 2.2.8. 2.2.9. 2.2.10. 2.2.11. 2.2.12. 2.2.13. 2.2.14. 2.2.15. 2.2.16. 2.2.17. 2.2.18. 2.2.19. 2.2.20. 2.2.21. 2.2.22. 2.2.23. 2.2.24. 2.2.25. 3.
3.1.
A interface PKCS#11................................................................................17 Chamadas API implementadas ....................................................17 Funes Gerais...............................................................................17 Funes de gesto de Slot e token ..............................................17 Funes de gesto de sesso........................................................17 Funes de gesto de objectos.....................................................18 Funes de assinatura ..................................................................18 Funes de digest..........................................................................18 Funes de gerao aleatria (a aguardar confirmao).........18 3.1.1.1. 3.1.1.2. 3.1.1.3. 3.1.1.4. 3.1.1.5. 3.1.1.6. 3.1.1.7.
3.1.1.
3.1.2. 3.1.3. 3.1.4. 4. 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 4.9. 4.10. 4.11.
Mecanismos de assinatura suportados...........................................18 Informaes de Slot e token .............................................................19 Comportamento da chave de no-repdio....................................19
Documentao eID Lib API .............................................................................20 Gesto de verses e compatibilidade ....................................................20 Insero de PIN.........................................................................................20 Aplicao Multi-threaded .......................................................................21 Organizao API.......................................................................................21 Funes de Initialisation e termination.................................................21 Funes de Identity..................................................................................21 Funes General purpose de alto nvel.................................................22 Funes relacionadas com CVC .............................................................22 Detalhes da API C/C++ ..........................................................................23 Caching de ficheiros.................................................................................33 Cdigos de Erro ........................................................................................33
3/35
May 2007
1.
Viso Global
As seguintes interfaces podem ser encontradas no middleware do Carto de Cidado: CryptoAPI/CSP PKCS#11 eID lib ( = a SDK ou Software Development Kit)
A CSP est apenas disponvel em ambiente Windows; as outras 2 bibliotecas esto disponveis em Windows, Linux e Mac OS X. As primeiras 2 interfaces so APIs standard para operaes criptogrficas; a eID lib tem uma API nonstandard que direccionada funcionalidade no-criptogrfica do Carto de Cidado. No Windows, estas bibliotecas podem ser encontradas na pasta System32; no Mac OS X no directrio /usr/local/lib e em Linux depende do directrio de instalao. Este documento fornece informao para programadores sobre como desenvolver aplicaes com base nestas interfaces. Para informaes ou guias sobre como usar estas bibliotecas, por favor consulte os Manuais de Utilizador respectivos. Adicionalmente, as seguintes aplicaes esto presentes no middleware: eID GUI Esta aplicao pode ser usada para ver e gerir a informao no carto eID: Ler e mostrar informao sobre o cidado e fotografia Ler e mostrar a morada do cidado Ler os certificados do governo e do cidado Registar os certificados do governo e do cidado (apenas Windows) Gesto de cdigos PIN (Testar o PIN, Alterar o PIN) Gerir a Pasta pessoal Ver informao especfica de ministrios
Tray applet Esta aplicao instalada como uma funcionalidade da rea de notificao. No Windows, aparece normalmente no canto inferior direito do ecr, no Mac no canto superior direito do ecr. Quando activada (o utilizador pode
Technical manual for the Portuguese eID Middleware 1.0
4/35
May 2007
desactiv-la), verifica se um carto eID est inserido. Aps inserir o carto ser mostrada a fotografia do cidado durante uns segundos. Ir tambm registar automaticamente (se esta opo estiver activada) os certificados do carto na Microsoft certificate store, caso ainda no estejam registados. Quando o carto removido os certificados registados so automaticamente removidos da certificate store (se esta opo estiver activada). Este modo tambm conhecido como modo Kiosk. Esta funcionalidade a nvel de certificados apenas implementada na plataforma Windows devido s outras plataformas (Mac e Linux) no suportarem o conceito de certificate stores. Por favor consulte o Manual de Utilizador para mais informao sobre estas aplicaes.
5/35
May 2007
2.
Para as aplicaes standard Microsoft (Office, Outlook...) criado um Cryptographic Service Provider (CSP) que implementa as operaes criptogrficas do smartcard. Uma aplicao nunca chamar esta implementao directamente mas sim atravs de uma interface standard chamada Crypto API. A implementao CSP utiliza a segunda interface implementada, PKCS#11. Esta interface usada por aplicaes no standard Microsoft. Quando uma nova aplicao criada, o programador que decide qual das
Aplicaes no Microsoft
PKCS#11
conhecerem a implementao subjacente, da mesma forma que podem usar uma biblioteca grfica sem terem conhecimento sobre a configurao de hardware. A componente CSP do middleware estabelece a ligao entre a abstracta CryptoAPI e a interface PKCS#11 subjacente. O programador nunca ir chamar nenhuma das funes do CSP directamente mas sim atravs da CryptoAPI. Nas seces abaixo ser apresentada uma descrio das chamadas API que a CryptoAPI encaminha para o CSP para processamento. Este documento no fornece informao detalhada sobre a operao de cada chamada API. Para este tipo de informao por favor consulte a Microsoft Developer Network (MSDN). O carto de identidade Portugus apenas suporta operaes de assinatura digital. Todas as funes no relacionadas com esta operao criptogrfica no so implementadas. O carto contm dois pares de chaves que podem ser usados para assinaturas digitais; o primeiro para autenticao e o segundo para no-repudio (assinaturas legalmente vinculativas). Devido a isto alguns parmetros passados para as funes da CryptoAPI no tm significado. Por exemplo na chamada API CryptGetUserKey passado um parmetro chamado dwKeySpec. Este parmetro usado para definir qual o tipo de chave a obter, AT_KEYEXCHANGE ou AT_SIGNATURE. No entanto, no caso do CSP do Carto de Cidado este parmetro no suficiente para determinar qual a chave de assinatura a carregar. Neste caso o contentor que contm o certificado correcto deve ser passado para CryptAcquireContext e ento a chamada para a funo CryptGetUserKey ser completada com sucesso. Apesar do CSP apenas suportar assinaturas digitais, est mesmo assim registado como um CSP de tipo PROV_RSA_FULL. Isto feito de forma a permitir a utilizao do CSP em aplicaes standard Microsoft. Chamar funes da Crypto API que no so usadas num contexto de assinatura digital resultar num erro indicando que a funcionalidade no est implementada.
2.2.1. CryptAcquireContext
BOOL WINAPI CryptAcquireContext(HCRYPTPROV *phProv, LPCTSTR pszContainer, LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags);
7/35
May 2007
O parmetro pszContainer contm o nome do key container que tem uma determinada chave do carto. Os nomes dos containers existentes no carto podem ser obtidos atravs de uma chamada funo CryptGetProvParam. O parmetro dwFlags pode ser definido para os seguintes valores (de acordo com a MSDN): 0 (equivalente a CRYPT_SCKEYSET) CRYPT_VERIFYCONTEXT CRYPT_NEWKEYSET CRYPT_MACHINE_KEYSET CRYPT_DELETEKEYSET Como a informao relativa a chaves do Carto de Cidado est guardada num smartcard e o utilizador no tem permisses para criar novos conjuntos de chaves, os valores CRYPT_NEWKEYSET, CRYPT_MACHINE_KEYSET e CRYPT_DELETEKEYSET no so suportados. A utilizao destes valores ir gerar o erro NTE_BAD_FLAGS. Est definido para este parmetro um valor extra, CRYPT_SCKEYSET. Com este valor o programador define que adquirido um contexto para a chave, definido no parmetro pszContainer. utilizado base CSP, somente para operaes de hashing. Se por algum motivo o carregamento do base CSP falhar, ento o seguinte cdigo de erro ser definido atravs de SetLastError(): ERR_CANNOT_LOAD_BASE_CSP (0x1000)
2.2.2. CryptReleaseContext BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags); Esta chamada API implementada tal como definido pela MSDN.
2.2.3. CryptGenerateKey BOOL WINAPI CryptGenKey( HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey);
Technical manual for the Portuguese eID Middleware 1.0 8/35 May 2007
Visto que as chaves e certificados do Carto de Cidado so pr-instalados pelo governo e o utilizador no tem permisses para criar novos pares de chaves, esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs do SetLastError ().
2.2.4. CryptDeriveKey BOOL WINAPI CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey); Visto que esta funcionalidade refere-se apenas a chaves de encryptao e estas no esto presentes no carto, esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs do SetLastError ().
2.2.5. CryptDestroyKey BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey); Visto que as chaves e certificados do Carto de Cidado so pr-instalados pelo governo e o utilizador no tem permisses para criar novos pares de chaves, esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs do SetLastError ().
2.2.6. CryptSetKeyParam BOOL WINAPI CryptSetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags); Visto que as chaves e certificados do Carto de Cidado so pr-instalados pelo governo e o utilizador no tem permisses para criar novos pares de chaves, esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs do SetLastError ().
9/35
May 2007
2.2.7. CryptGetKeyParam BOOL WINAPI CryptGetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pcbData, DWORD dwFlags); Since the key material on the Portuguese identity card is pre-installed by the government and the user does not have the permissions to create additional key pairs, this API call is not implemented. Calling this function anyway, will generate the error E_NOTIMPL set through SetLastError ().
2.2.8. CryptSetProvParam BOOL WINAPI CryptSetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD dwFlags); De acordo com a documentao da MSDN o parmetro dwParam pode ser definido para os seguintes valores: PP_CLIENT_HWND PP_KEYSET_SEC_DESCR O ltimo parmetro no faz sentido visto que no possvel escrever informao sobre as chaves no carto. Este parmetro dever ser ignorado.
2.2.9. CryptGetProvParam BOOL WINAPI CryptGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pcbData, DWORD dwFlags); Esta chamada API implementada com base na documentao MSDN excepo do parmetro PP_KEYSET_SEC_DESCR, que ignorado.
Technical manual for the Portuguese eID Middleware 1.0 10/35 May 2007
Para o parmetro PP_IMPTYPE devolvido o valor CRYPT_IMPL_MIXED porque a operao de assinatura executada pelo hardware (smartcard) enquanto que a operao de hashing executada pelo base cryptographic provider.
2.2.10. CryptSetHashParam BOOL WINAPI CryptSetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD dwFlags); Esta chamada API implementada com base na documentao MSDN. O parmetro dwParam = HP_HASHVAL implementado mas deve ser usado com cuidado. Este parmetro foi definido de forma a dar s aplicaes a possibilidade de assinar hash values, sem ter acesso base data. Porque a aplicao (e muito menos o utilizador) no pode ter ideia do que est a ser assinado, esta operao intrinsecamente arrisacada.
2.2.11. CryptGetHashParam BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pcbData, DWORD dwFlags); Esta chamada API implementada com base na documentao MSDN.
2.2.12. CryptExportKey BOOL WINAPI CryptExportKey(HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pcbDataLen);
Technical manual for the Portuguese eID Middleware 1.0
11/35
May 2007
Esta funo pode ser usada para exportar a chave pblica associada ao parmetro hKey. O handle de uma chave pblica pode ser obtido atravs de uma chamada funo CryptGetUserKey. Visto que as chaves privadas esto guardadas num smartcard e a exportao destas no permitida, apenas PUBLICKEYBLOB pode ser definido como dwBlobType. Devido ao facto de apenas as chaves pblicas poderem ser exportadas, o parmetro hExpKey no utilizado e deve portanto ser definido como NULL. A chave pblica retornada como parmetro pbData. Para obter o comprimento dos dados o parmetro pbData deve ser definido como NULL. O comprimento dos dados que ser devolvido ento colocado no parmetro pcbDataLen. Se o buffer para esta funo no for suficientemente grande, ser devolvido o erro ERROR_MORE_DATA, e o valor correcto para o comprimento do buffer ser colocado no parmetro pcbDataLen.
2.2.13. CryptImportKey BOOL WINAPI CryptImportKey(HCRYPTPROV hProv, BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey); Visto que os chaves e certificados do Carto de Cidado so pr-instalados pelo governo e o utilizador no tem permisses para criar pares de chaves adicionais, esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs de SetLastError ().
2.2.14. CryptEncrypt BOOL WINAPI CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pcbData, DWORD cbBuffer);
12/35
May 2007
Tal como estipulado pelo Governo Portugus, no suportada a utilizao das chaves para encriptao. Deste modo esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs de SetLastError (). Caso no futuro sejam adicionadas chaves de encriptao ao Carto de Cidado, ento esta funo ser tambm implementada.
2.2.15. CryptDecrypt BOOL WINAPI CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pcbData); Tal como estipulado pelo Governo Portugus, no suportada a utilizao das chaves para encriptao. Deste modo esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs de SetLastError (). Caso no futuro sejam adicionadas chaves de encriptao ao Carto de Cidado, ento esta funo ser tambm implementada.
2.2.16. CryptCreateHash BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash); Esta chamada API implementada com base na documentao MSDN. Um erro adicional pode ser devolvido atravs de SetLastError (): ERR_INVALID_PROVIDER_HANDLE (0x1001) Este erro indica que o handle esperado por hProv no foi encontrado (no foi criado usando CryptAcquireContext ()) O processamento desta chamada delegado a uma base CSP.
13/35
May 2007
2.2.17. CryptHashData BOOL WINAPI CryptHashData(HCRYPTHASH hHash, BYTE *pbData, DWORD cbData, DWORD dwFlags); Esta chamada API implementada com base na documentao MSDN. No parmetro dwFlags um valor (excepto 0) pode ser especificado: CRYPT_USERDATA. Dependendo da base CSP escolhida poder ou no ser implementado. Por exemplo a Microsoft Base CSP no implementa este parmetro. O processamento desta chamada delegado a uma base CSP.
2.2.18. CryptHashSessionKey BOOL WINAPI CryptHashSessionKey(HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags); Visto que algumas das chamadas subjacentes necessrias para usar esta funo no so de momento implementadas por este CSP, esta chamada tambm no est disponvel. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs de SetLastError ().
2.2.19. CryptSignHash BOOL WINAPI CryptSignHash(HCRYPTHASH hHash, DWORD dwKeySpec, LPCTSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen); Esta chamada API implementada com base na documentao MSDN. Quando esta funo chamada, efectuada uma tentativa de conexo ao Carto de Cidado (smartcard). Se alguma destas operaes falhar, o seguinte erro pode ser gerado atravs de SetLastError (): ERR_CANNOT_LOGON_TO_TOKEN (0x1004)
Technical manual for the Portuguese eID Middleware 1.0 14/35 May 2007
De modo a assinar os dados hash, necessrio ler alguma informao (por exemplo o comprimento da chave) do smartcard. Caso ocorra um erro durante esta operao a seguinte mensagem de erro ser gerada atravs de SetLastError (): ERR_CANNOT_GET_TOKEN_SLOT_INFO (0x1003) O mecanismo de assinatura utilizado para produzir assinaturas digitais CKM_RSA_PKCS. Por favor consulte a documentao PKCS#11 para informao detalhada sobre este mecanismo. Os seguintes algoritmos de hashing podem ser usados para assinatura de dados: MD2, MD4, MD5, SHA-1 e SSL3 SHAMD5. Apesar dos algoritmos de hashing MDx ainda estarem disponvels para retrocompatibilidade, aconselhado o uso de SHA-1 para novas aplicaes.
2.2.20. CryptDestroyHash BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash); Esta chamada API implementada com base na documentao MSDN.
2.2.21. CryptVerifySignature BOOL WINAPI CryptVerifySignature(HCRYPTHASH hHash, BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCTSTR sDescription, DWORD dwFlags); Esta funo implementada por motivos de convenincia. Esta chamada delegada para a base CSP.
2.2.22. CryptGenRandom BOOL WINAPI CryptGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer);
15/35
May 2007
Esta chamada API implementada com base na documentao MSDN. Os dados inseridos atravs de pbBuffer sero usados como origem para a gerao aleatria.
2.2.23. CryptGetUserKey BOOL CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey); Esta chamada devolve um handle para a chave pblica do contentor de chaves que foi definido atravs de CryptAcquireContext. Especificar AT_SIGNATURE para o parmetro dwKeySpec no suficiente porque com essa informao o CSP no consegue determinar que chave de assinatura devolver. Por este motivo a chave a carregar tem de ser primeiro especificada atravs de CryptAcquireContext.
2.2.24. CryptDuplicateHash BOOL WINAPI CryptDuplicateHash(HCRYPTHASH hHash, DWORD *pdwReserved, DWORD dwFlags, HCRYPTHASH phHash); Esta chamada API implementada com base na documentao MSDN.
2.2.25. CryptDuplicateKey BOOL WINAPI CryptDuplicateKey(HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY* phKey); Visto que as chaves e certificados so guardados no smartcard, esta chamada API no implementada. Chamar esta funo ir gerar o erro E_NOTIMPL definido atravs de SetLastError ().
16/35
May 2007
3.
A interface PKCS#11 (v2.20) utilizada por aplicaes no Microsoft como por exemplo o Netscape. Aplicaes desenvolvidas podem recorrer a este interface em vez do interface CryptoAPI. A interface PKCS#11 por vezes chamada de Cryptoki. Uma descrio detalhada desta interface est disponvel no website da RSA Laboratories (http://www.rsasecurity.com/rsalabs/pkcs/pkcs-11/).
C_GetSlotList C_GetSlotInfo C_GetTokenInfo C_GetMechanismList C_GetMechanismInfo C_WaitForSlotEvent (only non-blocking) C_SetPin 3.1.1.3. Funes de gesto de sesso
C_DigestInit C_Digest C_DigestUpdate C_DigestFinal 3.1.1.7. Funes de gerao aleatria (a aguardar confirmao)
C_SeedRandom C_GenerateRandom
3.1.2. Mecanismos de assinatura suportados Para assinaturas: CKM_RSA_PKCS: both ASN.1-wrapped e hashes puros (MD5, SHA1, SHA1+MD5, RIPEMD160) CKM_RIPEMD160_RSA_PKCS, CKM_SHA1_RSA_PKCS, CKM_MD5_RSA_PKCS
Para digests:
Technical manual for the Portuguese eID Middleware 1.0 18/35 May 2007
3.1.3. Informaes de Slot e token O carto ser representado como um token PKCS#11 com o PIN de Autenticao do Cidado servindo como User PIN; no est presente nenhum SO PIN. O PIN de Assinatura do Cidado estar ocultado; caso seja necessrio este ser requisitado atravs de uma caixa de dilogo. As chaves pblicas, chaves privadas e os certificados que faam parte do mesmo conjunto tero o mesmo atributo no objecto CKA_ID.
3.1.4. Comportamento da chave de no-repdio Se uma assinatura for solicitada com esta chave, a prpria biblioteca PKCS#11 mostrar uma caixa de dilogo pedindo ao utilizador para inserir o PIN.
19/35
May 2007
4.
A SDK est destinada a organizaes cujo objectivo seja desenvolver aplicaes que utilizam o Carto de Cidado. Este kit de desenvolvimento lida apenas com os dados identificativos do cidado e no com operaes criptogrficas. O kit de desenvolvimento fornecido como: Uma interface C/C++, como biblioteca dinmica Uma biblioteca Java wrapper (JNI) sobre uma interface C/C++ Uma biblioteca C# wrapper para .NET sobre uma interface C/C++
20/35
May 2007
21/35
May 2007
Funes:
PTEID_GetID() PTEID_GetAddr() PTEID_GetPic() PTEID_GetCertificates() PTEID_GetPINs() PTEID_GetTokenInfo()
( char *
pszPin,
unsigned char * pucDate, unsigned long ulMode ) Activar o carto (= actualizar um ficheiro especfico do carto). Caso o carto j tenha sido activado, devolvido o erro SC_ERROR_NOT_ALLOWED. Parmetros: pszPin in: valor do PIN de Activao pucDate in: a data corrente no formato DD MM YY YY em formato BCD (4 bytes), ex: {0x17 0x11 0x20 0x06} para 17 de Novembro de 2006) ulMode in: modo: MODE_ACTIVATE_BLOCK_PIN para bloquear o PIN de Activao, ou 0 para o inverso (deve apenas ser usado para testes).
23/35
May 2007
Mudar um PIN. Parmetros: PinId in: o PIN ID, ver o registo PTEID_Pins pszOldPin in: o valor actual do PIN, caso seja NULL o PIN ser solicitado ao utilizador pszNewPin in: o novo valor do PIN, caso seja NULL o PIN ser solicitado ao utilizador triesLeft out: as restantes tentativas de PIN
pucSignedChallenge, iSignedChallengeLen
Concluir a autenticao CVC com o carto, para ser chamado aps PTEID_CVC_Init() Parmetros: pucSignedChallenge in: no challenge que foi assinado pela chave privada correspondente ao CVC iSignedChallengeLen in: o comprimento de ucSignedChallenge tem de ser 128
PTEIDLIB_API long PTEID_CVC_GetAddr( PTEID_ADDR * AddrData ) Ler o ficheiro de morada sobre um canal CVC e colocar os contedos num registo PTEID_ADDR. PTEID_CVC_Init() e PTEID_CVC_Authenticate() bem sucedidos tero de ser efectuados anteriormente. Parmetros: AddrData out: o endereo de um registo PTEID_ADDR
24/35
May 2007
Iniciar uma autenticao CVC com o carto. O challenge resultante dever ser assinado com a chave privada correspondente ao certificado CVC (raw RSA signature) e fornecido na funo PTEID_CVC_Authenticate(). Parmetros: pucCert iCertLen pucChallenge iChallengeLen
in: o CVC como um byte array in: o comprimento de ucCert out: o challenge que ser assinado pela chave CVC privada in: o comprimento reservado para ucChallenge, deve ser 128
Ler os contedos de um ficheiro sobre um canal CVC. PTEID_CVC_Init() e PTEID_CVC_Authenticate() bem sucedidos tero de ser efectuados anteriormente. Se *outlen for menor que os contedos do ficheiro, apenas os bytes *outlen sero lidos. Se *outlen for maior os contedos do ficheiro so devolvidos sem erro. Parmetros: file in: o caminho do ficheiro a ler (e.g. {0x3F, 0x00, 0x5F, 0x00, 0xEF, 0x05} filelen in: o coprimento do caminho do ficheiro (ex: 6) out out: o buffer para armazenar os contedos do ficheiro outlen out: o nmero de bytes a ler / nmero de bytes lidos.
25/35
May 2007
PTEIDLIB_API long PTEID_CVC_WriteAddr( const PTEID_ADDR * AddrData ) Escrever o ficheiro de endereo sobre um canal CVC. PTEID_CVC_Init() e PTEID_CVC_Authenticate() bem sucedidos tero de ser efectuados anteriormente. Parmetros: AddrData in: o endereo de um registo PTEID_ADDR
( unsigned char * int unsigned long const unsigned char * unsigned long unsigned long )
Escrever para um ficheiro no carto sobre um canal CVC PTEID_CVC_Init() e PTEID_CVC_Authenticate() bem sucedidos tero de ser efectuados anteriormente Parmetros: file in: o caminho do ficheiro a ler (ex: {0x3F, 0x00, 0x5F, 0x00, 0xEF, 0x05} ) filelen in: o comprimento do caminho do ficheiro (ex: 6) ulFileOffset in: escolher qual o offset no ficheiro por onde iniciar a escrita in in: os contedos do ficheiro inlen in: o nmero de bytes a escrever ulMode in: definir como CVC_WRITE_MODE_PAD para preencher o ficheiro com zeros se (ulFileOffset + inlen) for menor que o comprimento do ficheiro
Esta funo chama PTEID_CVC_WriteFile() com o ficheiro SOD file como caminho. Parmetros: ulFileOffset in: escolher qual o offset no ficheiro por onde iniciar a escrita in in: os contedos do ficheiro
Technical manual for the Portuguese eID Middleware 1.0 26/35 May 2007
inlen ulMode
in: o nmero de bytes a escrever in: definir como CVC_WRITE_MODE_PAD para preencher o ficheiro com zeros se (ulFileOffset + inlen) for menor que o comprimento do ficheiro
PTEIDLIB_API long PTEID_Exit( unsigned long ulMode ) Limpa todos os dados usados pelo toolkit. Esta funo tem que ser chamada no final do programa. Parmetros: ulMode in: modo de sada, PTEID_EXIT_LEAVE_CARD ou PTEID_EXIT_UNPOWER
PTEIDLIB_API long PTEID_GetAddr( PTEID_ADDR * AddrData ) Ler os dados de Morada: Parmetros: AddrData out: o endereo do registo PTEID_ADDR
PTEIDLIB_API long PTEID_GetCertificates ( PTEID_Certifs * Ler todos os certificados pessoais e de CA Parmetros: Certifs out: o endereo do registo PTEID_Certifs
Certifs )
( PTEID_RSAPublicKey * pCVCRootKey
Obter a chave pblica CVC CA que este carto utilize para verificar a chave CVC; permitir que a aplicao seleccione o certificado CVC correcto para este carto. No ser alocada nenhuma memria para o registo PTEID_RSAPublicKey struct por isso os campos modulus e exponent devero ter memria suficiente alocada para guardar os respectivos valores; e a quantidade de memria deve ser dada nos campos Lenght. Por exemplo: unsigned char modulus[128]; unsigned char exponent[3]; PTEID_RSAPublicKey CVCRootKey = {modulus, sizeof(modulus), exponent,
Technical manual for the Portuguese eID Middleware 1.0 27/35 May 2007
sizeof(exponent)}; Aps retorno bem sucedido, os campos modulusLength e exponentLenght iro conter os correctos modulus length resp. exponent length. Parmetros: pCVCRootKey in: o endereo do registo PTEID_RSAPublicKey
PTEIDLIB_API long PTEID_GetID( PTEID_ID * IDData ) Ler os dados de Identificao Parmetros IDData out: o endereo do registo PTEID_ID
PTEIDLIB_API long PTEID_GetPic( PTEID_PIC * PicData ) Ler a fotografia. Parmetros: PicData out: o endereo do registo PTEID_PIC
PTEIDLIB_API long PTEID_GetPINs( PTEID_Pins * Pins ) Devolver os PINs (listados nos ficheiros PKCS15). Parmetros: Pins out: o endereo do registo PTEID_Pins
PTEIDLIB_API long PTEID_GetTokenInfo( PTEID_TokenInfo * tokenData ) Devolver os contedos de PKCS15 TokenInfo. Parmetros: tokenData out: o endereo do registo PTEID_TokenInfo
PTEIDLIB_API long PTEID_Init( char * ReaderName ) Inicializa o toolkit. Esta funo deve ser chamada antes de qualquer outra; tenta efectuar uma ligao ao carto e caso no esteja inserido nenhum carto devolvido um erro. Quando o
Technical manual for the Portuguese eID Middleware 1.0
28/35
May 2007
carto removido do leitor, esta funo tem que ser chamada novamente. Parmetros: ReaderName in: o nome do leitor PCSC (tal como devolvido por SCardListReaders()), especifique NULL se quiser seleccionar o primeiro leitor
PTEIDLIB_API long PTEID_IsActivated( unsigned long * pulStatus ) Obter o estado de activao do carto. Parmetros: pulStatus out: o estado de activao: 0 se no estiver activo, 1 se activado
Ler um ficheiro no carto. Se uma referncia PIN fornecida e necessria para ler o ficheiro, o PIN ser solicitado e verificado se necessrio. Se *outlen for menor que os contedos do ficheiro, apenas os bytes *outlen sero lidos. Se *outlen for maior os contedos do ficheiro so devolvidos sem erro. Parmetros: file in: um byte array contendo o caminho do ficheiro, como por exemplo {0x3F, 0x00, 0x5F, 0x00, 0xEF, 0x02}, para o ficheiro ID filelen in: comprimento do ficheiro out out: o buffer que guarda os contedos do ficheiro outlen in/out: nmero de bytes alocados / nmero de bytes lidos PinId in: o ID do PIN de Morada (apenas necessrio aquando da leitura do ficheiro de Morada)
( unsigned char *
out,
29/35
May 2007
Ler os contedos do ficheiro SOD a partir do carto. Esta funo chama PTEID_ReadFile() com o ficheiro SOD como caminho. Se *outlen for menor que os contedos do ficheiro, apenas os bytes *outlen sero lidos. Se *outlen for maior os contedos do ficheiro so devolvidos sem erro. Parmetros: out out: o buffer para guardar os contedos do ficheiro outlen in/out: nmero de bytes alocados / nmero de bytes lidos
adf, adflen
Seleccionar um Application Directory File (ADF) atravs da AID (Application ID). Parmetros adf in: a AID da ADF adflen in: o comprimento
( PTEID_Certifs * Certifs )
Especificar os certificados (raiz) que so usados para assinar os certificados DocumentSigner no ficheiro SOD. (O ficheiro SOD no carto est assinado por um certificado Document Signer, e este certificado est tambm no SOD) Por omisso, esta biblioteca l os certificados que esto presentes no directrio %appdir%/eidstore/certs (%appdir% corresponde ao directrio onde a aplicao reside). Se este directrio no existir (ou no contiver os certificados correctos para o carto), dever chamar esta funo para o especificar; ou desactivar a verificao SOD com a funo PTEID_SetSODChecking(). Se chamar esta funo novamente com o parmetro NULL, os certificados default sero novamente usados. Parmetros: Certifs in: o endereo de PTEID_Certifs, ou NULL
30/35
May 2007
Verificao SOD significa que a validade dos dados de identificao, morada, fotografia e chave pblica de autenticao do carto, verificada de modo a assegurar que no falsificada. Este processo efectuado atravs da leitura do ficheiro SOD que contm hashes sobre os dados mencionados acima e est assinada por um certificado DocumentSigner. Parmetros: bDoCheck in: true para activar verificao SOD checking, false para desactivar
Desbloquear PIN com alterao de PIN. Se pszPuk == NULL ou pszNewPin == NULL, uma caixa de dilogo mostrada solicitando o PUK e o novo PIN Parmetros: PinId pszPuk pszNewPin triesLeft
in: o PIN ID, ver o registo PTEID_Pins in: o valor PUK, se NULL ser solicitado o PUK ao utilizador. in: o novo PIN, se NULL ser solicitado o PIN ao utilizador. out: o nmero restante de tentativas PUK
Funcionalidade estendida de desbloqueio de PIN Ex: chamar PTEID_UnblockPIN_Ext() com ulFlags = UNBLOCK_FLAG_NEW_PIN o mesmo que chamar PTEID_UnblockPIN(...) Parmetros: PinId pszPuk
in: o PIN ID, ver o registo PTEID_Pins in: o valor PUK, se NULL ser solicitado o PUK ao utilizador.
31/35 May 2007
pszNewPin in: o novo PIN, se NULL ser solicitado o PIN ao utilizador. triesLeft out: o nmero restante de tentativas PUK ulFlags in: flags: 0, UNBLOCK_FLAG_NEW_PIN, UNBLOCK_FLAG_PUK_MERGE ou UNBLOCK_FLAG_NEW_PIN | UNBLOCK_FLAG_PUK_MERGE
Verificar um PIN. Parmetros: PinId in: o PIN ID, ver o registo PTEID_Pins Pin in: o valor PIN, se NULL ser solicitado o PIN ao utilizador. triesLeft out: o nmero restante de tentativas PIN
Escrever dados para um ficheiro no carto. Se for fornecida uma referncia PIN, este ser solicitado e verificado se necessrio (verificao just-in-time). Esta funo aplica-se apenas a escrita no ficheiro Personal Data. Parmetros: file in: um array de bytes, contendo o caminho para o ficheiro. Ex: {0x3F, 0x00, 0x5F, 0x00, 0xEF, 0x02} para o ficheiro ID filelen in: comprimento do ficheiro in in: os dados a ser escritos no ficheiro inlen in: o comprimento dos dados a escrever PinId in: o ID do PIN de Autenticao, ver o registo PTEID_Pins
32/35
May 2007
O ficheiro de morada no cached pois pode vir a mudar e porque contm dados protegidos por PIN. O ficheiro SOD pode tambm vir a mudar por isso uma pequena parte do SOD lido do carto para verificar se a SOD que foi cached ainda est actualizada. Caso no esteja, o ficheiro completo lido do carto e copiado novamente para o disco rgido. Nota para CVC: existe uma flag no middleware que regista quando o SOD foi lido e, por exemplo, quando efectua um GetID() e depois GetAddress(), o SOD no lido novamente para verificar a validade dos dados de Morada. Como excepo, quando CVC_Write_XXX() chamado, feito um reset flag.
0 /* Function succeeded */ 1 /* Invalid parameter (NULL 2 /* An internal consistency check 3 /* The data buffer to receive 4 /* Input on pinpad cancelled */ 5 /* Timout returned from pinpad */ 6 /* The two PINs did not match */ 7 /* Message too long on pinpad */
33/35
May 2007
#define PTEID_E_INVALID_PIN_LENGTH #define PTEID_E_NOT_INITIALIZED #define PTEID_E_UNKNOWN detected, but the source is unknown */
8 /* Invalid PIN length */ 9 /* Library not initialized */ 10 /* An internal error has been
Return codes da biblioteca open-source subjacente pteidlibopensc - Licena LGPL: /* Erros relativos a operaes do leitor */ #define SC_ERROR_READER #define SC_ERROR_NO_READERS_FOUND #define SC_ERROR_SLOT_NOT_FOUND #define SC_ERROR_SLOT_ALREADY_CONNECTED #define SC_ERROR_CARD_NOT_PRESENT #define SC_ERROR_CARD_REMOVED #define SC_ERROR_CARD_RESET #define SC_ERROR_TRANSMIT_FAILED #define SC_ERROR_KEYPAD_TIMEOUT #define SC_ERROR_KEYPAD_CANCELLED #define SC_ERROR_KEYPAD_PIN_MISMATCH #define SC_ERROR_KEYPAD_MSG_TOO_LONG #define SC_ERROR_EVENT_TIMEOUT #define SC_ERROR_CARD_UNRESPONSIVE #define SC_ERROR_READER_DETACHED #define SC_ERROR_READER_REATTACHED -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115
/* Resultantes de um comando de carto ou relacionado com o carto */ #define SC_ERROR_CARD_CMD_FAILED #define SC_ERROR_FILE_NOT_FOUND #define SC_ERROR_RECORD_NOT_FOUND #define SC_ERROR_CLASS_NOT_SUPPORTED #define SC_ERROR_INS_NOT_SUPPORTED #define SC_ERROR_INCORRECT_PARAMETERS #define SC_ERROR_WRONG_LENGTH #define SC_ERROR_MEMORY_FAILURE #define SC_ERROR_NO_CARD_SUPPORT #define SC_ERROR_NOT_ALLOWED #define SC_ERROR_INVALID_CARD #define SC_ERROR_SECURITY_STATUS_NOT_SATISFIED #define SC_ERROR_AUTH_METHOD_BLOCKED
Technical manual for the Portuguese eID Middleware 1.0 34/35
-1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212
May 2007
/* Devolvidos pela biblioteca OpenSC quando invocada com argumentos invlidos */ #define SC_ERROR_INVALID_ARGUMENTS #define SC_ERROR_CMD_TOO_SHORT #define SC_ERROR_CMD_TOO_LONG #define SC_ERROR_BUFFER_TOO_SMALL #define SC_ERROR_INVALID_PIN_LENGTH /* Resultantes de operaes internas da biblioteca OpenSC */ #define SC_ERROR_INTERNAL #define SC_ERROR_INVALID_ASN1_OBJECT #define SC_ERROR_ASN1_OBJECT_NOT_FOUND #define SC_ERROR_ASN1_END_OF_CONTENTS #define SC_ERROR_OUT_OF_MEMORY #define SC_ERROR_TOO_MANY_OBJECTS #define SC_ERROR_OBJECT_NOT_VALID #define SC_ERROR_OBJECT_NOT_FOUND #define SC_ERROR_NOT_SUPPORTED #define SC_ERROR_PASSPHRASE_REQUIRED #define SC_ERROR_EXTRACTABLE_KEY #define SC_ERROR_DECRYPT_FAILED #define SC_ERROR_WRONG_PADDING #define SC_ERROR_WRONG_CARD /* Relacionados com o PKCS #15 init */ #define SC_ERROR_PKCS15INIT #define SC_ERROR_SYNTAX_ERROR #define SC_ERROR_INCONSISTENT_PROFILE #define SC_ERROR_INCOMPATIBLE_KEY #define SC_ERROR_NO_DEFAULT_KEY #define SC_ERROR_ID_NOT_UNIQUE #define SC_ERROR_CANNOT_LOAD_KEY /* Erros que no se enquadram nas categorias acima */ #define SC_ERROR_UNKNOWN #define SC_ERROR_PKCS15_APP_NOT_FOUND
Technical manual for the Portuguese eID Middleware 1.0 35/35
-1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413
-1900 -1901
May 2007