Basic Encoding Rules
Basic Encoding Rules (BER) je jeden z formátů kódování pro ASN.1 podle ITU specifikace X.690.
Basic Encoding Rules jsou původní pravidla standardu ASN.1 pro zakódování abstraktní informace do konkrétního datového proudu. Pravidla v jazyce standardu ASN.1 označovaná jako transfer syntax definují konkrétní posloupnosti oktetů, které slouží pro zakódování dané datové položky. Syntaxe definuje:
- reprezentaci jednoduchých datových typů
- strukturu informace o délce
- prostředky umožňující definovat komplexní datové typy skládáním z jednoduchých typů.
BER je spolu se svými dvěma podmnožinami (Canonical Encoding Rules a Distinguished Encoding Rules) definován ITU-T standardem X.690, který patří do sady dokumentů popisujících ASN.1.
Kódování
BER definuje formát pro kódování datových struktur podle ASN.1. BER popisuje typy jednotlivých položek struktur a dovoluje zjistit jejich hranice. Do míst, kde je to nutné, lze vložit označení konce dat (end-of-content marker). Každý datový prvek (data element) je zakódovaný jako trojice
- Type – identifikátor typu
- Length – informace o délce
- Value – vlastní hodnota
Tím se BER řadí k type-length-value (TLV) formátům. BER umožňuje na přijímací straně dekódovat ASN.1 informace z neúplného proudu dat bez potřeby znát velikost obsah nebo význam dat.[1]
1..(tLen) | (tLen+1)..(tLen+1+lLen) | (1+tLen+lLen+1)..(1+tLen+lLen+1+vLen) |
---|---|---|
Type | Length | Value (délky Length) |
Kódování PDU sestává z hierarchie TLV struktur; složené struktury se vytváří pomocí typů SEQUENCE (posloupnost), SET (množina) a CHOICE (alternativa).
Typ
Pole Type určuje typ nebo význam hodnoty. První oktet má následující strukturu:
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|
Třída | P/C | Číslo Tagu |
Pokud číslo tagu má hodnotu 31 (0x1F), je typ vícebytový a končí bytem s hodnotou menší než 128 (0x80).
Horní dva bity pole Type udávají jeho třídu (Class):
Třída | bit 8 | bit 7 |
---|---|---|
Universal (univerzální) | 0 | 0 |
Application (definované aplikací) | 0 | 1 |
Context-specific (kontextově závislé) | 1 | 0 |
Private (definované privátním standardem) | 1 | 1 |
Typy třídy Universal (např. INTEGER) definuje přímo standard ASN.1; typy třídy Private mohou být definovány jinými standardy. Typy s třídou Application si může nadefinovat každá aplikace podle svých potřeb; typy s třídou Context-specific závisí na kontextu (mohou mít různý význam uvnitř různých typů sequence, set nebo choice).
Bit P/C slouží k rozlišení, zda je hodnota jednoduchá (primitive) nebo složená (constructed):
P/C | bit 6 |
---|---|
Primitive | 0 |
Constructed | 1 |
Spodních 6 bitů Číslo tagu určuje konkrétní tag, případně přesný typ hodnoty:
P/C | Číslo (desítkově) | Číslo (šestnáctkově) | |
---|---|---|---|
EOC (End-of-Content koncová značka) | P | 0 | 0 |
BOOLEAN (logická hodnota) | P | 1 | 1 |
INTEGER (celé číslo) | P | 2 | 2 |
BIT STRING (bitový řetězec) | P/C | 3 | 3 |
OCTET STRING (řetězec bytů) | P/C | 4 | 4 |
NULL (prázdná hodnota) | P | 5 | 5 |
OBJECT IDENTIFIER (identifikátor objektu) | P | 6 | 6 |
Object Descriptor (popisovač objektu) | P/C | 7 | 7 |
EXTERNAL (externí) | C | 8 | 8 |
REAL (číslo s pohyblivou řádovou čárkou) | P | 9 | 9 |
ENUMERATED (výčet) | P | 10 | A |
EMBEDDED PDV (vložené PDV) | C | 11 | B |
UTF8String (řetězec v kódování UTF-8) | P/C | 12 | C |
RELATIVE-OID (relativní identifikátor objektu) | P | 13 | D |
reserved (rezervováno) | - | 14 | E |
reserved (rezervováno) | - | 15 | F |
SEQUENCE and SEQUENCE OF (posloupnost) | C | 16 | 10 |
SET and SET OF (množina) | C | 17 | 11 |
NumericString (číslo zapsané jako řetězec) | P/C | 18 | 12 |
PrintableString (tisknutelný řetězec) | P/C | 19 | 13 |
T61String (řetězec v kódování T.61) | P/C | 20 | 14 |
VideotexString (řetězec pro Videotex) | P/C | 21 | 15 |
IA5String (řetězec k kódování IA5) | P/C | 22 | 16 |
UTCTime (časový údaj v UTC) | P/C | 23 | 17 |
GeneralizedTime (časový údaj) | P/C | 24 | 18 |
GraphicString (grafický řetězec) | P/C | 25 | 19 |
VisibleString (viditelný řetězec) | P/C | 26 | 1A |
GeneralString (obecný řetězec) | P/C | 27 | 1B |
UniversalString (univerzální řetězec) | P/C | 28 | 1C |
CHARACTER STRING (znakový řetězec) | P/C | 29 | 1D |
BMPString (řetězec v kódu BMP) | P/C | 30 | 1E |
use long-form (pro rozšíření) | - | 31 | 1F |
Další informace z http://luca.ntop.org/Teaching/Appunti/asn1.html:
Bit P/C (primitive/constructed) má hodnotu 0 pro jednoduché typy (primitive) a 1 pro složené (constructed). Některé typy (např. řetězce) mohou být kódovány jako jednoduché i složené typy. Pokud jsou kódovány jako jednoduché, pole s hodnotou obsahuje reprezentaci položky tagovaných dat, zatímco když kódování je constructed, hodnota obsahuje posloupnost TLV.
Pokud má pole Tag hodnotu 1F (hex), je číslo tagu uloženo v několika následujících bytech; spodních 7 bitů každého bytu je část hodnoty a vrchní bit udává, zda následují další byty (1 - ano, 0 - toto je poslední byte); hodnoty z jednotlivých bytů jsou v pořadí od nejvýznamnějších k nejméně významným.
Data (především prvky posloupností, množina a alternativ) mohou být označena unikátní hodnotou Tagu (v ASN.1 uvedenou v hranatých závorkách []), aby bylo možné rozlišit jednotlivé prvky. Tyto tagy mohou být implicitní (zakódované jako TLV tag hodnoty místo použití základního typu jako TLV tagu) nebo explicitní (tag je použit jako složené TLV, které obaluje TLV základního typu). Pokud není styl tagu výslovně uveden a v ASN.1 definici modulu není definován jako implicitní, je tagovací styl explicitní. Takové tagy mají třídu context-specific, pokud není před tagem uvedeno jiné jméno třídy.
Kódování hodnoty typu alternativa je stejné jako kódování vybrané (použité) hodnoty – tj. primitive nebo constructed podle vybraného typu. Tag použitý v oktetu s identifikátorem je tag vybraného typu jak je definovaný v ASN.1 definici.
Délka
Délka hodnoty (v oktetech) je zakódována takto:
- Pokud první byte pole Length má hodnotu 0x00 až 0x7F, je to délka pole.
- Hodnota 0x80 prvního bytu je povolena pouze pro složené typy a znamená „neurčenou délku“; struktura pak musí být zakončena EOC TLV.
- Pokud má první byte hodnotu n = 0x81 až 0xFE, pak je délka hodnoty obsažena v následujících 'n - 0x80' bytech (big endian).
- Hodnota 0xFF první bytu je rezervovaná pro budoucí rozšíření.[2]
Kódování vybraných typů
Typ OBJECT IDENTIFIER
Type OBJECT IDENTIFIER (identifikátor objektu) používá Type=6. Protože první složka může nabývat hodnot 0 až 2 a druhá složka musí být menší než 40, jsou první dvě složky spojeny do jedné; identifikátor objektu a1.a2.a3.a4.a5 se zakóduje jako posloupnost čísel 40×a1+a2, a3, a4, a5 (číslo 40 je v desítkové soustavě). Pokud je libovolné číslo z posloupnosti menší než 128, je zakódováno jediným oktetem, obsahujícím příslušnou hodnotu. Pokud má číslo hodnotu větší nebo rovnu 128, bude zakódováno pomocí více oktetů s hodnotami o1, o2, ... on, tak že o1, o2, ... on-1 mají hodnotu větší nebo rovnu 128 a on má hodnotu menší než 128, což signalizuje konec kódu pro příslušné číslo; výsledná hodnota = (o1-128)×128n-1 + (o2-128)×128n-2 + ... + on.
Typ PrintableString
PrintableString je univerzální Tag v ASN.1 notaci.
Podle RFC 3280 [1] je PrintableString přípustná znaková sada pro datový typ DirectoryName. PrintableString sestává z podmnožiny znakové sady ASCII a neobsahuje znaky zavináč (@ at sign) a ampersand (&). To způsobuje problémy v naivních implementacích, které se snaží uložit SMTP e-mailovou adresu do položky Distinguished Name v digitálním certifikátu podle standardu X.509.
Podle Layman's Guide to a Subset of ASN.1, BER, and DER [2] (Laický průvodce částí ASN.1, BER a DER), lze znakovou sadu typu PrintableString vyjádřit takto:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
mezera ' ( ) + , - . / : = ?
Porovnání s alternativními formáty
Formát BER ponechává na rozdíl od formátů CER a DER určitou volnost ve způsobu reprezentace dat. Podle standardu X.690 „Vysílající strana může volit z několika kódování. Pokud přijímající strana deklaruje svoji schopnost zpracovávat BER, musí být schopná zpracovat všechny alternativy.“ Například při kódování složené hodnoty může vysílající strana zvolit jednu ze tří možných forem udání délky dat.[1] Přijímající strana musí být schopná přijmout všechny tři alternativy, aby mohla deklarovat, že podporuje BER. Naproti tomu CER a DER dovolují pouze jednu možnost pro udání délky.
Ačkoli je obecně BER vnímáno jako „méně efektivní“ v porovnání s alternativními kódovacími pravidly, při kvalitní implementaci je stejně efektivní jako CER a DER.[3] Tyto implementace využívají pružnosti, kterou umožňuje BER, k maximálnímu zjednodušení kodéru, který ale ne vždy vytváří optimální kódovanou reprezentaci. Ať je tato neefektivita realitou nebo jen pocitem, vedla k vytvoření několika alternativní kódovacích schémat, jako Packed Encoding Rules, která se snaží zlepšit výkonnost BER i velikost produkovaných dat.
Byla vyvinuta i další alternativní formátovací schémata, která jsou stejně flexibilní jako BER. Nejoblíbenější je jsou alternativy založené na XML jako XML Encoding Rules a ASN.1 SOAP.[4] Navíc existuje standardní mapování pro konverzi XML Schématu na ASN.1 schéma, které může být zakódováno pomocí BER.[5]
Použití
Přes některé problémy je BER oblíbený formát pro přenos dat, zvláště mezi systémy s různými nativními kódováními dat.
- Protokoly SNMP a LDAP používají ASN.1 a BER jako své povinné kódovací schéma.
- Standard EMV pro bankovní karty kredit používá BER pro kódování dat na kartě
- Standard PKCS #7 pro digitální podpis používá ASN.1 s BER pro kódování zašifrovaných zpráv, jejich digitálních podpisů a digitálních obálek.
- Standard X.509 pro certifikáty s veřejným klíčem používá ASN.1 s BER.
- Telekomunikační systémy používající TCAP, jako například ISDN, signalizace v SS7 sítích používající MAP a směrování bezplatných hovorů používá intenzivně ASN.1 s BER.
- GSM TAP (Transferred Account Procedures), NRTRDE (Near Real Time Roaming Data Exchange) soubory jsou kódovány pomocí BER. [3]
Reference
- ↑ a b ITU-T X.690, ISO 8825-1
- ↑ Olivier Dubuisson: "ASN.1 - Communication between Heterogeneous Systems", strana 396.
- ↑ Lin, Huai-An. “Estimation of the Optimal Performance of ASN.1/BER Transfer Syntax”. ACM Computer Communication Review. July 93, 45 - 58.
- ↑ ITU-T Rec. X.892, ISO/IEC 24824-2
- ↑ ITU-T X.694, ISO/IEC ISO/IEC 8825-5
- HOUSLEY, R.; POLK, W.; FORD, W.; SOLO, D. Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. [s.l.]: [s.n.] Dostupné online.
- KALISKI, JR., Burton. A Layman's Guide to a Subset of ASN.1, BER, and DER. [s.l.]: [s.n.] Dostupné online.
- LARMOUTH, John. ASN.1 Complete. [s.l.]: [s.n.] Dostupné online.
- DUBUISSON, Olivier. ASN.1 - Communication Between Heterogeneous Systems. [s.l.]: [s.n.] Dostupné online.
- ITU-T. Information technology – Abstract Syntax Notation One (ASN.1): Specification of basic notation (X.680 - 07/2002). [s.l.]: [s.n.] Dostupné online.
- V tomto článku byl použit překlad textu z článku Basic Encoding Rules na anglické Wikipedii.
Související články
- ASN.1
- Canonical Encoding Rules
- Distinguished Encoding Rules
- Packed Encoding Rules
- SNMP
- Kerberos
- Serializace
Externí odkazy
- ITU-T X.690, ISO/IEC 8825-1
- ITU-T X.892, ISO/IEC 24824-2
- ITU-T X.694, ISO/IEC ISO/IEC 8825-5
- PKCS #7
- simple BER tutorial
- jASN1 Java ASN.1 BER encoding/decoding library at openmuc.org, LGPL-licensed
- Peter Gutmann's 'X.509 Style Guide' [4]
- RSA's 'A Layman's Guide to a Subset of ASN.1, BER, and DER ' [5]