Copyright © 1997 RNDr. Libor Dostalek a Alena Kabelova

ASN.1, BER & DER

Pokud jste se prokousali az do teto kapitoly, pak uz jste s problematikou protokolu TCP/IP dobre seznameni. Drtiva vetsina vyvojaru a spravcu systemu  v Internetu se totiz bez teto problematiky rada obejde. Pokud vsak chcete proniknout do problematiky hloubeji, pak Vitejte v teto kapitole.

Definice ASN.1 a kodovani BER jsou pomerne rozsahle definice, takze jejich studium je obecne povazovano za odtazite tema. Zvolili jsme metodu "stredoskolskeho vykladu", tj. smysl vetsiny pojmu vysvetlujeme na prikladech. Je tedy dulezite priklady nepreskakovat.

Cilem tohoto textu je vytvorit uvod do problematiky tak, aby pak bylo snadnejsi studovat normy samotne, ktere jsou vycerpavajici. Bohuzel v teto oblasti je mnohe normalizovano pomoci doporuceni ITU (drive CCITT), takze normy nejsou jiz bezplatne (volne) verejnosti k dispozici (jeden vytisk jedne normy prijde bratru  na 20 svycarskych franku). Doporuceni RFC se pak na tyto normy jen odkazuji. Vyhodou doporuceni ITU naopak je, ze maji vyssi formalni kvalitu nez  prumerne RFC. Vzdyt take Mezinarodni telekomunikacni unie (ITU) vznikla v roce 1865 a je patrne nejstarsi svetovou organizaci (po vzniku OSN funguje od roku 1947 jako  organ OSN).

Krome prislusnych norem vychazime take z literatury: "A Layman's Guide to a Subset of ASN.1, BER a DER" zverejnene na http://www.rsa.com.

Proc ASN.1? Bavime-li se hovorove napr. o sitove karte nejakeho pocitace, pak treba rekneme: "ta nova karta v pocitaci pana Novaka...". Komunikuji-li vsak spolu dva pocitace pak nelze pouzit: "ta nova karta ...", ale je nutne presne (exaktne) specifikovat objekt, jeho typ  a jeho parametry. Jazyk ASN.1 (Abstract Syntax Notation One) zavadi celosvetove jednoznacnou klasifikaci jednotlivych objektu a metody pro definice jejich vlastnosti v textove i ciselne forme. V pocitacove komunikaci (napr. v sitovych protokolech) lze pomoci ASN.1 presne specifikovat, co ma pocitac na mysli, kdyz neco chce sdelit svemu protejsku.

V ASN.1 se objekty popisuji tak, aby popis byl snadno citelny pro cloveka (to bohuzel neni mineno ironicky).

Pri komunikaci dvou pocitacu vsak neni nutne, aby se  data prenasela ve tvaru citelnem pro cloveka. naopak je nutne zajistit takovy tvar, aby byl jednoznacny pro vsechny platformy pocitacu. Informace se prevadi z ASN.1 do kodovani BER (Basic Encoding Rules) specifikujici jednotlive bity prenasenych bajtu. Informace kodovana v BER je nejenom pro cloveka necitelna, ale jelikoz se jedna o binarni data, tak je i nezobrazitelna na displejich. Pri vykladu  budeme jednotlive bajty zobrazovat v hexadecimalnim tvaru (dve sestnactkove cislice). Pri komunikaci pocitacu muze byt take na zavadu  osmibitovy prenos. V takovem pripade se zpravidla BER-kodovane informace jeste koduji Base64 (prevadi se do sedmibitoveho tvaru) a rika se tomu nekdy "PEM-format". Ty uvozovky bych mel asi podtrhnout, protoze protokol PEM opravdu vyuziva kodovani BER. Na vysledek tohoto kodovani se pak jeste pouzije kodovani Base64. Ale je to jen jeden (a ne prilis  vyznamny) prakticky priklad.

Zapis v hexadecimalnim (sestnactkovem) tvaru je take sedmibitovy, a Base64 je efektivnejsi, protoze prodlouzi vysledek jen o tretinu, kdezto hexadecimalni zapis prodlouzi data na dvojnasobek.
 
