RenatoMartini.Net

ASN.1: interoperabilidade pura

ASN.1 ou "Abstract Syntax Notation number One" é na definição de um dos seus patrocinadores, a ITU-T, uma notação formal usada para descrever, representar, codificar/decodificar, dados a serem  transmitidos em protocolos de telecomunicação -- sua criação data de 1984 (CCITT X.409:1984; ver aqui) -- e, mais presentemente, redes de computadores. É esta capacidade de descrever abstratamente tipos e valores que faz (e sempre fez) do ASN.1 uma poderosa ferramenta de interoperabilidade, tão útil em nossas dias conectados.

Type Tag number
(decimal)
Tag number
(hexadecimal)
INTEGER 2 02
BIT STRING 3 03
OCTET STRING 4 04
NULL 5 05
OBJECT IDENTIFIER 6 06
SEQUENCE and SEQUENCE OF 16 10
SET and SET OF 17 11
PrintableString 19 13
T61String 20 14
IA5String 22 16
UTCTime 23 17

...alguns tipos e suas tags

A tabela mostra alguns tipos presentes na notação, e eles curiosamente estão presentes no dia-a-dia de um certificado digital ICP-Brasil v.3. Se fizermos um dumping em notação ASN.1 ou uma radiografia do certificado da raiz brasileira, por exemplo, os encontraremos um importante object identifier (OID) nesta última versão da AC Raiz brasileira (o leitor interessado pode fazer esta decodificação on line):

OBJECT IDENTIFIER 1.2.840.10045.4.3.4

Ele mostra a adoção da ECDSA no lugar do algoritmo RSA, o OID significa "ecdsaWithSHA512", ANSI X9.62, ou seja, a última chave -- versão 3 -- da AC Raiz foi gerada com o algoritmo de curvas elípticas com o hash sha512 (considerando-se a obsolência do MD5 e do SHA1). Os OIDs (também mantidos pela ITU-T & ISO/IEC) jogam um papel essencial na transferência de dados em rede, pois designam de forma persistente qualquer tipo de objeto, conceito ou "coisa", de forma única (não- ambígua). Possuindo uma forma de árvore hierárquica a "OID tree". Há um repositório on line onde pode-se descobrir facilmente estas árvores de OIDs. O OID acima está em "notação pontual", se escrito em ASN.1 ficarão mais claras as suas inter-relações: {iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA2(3) ecdsa-with-SHA512(4)}.

E no caso de um certificado digital emitida na ICP-Brasil? O Brasil possui também e, especialmente seu sistema nacional de certificação digital, de uma árvore de OIDs. No exemplo abaixo está a OID de um usuário brasilero: "2.16.76.1.3.1". A porção inicial (2.16.76.1) é em ASN.1 {joint-iso-itu-t(2) country(16) br(76) 1} é designa a ICP-Brasil, OIDs a partir daí são mantidos pelo ITI.

Exemplo:

: . . . . . . . . . . (X.509 extension)
1376 150: . . . . . . . . . OCTET STRING, encapsulates {
1379 147: . . . . . . . . . . SEQUENCE {
1382 25: . . . . . . . . . . . [1] 'usuario@end.com.br'
1409 61: . . . . . . . . . . . [0] {
1411 5: . . . . . . . . . . . . OBJECT IDENTIFIER '2 16 76 1 3 1'
1418 52: . . . . . . . . . . . . [0] {
1420 50: . . . . . . . . . . . . . OCTET STRING
 : . . . . . . . . . '0101197500123456789123456789ifp'
 : . . . . . . . . . 'RJ'
 : . . . . . . . . . . . . . }
 : . . . . . . . . . . . . }
1472 23: . . . . . . . . . . . [0] {
1474 5: . . . . . . . . . . . . OBJECT IDENTIFIER '2 16 76 1 3 6'
1481 14: . . . . . . . . . . . . [0] {
1483 12: . . . . . . . . . . . . . OCTET STRING '000000000000'
 : . . . . . . . . . . . . . }
 : . . . . . . . . . . . . }
1497 30: . . . . . . . . . . . [0] {
1499 5: . . . . . . . . . . . . OBJECT IDENTIFIER '2 16 76 1 3 5'
1506 21: . . . . . . . . . . . . [0] {
1508 19: . . . . . . . . . . . . . OCTET STRING '0000000000000000000'
 : . . . . . . . . . . . . . }

Esta é a definição de alguns OIDs brasileiros, usados na ICP-Brasil:

'2 16 76 1 3 1' = dados de pessoa física
'2 16 76 1 3 6' = Campo otherName em certificado de pessoa física, contendo nas 12 posições o número do Cadastro Específico do INSS (CEI) da pessoa física titular do certificado
'2 16 76 1 3 5' = campo otherName em certificado de pessoa física, contendo informações sobre o Título de Eleitor do titular;

 

Note-se que os últimos OIDs são obrigatórios, porém não-críticos, o que significa que estão presentes no leiaute do certificado, mas não precisam ser preenchidos. Os OIDs por sua natureza fixa e interoperável, universalizante, são extremamente úteis no desenvolvimento de softwares e mesmo de um hardware. O objeto "2.16.76.1.4" representa a inscrição profissional em nosso país e será preenchida com tal valor. Pode portanto singularizar e também estabelecer um atributo. Abaixo a representação da "árvores" de OIDs:


tree_display_OID
v.0.2


Referências:

http://www.itu.int/ITU-T/asn1/introduction/short.htm

http://luca.ntop.org/Teaching/Appunti/asn1.html

http://www.cs.auckland.ac.nz/~pgut001/dumpasn1.c

http://www.oid-info.com/index.htm

http://lapo.it/asn1js/

 

v.2.0

Categories: asn.1

Cripto como ferramenta » « Novo sistema eletrônico do MDIC utilizará certificação ICP-Brasil

3 Comments

  1. Gosto do blog mesmo não entendendo nada 😀

  2. Boa noite belo post!
    Gostaria de saber como seria declaro este OID no arquivo de configuração do OpenSSL. Se puder me ajudar ficarei muito grato. Desde já agradeço a atenção.

    • Renato Martini

      21 de setembro de 2017 — 00:34

      Olá André qualquer OID a ser endereçado no OpenSSL é configurado por padrão no openssl.cnf (outra qualquer template usada), ´por exemplo, declara-se ali:

      oid_section = new_oids

      … e depois configure o objeto que desejar na seção destinada aos OIDs:

      [ new_oids ]

      testoid1=1.2.3.4
      testoid2=${testoid1}.5.6

Deixe uma resposta

Your email address will not be published.

*

Copyright © 2017 RenatoMartini.Net

Theme by Anders NorenUp ↑