Copyright © 1997 RNDr. Libor Dostálek a Alena Kabelová

ASN.1, BER & DER

Pokud jste se prokousali až do této kapitoly, pak už jste s problematikou protokolů TCP/IP dobře seznámeni. Drtivá většina vývojářů a správců systému  v Internetu se totiž bez této problematiky ráda obejde. Pokud však chcete proniknout do problematiky hlouběji, pak Vítejte v této kapitole.

Definice ASN.1 a kódování BER jsou poměrně rozsáhlé definice, takže jejich studium je obecně považováno za odtažité téma. Zvolili jsme metodu "středoškolského výkladu", tj. smysl většiny pojmů vysvětlujeme na příkladech. Je tedy důležité příklady nepřeskakovat.

Cílem tohoto textu je vytvořit úvod do problematiky tak, aby pak bylo snadnější studovat normy samotné, které jsou vyčerpávající. Bohužel v této oblasti je mnohé normalizováno pomocí doporučení ITU (dříve CCITT), takže normy nejsou již bezplatně (volně) veřejnosti k dispozici (jeden výtisk jedné normy přijde bratru  na 20 švýcarských franků). Doporučení RFC se pak na tyto normy jen odkazují. Výhodou doporučení ITU naopak je, že mají vyšší formální kvalitu než  průměrné RFC. Vzdyť také Mezinárodní telekomunikační unie (ITU) vznikla v roce 1865 a je patrně nejstarší světovou organizací (po vzniku OSN funguje od roku 1947 jako  orgán OSN).

Kromě příslušných norem vycházíme také z literatury: "A Layman's Guide to a Subset of ASN.1, BER a DER" zveřejněné na http://www.rsa.com.

Proč ASN.1? Bavíme-li se hovorově např. o síťové kartě nějakého počítače, pak třeba řekneme: "ta nová karta v počítači pana Nováka...". Komunikují-li však spolu dva počítače pak nelze použít: "ta nová karta ...", ale je nutné přesně (exaktně) specifikovat objekt, jeho typ  a jeho parametry. Jazyk ASN.1 (Abstract Syntax Notation One) zavádí celosvětově jednoznačnou klasifikaci jednotlivých objektů a metody pro definice jejich vlastností v textové i číselné formě. V počítačové komunikaci (např. v síťových protokolech) lze pomocí ASN.1 přesně specifikovat, co má počítač na mysli, když něco chce sdělit svému protějšku.

V ASN.1 se objekty popisují tak, aby popis byl snadno čitelný pro člověka (to bohužel není míněno ironicky).

Při komunikaci dvou počítačů však není nutné, aby se  data přenášela ve tvaru čitelném pro človeka. naopak je nutné zajistit takový tvar, aby byl jednoznačný pro všechny platformy počítačů. Informace se převádí z ASN.1 do kódování BER (Basic Encoding Rules) specifikující jednotlivé bity přenášených bajtů. Informace kódovaná v BER je nejenom pro člověka nečitelná, ale jelikož se jedná o binární data, tak je i nezobrazitelná na displejích. Při výkladu  budeme jednotlivé bajty zobrazovat v hexadecimálním tvaru (dvě šestnáctkové číslice). Při komunikaci počítačů může být také na závadu  osmibitový přenos. V takovém případě se zpravidla BER-kódované informace ještě kódují Base64 (převádí se do sedmibitového tvaru) a říká se tomu někdy "PEM-formát". Ty uvozovky bych měl asi podtrhnout, protože protokol PEM opravdu využívá kódování BER. Na výsledek tohoto kódování se pak ještě použije kódování Base64. Ale je to jen jeden (a ne příliš  významný) praktický příklad.

Zápis v hexadecimálním (šestnáctkovém) tvaru je také sedmibitový, a Base64 je efektivnější, protože prodlouží výsledek jen o třetinu, kdežto hexadecimální zápis prodlouží data na dvojnásobek.

