SlideShare a Scribd company logo
1 of 39
The Development of the new
Free/Opensource Portuguese Card Citizen
middleware




Luis Medinas <luis.medinas@caixamagica.pt>
(Software Engineer)

http://twitter.com/lmedinas
Disclaimer!
O que vos trouxe até aqui ?

                          lv ido o           Poss
                                                  o
                   envo                     aplic desenv
            i des are ?
        o fo lew                    C
                                      ?          açõe          olver
  Com midd                        C                     s com        nova
   no vo                       do Q                             o CC
                                                                       ?
                                                                           s
                            re      uais
                       e wa      Éu
                                     ms
                                          as c
                   id
                     dl                  imp apacid
                  m                          les       ade
                o                                ca rt     s do
              v                                        ão d      CC
           no Com                                           e ID     ?
         m               o poss                                  ou m
        u                         o partic                             ais
      ê                                    ipar no                         ?
    u                                               novo m
 orq                                                          iddlewa
P                                                                      re ?
           Como funciona o Cartão de Cidadão ?
Resumo
●   SmartCards
●   Cartão de Cidadão
●   Desenvolvimento do novo Middleware
●   Demonstração do Projeto
SmartCards
SmartCards – Cartão de Cidadão
●   Obtenção dos atributos
    ●   Informatica – SmartCard
    ●   Visual – Zona de leitura por maquina (MRZ)
    ●   Visual – Zona de leitura humana
SmartCards – Atributos Visuais
●   Humano
    ●   Nomes
    ●   Atributos Físicos
    ●   Números (NIF, Validade, NIC, etc...)
    ●   Outros (Fotografia, Nacionalidade, etc...)
●   MRZ
    ●   Nome
    ●   Números
SmartCards – Atributos Informaticos
●   ID
●   Fotografia
●   Morada
●   2 Chaves (Auth e Sign)
●   4/5 Certificados públicos (depende applet)
●   3 PIN's... errr 4!
●   EMV-CAP
SmartCards
●   Cartão:
    ●   CPU
    ●   ROM
    ●   EEPROM
    ●   RAM
●   2 Applets diferentes (IAS/GEMSAFE)
Smartcards - Componentes
●   CPU                     ●   EEPROM
    ●   8/16 bits               ●   File System
●   Rom                         ●   Chaves
    ●   Comunicação             ●   Pin's
    ●   Sistema Operativo   ●   RAM (rm poweroff)
    ●   Criptografia        ●   Contactos Mecânicos
●   ISO 7816-2              ●   Segurança Física
Smartcards - Comunicação
●   Baixo nível
    ●   T=0 (char level) e T=1 (block-level)
    ●   ATR (ISO 7816-3)
●   Alto nível
    ●   APDU (Application Protocol Data Unit)
    ●   ISO 7816-4
SmartCards – APDU
●   Comando APDU
    ●   CLA (1 byte)
        – Classe de Instrução
    ●   INS (1 byte)
        – Tipo de Comando
    ●   P1 & P2 (2 bytes)
        –    Parâmentros do Comando
    ●   LC
        – Tamanho opcional do Comando DATA
    ●   DATA
    ●   LE
        –    Tamanho da DATA esperado após a resposta APDU
SmartCards - APDU
●   Exemplos de APDU
    ●   0x00 ; 0xA4 ; 0x04 ; 0x0C ; 0x3F ; 0x00
    ●   0x00 ; 0xB0 ; 0x00 ; 0x00 ; 0x00 ; 0x00
    ●   0X00 ; 0xC0 ; 0x00 ; 0x00; 0x00 ; 0x00
    ●   0X00 ; 0x2A ; 0x90 ; 0xA0 ; DATA
SmartCards - APDU
●   Resposta da APDU
    ●   SW1 & SW 2 (2 bytes)
        –   90 00 – OK
        –   6A86 – Erro
        –   6A83 – Número de Tentativas do PIN
Cartão de Cidadão




O que podemos fazer mais com o Cartão de Cidadão ?
Cartão de Cidadão – Auth/Sign
●   Chaves Privadas
    ●   Criadas no cartão
    ●   Não saem do cartão
    ●   Necessitam de um PIN
    ●   Usadas para produzir assinaturas (encriptação)
