Tiago Silva Tec. Informação e Hobbies pessoais

13Aug/100

Validação de Número de Documento do Cartão de Cidadão (Versão 1.0 – Jan. 2010) em Java SE [PT]

O código de autenticação de numero de documento do cartão de cidadão em Java. Já existia o mesmo em C# .Net, achei pertinente criar uma versão em Java SE. Espero que seja útil para alguém.

public class CCValidator
{
     public static boolean ValidateNumeroDocumentoCC(String numeroDocumento) throws Exception
     {
          int sum = 0;
          boolean secondDigit = false;

          if (numeroDocumento.length() != 12) {
               throw new Exception("Tamanho inválido para número de documento.");
          }

          for (int i = numeroDocumento.length() - 1; i >= 0; --i)
          {
               int valor = getNumberFromChar(numeroDocumento.charAt(i));

               if (secondDigit)
               {
                    valor *= 2;
                    if (valor > 9)
                    {
                         valor -= 9;
                    }
               }

          sum += valor;
          secondDigit = !secondDigit;
     }

return (sum % 10) == 0;
}

public static int getNumberFromChar(char letter) throws Exception
{
     switch (letter)
     {
          case '0':
               return 0;
          case '1':
               return 1;
          case '2':
               return 2;
          case '3':
               return 3;
          case '4':
               return 4;
          case '5':
               return 5;
          case '6':
               return 6;
          case '7':
               return 7;
          case '8':
               return 8;
          case '9':
               return 9;
          case 'A':
               return 10;
          case 'B':
               return 11;
          case 'C':
               return 12;
          case 'D':
               return 13;
          case 'E':
               return 14;
          case 'F':
               return 15;
          case 'G':
               return 16;
          case 'H':
               return 17;
          case 'I':
               return 18;
          case 'J':
               return 19;
          case 'K':
               return 20;
          case 'L':
               return 21;
          case 'M':
               return 22;
          case 'N':
               return 23;
          case 'O':
               return 24;
          case 'P':
               return 25;
          case 'Q':
               return 26;
          case 'R':
               return 27;
          case 'S':
               return 28;
          case 'T':
               return 29;
          case 'U':
               return 30;
          case 'V':
               return 31;
          case 'W':
               return 32;
          case 'X':
               return 33;
          case 'Y':
               return 34;
          case 'Z':
               return 35;
          }

          throw new Exception("Valor inválido no número de documento.");
     }
}

Caso tenham alguma necessidade especifica sobre o cartão de cidadão aproveitem e comentem!
O meu comentário sobre o cartão do cidadão é que, embora seja um cartão que contem um micro-controlador que corre uma Java Virtual Machine, ou seja, é um Smart Card bastante avançado e robusto, os comandos para invocar as funções internas, para obter os dados públicos por ex., ainda é um mistério, ou seja, embora seja um produto para uso publico, onde está a informação para comunicar a baixo nível com o próprio cartão?

Para um cartão extremamente seguro não compreendo o porquê de tanto secretismo. O cartão nem permite a escrita por entidades não autorizadas.

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

(required)

No trackbacks yet.