Cilem BER kodovani je prevest zapis z ASN.1, tj. z podoby dobre citelne pro cloveka, do podoby (kodovani) vhodne pro komunikaci mezi pocitaci.
Problemem kazdeho kodovani je interpretace jednotlivych bitu v kazdem bajtu. BER specifikuje poradi v jakem se interpretuji jednotlive bity v kazdem bajtu tak, ze nejvyznamnejsi bit je vlevo:
Data se v BER koduji vzdy ve strukture tri poli: typ dat, delka a hodnota:
Pole typu dat v sobe nese soucet tri hodnot, ze kterych je slozeno:
Univerzalni typy zacinaji od nuly, aplikacni od 64 (sestnactkove 40), Content-specific od 128 (8016) a privatni od 192 (C016). Neni-li typ jednoduchy, tj. je-li strukturovany, pak se musi pricist jeste bit J/K, tj. pricte se 32 desitkove, resp. 20 sestnactkove.
Nektere hodnoty univerzalnich tagu jsou uvedeny v nasledujici tabulce:
|
|
|
|
BOOLEAN | 1 | 1 | Nabyva hodnot TRUE a FALSE |
INTEGER | 2 | 2 | Cela kladna i zaporna cisla a nula |
BIT STRING | 3 | 3 | Retezec bitu - muze byt zadan binarne nebo hexadecimalne.
Priklad: 'A98A'H nebo '1010100110001010'B |
OCTET STRING | 4 | 4 | Retezec bajtu (blize nespecifikovany) |
NULL | 5 | 5 | Prazny typ |
OBJECT IDENTIFIER | 6 | 6 | Identifikator objektu (viz samostatna kapitola) |
REAL | 9 | 6 | {Mantisa,Base,Exponent} = M x BE |
ENUMERATED | 10 | A | Vycet hodnot (nemusi byt usporadany) |
SEQUENCE a SEQUENCE OF | 16 | 10 | Usporadana posloupnost prvku. SEQUENCE OF muze byt i prazdna. |
SET a SET OF | 17 | 11 | Mnozina prvku (neusporadana). SET OF muze byt i prazdna. |
PrintableString | 19 | 13 | 0-9 a-z A-Z mezera ' ( ) + , - . / : = ? |
T61String | 20 | 14 | TeleText podle doporuceni T.61
Krome PrintableString obsahuje: 87 102 103 106 107 SPACE DELETE |
IA5String | 22 | 16 | ASCII, tj. krome znaku PrintableString obsahuje: SPACE DELETE |
UTCTime | 23 | 17 | Cas ve formatu UTC.
Napr. 19851106210627.3-0500 vyjadruje 11.6.1985 v 21:06:27,3 kde mistni casove pasmo je 5 hodin zapadne od Grenwiche. |
VisibleString | 26 | 1A |
Nazvy typu zacinaji velkym pismenem. Nazvy typu ktere jsou tvoreny pouze velkymi pismeny (vsechna pismena jsou velka jako napr. INTEGER) jsou klicovymi slovy jazyka ASN.1 a nesmi se pouzit v jinem vyznamu.
Poznamka k obrazku: 126x8=1008
Priklad: Datove pole je dlouhe 2 bajty, pak v poli delka muze byt (sestnactkove):
Pomoci naseho konvertoru si provedte kontrolu:
Cviceni 2: Jak bude v kodovani BER retezec KOTE? (Napr: 16 04 4B 4F 54 45)
Priklad 2: Nyni muzeme pristoupit ke slozitejsimu prikladu.
V kodovani BER vyjadrete jednu polozku z kartoteky zamestnancu firmy kapitalista.cz.
Tato firma ma kazdeho zamestnance popsaneho na karte skladajici se ze ctyr
polozek:
prijmeni | IA5String |
jmeno | IA5String |
sex | BOOLEAN |
znamosti | BOOLEAN |
Jenze kazda karta je v sekvenci techto polozek. Vyjadreno tabulkou
|
Coz v ASN.1 vyjadrime:
Zamestnanec ::= SEQUENCE { prijmeni IA5string, jmeno IA5string, sex BOOLEAN, znamosti BOOLEAN } |
V ASN.1 se v praxi zapis Typu Zamestnanec pise "elegantneji":
Zamestnanec ::= SEQUENCE {
prijmeni Prijmeni,
jmeno Jmeno,
sex Sex,
znamosti Znamosti }
Kde
Prijmeni ::= IA5string,
Jmeno ::= IA5string,
Sex ::= BOOLEAN,
Znamosti ::= BOOLEAN }
Misto typu SEQUENCE by se asi mel pouzit typ SEQUENCE OF, protoze kartoteka
muze byt i prazna (kdyz vsechny zamestnance propustime).
Takze kartu v kodovani BER pro zamestnance: Bobek Bob TRUE (Sex) FALSE
(Znamosti) bychom v BER konstruovali zevnitr (od jednoduchych typu):
SEQUENCE
30 12
IA5STRING :Bobek
16 05 42 6f 62 65 6b
IA5STRING :Bob
16 03 42 6f 62
BOOLEAN :1
01 01 01
BOOLEAN :0
01 01 00
Priklady kodovani celych cisel:
Hodnota | BER-kodovani |
0 | 02 01 00 |
12710 = 7F16 | 02 01 7F |
12810 = 8016 | 02 02 00 80 |
25610 = 10016 | 02 02 01 00 |
-12810 (10016-8016=8016) | 02 01 80 |
-12910 (1000016-8116=FF7F16) | 02 02 FF 7F |
Obecne: INTEGER [{identifikator-1 (hodnota-1) ... identifikator-n (hodnota-n)}]
Priklad:
Barva ::= INTEGER {cervena(1) modra(2) bila (3)}
Priklad z definice certifikatu X.509:
Version :== {v1988(0)}
Certificate :== SEQUENCE {
...
version Version DEFAULT v1988
...}
Tim se chce sdelit, ze identifikator version je typu INTEGER
a neni-li polozka uvedena, pak se pouzije hodnota 0.
Slovo OF v obou pripadech vyjadruje, ze posloupnost (resp. mnozina) muze byt i prazna.
V posloupnosti (SEQUENCE) zalezi na poradi prvku, v mnozine (SET) nikoliv.
Syntaxe SEQUENCE o n prvcich je:
SEQUENCE {
[identifikator-1] Typ-1 [{OPTIONAL | DEFAULT hodnota-1}],
...
[identifikator-n] Typ-n [{OPTIONAL | DEFAULT hodnota-n}] }
Syntaxe SEQUENCE OF, SET a SET OF je obdobna, pouze s tim rozdilem, ze slovo SEQUENCE je nahrazeno slovy SEQUENCE OF, resp. SET, resp. SET OF.
Slovo OPTIONAL vyjadruje, ze prvek je volitelny (nepovinny). Slovo
DEFAULT nasledovane hodnotou pak urcuje, ze v pripade kdy prvek neni uveden,
pak se pouzije implicitni hodnota.
Napr.: 19851106210627.3-0500
vyjadruje 11.6.1985 v 21:06:27,3 kde mistni casove pasmo je 5 hodin
zapadne od Grenwiche.
V BER-kodovani se UTCTime zpravidla koduje v ASCII, tj. uvedeny cas
bude:
31 39 38 35 31 31 30 36 32 31 30 36 32 37 2e 33 2d 30 35 30 30
(pro orientaci: 0=3016, 1=3116 , ..., minus je
2d).
Musime jeste doplnit typ (UTCTime ma 1716 ) a delka je 1516
cili:
17 15 31 39 38 35 31 31 30 36 32 31 30
36 32 37 2e 33 2d 30 35 30 30
Zleva se pred retezec doplni bajt binarne vyjadrujici o kolik bitu byl retezec doplnen.
Priklad:
Retezec | 01101110 11 |
Zprava doplnen sesti binarnimi nulami | 01101110 11000000 |
Preveden na bajty (vyjadreno sestnactkove) | 6E C0 |
Zleva doplnen bajtem vyjadrujicim delku vyplne (6) | 06 6E C0 |
BER kodovani (03 je tag pro bit string, 03 je i delka) | 03 03 06 6E C0 |