DER kódování (Distinguished Encoding Rules) je podmnožinou BER kódování, se kterou se nejčastěji setkáváme v oblasti certifikátů X.509. Rozdíl mezi BER a DER lze mj. demonstrovat na vyjadřování čísel. Běžně používáme např. číslo 7, ale je možné napsat i 007. Pro BER jsou přípustné obě varianty (7 i 007), pro DER jen první (krátká) varianta, tj. 7.  Blíže se však kódováním DER zabývat nebudeme.
 

ASN.1

ASN.1 je definováno v doporučení ITU (bývalé CCITT) pod označením X.208. Od roku 1994 však ITU tuto problematiku rozpracovalo ještě podrobněji v doporučeních X.680 až X.683. Tato publikace však nepřesahuje rámec doporučení X.208.

V programovacích jazycích se definují typy proměnných (řetězec, celé číslo, číslo v exponenciálním tvaru atd.). ASN.1 definuje typy dat jako řetězce bitů v paměti počítače.
 

Typy a identifikátory

Jazyk ASN.1 nepoužívá slovní spojení "typ proměnné" nebo spojení "typ dat", ale pouze slovo "typ". Typem míníme pojmenovanou množinu hodnot. Např. typ BOOLEAN nabývá hodnoty TRUE nebo FALSE. Typ INTEGER je množinou celých kladných a záporných čísel včetně nuly (zatím pomíjíme problém, že tato množina je prakticky omezená) atd. Hodnotou pak rozumímem jeden prvek z této množiny.

Podobně jako ve vyšších programovacích jazycích máme proměnné pojmenovávající se svými identifikátory, tak v jazyce ASN.1 máme jejich obdobu, která se nazývá identifikátor. Hovorově se i zde někdy používá místo slova identifikátor slovo proměnná nebo spojení identifikátor proměnné.

Když už jsme použili přirovnání k vyššímu programovacímu jazyku, tak např. v jazyce C definujeme celočíselnou proměnnou a jako
    int a
Tedy nejprve napíšeme typ (integer) a pak identifikátor proměnné (a). Avšak např. v jazyce COBOL bychom proměnnou a definovali např.
    a    PIC S9(4) COMP
Tedy nejprve bychom napsali identifikátor porměnné a pak  teprve typ proměnné (PIC S9(4) COMP).  Nyní Vás asi napadlo kde jsem vyštrachal něco tak archaického jako COBOL, ale v jazyce ASN.1 se to píše slovy podobnými jazyku C, ale pořadí je jako v COBOLu, tj.:
    a    INTEGER

Důležité je, že identifikátory začínáme zásadně malým písmenem, kdežto typy velkým písmenem.

Typy v ASN.1 rozlišujeme:

Nové typy definujeme operátorem přiřazení ::= (dvě dvojtečky a rovná se).

Příklad:
Version ::= INTEGER

Příklad definice nového typu Zamestnanec popisujícího kartu zaměstnance ve firmě kapitalista.cz (karta zaměstnance  je tvořena posloupností o čtyřech prvcích, první dva jsou typy IA5string a druhé dva typu BOOLEAN) :
Zamestnanec ::= SEQUENCE {
    prijmeni    IA5string,
    jmeno        IA5string,
    sex            BOOLEAN,
    znamosti    BOOLEAN }

Typy mají své slovní označení (INTEGER, OCTET STRING atd.). Kromě toho je každý typ specifikován číslem, které se anglicky nazývá "Tag Number", česky asi nesprávně, ale s oblibou používané slovo tág.

Dva typy jsou stejné, mají-li stejný tág. Z toho je už jasné, že slovní označení je pouze pomocné a podstatný je právě tág. Tág bude základem i pro DER.

Tágy se dělí na třídy:

 Dále se dozvíme, že číslo identifikující typ je součtem tágu, třídy a skutečnosti, jedná-li se o strukturovaný nebo jednoduchý typ.

 BER kódování