Rechnernetze
Home Nach oben Stichworte

Darstellungssprache

TLS verwendet eine besondere Darstellungssprache, die sich an C bzw. XDR (External Data Representation Format, eine Datenaustauschsprache von Sun Microsystems) orientiert.

Basistypen

Optionale Komponenten werden bei der Spezifikation in doppelten eckigen Klammern ([[...]]) dargestellt. Kommentare werden wie in C (/*...*/) notiert. Ein einzelnes uninterpretiertes Byte ist vom Typ opaque. Mehrfache Bytes werden "big-endian" dargestellt. 

value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | ... | byte[n-1];

Felder mit Namen T' mit einer festen Anzahl von Elementen vom Typ T werden wie in C notiert; die Anzahl n gibt die Anzahl der Oktette, nicht die Anzahl der Elemente vom Typ T an.

T T'[n];

Beispiel

opaque Datum[3]; /* three uninterpreted bytes */

Datum Data[9];   /* 3 consecutive 3 byte vectors */

Felder mit Namen T' mit einer variablen Anzahl von Elementen vom Typ T werden unter Angabe eines zulässigen Bereichs angegeben. .

T T'<floor..ceiling>;

Beispiel

opaque mandatory<300..400>/*length field is 2 bytes, cannot be empty*/

uint16 longer<0..800>;    /* zero to 400 16-bit unsigned integers */

Felder mit fester Anzahl von Elementen werden ohne Angabe der Länge übertragen, die mit variabler Anzahl von Elementen mit Angabe dieser Länge kodiert.

Es werden die folgenden numerischen Datentypen definiert:

uint8 uint16[2];

uint8 uint24[3];

uint8 uint32[4];

uint8 uint64[8];

Aufzählungstypen werden ähnlich wie in C notiert, mit der Ausnahme, dass der maximale Wert für die Anzahl von Bytes der internen Darstellung verwendet wird; diese kann durch eine explizite Angabe (ohne Tag) erzwungen werden. Die interne Darstellung kann implizit sein.

enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te;

Beispiel

enum { red(3), blue(5), white(7) } Color;

enum { sweet(1), sour(2), bitter(4), (32000) } Taste;

enum { low, medium, high } Amount;

Color color = Color.blue; /* overspecified, legal */

Color color = blue; /* correct, type implicit */

Konstruierte Typen werden wie in C definiert und können verschachtelt werden.

struct { T1 f1; T2 f2; ... Tn fn; } [[T]];

Beispiel

T.f2 /* referiert das zweite Feld */

Varianten können innerhalb von Strukturen definiert werden, müssen jedoch durch den Wert eines Aufzählungstyps dynamisch festgelegt werden.

struct  { T1 f1; T2 f2; .... Tn fn;

select (E) {

case e1: Te1;

case e2: Te2;

....

case en: Ten;

} [[fv]];

} [[Tv]];

Beispiel

enum   { apple, orange } VariantTag;

struct { uint16 number; opaque string<0..10>; /* variable length */

       } V1;

struct { uint32 number; opaque string[10]; /* fixed length */

       } V2;

struct { select (VariantTag) { /* value of selector is implicit */

           case apple:  V1; /* VariantBody, tag = apple */

           case orange: V2; /* VariantBody, tag = orange */

         } variant_body; /* optional label on variant */

       } VariantRecord;

orange VariantRecord InstanzName;

Bei der Initialisierung können einem Objekt Anfangswerte zugewiesen werden.

Beispiel

struct { uint8 f1; uint8 f2;

       } Example1;

Example1 ex1 = {1, 4}; /* assigns f1 = 1, f2 = 4 */

Kryptographische Attribute

Es gibt vier kryptographische Attribute,

  1. digitally-signed,
  2. stream-ciphered,
  3. block-ciphered,
  4. public-key-encrypted.

Der jeweilige kryptographische Prozess wird durch ein entsprechendes Schlüsselwort spezifiziert, welcher der jeweiligen Typspezifikation des Feldes vorangestellt wird. Die kryptographischen Schlüssel werden implizit dem jeweiligen Sitzungsstatus entnommen.

Für die digitale Signatur einer Zeichenfolge von bis zu 216 Bytes wird eine Einweg-Hashfunktion verwendet.

Bei der RSA-Signatur (nach einem RSA-Laboratories-Standard) werden ein SHA-Hash und ein MD5-Hash konkateniert (286 Bits) und mit dem privaten Schlüssel des Unterzeichners signiert.

Im Digital Signature Standard (DSS) werden die 20 Bytes des SHA-Hashes digital signiert.

Bei einer Stromverschlüsselung wird der Klartext mit der Ausgabe eines kryptografisch sicheren Pseudozufallszahlengenerator verknüpft.

Blockchiffre-Verschlüsselung wird ausschließlich im CBC-Modus durchgeführt.

Public-Key-Verschlüsselung verschlüsselt Blöcke bis zu 216 Bytes.

RSA-verschlüsselte Werte werden mit dem Verfahrern PKCS #1, Blocktyp 2 erzeugt.