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.
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.
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:
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: