C2-0.1 PKIs na prática, hoje.
C2-0.1.1 Geração de chaves, instalação de certificados no PGPC2-0.2 Especificação formal de protocolos critpográficosCada aluno precisa gerar pelo menos um par de chaves criptográficas assimétricas que servirá como instrumento para práticas durante o curso. Em cada um dos aplicativos de correio eletrônico disponíveis no computador de sala de aula (Mozilla e IE), configurar sua conta de correio pessoal, para que possa enviar e receber mensagens endereçadas a esta conta, durante a aula. O aluno deve, portanto, trazer anotado para a primeira aula o nome de domínio do seu servidor de correio eletrônico pessoal (POP ou IMAP e SMTP). A seu critério, ele pode abrir uma conta de correio pessoal para uso exclusivo no curso.C2-0.1.2 Geração de chaves, instalação de certificados no navegador MozillaDeverá instalar o PGP no computador, escolhendo, na primeira seleção, a opção "usuário 'sem chaveiro';" (novo usuário). Gere pelo menos um par de chaves seguindo as intruções da interface. Em seguida, escolha um dos navegadores para acionar. Instale também o plugin para o navegador IE
Se o aluno escolher o navegador Mozilla para gerar o par de chaves:C2-0.1.3 Geração de chaves, instalação de certificados no navegador Internet Explorer
- Obter certificado numa certificadora: faça-o a partir da página da certificadora FreeICP, em http://ca.freeicp.org/ (ATENÇÃO: certificadora não-credenciada na ICP-BR!!!), e siga as instruções para obtenção de certificados de nível básico (identidade não verificada).
- Exportar a chave privada para o outro navegador e para o PGP, backup para um disquete.
- Exportar o certificado para o outro navegador e para o PGP. Verifique se a exportação incluiu também as chaves da cadeia de verificação que se fizerem necessárias para a validação de assinaturas com dito certificado.Se o aluno escolher o navegador IE para gerar o par de chaves:C2-0.1.4 Identificação imediata de problemas de interoperabilidade
- Obter certificado nalguma certificadora: faça-o a partir da página da certificadora FreeICP, em http://ca.freeicp.org/ (ATENÇÃO: certificadora não-credenciada na ICP-BR!!!), e siga as instruções para obtenção de certificados de nível básico (identidade não verificada).
- Exportar a chave privada para o outro navegador e para o PGP, backup para um disquete.
- Exportar o certificado para o outro navegador e para o PGP. Verifique se a exportação incluiu também as chaves da cadeia de verificação que se fizerem necessárias para a validação de assinaturas com dito certificado.Assinar e enviar mensagens para anotar os problemas de interoperabilidade que encontrar. O que encontrarmos neste exercício será, de forma simplificada e resumida, os desafios para a implementação de uma infra-estrutura de chaves públicas, desafios esses que foram abordados pelos pesquisadores que estabeleceram os padrões e formatos objeto de estudo neste curso. Anote os problemas que encontrar, pois eles virão à tona ao longo do curso, e também quando estiver desenvolvendo aplicações no âmbito profissional. Se o tempo estiver exíguo, o aluno poderá continuar a experiência depois da aula, com as chaves e certificados exportados para o disquete
C2-0.2.1 O papel central da estrutura de dados para transporte de chave publicaPara melhor entendermos a natureza das possíveis discrepâncias e incompatibilidades no cenário de experimentos que montamos, podemos começar examinando o conteúdo do certificado pessoal obtido da FreeICP. Seria melhor, para isso, usar a interface de configurações de controle do Mozilla:C2-0.2.2 A necessidade de padronização aberta: o padrão X-509 e alternativasEdit > Preferences > Privacy & Security > Manage Certificates > (yours) > view > details
Instalar, se necessário, o certificado auto-assinado (raiz) da ICP-BR, a partir do site http://www.iti.gov.br Examinar os campos de extensão deste certificado X-509 v.3 comparando-o com outros certificados, incluindo os certificados instalados pelo usuário e os certificados embutidos pelo fabricante do navegador no seu container (chaveiro embutido) ou no registry do sistema (IE).C2-0.2.3 A necessidade de identificadores de objetos e as linguagens ASN.1 e DER.Ler a introdução do apêndice A, "ASN.1 Primer", no livro texto (pag 301).C2-0.2.4 A necessidade do registro de identificadores de objetos para PKIsVeja os exemplos (como este abaixo do Mozilla) e o item "Obtaining Private OIDs" na página 308 do livro texto.
Exercício: (valendo 20% da nota)
Enviar ao prof. Pedro (rezende@cic.unb.br) uma mensagem digitalmente assinada
que seja reconhecida como válida no programa de correio eletrônico
dele (ele usa o Mozilla e o PGP)
Aula 2 -
C2 1 - A linguagem ASN.1 e as sintaxes BER e DER
C2-1.1 Sintaxes Abstratas e a Linguagem ASN.1.
Os exemplos mais óbvios desta necessidade ocorre na transmissão de cadeias (strings) de caracteres entre ambientes operando com distintos conjuntos de caracteres, e valores reais e inteiros cuja representação interna depende da arquitetura do hardware.
Esta adequação é suprida por um conjunto de algoritmos compostos de regras de codificação, chamados sintaxes de transferência (transfer sintaxes). Os serviços da camada de apresentação funcionam negociando, quando duas aplicações se comunicam, a sintaxe de transferência a ser aplicada, e aplicando-a na transferência.
Para que esses serviços não precisem armazenar informação sobre como negociar a sintaxe de transferência em cada situação possível, uma linguagem comum para se denotar tipos de dados, uma espécie de linguagem intermediária para codificação/decodificação, compartilhada entre as aplicações comunicantes, se faz necessária, para descrever as possíveis representações de dados transferíveis entre elas.
Uma tal linguagem é dita uma sintaxe abstrata. A arquitetura
ISO-OSI propôs a primeira de tais linguagens, por isso chamada de
ASN-1 (Abstract Sintax Notation One), definida no padrão
ITU X-208-88 (de 1988), extendido em 1993
(X-209)
A ASN.1 é a linguagem padronizada pela ITU e também pela ISO-OSI (norma ISO8824) para denotar tipos de dados que podem ser inequivocamente reconhecidos por aplicações comunicantes. A semântica desses dados, entretanto, fica de fora da ASN-1, sendo abordada pela linguagem BER (Basic Encoding Rules) e um por subconjunto desambiguado desta, o DER (Distinguished Encoding Rules, norma ISO8825.)
A ASN.1 se parece com uma linguagem de programação, com a particularidade de se restringir à declaração de tipos e valores. Uma classificação elementar de tipos em famílias na linguagem ASN.1 é dada por
Família | Tipos / Construtores / Classes | Descrição |
Simple | Tipos: BIT STRING, BOOLEAN, INTEGER,
NULL,
OBJECT IDENTIFIER, OCTET STRING, etc. (tipos string) |
Tipos
Primitivos |
Structured | Construtores: SEQUENCE, SEQUENCE OF,
SET, SET OF |
Tipos
Compostos |
Tagged | Classes: UNIVERSAL, APPLICATION, PRIVATE,
IMPLICIT, EXPLICIT, etc. (espec. contexto) |
Tipos
Rotulados |
Other | Construtores: CHOICE, ANY
(não rotuláveis implicitamente) |
Tipos
Complementares |
a a z 0 a 9 : = , { } < . ( ) [ ] - ' " espaço em branco |
ABSENT | ANY | APPLICATION | BEGIN |
BIT | BOOLEAN | BY | CHOICE |
COMPONENT | COMPONENTS | DEFAULT | DEFINED |
DEFINITIONS | empty | END | ENUMERATED |
EXPLICIT | EXPORTS | EXTERNAL | FALSE |
FROM | IA5String | identifier | IDENTIFIER |
GeneralizedTime | GeneralStrinG | GraphicString | IMPLICIT |
IMPORTS | INCLUDES | INTEGER | ISO646String |
MACRO | MAX | MIN | MINUS-INFINITY |
NOTATION | NULL | NumericString | number |
OBJECT | ObjectDescriptor | OCTET | OF |
OPTIONAL | PLUS-INFINITY | PRESENT | PrintableString |
PRIVATE | REAL | SEQUENCE | SET |
SIZE | string | STRING | TAGS |
TeletexString | TRUE | type | TYPE |
T61String | value | VALUE | VideotexString |
VisibleString | UNIVERSAL | UTCTime | WITH |
TipoDígitos ::= PrintableString
("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "-") TipoAgência ::= SET { NomeAgência ::= PrintableString (SIZE(10)), NumeroDaAgência ::= INTEGER (0..9999) } Registro ::= SET { Nome ::= PrintableString (SIZE(30)), CPF ::= TipoDígitos (SIZE(13)), NumeroDaConta ::= TipoDígitos (SIZE(10)), TipoDaConta ::= ENUMERATED {contacorrente(1), poupança(2)}, Agência ::= TipoAgência, Saldo ::= REAL } |
Um tipo estruturado é formado numa declação de tipo contendo o seletor de valores "{ chaves }" sucedendo um construtor.
A produção de um subtipo ou de um tipo estruturado é
formada por um item identificador (que, sendo identificador de um novo
tipo, começa com letra maiúscula e não termina
com hífen), seguido do item operador, seguido do tipo-pai a que
pertencem os valores do novo tipo ou do construtor, seguido do item seletor
de valores, com formato e exemplos dados abaixo:.
TipoDígitos ::= PrintableString
( "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "-" ) -- "|" significa alternativa TipoAgência ::= SET
FimDeSemanaLongo ::= DiasDaSemana
|
A referência adiantada (forward reference) é permitida
(como acima, na declaração de FimDeSemanaLongo,
e como implícita acima, na ausência de IMPORTS, para
o tipo DiasDaSemana).
O tipo simples INTEGER é utilizado para representar números inteiros, sendo que não existem valores limites para este tipo, como em seus correspondentes nas linguagens C e Pascal.
c) Valores:
cristina Registro ::=
{ "Cristina Resende", "6666666-66", "88888-8", poupança, {"Laranjeiras",0232}, {2918189707,2,0} } |
11 4516
14 10 4372697374696E6120526573656E646516 14 0A 363636363636362D363616 14 08 38383838382D3816 0A 01 0216 11 1016 14 0B 4C6172616E6A656972617316 02 01 E816 09 06 8000ADF00A8B16 |
Inteiro ::= INTEGER
{ um(1), dois(2), três(3), quatro(4), cinco(5), nove(9), oito(8), sete(7), seis(6), zero(0), cem(100), mil(1000) } |
A idéia da linguagem é que cada tipo receba uma denominação
que o distinga, de forma inequívoca, de todos os demais tipos. Para
isso cada tipo recebe um rótulo ("tag"). Um mesmo rótulo
pode ser atribuído
a mais de um tipo cuja particular identificação será
decidida pelo contexto em que o rótulo for usado. Doutra feita,
um tipo que receba rótulos distintos em instâncias distintas,
resultará em um novo tipo para cada rótulo.
.
· UNIVERSAL: pode ser atribuído a um tipo simples
ou a um construtor (structured, other) conforme tabela.
· APPLICATION: rótulos atribuídos a tipos
para módulos específicos. Num dado módulo os rótulos
desta classe somente podem ser atribuídos a uma única
instância.
· PRIVATE: rótulos usados numa empresa especifica.
· ESPECIFICADO-POR-CONTEXTO: interpretado de acordo com o contexto
em que é usado (omite-se o nome de classe).
UNIVERSAL 1 | tipo booleano
UNIVERSAL 2 | tipo inteiro UNIVERSAL 3 | tipo string de bits UNIVERSAL 4 | tipo string de octetos UNIVERSAL 5 | tipo nulo UNIVERSAL 6 | tipo identificador de objeto UNIVERSAL 7 | tipo descritor de objeto UNIVERSAL 8 | tipo externo UNIVERSAL 9-15 | reservados para adendos ao padrão UNIVERSAL 16 | tipo SEQUENCE e SEQUENCE-OF UNIVERSAL 17 | tipo SET e SET-OF UNIVERSAL 18-22 | tipos string de conjuntos de caracteres UNIVERSAL 25-27 | tipos string de conjuntos de caracteres UNIVERSAL 23-24 | tipo hora UNIVERSAL 28-...| reservados para adendos ao padrão |
Registro pessoal::= [APPLICATION 0] IMPLICIT SET
{ Nome, Cargo [0] ISO646 String, NumeroEmpregado, DataIngresso [1] Date, NomeEsposa [2] Name, Filhos [3] IMPLICIT SEQUENCE OF InformaçãoFilho DEFAULT { } } Informaçãofilho::= SET
Nome ::= [APPLICATION 1] IMPLICIT SEQUENCE
NumeroEmpregado::= [APPLICATION 2] IMPLICIT INTEGER Date ::= [APPLICATION 3] IMPLICIT ISO 646 String -- AAAAMMDD |
As regras de codificação sempre forçam a transmissão do rótulo de um tipo, implícita ou explicitamente, juntamente com a representação do seu valor.
Os valores do tipo OBJECT IDENTIFIER correspondem aos nós
da árvore de identificação de objeto (OIT - Object
Identifier Tree). A notação é feita simplesmente usando-se
a palavra -chave OBJECT IDENTIFIER. como no exemplo
C2-1.2.1 - Conceito e RegrasA linguem BER consiste em um conjunto de algoritmos para se representar, em uma ou mais formas inambíguas, qualquer valor ASN.1 através de uma sequência de octetos. Três métodos são fornecidos para se codificar um valor (dado), onde o método adequado depende do tipo e do comprimento do dado, se conhecido ou não de antemão. Tipos simples, por exemplo, podem ser codificados com qualquer dos três métodosA codificação incluirá informações derivadas dos parâmetros de rotulagem (tag) constantes da declaração e do seu contexto de apresentação. Para que a decodificação seja inambígua, a declaração do tipo ASN.1 deve fornecer os parâmetros necessários para que as regras possam codificar a rotulagem que não pode ser inferida durante a decodificação. Esses parâmetros sãoQuando um rótulo de classe ([--classe-- ..]) ou um rótulo específico de contexto ([..]) é empregado, a codificação pode encapsular o número do rótulo em um identificador de tipo em volta da sua base de codificação, que é o dado codificado conforme o tipo sendo rotulado. Parâmetros de rotulagem podem ser omitidos na declaração do tipo quando o tipo do dado puder ser deduzido do contexto da apresentação e/ou de opções "default" para rotulagem.
- classe (UNIVERSAL, APPLICATION, PRIVATE)
- modo de composição (IMPLICIT, EXPLICIT)
- número de tagging ( [ ..] onde .. é um inteiro não negativo)
Doutra feita, o parâmetroIMPLICIT, declarado ou exercido por deafult (o documento ITU X.208 que define a ASN.1 explica, no item 26.7 pag 34, as regras default para regulagem), indica que o encapsulamento da base de codificação pelo identificador do rótulo não se faz necessário.
Por exemplo, o parâmetro "número de tagging" [..], também chamado rótulo específico de contexto, não poderá ser omitido quando dois campos opcionais (declarados com predicado OPTIONAL) numa estrutura SET são do mesmo tipo, como mostrado no exemplo de rotulação em 1.1.4.
No exemplo de rotulação em 1.1.4, podemos observar que se um campo numa estrutura SET recebe rótulo da classe aplicação ([APPLICATION ..]), não precisa adicionalmente receber rótulo específico de contexto ([..], que seria usado para distinguir um campo de outro do mesmo tipo na estrutura).
Os três métodos de codificação disponíveis sãoEmbora a codificação seja inambígua, uma vez escolhido o método, há situações onde mais de um método pode ser usado. Quando a apresentação requer não apenas codificação inambígua, mas codificação única (por exemplo, para assinatura digital), a linguagem BER se torna inadequada.- Primitiva, comprimento definido: Aplica-se a tipos simples, tipos rotulados implicitamente e derivados de tipos simples, exceto strings. Requer que o comprimento do valor seja conhecido de antemão.
- Compexa, comprimento definido: Aplica-se a tipos string simples, tipos estruturados, tipos rotulados implicitamente derivados de tipos string simples ou estruturados, e tipos rotulados explicitamente. Requer que o comprimento do valor seja conhecido de antemão.
- Complexa, comprimento indefinido: Aplica-se aos mesmos casos que o método acima, mas sem requerer que o comprimento do valor seja conhecido de antemão.
C2-1.2.3 - Elementos de codificação
No método para comprimento indefinido, uma quarta cadeia é acrescida à sequência, sinalizando o fim do conteúdo codificado: a cadeia de dois octetos de zeros, 00 0016
a) Identificador de tipo
O formato da sequência de octetos que representa o identificador
do tipo tem a seguinte sintaxe:
|
|
|
|
|
|
|
|
Bit |
|
codificação |
|
Uso | |||||
00:universal
01 application 10:context-specific 11:private |
0:primitiva
1:complexa |
Se número do rótulo > 30, todos
os bits deste campo são ligados e o bit 7 dos octetos subsequentes
sinaliza a cadeia codificadora do número do rótulo:
0:octeto final da cadeia; 1:octeto com sucessor na cadeia |
Valores |
Embora a codificação seja inambígua, uma vez escolhido o método, há situações onde mais de um método pode ser usado. Quando a apresentação requer não apenas codificação inambígua, mas codificação única (por exemplo, para assinatura digital), a linguagem BER se torna inadequada.
O formato da sequência de octetos que representa o comprimento
do conteúdo tem a seguinte sintaxe:
|
|
|
|
|
|
|
|
Bit |
|
|
Uso | ||||||
0:compr.
menor que 128 1:compr.
|
Se comprimento do conteúdo <
128, este comprimento será aqui codificado.
a) Aqui se codifica o comprimento da cadeia que representa o comprimento do conteúdo conhecido de antemão. b) Este octeto recebe valor '10000000'B, sinalizando que o comprimento do conteúdo não é conhecido de antemão (ou > 2127) e que o final de conteúdo será sinalizado por '0000'H |
Valores |
c) Conteúdo codificado
O conteúdo codificado será constituído por uma cadeia de zero ou mais octetos, convencionando-se que estão ordenados da esquerda para a direita.
c.1) Em relação aos tipos primitivos, observe-se:
IdentificaçãoPaciente ::= SEQUENCE
{ nome OCTET STRING, numeroQuarto CHOICE {INTEGER, NULL --se o paciente já saiu do hospital-- } } -- não é necessário rótulo específico de contexto para CHOICE pois as opções são de tipos distintos |
c.2) Em relação aos tipos estruturados, observe-se
NomeNaçõesMembros ::= SEQUENCE OF ISO646String
-- na ordem em que se integraram PalavrasChave ::= SET OF ISO646String
Credenciais ::= SEQUENCE
AtributosArquivo ::= SET
|
IdentificadorArquivo ::= CHOICE
{ nomeRelativo [0] ISO646String, -- nome do arquivo nomeAbsoluto [1] ISO646String, --nome do arquivo e caminho numeroSerial [2] INTEGER --identificador atribuido pelo sistema } AtributosCorrentes ::= SEQUENCE
AtributoArquivo ::= CHOICE
|
C2-1.3 DER: Distinguished Encoding
Rules.
DER requer que a codificação seja sempre com comprimento
definido, de forma que a opção 1.2.3.b.b)
para codificar o comprimento de um conteúdo complexo, descrito acima,
é descartada.
Registro pessoal::= [APPLICATION 0] IMPLICIT SET
{ Nome, cargo [0] ISO646 String, numero NumeroEmpregado, dataDeIngresso [1] Date, nomeDaEsposa [2] Name, filhos [3] IMPLICIT SEQUENCE OF InformaçãoFilho DEFAULT { } } InformaçãoFilho::- SET { Nome, dataNascimento [0] Date } Nome ::- [APPLICATION 1] IMPLICIT SEQUENCE { nome ISO646 String, inicial ISO646 String, sobrenome ISO646 String } NumeroEmpregado::- [APPLICATION 2] IMPLICIT INTEGER Date ::- [APPLICATION 3] IMPLICIT ISO 646 String -- AAAAMMDD |
Tipo
ASN.1 |
{ nome "John", inicial "T", sobrenome "Smith" },
cargo "Director", numero 51, dataDeIngresso "19710917", nomeDaEsposa {nome "Mary", inicial "T", sobrenome "Smith" }, filhos { { { nome "Ralph",inicial "T",sobrenome "Smith } , dataDeNascimento "19571111" }, { { nome "Susan", inicial "B",sobrenome "Jones" }, dataDeNascimento =19590717" } } |
Valor |
Pessoal
Registro Comprimento Conteúdo 60 8185 Nome Comprimento Conteúdo 61 10 IA5String Comprimento Conteúdo 16 4 "John" IA5String Comprimento Conteudo 16 1 "T" IA5String Comprimento Conteudo 16 5 "Smith" Cargo Comprimento Conteudo A0 0A IA5String Comprimento Conteudo 16 08 "Director" Empregado Comprimento Conteudo Numero Comprimento Conteudo 42 01 33 DataIngresso Comprimento Conteudo A1 0A Data Comprimento Conteudo 43 08 "19710917" NomeEsposa Comprimento Conteudo A2 12 Nome Comprimento Conteudo 61 10 IA5String Comprimento Conteudo 16 04 "Mary" IA5String Comprimento Conteudo 16 01 "T" IA5String Comprimento Conteudo 16 05 "Smith" [3] Comprimento Conteudo A3 42 SET Comprimento Conteudo 31 1F Nome Comprimento Conteudo 61 11 IA5String Comprimento Conteudo 16 05 "Ralph" IA5String Comprimento Conteudo 16 01 "T" IA5String Comprimento Conteudo 16 05 "Smith" DataNasc Comprimento Conteudo A0 0A Data Comprimento Conteudo 43 08 "19571111" SET Comprimento Conteudo 31 1F Nome Comprimento Conteudo 61 11 IA5String Comprimento Conteudo 16 05 "Susan" IA5String Comprimento Conteudo 16 01 "B" IA5String Comprimento Conteudo 16 05 "Jones" DataNasc Comprimento Conteudo A0 0A Data Comprimento Conteudo 43 08 "19590717" |
DER |
Material de referência
Texto de Referência
Material de consulta
Os textos abaixo aprofundam o material abordado no curso.