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