DER kodovani (Distinguished Encoding Rules) je podmnozinou BER kodovani, se kterou se nejcasteji setkavame v oblasti certifikatu X.509. Rozdil mezi BER a DER lze mj. demonstrovat na vyjadrovani cisel. Bezne pouzivame napr. cislo 7, ale je mozne napsat i 007. Pro BER jsou pripustne obe varianty (7 i 007), pro DER jen prvni (kratka) varianta, tj. 7.  Blize se vsak kodovanim DER zabyvat nebudeme.
 

ASN.1

ASN.1 je definovano v doporuceni ITU (byvale CCITT) pod oznacenim X.208. Od roku 1994 vsak ITU tuto problematiku rozpracovalo jeste podrobneji v doporucenich X.680 az X.683. Tato publikace vsak nepresahuje ramec doporuceni X.208.

V programovacich jazycich se definuji typy promennych (retezec, cele cislo, cislo v exponencialnim tvaru atd.). ASN.1 definuje typy dat jako retezce bitu v pameti pocitace.
 

Typy a identifikatory

Jazyk ASN.1 nepouziva slovni spojeni "typ promenne" nebo spojeni "typ dat", ale pouze slovo "typ". Typem minime pojmenovanou mnozinu hodnot. Napr. typ BOOLEAN nabyva hodnoty TRUE nebo FALSE. Typ INTEGER je mnozinou celych kladnych a zapornych cisel vcetne nuly (zatim pomijime problem, ze tato mnozina je prakticky omezena) atd. Hodnotou pak rozumimem jeden prvek z teto mnoziny.

Podobne jako ve vyssich programovacich jazycich mame promenne pojmenovavajici se svymi identifikatory, tak v jazyce ASN.1 mame jejich obdobu, ktera se nazyva identifikator. Hovorove se i zde nekdy pouziva misto slova identifikator slovo promenna nebo spojeni identifikator promenne.

Kdyz uz jsme pouzili prirovnani k vyssimu programovacimu jazyku, tak napr. v jazyce C definujeme celociselnou promennou a jako
    int a
Tedy nejprve napiseme typ (integer) a pak identifikator promenne (a). Avsak napr. v jazyce COBOL bychom promennou a definovali napr.
    a    PIC S9(4) COMP
Tedy nejprve bychom napsali identifikator pormenne a pak  teprve typ promenne (PIC S9(4) COMP).  Nyni Vas asi napadlo kde jsem vystrachal neco tak archaickeho jako COBOL, ale v jazyce ASN.1 se to pise slovy podobnymi jazyku C, ale poradi je jako v COBOLu, tj.:
    a    INTEGER

Dulezite je, ze identifikatory zaciname zasadne malym pismenem, kdezto typy velkym pismenem.

Typy v ASN.1 rozlisujeme:

Nove typy definujeme operatorem prirazeni ::= (dve dvojtecky a rovna se).

Priklad:
Version ::= INTEGER

Priklad definice noveho typu Zamestnanec popisujiciho kartu zamestnance ve firme kapitalista.cz (karta zamestnance  je tvorena posloupnosti o ctyrech prvcich, prvni dva jsou typy IA5string a druhe dva typu BOOLEAN) :
Zamestnanec ::= SEQUENCE {
    prijmeni    IA5string,
    jmeno        IA5string,
    sex            BOOLEAN,
    znamosti    BOOLEAN }

Typy maji sve slovni oznaceni (INTEGER, OCTET STRING atd.). Krome toho je kazdy typ specifikovan cislem, ktere se anglicky nazyva "Tag Number", cesky asi nespravne, ale s oblibou pouzivane slovo tag.

Dva typy jsou stejne, maji-li stejny tag. Z toho je uz jasne, ze slovni oznaceni je pouze pomocne a podstatny je prave tag. Tag bude zakladem i pro DER.

Tagy se deli na tridy:

 Dale se dozvime, ze cislo identifikujici typ je souctem tagu, tridy a skutecnosti, jedna-li se o strukturovany nebo jednoduchy typ.

 BER kodovani