Cartão de Cidadão – Autenticação
●   Exemplos de Autenticação
    ●   HTTPS (http//login.sapo.pt)
    ●   802.1X

●   Processo
    ●   Cartão assina dados
    ●   Envia a assinatura, chaves públicas

    ●   O receptor (Servidor) usa cadeias de certificação
    ●   Extrai os dados das chaves públicas
Cartão de Cidadão – Assinatura
●   Exemplos de Assinatura
    ●   Ficheiros (*.doc, *.odt, *.pdf, etc...)
    ●   Email

●    Processo
    ●   Assinatura → Hash do documento + Chave pública
        do cartão
    ●   Encriptação gerada com a chave privada
Cartão de Cidadão – EMV-CAP

      Funcionalidade Escondida ?




                  =
Cartão de Cidadão – EMV-CAP
●   Applet no Cartão de Cidadão semelhante aos
    VISA/MasterCards
●   Usado para gerar o OTP
●   Necessário para sincronização do 4º PIN


●   4º PIN
    ●   Sincroniza com o PIN de Auth
    ●   Utiliza Auth p/pkc11 com os Servidores de OTP
    ●   Envia parâmetros ARQC, PIN, ATC, CDOL1...
Cartão de Cidadão - SAM
●   Alterar a morada do Cidadão (EF05)
●   Verificar o ficheiro SOD (EF06)
●   Gravar a nova morada no cartão
Middleware
Objectivos novo Middleware
●   Realizar a comunicação entre o Cartão e o SO
    ●   Envolver serviços SAM e OTP
●   Multiplataforma (Windows, Linux, Mac OS X)
●   Free/OpenSource Software
●   Base estável e modular.
●   Suporte para varias linguagens de programação (JAVA,
    C++, C# (.NET))
●   Documentação
●   Developer-Friendly
●   Realizar assinaturas “easy mode”
Middleware actual
●   Closed Source
●   Conceito obsoleto
●   Problemas multi-arquitecturas
●   Pouca documentação
●   Não é Developer friendly
Nós quermos fazer melhor!
Como ?
●   Utilização de FOSS
●   Base moderna e aberta
●   Comunidade
●   Developers
Novo Middleware
●   FOSS
●   Projecto modular
●   Baseado no beid-mw (http://goo.gl/ZTbQm)
●   Multiplataforma (Windows, Linux, Mac OS X)
●   Multiarquitectura (32/64 x86)
●   Documentação
●   Developers
●   Comunidade
●   Suporte Aplicacional
Tecnologias do novo Middleware
●   PKCS#11
●   Crypto API
●   PCSC/WinScard
●   Qt
●   Eid-mw
●   C/C++
●   Java
●   openssl
Arquitectura

MS Windows            eidgui


Crypto API             SDK            Java .Net

   CSP                 eidlib


         AppLayer                    PKCS11 apps


         CardLayer               PKCS11

                     PCSC-lite

                      Kernel
Desafios de desenvolvimento
●   Multiplatforma
●   Sistema modular
●   Compreensão das Applets
●   Compatibilidade antecessor
●   Serviços Web
●   Contribuir Código
●   Novas funcionalidades
●   Código online (http://svn.gov.pt/projects/ccidadao)
Hello World C++
                                                                                                                                         //*****************************************************************************
                                                                                                                                         // Show the info of the card in the reader
//*****************************************************************************                                                          //*****************************************************************************
// PTeID SDK sample code.                                                                                                                void showCardInfo( const char* readerName )
// This sample demonstrates how to use the eID SDK to read a Portuguese eID card.                                                        {
// The program will dump the data to the standard output for each card reader                                                                            PTEID_ReaderContext& readerContext = ReaderSet.getReaderByName( readerName );
// it finds.                                                                                                                                             if ( readerContext.isCardPresent() )
//*****************************************************************************                                                                          {
#include <iostream>                                                                                                                                                      //PTEID_CARDTYPE_EID:
#include "eidlib.h"                                                                                                                                                      getEidCardData( readerContext );
                                                                                                                                                         }
using namespace eIDMW;                                                                                                                   }

//*****************************************************************************                                                          //*****************************************************************************
// Get the data and dump to the screen                                                                                                   // Show the reader info an get the data of the card if present
// Beware: The data coming from the cards is encoded in UTF8!                                                                            //*****************************************************************************
//*****************************************************************************                                                          void showReaderCardInfo( const char* readerName )
void getEIDData( PTEID_EIDCard& card )                                                                                                   {
{                                                                                                                                                        PTEID_ReaderContext& readerContext = ReaderSet.getReaderByName( readerName );
                PTEID_EId& eid = card.getID();
                                                                                                                                                       std::cout << "Reader: "                               << readerName << std::endl;
               if ( card.isTestCard() )                                                                                                                std::cout << "tCard present: " << (readerContext.isCardPresent()? "yes" :"no") << std::endl;
               {
                              std::cout << "Error: This is a test card. Can not read data..." << std::endl;                                            showCardInfo( readerName );
                              return;
               }                                                                                                                                       std::cout << std::endl;
                                                                                                                                         }
               std::cout << "tDocumentType            : " << eid.getDocumentType() << std::endl;
                                                                                                                                         //*****************************************************************************
               std::cout << "tPersonal data:"                         << std::endl;                                                     // scan all the card readers and if a card is present, show the content of the
               std::cout << "tFirstName       : " << eid.getFirstName()                                            << std::endl;        // card.
               std::cout << "tSurname         : " << eid.getSurname()                                                              <<   //*****************************************************************************
std::endl;                                                                                                                               void scanReaders( void )
               std::cout << "tGender         : " << eid.getGender()                                           << std::endl;             {
               std::cout << "tDateOfBirth      : " << eid.getDateOfBirth()                                    << std::endl;                             unsigned long                                  nrReaders = ReaderSet.readerCount();
               std::cout << "tLocationOfBirth : " << eid.getLocationOfBirth()                   << std::endl;                                           const char* const*             readerList = ReaderSet.readerList();
               std::cout << "tNationality    : " << eid.getNationality()                                      << std::endl;
               std::cout << "tNationalNumber : " << eid.getNationalNumber()                     << std::endl;                                         std::cout << "Nr of card readers detected: " << nrReaders << std::endl;
               std::cout << "tMemberOfFamily : " << eid.getMemberOfFamily()                                   << std::endl;
               std::cout << "tValidityBeginDate : " << eid.getValidityBeginDate() << std::endl;                                                       for ( size_t readerIdx=0; readerIdx<nrReaders; readerIdx++)
               std::cout << "tValidityEndDate : " << eid.getValidityEndDate()                   << std::endl;                                         {
                                                                                                                                                                      showReaderCardInfo( readerList[readerIdx] );
               PTEID_EIdAddress&                eidaddress = card.getAddr();                                                                           }
               std::cout << "tStreet            : " << eidaddress.getStreet()                                                      <<   }
std::endl;
               std::cout << "tZipCode             : " << eidaddress.getZipCode()                                                   <<   //*****************************************************************************
std::endl;                                                                                                                               // Main entry point
               std::cout << "tMunicipality   : " << eidaddress.getMunicipality()                                   << std::endl;        //*****************************************************************************
               std::cout << "tIssuingMunicipality: " << eidaddress.getIssuingMunicipality()        << std::endl;                        int main( int argc, char* argv[] )
}                                                                                                                                        {
                                                                                                                                                         std::cout << "PTeID SDK C++ sample program: read_eid" << std::endl;
//*****************************************************************************
// Get the data from a Portuguese EID card                                                                                                             scanReaders();
//*****************************************************************************
void getEidCardData( PTID_ReaderContext& readerContext )                                                                                               PTEID_ReleaseSDK();
{
                PTEID_EIDCard& card = readerContext.getEIDCard();                                                                        }
                getEIDData(card);
}
Hello World Java
                                                                                                                       //*****************************************************************************
                                                                                                                                       // Get the data from a Portuguese EID card
//*****************************************************************************                                                        //*****************************************************************************
// eID SDK sample code.                                                                                                                private static void getEidCardData(PTEID_ReaderContext readerContext) throws Exception
// This sample demonstrates how to use the eID SDK to read a Portuguese eID card.                                                      {
// The program will dump the data to the standard output for each card reader                                                                          PTEID_EIDCard card = readerContext.getEIDCard();
// it finds.                                                                                                                                           getEIDData(card);
//                                                                                                                                     }
// compile:
// javac -classpath <path_to>pteid[35]libJava.jar main.java                                                                     //*****************************************************************************
//                                                                                                                               // Show the info of the card in the reader
// run (windows):                                                                                                                //*****************************************************************************
// set PATH=<path_to_dll's>;%PATH%                                                                                               private static void showCardInfo(String readerName) throws Exception
// java -cp <path_to>pteid35libJava.jar;. main                                                                                  {
//*****************************************************************************                                                                  PTEID_ReaderContext readerContext =
                                                                                                                       PTEID_ReaderSet.instance().getReaderByName( readerName );
import java.lang.*;                                                                                                                              if ( readerContext.isCardPresent() )
import pt.portuguese.eid.*;                                                                                                                      {
                                                                                                                                                                 System.out.println("tType               : " + getCardTypeStr(readerContext));
public class main
{                                                                                                                                                                PTEID_CardType cardType = readerContext.getCardType();
              //*****************************************************************************                                                                    getEidCardData(readerContext);
              // Get the data and dump to the screen                                                                                               }
              // Beware: The data coming from the cards is encoded in UTF8!                                                          }
              //*****************************************************************************
              private static void getEIDData(PTEID_EIDCard card) throws Exception                                                //*****************************************************************************
              {                                                                                                                  // Show the reader info an get the data of the card if present
                              PTEID_EId eid = card.getID();                                                                      //*****************************************************************************
                                                                                                                                 private static void showReaderCardInfo(String readerName) throws Exception
                              System.out.println( "tDocumentType          : " + eid.getDocumentType() );                        {
                                                                                                                                                 PTEID_ReaderContext readerContext =
                              System.out.println( "tPeronal data:" );                                                 PTEID_ReaderSet.instance().getReaderByName( readerName );
                              System.out.println( "t-------------" );
                              System.out.println( "tFirstName1          : " + eid.getFirstName1()                );                               System.out.println("Reader: "+readerName);
                              System.out.println( "tSurname           : " + eid.getSurname()                                                      System.out.println("tCard present: " + (readerContext.isCardPresent()? "yes" :"no"));
              );
                              System.out.println( "tGender           : " + eid.getGender()                                                        showCardInfo( readerName );
              );
                              System.out.println( "tDateOfBirth      : " + eid.getDateOfBirth()                  );                               System.out.println("");
                              System.out.println( "tLocationOfBirth : " + eid.getLocationOfBirth()               );                 }
                              System.out.println( "tNationality    : " + eid.getNationality()                    );
                              System.out.println( "tNationalNumber : " + eid.getNationalNumber()                 );                 //*****************************************************************************
                              System.out.println( "tSpecialOrganization: " + eid.getSpecialOrganization()   );                      // scan all the card readers and if a card is present, show the content of the
                              System.out.println( "tMemberOfFamily : " + eid.getMemberOfFamily()                 );                 // card.
                              System.out.println( "tValidityBeginDate : " + eid.getValidityBeginDate()      );                      //*****************************************************************************
                              System.out.println( "tValidityEndDate : " + eid.getValidityEndDate()               );                 private static void scanReaders() throws Exception
                                                                                                                                     {
                              PTEIDAddress_EId              eidaddress = card.getAddr();                                                             long nrReaders = PTEID_ReaderSet.instance().readerCount();
                              System.out.println( "tStreet        : " + eid.getStreet()                                                             System.out.println("Nr of card readers detected: "+nrReaders);
              );
                              System.out.println( "tZipCode           : " + eid.getZipCode()                                                      for ( int readerIdx=0; readerIdx<nrReaders; readerIdx++)
              );                                                                                                                                   {
                              System.out.println( "tMunicipality      : " + eid.getMunicipality()                );                                              String readerName = PTEID_ReaderSet.instance().getReaderName(readerIdx);
                              System.out.println( "tCountry          : " + eid.getCountry()                                                                      showReaderCardInfo(readerName);
              );                                                                                                                                   }
                              System.out.println( "tIssuingMunicipality: " + eid.getIssuingMunicipality()   );                      }
              }
Demonstração
Obrigado!
Questões?



luis.medinas@caixamagica.pt

More Related Content

Similar to Codebits2011

APG82 product presentation by Advanced Card Systems Ltd
APG82 product presentation by Advanced Card Systems LtdAPG82 product presentation by Advanced Card Systems Ltd
APG82 product presentation by Advanced Card Systems LtdAdvanced Card Systems Ltd.
 
143778 633688290317528750
143778 633688290317528750143778 633688290317528750
143778 633688290317528750laxmai
 
Eurotime systems terminal booklet
Eurotime systems terminal bookletEurotime systems terminal booklet
Eurotime systems terminal bookletEuroTime Systems
 
Rfid based attendance system using arduino (1)
Rfid based attendance system using arduino (1)Rfid based attendance system using arduino (1)
Rfid based attendance system using arduino (1)AWANISHKUMAR84
 
PASSWORD DOOR LOCK SYSTEM.pptx
PASSWORD DOOR LOCK SYSTEM.pptxPASSWORD DOOR LOCK SYSTEM.pptx
PASSWORD DOOR LOCK SYSTEM.pptxsonalshitole
 
Embedded system in Smart Cards
Embedded system in Smart CardsEmbedded system in Smart Cards
Embedded system in Smart CardsRebecca D'souza
 
Monitoring temperature rumah dengan display lcd dan recording
Monitoring temperature rumah dengan display lcd dan recordingMonitoring temperature rumah dengan display lcd dan recording
Monitoring temperature rumah dengan display lcd dan recordingYuda Wardiana
 
What is smart card on tam
What is smart card on tamWhat is smart card on tam
What is smart card on tam崇倍 洪
 
One library for all Java encryption
One library for all Java encryptionOne library for all Java encryption
One library for all Java encryptionDan Cvrcek
 
Intel galileo gen 2
Intel galileo gen 2Intel galileo gen 2
Intel galileo gen 2srknec
 
smartcard-090723101806-phpapp01.pdf
smartcard-090723101806-phpapp01.pdfsmartcard-090723101806-phpapp01.pdf
smartcard-090723101806-phpapp01.pdfssuser5b47c8
 
Embedded System Security: Learning from Banking and Payment Industry
Embedded System Security: Learning from Banking and Payment IndustryEmbedded System Security: Learning from Banking and Payment Industry
Embedded System Security: Learning from Banking and Payment IndustryNarudom Roongsiriwong, CISSP
 
ATM for visually challenged people
ATM for visually challenged peopleATM for visually challenged people
ATM for visually challenged peopleIRJET Journal
 
Paperless ticket system
Paperless ticket systemPaperless ticket system
Paperless ticket systemHardik Shah
 

Similar to Codebits2011 (20)

APG82 product presentation by Advanced Card Systems Ltd
APG82 product presentation by Advanced Card Systems LtdAPG82 product presentation by Advanced Card Systems Ltd
APG82 product presentation by Advanced Card Systems Ltd
 
Java card
Java cardJava card
Java card
 
143778 633688290317528750
143778 633688290317528750143778 633688290317528750
143778 633688290317528750
 
Smart Card Technology
Smart Card TechnologySmart Card Technology
Smart Card Technology
 
Eurotime systems terminal booklet
Eurotime systems terminal bookletEurotime systems terminal booklet
Eurotime systems terminal booklet
 
Smart card
Smart cardSmart card
Smart card
 
Rfid based attendance system using arduino (1)
Rfid based attendance system using arduino (1)Rfid based attendance system using arduino (1)
Rfid based attendance system using arduino (1)
 
SIM Card Overview
SIM Card OverviewSIM Card Overview
SIM Card Overview
 
PASSWORD DOOR LOCK SYSTEM.pptx
PASSWORD DOOR LOCK SYSTEM.pptxPASSWORD DOOR LOCK SYSTEM.pptx
PASSWORD DOOR LOCK SYSTEM.pptx
 
Embedded system in Smart Cards
Embedded system in Smart CardsEmbedded system in Smart Cards
Embedded system in Smart Cards
 
Monitoring temperature rumah dengan display lcd dan recording
Monitoring temperature rumah dengan display lcd dan recordingMonitoring temperature rumah dengan display lcd dan recording
Monitoring temperature rumah dengan display lcd dan recording
 
Smart card ppt
Smart card pptSmart card ppt
Smart card ppt
 
What is smart card on tam
What is smart card on tamWhat is smart card on tam
What is smart card on tam
 
A STUDY OF AN ENTRENCHED SYSTEM USING INTERNET OF THINGS
A STUDY OF AN ENTRENCHED SYSTEM USING INTERNET OF THINGSA STUDY OF AN ENTRENCHED SYSTEM USING INTERNET OF THINGS
A STUDY OF AN ENTRENCHED SYSTEM USING INTERNET OF THINGS
 
One library for all Java encryption
One library for all Java encryptionOne library for all Java encryption
One library for all Java encryption
 
Intel galileo gen 2
Intel galileo gen 2Intel galileo gen 2
Intel galileo gen 2
 
smartcard-090723101806-phpapp01.pdf
smartcard-090723101806-phpapp01.pdfsmartcard-090723101806-phpapp01.pdf
smartcard-090723101806-phpapp01.pdf
 
Embedded System Security: Learning from Banking and Payment Industry
Embedded System Security: Learning from Banking and Payment IndustryEmbedded System Security: Learning from Banking and Payment Industry
Embedded System Security: Learning from Banking and Payment Industry
 
ATM for visually challenged people
ATM for visually challenged peopleATM for visually challenged people
ATM for visually challenged people
 
Paperless ticket system
Paperless ticket systemPaperless ticket system
Paperless ticket system
 

Codebits2011

  • 1. The Development of the new Free/Opensource Portuguese Card Citizen middleware Luis Medinas <luis.medinas@caixamagica.pt> (Software Engineer) http://twitter.com/lmedinas
  • 3. O que vos trouxe até aqui ? lv ido o Poss o envo aplic desenv i des are ? o fo lew C ? açõe olver Com midd C s com nova no vo do Q o CC ? s re uais e wa Éu ms as c id dl imp apacid m les ade o ca rt s do v ão d CC no Com e ID ? m o poss ou m u o partic ais ê ipar no ? u novo m orq iddlewa P re ? Como funciona o Cartão de Cidadão ?
  • 4. Resumo ● SmartCards ● Cartão de Cidadão ● Desenvolvimento do novo Middleware ● Demonstração do Projeto
  • 6.
  • 7. SmartCards – Cartão de Cidadão ● Obtenção dos atributos ● Informatica – SmartCard ● Visual – Zona de leitura por maquina (MRZ) ● Visual – Zona de leitura humana
  • 8. SmartCards – Atributos Visuais ● Humano ● Nomes ● Atributos Físicos ● Números (NIF, Validade, NIC, etc...) ● Outros (Fotografia, Nacionalidade, etc...) ● MRZ ● Nome ● Números
  • 9.
  • 10. SmartCards – Atributos Informaticos ● ID ● Fotografia ● Morada ● 2 Chaves (Auth e Sign) ● 4/5 Certificados públicos (depende applet) ● 3 PIN's... errr 4! ● EMV-CAP
  • 11. SmartCards ● Cartão: ● CPU ● ROM ● EEPROM ● RAM ● 2 Applets diferentes (IAS/GEMSAFE)
  • 12. Smartcards - Componentes ● CPU ● EEPROM ● 8/16 bits ● File System ● Rom ● Chaves ● Comunicação ● Pin's ● Sistema Operativo ● RAM (rm poweroff) ● Criptografia ● Contactos Mecânicos ● ISO 7816-2 ● Segurança Física
  • 13. Smartcards - Comunicação ● Baixo nível ● T=0 (char level) e T=1 (block-level) ● ATR (ISO 7816-3) ● Alto nível ● APDU (Application Protocol Data Unit) ● ISO 7816-4
  • 14. SmartCards – APDU ● Comando APDU ● CLA (1 byte) – Classe de Instrução ● INS (1 byte) – Tipo de Comando ● P1 & P2 (2 bytes) – Parâmentros do Comando ● LC – Tamanho opcional do Comando DATA ● DATA ● LE – Tamanho da DATA esperado após a resposta APDU
  • 15. SmartCards - APDU ● Exemplos de APDU ● 0x00 ; 0xA4 ; 0x04 ; 0x0C ; 0x3F ; 0x00 ● 0x00 ; 0xB0 ; 0x00 ; 0x00 ; 0x00 ; 0x00 ● 0X00 ; 0xC0 ; 0x00 ; 0x00; 0x00 ; 0x00 ● 0X00 ; 0x2A ; 0x90 ; 0xA0 ; DATA
  • 16. SmartCards - APDU ● Resposta da APDU ● SW1 & SW 2 (2 bytes) – 90 00 – OK – 6A86 – Erro – 6A83 – Número de Tentativas do PIN
  • 17.
  • 18. Cartão de Cidadão O que podemos fazer mais com o Cartão de Cidadão ?
  • 19. Cartão de Cidadão – Auth/Sign ● Chaves Privadas ● Criadas no cartão ● Não saem do cartão ● Necessitam de um PIN ● Usadas para produzir assinaturas (encriptação)
  • 20. Cartão de Cidadão – Autenticação ● Exemplos de Autenticação ● HTTPS (http//login.sapo.pt) ● 802.1X ● Processo ● Cartão assina dados ● Envia a assinatura, chaves públicas ● O receptor (Servidor) usa cadeias de certificação ● Extrai os dados das chaves públicas
  • 21. Cartão de Cidadão – Assinatura ● Exemplos de Assinatura ● Ficheiros (*.doc, *.odt, *.pdf, etc...) ● Email ● Processo ● Assinatura → Hash do documento + Chave pública do cartão ● Encriptação gerada com a chave privada
  • 22. Cartão de Cidadão – EMV-CAP Funcionalidade Escondida ? =
  • 23. Cartão de Cidadão – EMV-CAP ● Applet no Cartão de Cidadão semelhante aos VISA/MasterCards ● Usado para gerar o OTP ● Necessário para sincronização do 4º PIN ● 4º PIN ● Sincroniza com o PIN de Auth ● Utiliza Auth p/pkc11 com os Servidores de OTP ● Envia parâmetros ARQC, PIN, ATC, CDOL1...
  • 24. Cartão de Cidadão - SAM ● Alterar a morada do Cidadão (EF05) ● Verificar o ficheiro SOD (EF06) ● Gravar a nova morada no cartão
  • 26. Objectivos novo Middleware ● Realizar a comunicação entre o Cartão e o SO ● Envolver serviços SAM e OTP ● Multiplataforma (Windows, Linux, Mac OS X) ● Free/OpenSource Software ● Base estável e modular. ● Suporte para varias linguagens de programação (JAVA, C++, C# (.NET)) ● Documentação ● Developer-Friendly ● Realizar assinaturas “easy mode”
  • 27. Middleware actual ● Closed Source ● Conceito obsoleto ● Problemas multi-arquitecturas ● Pouca documentação ● Não é Developer friendly
  • 29.
  • 30. Como ? ● Utilização de FOSS ● Base moderna e aberta ● Comunidade ● Developers
  • 31. Novo Middleware ● FOSS ● Projecto modular ● Baseado no beid-mw (http://goo.gl/ZTbQm) ● Multiplataforma (Windows, Linux, Mac OS X) ● Multiarquitectura (32/64 x86) ● Documentação ● Developers ● Comunidade ● Suporte Aplicacional
  • 32. Tecnologias do novo Middleware ● PKCS#11 ● Crypto API ● PCSC/WinScard ● Qt ● Eid-mw ● C/C++ ● Java ● openssl
  • 33. Arquitectura MS Windows eidgui Crypto API SDK Java .Net CSP eidlib AppLayer PKCS11 apps CardLayer PKCS11 PCSC-lite Kernel
  • 34. Desafios de desenvolvimento ● Multiplatforma ● Sistema modular ● Compreensão das Applets ● Compatibilidade antecessor ● Serviços Web ● Contribuir Código ● Novas funcionalidades ● Código online (http://svn.gov.pt/projects/ccidadao)
  • 35.
  • 36. Hello World C++ //***************************************************************************** // Show the info of the card in the reader //***************************************************************************** //***************************************************************************** // PTeID SDK sample code. void showCardInfo( const char* readerName ) // This sample demonstrates how to use the eID SDK to read a Portuguese eID card. { // The program will dump the data to the standard output for each card reader PTEID_ReaderContext& readerContext = ReaderSet.getReaderByName( readerName ); // it finds. if ( readerContext.isCardPresent() ) //***************************************************************************** { #include <iostream> //PTEID_CARDTYPE_EID: #include "eidlib.h" getEidCardData( readerContext ); } using namespace eIDMW; } //***************************************************************************** //***************************************************************************** // Get the data and dump to the screen // Show the reader info an get the data of the card if present // Beware: The data coming from the cards is encoded in UTF8! //***************************************************************************** //***************************************************************************** void showReaderCardInfo( const char* readerName ) void getEIDData( PTEID_EIDCard& card ) { { PTEID_ReaderContext& readerContext = ReaderSet.getReaderByName( readerName ); PTEID_EId& eid = card.getID(); std::cout << "Reader: " << readerName << std::endl; if ( card.isTestCard() ) std::cout << "tCard present: " << (readerContext.isCardPresent()? "yes" :"no") << std::endl; { std::cout << "Error: This is a test card. Can not read data..." << std::endl; showCardInfo( readerName ); return; } std::cout << std::endl; } std::cout << "tDocumentType : " << eid.getDocumentType() << std::endl; //***************************************************************************** std::cout << "tPersonal data:" << std::endl; // scan all the card readers and if a card is present, show the content of the std::cout << "tFirstName : " << eid.getFirstName() << std::endl; // card. std::cout << "tSurname : " << eid.getSurname() << //***************************************************************************** std::endl; void scanReaders( void ) std::cout << "tGender : " << eid.getGender() << std::endl; { std::cout << "tDateOfBirth : " << eid.getDateOfBirth() << std::endl; unsigned long nrReaders = ReaderSet.readerCount(); std::cout << "tLocationOfBirth : " << eid.getLocationOfBirth() << std::endl; const char* const* readerList = ReaderSet.readerList(); std::cout << "tNationality : " << eid.getNationality() << std::endl; std::cout << "tNationalNumber : " << eid.getNationalNumber() << std::endl; std::cout << "Nr of card readers detected: " << nrReaders << std::endl; std::cout << "tMemberOfFamily : " << eid.getMemberOfFamily() << std::endl; std::cout << "tValidityBeginDate : " << eid.getValidityBeginDate() << std::endl; for ( size_t readerIdx=0; readerIdx<nrReaders; readerIdx++) std::cout << "tValidityEndDate : " << eid.getValidityEndDate() << std::endl; { showReaderCardInfo( readerList[readerIdx] ); PTEID_EIdAddress& eidaddress = card.getAddr(); } std::cout << "tStreet : " << eidaddress.getStreet() << } std::endl; std::cout << "tZipCode : " << eidaddress.getZipCode() << //***************************************************************************** std::endl; // Main entry point std::cout << "tMunicipality : " << eidaddress.getMunicipality() << std::endl; //***************************************************************************** std::cout << "tIssuingMunicipality: " << eidaddress.getIssuingMunicipality() << std::endl; int main( int argc, char* argv[] ) } { std::cout << "PTeID SDK C++ sample program: read_eid" << std::endl; //***************************************************************************** // Get the data from a Portuguese EID card scanReaders(); //***************************************************************************** void getEidCardData( PTID_ReaderContext& readerContext ) PTEID_ReleaseSDK(); { PTEID_EIDCard& card = readerContext.getEIDCard(); } getEIDData(card); }
  • 37. Hello World Java //***************************************************************************** // Get the data from a Portuguese EID card //***************************************************************************** //***************************************************************************** // eID SDK sample code. private static void getEidCardData(PTEID_ReaderContext readerContext) throws Exception // This sample demonstrates how to use the eID SDK to read a Portuguese eID card. { // The program will dump the data to the standard output for each card reader PTEID_EIDCard card = readerContext.getEIDCard(); // it finds. getEIDData(card); // } // compile: // javac -classpath <path_to>pteid[35]libJava.jar main.java //***************************************************************************** // // Show the info of the card in the reader // run (windows): //***************************************************************************** // set PATH=<path_to_dll's>;%PATH% private static void showCardInfo(String readerName) throws Exception // java -cp <path_to>pteid35libJava.jar;. main { //***************************************************************************** PTEID_ReaderContext readerContext = PTEID_ReaderSet.instance().getReaderByName( readerName ); import java.lang.*; if ( readerContext.isCardPresent() ) import pt.portuguese.eid.*; { System.out.println("tType : " + getCardTypeStr(readerContext)); public class main { PTEID_CardType cardType = readerContext.getCardType(); //***************************************************************************** getEidCardData(readerContext); // Get the data and dump to the screen } // Beware: The data coming from the cards is encoded in UTF8! } //***************************************************************************** private static void getEIDData(PTEID_EIDCard card) throws Exception //***************************************************************************** { // Show the reader info an get the data of the card if present PTEID_EId eid = card.getID(); //***************************************************************************** private static void showReaderCardInfo(String readerName) throws Exception System.out.println( "tDocumentType : " + eid.getDocumentType() ); { PTEID_ReaderContext readerContext = System.out.println( "tPeronal data:" ); PTEID_ReaderSet.instance().getReaderByName( readerName ); System.out.println( "t-------------" ); System.out.println( "tFirstName1 : " + eid.getFirstName1() ); System.out.println("Reader: "+readerName); System.out.println( "tSurname : " + eid.getSurname() System.out.println("tCard present: " + (readerContext.isCardPresent()? "yes" :"no")); ); System.out.println( "tGender : " + eid.getGender() showCardInfo( readerName ); ); System.out.println( "tDateOfBirth : " + eid.getDateOfBirth() ); System.out.println(""); System.out.println( "tLocationOfBirth : " + eid.getLocationOfBirth() ); } System.out.println( "tNationality : " + eid.getNationality() ); System.out.println( "tNationalNumber : " + eid.getNationalNumber() ); //***************************************************************************** System.out.println( "tSpecialOrganization: " + eid.getSpecialOrganization() ); // scan all the card readers and if a card is present, show the content of the System.out.println( "tMemberOfFamily : " + eid.getMemberOfFamily() ); // card. System.out.println( "tValidityBeginDate : " + eid.getValidityBeginDate() ); //***************************************************************************** System.out.println( "tValidityEndDate : " + eid.getValidityEndDate() ); private static void scanReaders() throws Exception { PTEIDAddress_EId eidaddress = card.getAddr(); long nrReaders = PTEID_ReaderSet.instance().readerCount(); System.out.println( "tStreet : " + eid.getStreet() System.out.println("Nr of card readers detected: "+nrReaders); ); System.out.println( "tZipCode : " + eid.getZipCode() for ( int readerIdx=0; readerIdx<nrReaders; readerIdx++) ); { System.out.println( "tMunicipality : " + eid.getMunicipality() ); String readerName = PTEID_ReaderSet.instance().getReaderName(readerIdx); System.out.println( "tCountry : " + eid.getCountry() showReaderCardInfo(readerName); ); } System.out.println( "tIssuingMunicipality: " + eid.getIssuingMunicipality() ); } }