|
Previous page | Next page | Contents Presentation languageThis document deals with the formatting of data in an external representation. The following very basic and somewhat casually defined presentation syntax will be used. The syntax draws from several sources in its structure. Although it resembles the programming language 'C' in its syntax and XDR [XDR] in both its syntax and intent, it would be risky to draw too many parallels. The purpose of this presentation language is to document SSL only, not to have general application beyond that particular goal.
value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | ... | byte[n-1]; This byte ordering for multi-byte values is the commonplace network byte order or big endian format.
Optional components are denoted by enclosing them in italic "[ ]" brackets. Single byte entities containing uninterpreted data are of type opaque.
The syntax for specifying a new type T' that is a fixed length vector of type T is
T T'[n]; Here T' occupies n bytes in the data stream, where n is a multiple of the size of T. The length of the vector is not included in the encoded stream. In the following example, Datum is defined to be three consecutive bytes that the protocol does not interpret, while Data is three consecutive Datum, consuming a total of nine bytes.
opaque Datum[3]; /* three uninterpreted bytes of data */ Datum Data[9]; /* 3 consecutive 3 byte vectors */ Variable length vectors are defined by specifying a subrange of legal lengths, inclusively, using the notation <floor..ceiling>. When encoded, the actual length precedes the vector's contents in the byte stream. The length will be in the form of a number consuming as many bytes as required to hold the vector's specified maximum (ceiling) length. A variable length vector with an actual length field of zero is referred to as an empty vector.
T T'<floor..ceiling>; In the following example, mandatory is a vector that must contain between 300 and 400 bytes of type opaque. It can never be empty. The actual length field consumes two bytes, a uint16, sufficient to represent the value 400 (see Section 6.4). On the other hand, longer can represent up to 800 bytes of data, or 400 uint16 elements, and it may be empty. Its encoding will include a two byte actual length field prepended to the vector.
opaque mandatory<300..400>; /* length field is 2 bytes, cannot be empty */ uint16 longer<0..800>; /* zero to 400 16-bit unsigned integers */
uint8 uint16[2]; uint8 uint24[3]; uint8 uint32[4]; uint8 uint64[8];
enum { e1(v1), e2 (v1), ... , en (vN), [(n)] } Te; Enumerateds occupy as much space in the byte stream as would its maximal defined ordinal value. The following definition would cause one byte to be used to carry fields of type Color.
enum { red(3), blue(5), white(7) } Color; One may optionally specify a value without its associated tag to force the width definition without defining a superfluous element. In the following example, Taste will consume two bytes in the data stream but can only assume the values 1, 2 or 4.
enum { sweet(1), sour(2), bitter(4), (32000) } Taste; The names of the elements of an enumeration are scoped within the defined type. In the first example, a fully qualified reference to the second element of the enumeration would be Color.blue. Such qualification is not required if the target of the assignment is well specified.
Color color = Color.blue; /* overspecified, but legal */ Color color = blue; /* correct, type is implicit */ For enumerateds that are never converted to external representation, the numerical information may be omitted.
enum { low, medium, high } Amount;
struct { T1 f1; T2 f2; ... Tn fn; } [T]; The fields within a structure may be qualified using the type's name using a syntax much like that available for enumerateds. For example, T.f2 refers to the second field of the previous declaration. Structure definitions may be embedded.
struct { T1 f1; T2 f2; .... Tn fn; select (E) { case e1: Te1; case e2: Te2; .... case en: Ten; } [fv]; } [Tv]; For example 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 variant selector is implicit */ case apple: V1; /* definition of VariantBody, tag = apple */ case orange: V2; /* definition of VariantBody, tag = orange */ } variant_body; /* optional label on the variant portion */ } VariantRecord; Variant structures may be qualified (narrowed) by specifying a value for the selector prior to the type. For example, a
orange VariantRecord is a narrowed type of a VariantRecord containing a variant_body of type V2.
In digital signing, one-way hash functions are used as input for a signing algorithm. In RSA signing, a 36-byte structure of two hashes (one SHA and one MD5) is signed (encrypted with the private key). In DSS, the 20 bytes of the SHA hash are run directly through the Digital Signing Algorithm with no additional hashing. In stream cipher encryption, the plaintext is exclusive-ORed with an identical amount of output generated from a cryptographically-secure keyed pseudorandom number generator. In block cipher encryption, every block of plaintext encrypts to a block of ciphertext. Because it is unlikely that the plaintext (whatever data is to be sent) will break neatly into the necessary block size (usually 64 bits), it is necessary to pad out the end of short blocks with some regular pattern, usually all zeroes. In public key encryption, one-way functions with secret "trapdoors" are used to encrypt the outgoing data. Data encrypted with the public key of a given key pair can only be decrypted with the private key, and vice-versa. In the following example:
stream-ciphered struct { uint8 field1; uint8 field2; digitally-signed opaque hash[20]; } UserType; The contents of hash are used as input for a signing algorithm, then the entire structure is encrypted with a stream cipher.
For example,
struct { uint8 f1; uint8 f2; } Example1; Example1 ex1 = {1, 4}; /* assigns f1 = 1, f2 = 4 */ |
|||||||||||||||||
With any suggestions or questions please feel free to contact us |