Rechnernetze
Home Nach oben

Darstellungssprache

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

Basistypen

Optionale Komponenten bei Spezifikation in doppelten eckigen Klammern ([[...]]
Kommentare wie in C (/*...*/
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' 
festen Anzahl von Elementen vom Typ T 
wie in C notiert
Anzahl n gibt die Anzahl der Oktette an (nicht Anzahl der Elemente vom Typ T)

T T'[n];

Beispiel

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

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

Felder mit Namen T' mit variabler Anzahl von Elementen vom Typ T 
Angabe eines zulässigen Bereichs 

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 */

übertragen von Feldern
mit fester Anzahl von Elementen ohne Angabe der Länge 
mit variabler Anzahl von Elementen mit Angabe dieser Länge kodiert
numerische Datentypen 

uint8 uint16[2];

uint8 uint24[3];

uint8 uint32[4];

uint8 uint64[8];

Aufzählungstypen  
ähnlich wie in C 
Ausnahme, 
maximaler Wert für Anzahl von Bytes der internen Darstellung 
durch explizite Angabe (ohne Tag) erzwungen 
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  
innerhalb von Strukturen definierbar
müssen durch eines Aufzählungstyps dynamisch festgelegt werden

struct  { T1 f1; T2 f2;

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.
kryptographischer Prozess durch Schlüsselwort spezifiziert
der jeweiligen Typspezifikation des Feldes vorangestellt 
kryptographische Schlüssel implizit dem jeweiligen Sitzungsstatus entnommen.
Für digitale Signatur einer Zeichenfolge von bis zu 216 Bytes wird Einweg-Hashfunktion verwendet.
RSA-Signatur 
nach einem RSA-Laboratories-Standard
SHA-Hash und MD5-Hash konkateniert (286 Bits) 
mit privatem Schlüssel des Unterzeichners signiert.
Digital Signature Standard (DSS) 
20 Bytes des SHA-Hashes digital signiert.
Stromverschlüsselung 
Klartext mit Ausgabe eines kryptografisch sicheren Pseudozufallszahlengenerator verknüpft.
Blockchiffre-Verschlüsselung 
ausschließlich im CBC-Modus
Public-Key-Verschlüsselung 
verschlüsselt Blöcke bis zu 216 Bytes.
RSA-verschlüsselte Werte 
mit Verfahrern PKCS #1, Blocktyp 2 erzeugt.