X.690
X.690 to standard ITU-T określający kilka formatów kodowania ASN.1 :
- Podstawowe zasady kodowania (BER)
- Reguły kodowania kanonicznego (CER)
- Wyróżniające się reguły kodowania (DER)
Podstawowe zasady kodowania (BER) były oryginalnymi zasadami określonymi w standardzie ASN.1 do kodowania danych w formacie binarnym. Reguły, określane zbiorczo jako składnia transferu w żargonie ASN.1, określają dokładne oktety (8-bitowe bajty) używane do kodowania danych.
X.680 definiuje składnię do deklarowania typów danych, na przykład: logiczne, liczbowe, łańcuchowe i struktury złożone. Każda definicja typu zawiera również numer identyfikacyjny. X.680 definiuje kilka prymitywnych typów danych, na przykład: BooleanType, IntegerType, OctetStringType. (ASN.1 zapewnia również skonstruowane typy zbudowane z innych typów). Typy są skojarzone z klasą . Na przykład typy pierwotne są częścią uniwersalnej . Trzy pozostałe klasy ( application , private i kontekstowe ) to zasadniczo różne zakresy obsługujące dostosowywanie do określonych aplikacji. W połączeniu klasa i typ tworzą tag , który w związku z tym odpowiada unikalnej definicji danych. X.690 zawiera reguły kodowania tych znaczników, wartości danych (zawartości) i długości tych zakodowanych danych.
BER, wraz z dwoma podzbiorami BER ( Canonical Encoding Rules i Distinguished Encoding Rules ), są zdefiniowane w dokumencie standardów X.690 ITU-T , który jest częścią serii dokumentów ASN.1.
kodowanie BER
Podstawowe reguły kodowania określają w sposób ogólny częściowo samoopisujący i samoograniczający protokół do kodowania struktur danych ASN.1. Każdy element danych należy zakodować jako identyfikator typu, opis długości, rzeczywiste elementy danych oraz, w razie potrzeby, znacznik końca treści. Te typy kodowania są powszechnie nazywane kodowaniem typ-długość-wartość (TLV). Jednak w terminologii BER jest to identyfikator-długość-zawartość .
Ten typ formatu umożliwiłby odbiornikowi dekodowanie informacji ASN.1 z niekompletnego strumienia, bez konieczności uprzedniej znajomości rozmiaru, treści lub znaczenia semantycznego danych, chociaż należałoby podać pewne szczegóły protokołu lub poddane inżynierii wstecznej z reprezentatywnych próbek ruchu lub oprogramowania.
Kodowanie danych składa się z trzech lub czterech elementów w następującej kolejności:
Oktety identyfikatora Typ |
Długość oktetów Długość |
Zawartość oktetów Wartość |
Oktety końca treści (tylko w przypadku nieokreślonej formy ) |
Zauważ, że jeśli długość wynosi zero, to nie ma oktetów zawartości, np. typu NULL. Oktety końca treści są używane tylko dla nieokreślonej formy długości.
Oktety identyfikatora
identyfikatora BER kodują znaczniki ASN.1 . Listę tagów klasy uniwersalnej można znaleźć na stronie Rec. ITU-T X.680, klauzula 8, tabela 1. Następujące znaczniki są natywne dla ASN.1:
Nazwa | Dozwolona konstrukcja | Numer znacznika | |
---|---|---|---|
Dziesiętny | Szesnastkowy | ||
Koniec treści (EOC) | Prymitywny | 0 | 0 |
BOOLEAN | Prymitywny | 1 | 1 |
LICZBA CAŁKOWITA | Prymitywny | 2 | 2 |
ŁAŃCUCH BITÓW | Obydwa | 3 | 3 |
ŁAŃCUCH OKTETU | Obydwa | 4 | 4 |
ZERO | Prymitywny | 5 | 5 |
IDENTYFIKATOR OBIEKTU | Prymitywny | 6 | 6 |
Deskryptor obiektu | Obydwa | 7 | 7 |
ZEWNĘTRZNY | Zbudowana | 8 | 8 |
RZECZYWISTY (zmiennoprzecinkowy) | Prymitywny | 9 | 9 |
WYLICZONE | Prymitywny | 10 | A |
WBUDOWANY PDV | Zbudowana | 11 | B |
Ciąg znaków UTF8 | Obydwa | 12 | C |
WZGLĘDNY OID | Prymitywny | 13 | D |
CZAS | Prymitywny | 14 | mi |
Skryty | 15 | F | |
KOLEJNOŚĆ I KOLEJNOŚĆ | Zbudowana | 16 | 10 |
ZESTAW i ZESTAW | Zbudowana | 17 | 11 |
Ciąg liczbowy | Obydwa | 18 | 12 |
Ciąg do wydrukowania | Obydwa | 19 | 13 |
T61String | Obydwa | 20 | 14 |
VideotexString | Obydwa | 21 | 15 |
Ciąg IA5 | Obydwa | 22 | 16 |
Czas UTC | Obydwa | 23 | 17 |
Uogólniony czas | Obydwa | 24 | 18 |
Ciąg graficzny | Obydwa | 25 | 19 |
Widoczny ciąg | Obydwa | 26 | 1A |
Ciąg ogólny | Obydwa | 27 | 1B |
Ciąg uniwersalny | Obydwa | 28 | 1C |
ŁAŃCUCH ZNAKÓW | Zbudowana | 29 | 1D |
BMPString | Obydwa | 30 | 1E |
DATA | Prymitywny | 31 | 1F |
PORA DNIA | Prymitywny | 32 | 20 |
DATA-CZAS | Prymitywny | 33 | 21 |
CZAS TRWANIA | Prymitywny | 34 | 22 |
OID-IRI | Prymitywny | 35 | 23 |
RELATIVE-OID-IRI | Prymitywny | 36 | 24 |
Kodowanie
Oktety identyfikatora kodują numer klasy i numer typu znacznika ASN.1. Koduje również, czy oktety zawartości reprezentują wartość skonstruowaną czy pierwotną. Identyfikator obejmuje jeden lub więcej oktetów.
Oktet 1 |
Oktet 2 ... n Tylko jeśli typ znacznika > 30 10 |
||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
Klasa tagów | komputer osobisty | Typ znacznika (jeśli 0–30 10 ) | Długa forma | ||||||||||||
31 10 = Długa forma | 1=Więcej | 7 bitów typu Tag |
W początkowym oktecie bit 6 koduje, czy typ jest prymitywny, czy skonstruowany, bity 7–8 kodują klasę znacznika, a bity 1–5 kodują typ znacznika. Możliwe są następujące wartości:
Klasa | Wartość | Opis |
---|---|---|
uniwersalny | 0 | Typ jest natywny dla ASN.1 |
Aplikacja | 1 | Typ jest ważny tylko dla jednej określonej aplikacji |
Specyficzne dla kontekstu | 2 | Znaczenie tego typu zależy od kontekstu (np. w ramach sekwencji, zestawu lub wyboru) |
Prywatny | 3 | Zdefiniowane w prywatnych specyfikacjach |
komputer osobisty | Wartość | Opis |
---|---|---|
Prymitywny (P) | 0 | Oktety zawartości bezpośrednio kodują wartość. |
Zbudowany (C) | 1 | Oktety zawartości zawierają 0, 1 lub więcej kodowań. |
Jeśli typ tagu mieści się w 5 bitach (0-30 10 ), to Identyfikator obejmuje tylko jeden bajt: Short Form . Jeśli typ znacznika jest zbyt duży dla 5-bitowego pola znacznika (> 30 10 ), należy go zakodować w dalszych oktetach: Long Form .
Początkowy oktet koduje klasę i prymityw/konstrukcję jak poprzednio, a bity 1–5 to 1. Numer znacznika jest zakodowany w następujących oktetach, gdzie bit 8 każdego z nich to 1, jeśli jest więcej oktetów, a bity 1–7 kodują numer znacznika. Połączone bity numeru znacznika, big-endian, kodują numer znacznika. Należy zakodować najmniejszą liczbę kolejnych oktetów; to znaczy, bity 1–7 nie powinny mieć wartości 0 w pierwszym kolejnym oktecie.
Długość oktetów
Istnieją dwie formy oktetów długości: forma określona i forma nieokreślona.
Formularz | Bity | |||||||
---|---|---|---|---|---|---|---|---|
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |
Zdecydowany, krótki | 0 | Długość (0–127) | ||||||
Nieokreślony | 1 | 0 | ||||||
Zdecydowany, długi | 1 | Liczba kolejnych oktetów (1–126) | ||||||
Skryty | 1 | 127 |
Zdecydowana forma
To koduje liczbę oktetów treści i jest używane zawsze, jeśli typ jest pierwotny lub skonstruowany, a dane są natychmiast dostępne. Istnieje krótka forma i długa forma, która może kodować różne zakresy długości. Dane liczbowe są kodowane jako liczby całkowite bez znaku, z najmniej znaczącym bitem zawsze na początku (po prawej).
Krótka forma składa się z pojedynczego oktetu, w którym bit 8 to 0, a bity 1–7 kodują długość (która może wynosić 0) jako liczbę oktetów.
Forma długa składa się z 1 początkowego oktetu, po którym następuje 1 lub więcej kolejnych oktetów zawierających długość. W początkowym oktecie bit 8 to 1, a bity 1–7 (z wyłączeniem wartości 0 i 127) kodują liczbę kolejnych oktetów. Następujące oktety kodują, jako big-endian, długość (która może wynosić 0) jako liczbę oktetów.
Oktet 1 | Oktet 2 | Oktet 3 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
Długa forma | 2 oktety długości | 110110011 2 = 435 10 oktetów zawartości |
Nieokreślona forma
To w ogóle nie koduje długości, ale oktety treści kończą się na oktetach znacznikowych. Dotyczy to skonstruowanych typów i jest zwykle używane, jeśli zawartość nie jest natychmiast dostępna w czasie kodowania.
Składa się z pojedynczego oktetu, w którym bit 8 to 1, a bity 1–7 to 0. Następnie dwa oktety końca treści muszą zakończyć oktety treści.
Zawartość oktetów
Oktety zawartości kodują wartość danych elementu.
Zauważ, że może nie być oktetów zawartości (stąd element ma długość 0), jeśli ma być odnotowane tylko istnienie obiektu ASN.1 lub jego pustka. Dotyczy to na przykład wartości ASN.1 NULL.
kodowanie CER
CER (Canonical Encoding Rules) to ograniczony wariant BER do tworzenia jednoznacznej składni transferu dla struktur danych opisanych przez ASN.1 . Podczas gdy BER daje wybór sposobu kodowania wartości danych, CER (wraz z DER ) wybiera tylko jedno kodowanie spośród dozwolonych przez podstawowe zasady kodowania, eliminując pozostałe opcje. CER jest przydatny, gdy kodowanie musi być zachowane; np. w giełdach papierów wartościowych.
kodowanie DER
DER (Distinguished Encoding Rules) to ograniczony wariant BER do tworzenia jednoznacznej składni transferu dla struktur danych opisanych przez ASN.1 . Podobnie jak CER , kodowania DER są prawidłowymi kodowaniami BER. DER to to samo co BER z usuniętymi wszystkimi opcjami nadawcy oprócz jednego.
DER to podzbiór BER zapewniający dokładnie jeden sposób kodowania wartości ASN.1. DER jest przeznaczony do sytuacji, w których potrzebne jest unikalne kodowanie, na przykład w kryptografii , i zapewnia, że struktura danych, która musi być podpisana cyfrowo, tworzy unikalną serializowaną reprezentację. DER można uznać za kanoniczną formę BER. Na przykład w BER logiczną true można zakodować jako dowolną z 255 niezerowych wartości bajtowych, podczas gdy w DER istnieje jeden sposób zakodowania wartości logicznej true.
Najbardziej znaczące ograniczenia kodowania DER to:
- Kodowanie długości musi mieć postać określoną
- Dodatkowo należy zastosować kodowanie długości możliwie najkrótszej
- Ciągi bitów, ciągi oktetów i ograniczone ciągi znaków muszą używać kodowania pierwotnego
- Elementy zestawu są kodowane w kolejności posortowanej na podstawie ich wartości znacznika
DER jest szeroko stosowany w przypadku certyfikatów cyfrowych, takich jak X.509 .
Porównanie BER, CER i DER
Kluczową różnicą między formatem BER a formatami CER lub DER jest elastyczność zapewniana przez podstawowe zasady kodowania. BER, jak wyjaśniono powyżej, jest podstawowym zestawem reguł kodowania podanych przez ITU-T X.690 do przesyłania struktur danych ASN.1. Daje nadawcom jasne zasady kodowania struktur danych, które chcą wysłać, ale pozostawia też nadawcom pewne opcje kodowania. Jak stwierdzono w standardzie X.690, „Alternatywne kodowanie jest dozwolone przez podstawowe zasady kodowania jako opcja nadawcy. Odbiorcy, którzy deklarują zgodność z podstawowymi zasadami kodowania, powinni wspierać wszystkie alternatywy”.
Odbiorca musi być przygotowany na zaakceptowanie wszystkich kodowań prawnych, aby zgodnie z prawem domagać się zgodności z BER. Natomiast zarówno CER, jak i DER ograniczają dostępne specyfikacje długości do jednej opcji. Jako takie, CER i DER są ograniczonymi formami BER i służą do ujednoznacznienia standardu BER.
CER i DER różnią się zestawem ograniczeń, które nakładają na nadawcę. Podstawowa różnica między CER i DER polega na tym, że DER używa formy o ostatecznej długości, a CER używa formy o nieokreślonej długości w niektórych dokładnie określonych przypadkach. Oznacza to, że DER zawsze zawiera informacje o długości wiodącej, podczas gdy CER używa oktetów końca treści zamiast dostarczania długości zakodowanych danych. Z tego powodu CER wymaga mniej metadanych dla dużych zakodowanych wartości, podczas gdy DER robi to dla małych.
Aby ułatwić wybór między regułami kodowania, dokument standardów X.690 zawiera następujące wskazówki:
Wyróżnione reguły kodowania są bardziej odpowiednie niż kanoniczne reguły kodowania, jeśli zakodowana wartość jest wystarczająco mała, aby zmieścić się w dostępnej pamięci i istnieje potrzeba szybkiego pominięcia niektórych zagnieżdżonych wartości. Reguły kodowania kanonicznego są bardziej odpowiednie niż reguły kodowania wyróżnionego, jeśli istnieje potrzeba zakodowania wartości, które są tak duże, że nie mieszczą się w dostępnej pamięci lub konieczne jest zakodowanie i przesłanie części wartości przed całą wartością jest dostępny. Podstawowe reguły kodowania są bardziej odpowiednie niż reguły kodowania kanonicznego lub wyróżniającego, jeśli kodowanie zawiera ustawioną wartość lub zestaw wartości i nie ma potrzeby stosowania ograniczeń, które narzucają reguły kodowania kanonicznego i wyróżniającego.
Krytyka kodowania BER
Powszechnie uważa się, że BER jest „nieefektywny” w porównaniu z alternatywnymi regułami kodowania. Niektórzy argumentowali, że to postrzeganie wynika przede wszystkim ze słabych implementacji, niekoniecznie z jakiejkolwiek nieodłącznej wady reguł kodowania. Implementacje te opierają się na elastyczności zapewnianej przez BER w zakresie stosowania logiki kodowania, która jest łatwiejsza do wdrożenia, ale skutkuje większym strumieniem zakodowanych danych niż to konieczne. Niezależnie od tego, czy ta nieefektywność jest rzeczywistością, czy postrzeganiem, doprowadziła do powstania wielu alternatywnych schematów kodowania, takich jak Packed Encoding Rules , które próbują poprawić wydajność i rozmiar BER.
Opracowywane są również inne alternatywne zasady formatowania, które nadal zapewniają elastyczność BER, ale wykorzystują alternatywne schematy kodowania. Najpopularniejsze z nich to alternatywy oparte na XML, takie jak XML Encoding Rules i ASN.1 SOAP . Ponadto istnieje standardowe mapowanie do konwersji schematu XML na schemat ASN.1, który można następnie zakodować za pomocą BER.
Stosowanie
Pomimo dostrzeganych problemów, BER jest popularnym formatem przesyłania danych, szczególnie w systemach z różnymi natywnymi kodowaniami danych.
- SNMP i LDAP określają ASN.1 z BER jako wymagany schemat kodowania .
- Standard EMV dla kart kredytowych i debetowych używa BER do kodowania danych na karcie
- Standard podpisu cyfrowego PKCS #7 określa również ASN.1 z BER do kodowania zaszyfrowanych wiadomości i ich podpisu cyfrowego lub cyfrowej koperty .
- Wiele systemów telekomunikacyjnych, takich jak ISDN , przekierowywanie połączeń bezpłatnych i większość usług telefonii komórkowej, w pewnym stopniu wykorzystuje ASN.1 z BER do przesyłania komunikatów kontrolnych przez sieć.
- Pliki GSM TAP (Transferred Account Procedures), NRTRDE (Near Real Time Roaming Data Exchange) są kodowane przy użyciu BER. [1]
Dla porównania, bardziej dokładne kodowanie DER jest szeroko stosowane do przesyłania certyfikatów cyfrowych, takich jak X.509 .
Zobacz też
- Kerberos
- Spakowane reguły kodowania (PER, X.691)
- Warstwa prezentacji
- Format wymiany danych strukturalnych ( SDXF )
- Serializacja
Linki zewnętrzne
- RSA „Przewodnik dla laika po podzbiorze ASN.1, BER i DER”
- 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 nr 7
- jASN1 Otwarta biblioteka kodowania Java ASN.1 BER/DER firmy beanit
- PHPASN1 PHP ASN.1 Biblioteka do kodowania/dekodowania BER w GitHub, na licencji GPL
- ASN1js JavaScript ASN.1 Biblioteka kodowania/dekodowania BER w GitHub, na licencji GPL
- „Przewodnik po stylu X.509” Petera Gutmanna