ALMA MATER STUDIORUM - UNIVERSITA' DI BOLOGNA FACOLTA' DI INGEGNERIA - SEDE DI CESENA LABORATORIO DI INFORMATICA Network Management 3. Il linguaggio ASN.1 3.2 Descrizione del linguaggio Claudio Salati Copyright © 2001 by Claudio Salati 1 Acknowledgements Questa lezione e' in gran parte derivata dal libro: • M. T. Rose, "The Open Book, A practical perspective on OSI", Prentice-Hall, 1989. Tutti i testi in inglese che compaiono in queste pagine, che siano o no virgolettati, sono tratti da questo libro. Un ringraziamento anche alla vecchia SIP per avermi, inconsapevolmente, dedicato un nome OBJECT IDENTIFIER: { ccitt network-operator(3) sip(2222) sgsdh(0) informationModel(0) sipItaltel(100) } 2 DEFINIZIONE DEL PROBLEMA • Il problema: The decoupling of the virtual data types exchanged by a protocol and the actual data structures that reside in a particular implementation. • La soluzione si basa su due nozioni: 1. Abstract representation: each data type is described without regard to machine-oriented structures and restrictions; 2. Concrete representation: a given instance of a data type may be transmitted on the network using an octet stream. The representation used must result in an unambiguous understanding between the sender and receiver as to the value (valore tipizzato!) of the data type. 3 EVOLUZIONE DEL PROBLEMA • "In the early days types were simple. Abstract representation focused on avoiding the pitfalls of byte and bit ordering of machine-oriented structures. • This tended to blur the distinction between the abstract and the concrete: data types were defined using diagrams that described the packet formats of the protocol. • In the 80's, the data types exchanged by application layer protocols became arbitrarily complex. • Formal languages are now used for precise definitions. • In OSI, the Abstract Syntax Notation One (ASN.1) language is used to describe data types. • ASN.1 is distinct from the mechanisms used to produce concrete representations. However, the Basic Encoding Rules (BER) were defined for ASN.1 so that data could be unambiguously transmitted." [M.T. Rose, "The open book"] 4 PERCHE' STRUTTURE DATI COMPLESSE ? • perche' le informazioni accedute tramite rete sono piu' complesse e con un numero di tipi di dato molto piu' vasto, • perche' una applicazione puo' allargare il numero di tipi di dato gestiti • perche' il tipo di dato acceduto attraverso la rete non e' necessariamente noto a priori a chi lo accede (ad esempio un browser attraverso un directory service). 5 L'approccio OSI 1 • the specification of the protocol used by the distributed application defines each data type using an abstract representation (e.g. ASN.1) The language used defines the conceptual aspects of a data type, but does not contain rules for how the data type might be realized on a real computer; • an implementor defines concrete local data types equivalent to the abstract data types using a programming language that is native to its machine (e.g. C). These are concrete representations, defined by a particular processor, language, compiler, run-time system; • when it is time to transmit a value of a data type, 2 mappings must be performed: • m1. the concrete local data structure is mapped to the abstract syntax for the data type, and • m2. a transfer syntax is applied to the abstract syntax to obtain the transfer value corresponding to the value of the data type to be transmitted. • when it is time to receive a value of a data type, the inverse mappings, in the reverse order, are applied. 6 L'approccio OSI 2 • Mapping m1 is conceptual. In effetti questo mapping avviene a priori, in quanto e' il sistema di programmazione ASN.1 che indica quali sono le strutture dati locali che devono essere utilizzate per rappresentare i tipi definiti in una sintassi astratta. • Mapping m2 is where the real work occurs. • The encoding rules take the abstract data type definitions along with a given value as a local data structure and produce an unambiguous representation. • This is called serializing, and results in a string of octects being generated that encodes the value of the data type. 7 ABSTRACT SYNTAX NOTATION ONE - ASN.1 • "ASN.1 defines a set of primitive data types and provides a facility to construct new data structures with their own typing inherent in the structure." (cosi’ come in C • il nome-tag di una struct e’ inerente alla struttura, mentre • il nome-typedef e’ solo un identificatore della struttura stessa) • This allows new data types to be defined that are uniquely recognizable within an application. (per tipo si intende struttura dati, come in C e Pascal) • ASN.1 definisce anche una sintassi per rappresentare valori tipizzati. • L'informazione di tipo e' inerente anche ai valori. 8 ASN.1: LESSICO • "An ASN.1 description consists of a sequence of 5 kinds of tokens: 1. words (identificatori), 2. numbers (valori letterali numerici), 3. strings (di character, hex, bin. Valori letterali stringa), 4. punctuation (e operatori), 5. reserved words (keywords: solo lettere maiuscole). • Comments (che iniziano con "--" e finiscono con "--" o EOLN) may be placed wherever whitespace is valid." • Come esempi di testi ASN.1 vedi • il modulo Remote-Operations-APDUs riportato nel seguito di questa lezione e • il modulo SNMPv2-PDU riportato in Lez. 3-1 9 ASN.1: MODULI • Module: a collection of ASN.1 descriptions specifying a protocol (detto anche sintassi astratta) <<module>> DEFINITIONS <<implicit>> ::= BEGIN <<linkage>> <<declarations>> END • The <<module>> term names the module. Consists of 2 parts: • a name, e.g. CMIP-1 (per esseri umani e moduli ASN.1) • an (optional) OBJECT IDENTIFIER, which provides an authoritative name (per altri moduli ASN.1 e per uso run-time) • <<linkage>> relates the module with other modules, by IMPORTing and EXPORTing objects. <<linkage>> consente la compilazione separata di moduli ASN.1. • <<declarations>> contains the actual ASN.1 definitions. 10 ASN.1: scambio di informazioni tra moduli • IMPORTS <<lista di tipi e/o costanti>> FROM <<nome del modulo>> ... <<lista di tipi e/o costanti>> FROM <<nome del modulo>> ; Rende visibili nel modulo corrente le costanti e i tipi listati, definiti nel (e esportati dal) modulo indicato. • Un simbolo definito in un altro modulo puo' essere riferito anche se non e' IMPORTato, purche' sia riferito in modo qualificato: <<identificatore modulo>>.<<identificatore simbolo>> • Questo costrutto puo’ essere utilizzato anche per disambiguare riferimenti a simboli uguali importati da moduli diversi 11 ASN.1: scambio di informazioni tra moduli • EXPORTS <<lista di tipi e/o costanti esportati dal modulo>>; Rende visibili all'esterno del modulo i tipi e le costanti listati e definiti nel modulo. • Se la clausola EXPORTS non e' presente tutte le definizioni contenute nel modulo sono esportate. 12 ASN.1: tipi, valori, simboli • 3 kinds of objects (identificatori, simboli) are defined: • tipi, identificati da una parola che inizia con lettera maiuscola; • valori, identificati da una parola che inizia con lettera minuscola; • macro, identificati da una parola tutta di lettere maiuscole. • Come in C e in Pascal • ogni simbolo che viene riferito in un modulo deve essere anche definito o dichiarato (importato) in quel modulo • A differenza che in C e in Pascal • un riferimento ad un simbolo non deve essere preceduto nel testo dalla definizione/dichiarazione del simbolo stesso • normali regole di stile ASN.1 (non applicate nel framework SNMP!) • le definizioni di valori precedono le definizioni di tipi, e • le definizioni sono in ordine alfabetico 13 ASN.1: definizione di tipi e valori (di simboli) • An ASN.1 type is defined as follows: NameOfType ::= TYPE-DENOTATION In realta’ questo statement non rappresenta la definizione di un nuovo tipo ma piuttosto, come lo statement typedef del C, l’associazione di un nuovo identificatore (NameOfType) ad un tipo (TYPE-DENOTATION) • An ASN.1 value (instance of a data type) is defined as follows: nameOfValue NameOfType ::= VALUE dove VALUE e' descritto secondo la ASN.1 value notation. 14 ASN.1: tipi semplici • BOOLEANI Read-only ::= BOOLEAN modifiable Read-only ::= TRUE -- or FALSE • INTERI ContentLength ::= INTEGER length ContentLength ::= 100 • Il tipo INTEGER ASN.1 rappresenta valori interi di dimensione illimitata. • E' possibile restringere esplicitamente l'insieme dei valori ammessi attraverso il subtyping (come fa il framework SNMP). • Forma alternativa, in cui si listano tutti e soli i valori legittimi: OpCodeLen ::= INTEGER { single-byte (1), double-byte (2), long-opcode (4) } multLen OpCodeLen ::= long-opcode -- or 415 ASN.1: tipi semplici • ENUMERATI OpCodeLen ::= ENUMERATED { single-byte (1), double-byte (2), long-opcode (4) } multLen OpCodeLen ::= long-opcode -- or 4 • I valori ENUMERATED non hanno significato come INTEGER e non possono essere utilizzati in operazioni tra e con interi. • A valori enumerati non si possono nemmeno applicare operatori interi, ad esempio operatori relazionali per il subtyping. • N.B.: tutti i diversi tipi enumerati hanno la stessa informazione inerente di tipo come fare a distinguere tra diversi tipi enumerati? • REALI Anche i valori REAL possono avere dimensione (e precisione) arbitraria. 16 ASN.1: tipi semplici • STRINGHE DI BIT • A BIT STRING type is a data type taking zero or more bits as its values. • BIT STRING may describe objects that are not octet-aligned. • Una forma alternativa di BIT STRING permette di nominare i singoli bit della stringa in modo individuale. • In questo caso tutti i bit della stringa sono significativi FacsimilePage ::= BIT STRING Attribute-Groups ::= BIT STRING { read (0), write (1), execute (2) } access-right Attribute-Groups ::= { read, write } -- or '110'B 17 ASN.1: tipi semplici • STRINGHE DI BYTE An OCTET STRING is a data type taking zero or more octets as its value. UserName ::= OCTET STRING initiator UserName ::= "anon" -- or '616E6F6E'H • le OCTET STRING sono basate sull'alfabeto ASCII (a 8 bit) • OCTET STRING speciali, predefinite (sub-typing) dal linguaggio: • NumericString: stringa di caratteri numerici (base 10) • PrintableString: stringa di caratteri stampabili • IA5String: stringhe di caratteri che appartengono all'alfabeto ITU No. 5 • GraphicString: stringhe di caratteri stampabili che appartengono all'alfabeto ITU No. 5 • continua alla pagina seguente 18 ASN.1: tipi semplici • STRINGHE DI BYTE OCTET STRING speciali, predefinite dal linguaggio (continua): • UTCTime: stringa di caratteri che rappresenta data-ora (Universal Time Coordinated) secondo un formato definito • il formato e' molto simile a quello di GeneralizedTime • ma non e' millennium compliant (manca l'indicazione di secolo)! • e' utilizzata nel framework di gestione Internet • GeneralizedTime: stringa di caratteri che rappresenta dataora (UTC) secondo un formato definito • e' millennium compliant • consente di effettuare il confronto di istanti come confronto di stringhe YYYYMMDDHHMMSS.dcm • e' utilizzata nel framework di gestione ITU/OSI 19 • esiste in 3 varianti ASN.1: tipi semplici • GeneralizedTime • "YYYYMMDDHHMMSS.dcm" nel fuso locale • "YYYYMMDDHHMMSS.dcmz" tempo astronomico di Greenwich • "YYYYMMDDHHMMSS.dcmHHMM" nel fuso locale t tra fuso locale e tempo astronomico di Greenwich • Esempio: lo stesso istante nelle 3 rappresentazioni: • "20020107103142.8" nell'Europa centrale • "20020107093142.8z" del tempo astronomico di Greenwich • "20020107103142.8-01" in rappresentazione differenziale • E quando inizia/finisce l'ora legale si hanno discontinuita'/ duplicazioni temporali (e.g. problemi con misure periodiche di performance e con time stamping di eventi di rete)? • NO, quando inizia l'ora legale si sposta avanti di un'ora l'ora locale ma ci si sposta di fuso per evitare la discontinuita! • Durante il periodo dell'ora legale l'Italia e' in Europa orientale e il Regno Unito in Europa centrale 20 ASN.1: tipi semplici • NULL • A NULL type is a data type that is simply a place-holder. • The only information conveyed is whether the data type is present (un po’ come il tipo void del C) • Suppose a data type normally has a value associated with it, but under some circumstances the value is undefined. • The NULL type allows to extend with the "undefined value" the domain of a data type. (NULL rappresenta quindi un place-holder anche per un valore, il che non accade in C. In questo senso la parentela e’ piuttosto con il valore C NULL di tipo void*) TimeOfDay ::= CHOICE { UTCTime, NULL } unknownTime TimeOfDay ::= NULL 21 ASN.1: tipi semplici • OBJECT IDENTIFIER • OBJECT IDENTIFIER is a data type denoting an authoritatively named object. • Qualsiasi cosa puo' essere identificata con un OBJECT IDENTIFIER. • Un OBJECT IDENTIFIER e' una sequenza di numeri interi non negativi che attraversa un albero • ogni intero e' il nome relativo univoco di un figlio rispetto al padre • ogni nodo dell'albero ha autorita' di denominazione sui suoi discendenti • in particolare, sotto la radice dell'albero, sono riconosciute 3 autorita' di denominazione • ccitt (0) • iso (1) • joint-iso-ccitt (2) • concatenando un intero (una sequenza di interi) ad un OBJECT 22 IDENTIFIER si ottiene un nuovo OBJECT IDENTIFIER ASN.1: costruttori di tipo e tipi costruiti • Symple types can be combined to build complex data types. • The constructor types are used for this purpose. • The process is recursive: constructor types combine both simple and other constructor types, of arbitrarily deep nesting. 23 ASN.1: costruttori e tipi costruiti, SEQUENCE • A SEQUENCE type is a data type denoting an ordered list of zero or more (ma in numero de/finito) elements, each of which are ASN.1 types. • E' "equivalente" ad un RECORD Pascal o una struct C. VarBind ::= SEQUENCE { name ObjectName, value ObjectSyntax } • I nomi (labels) degli elementi della SEQUENCE • non fanno parte strutturale del tipo, tanto che potrebbero essere assenti (e non sono trasmessi sulla rete!) • servono a. per aumentare la leggibilita' (potrebbero essere assenti), b. ma anche per disambiguare la descrizione di valori nella value notation ASN.1 nel caso di campi OPTIONAL o DEFAULT. 24 ASN.1: SEQUENCE, esempio di valore { { givenName "John", initial "P", familyName "Smith" }, title "Director", age 51, dateOfHire"19710917", nameOfSpouse { givenName "Margaret", initial "T", familyName "Smith" }, children { { { givenName "Ralph", initial "T", familyName"Smith" }, dateOfBirth "19571111" }, { { givenName "Susan", initial "B", familyName"Smith" }, dateOfBirth "19590717" } } } 25 ASN.1: SEQUENCE, campi opzionali e default 1 Interrupt-Request ::= SEQUENCE { fatal-error BOOLEAN DEFAULT TRUE, message PrintableString OPTIONAL } fatal1 Interrupt-Request :: = {} -- equivale a { fatal-error TRUE }, message assente fatal2 Interrupt-Request :: = { message "this is a fatal request" } -- equivale a { fatal-error TRUE, -message "this is a fatal request" } fatal2bis Interrupt-Request :: = { "fatal request" } -- equivale a { fatal-error TRUE, -message "fatal request" } nonFatal Interrupt-Request :: = { FALSE } -- equivale a { fatal-error FALSE }, message assente -- fin qui le label migliorano solo la leggibilita' 26 ASN.1: SEQUENCE, campi opzionali e default T1 ::= SEQUENCE { BOOLEAN, BOOLEAN } 2 v1 T1 ::= { FALSE, TRUE } -- f1 ha valore FALSE ed f2 ha valore TRUE T2 ::= SEQUENCE { BOOLEAN DEFAULT TRUE, BOOLEAN DEFAULT TRUE } v2 T2 ::= { FALSE } -- quale e' il campo con valore TRUE -- e quale quello con valore FALSE? T2 ::= SEQUENCE { v2 T2 ::= { f1 BOOLEAN DEFAULT TRUE, f2 FALSE f2 BOOLEAN DEFAULT TRUE } } 27 ASN.1: SEQUENCE, campi opzionali e default 3 -- continua -- f1 ha valore TRUE ed f2 ha valore FALSE: ma cosi' -- ho disambiguato solo la comunicazione con -- l'essere umano: -- i nomi dei campi non viaggiano in rete! -- Questa soluzione non basta a disambiguare il -- significato di un valore sulla rete! • Il problema di ambiguita' che abbiamo visto e' interno allo scope della SEQUENCE • In realta' esiste un problema di ambiguita' ancora piu' significativo tra SEQUENCEdiverse: tutti i diversi tipi SEQUENCE hanno la stessa informazione inerente di tipo come fare a distinguere tra diversi tipi SEQUENCE? 28 ASN.1: SEQUENCE La sintassi astratta non deve essere tale da creare possibilita' di ambiguita' alla sintassi di trasferimento, come nel caso di due campi opzionali o default adiacenti dello stesso tipo! (Vedi tags) I campi di una SEQUENCE sono riconosciuti, nell'ordine, dalla posizione dal tipo una situazione e' considerata ambigua se non puo' essere risolta da un processamento in linea 29 ASN.1: costruttori e tipi costruiti, SEQUENCE OF A SEQUENCE OF type is a data type denoting an ordered list of zero or more (in numero indefinito) elements of the same type. This is analogous to a dynamic array in many programming languages: the number of elements is unbounded, but each element has identical syntax. RoutingTable ::= SEQUENCE OF RoutingEntry notare che anche per il riconoscimento di diverse SEQUENCE OF esiste un problema intrinseco di ambiguita’: tutte le SEQUENCE OF hanno intrinsecamente la stessa informazione inerente di tipo, che tra l’altro e’ uguale a quella associata al costruttore SEQUENCE! 30 ASN.1: costruttori e tipi costruiti, SET e SET OF A SET type is a data type denoting an unordered list of zero or more (ma di numero definito) members. In una SEQUENCE gli elementi possono essere disambiguati dall'ordine, mentre cio' non e' possibile in un SET, dove ogni elemento deve essere distinguibile per il suo tipo. (Vedi tags) Ma cosa succede se due elementi sono dello stesso tipo? Ambiguita’! Unordered list di zero o piu' (in numero indefinito) elementi tutti dello stesso tipo sono specificabili attraverso il costruttore SET OF! notare che per il riconoscimento di diversi SET (e SET OF) esiste un problema intrinseco di ambiguita’: tutti i SET (e SET OF) hanno intrinsecamente lo stessa informazione inerente di tipo! 31 ASN.1: costruttori e tipi costruiti: tagged types • Come fare a distinguere diverse occorrenze dello stesso tipo di dato all'interno di un tipo costruito? • E in generale, come fare a identificare univocamente un tipo di dato (quando un valore e' inviato in rete)? • e.g.: come distinguere una SEQUENCE dall'altra? ASN.1 associa ad ogni tipo di dato un tag che lo identifica univocamente • Poiche' l'identificazione univoca puo' essere a diversi livelli • (e.g. campi di record in Pascal univoci nello scope definito dal record stesso), ci sono 4 tipi (classi) di tag. • Ogni tag consiste di una coppia di valori che ne specificano • classe (scope entro cui esso e' univoco) e • numero univoco nella classe (e nello scope). 32 ASN.1: costruttori e tipi costruiti: tagged types • Una SEQUENCE puo' essere distinta da un'altra SEQUENCE se la si tagga esplicitamente, cioe' se si costruisce un nuovo tipo che • "e' fatto come il il tipo SEQUENCE base" ma che • ha tag diverso • Tagging a data type results in "wrapping" the existing data type, tag and all, inside a new data type. • The tag associated with a data type is an integral part of the structure of the data type. 33 ASN.1: TAG di tipo • identificazione unica per tutte le sintassi astratte descrivibili in ASN.1: UNIVERSAL tags • identificano univocamente (secondo valori fissati da OSI/ITU al momento della definizione del linguaggio ASN.1) tipi semplici e costruttori di tipo (identificazione strutturale anonima). tipo ASN.1 BOOLEAN INTEGER BIT STRING OCTET STRING NULL OBJECT IDENTIFIER ObjectDescriptor EXTERNAL ... ENUMERATED ... tag universale 1 2 3 4 5 6 7 8 ... 10 ... 34 ASN.1: TAG di tipo • identificazione univoca all'interno di una specifica sintassi astratta (un modulo ASN.1), cioe' di una applicazione descritta in ASN.1: APPLICATION-wide tags • tutti i tipi definiti dalla applicazione e che devono essere differenziabili tra loro in ricezione dalla rete e che non sono intrinsecamente di tipo (universale) diverso, devono avere un tag di questo tipo differente. • identificazione univoca all'interno di un tipo costruito (e.g. SEQUENCE), al di fuori del quale questi tag sono privi di significato: context-specific tags • identificazione univoca in un contesto organizzativo: PRIVATE-use tags • non sono in realta' utilizzati 35 ASN.1: TAG di tipo, esempi IA5String ::= [UNIVERSAL 22] IMPLICIT OCTET STRING -- IA5String e' fatto come un'OCTET STRING ma e' di -- tipo UNIVERSAL 22 Priority ::= [APPLICATION 7] ENUMERATED { normal (0), non-urgent (1), urgent (2) } -- Priority e' fatto come un enumerato ma e' di -- tipo APPLICATION 7 Severity ::= [8] ENUMERATED { high (0), middle (1), low (2) } -- Severity e' fatto come un enumerato ma e' di -- tipo APPLICATION 8 (il default in questa -- posizione dello statement) 36 ASN.1: TAG di tipo, esempi ObjectClass ::= CHOICE { globalForm [0] IMPLICIT OBJECT IDENTIFIER, localForm [1] IMPLICIT INTEGER } ----- globalForm e' fatto come un OBJECT IDENTIFIER ma e' di tipo contestuale-0 localForm e' fatto come un INTEGER ma e' di tipo contestuale-1 -- i tag contestuali sono identificati come tali -- dalla loro posizione nello statement -- in questo caso non sarebbero stati necessari -- perche' le deu opzioni sono gia' di tipo -- (universale) diverso 37 ASN.1: TAG impliciti • When a data type is wrapped, additional information must be encoded on the network whenever an instance of that data type is transmitted. • If the loss of this information will not prevent interoperation, the IMPLICIT keyword may be used when defining a tagged type so that only the explicit tag will be transmitted and not the tag of the wrapped type. • E' possibile generalizzare l'uso di IMPLICIT in tutte le definizioni di un modulo definendo come IMPLICIT TAGS la clausola <<implicit>> che compare nella testata del modulo (E' possibile anche utilizzare la clausola (default) EXPLICIT TAGS) • Esempio: quando viene trasmesso un valore di tipo IA5String ::= [UNIVERSAL 22] IMPLICIT OCTET STRING viene trasmesso solo lo universal tag 22 di IA5String e non lo universal tag 4 di OCTET STRING. • La keyword IMPLICIT e' in effetti una direttiva per la transfer syntax! 38 ASN.1: TAG impliciti • Perche' e' possibile perdere informazione? • Consideriamo la seguente sintassi astratta: Int ::= [APPLICATION 1] IMPLICIT INTEGER Bool ::= [APPLICATION 2] IMPLICIT BOOLEAN intVal Int ::= 1 boolVal Bool ::= TRUE • IntVal e boolVal sono interpretabili, e distinguibili, solo per chi conosce la semantica dei due tipi "privati dell'applicazione" Int e Bool. • Se fosse mancato l'attributo IMPLICIT chiunque, anche senza questa conoscenza, avrebbe potuto dare la interpretazione corretta. (e.g. browser attraverso data base) 39 ASN.1: Metatipi, CHOICE • A CHOICE type is a data type that is defined as the union of one ore more data types • a una union C o alla parte variante di un record in Pascal • come in quest'ultimo caso, il campo non ha un suo tipo ma assume di volta in volta il tipo della variante attiva • in C invece una union e' di per se' un tipo che contiene una di tante possibili varianti • Any given instance of this data type takes the value of only one of the member data types of the union. Time ::= CHOICE { actualTime UTCTime, notAvailable NULL } unixEpoch Time ::= actualTime "700101000000Z" unknownTime Time ::= notAvailable NULL • Each member of a CHOICE must be uniquely distinguishable based on their data types (inclusi i tag ovviamente). • Cio' e' vero anche quando membro di una CHOICE e' una CHOICE 40 ASN.1: Metatipi, ANY • An ANY type is a data type that is the union of all possible data types defined using ASN.1. • An instance of this data type takes any legal ASN.1 value. • ANY is used whenever the data type being used is not specified by the module: ad esempio, nello specificare un protocollo applicativo, la SDU di quel protocollo e' specificata come di tipo ANY (come la specifica del tipo dei parametri di una operazione). • All'interno di una SEQUENCE o di un SET, ANY puo' comparire come tipo di un campo nella forma: ANY DEFINED BY identifier dove identifier puo' essere il nome di un altro campo della struttura o uno dei tipi INTEGER o OBJECT IDENTIFIER. • Ha lo stesso significato di un RECORD variante del Pascal, e identifier svolge lo stesso ruolo del tag (tipo o campo) della parte variante del RECORD Pascal. 41 ASN.1: Metatipi • Metatipi e tag impliciti: • e' ovvio che un "tipo" ANY non puo' essere taggato come IMPLICIT altrimenti come sarebbe possibile capire quale delle alternative possibile e' quella attuale? • e' ovvio che questo vale anche per il "tipo" CHOICE • il pragma IMPLICIT non ha alcun effetto quando applicato ad un metatipo • notare che il pragma IMPLICIT puo' venire applicato anche implicitamente, quando l'intero modulo e' definito come IMPLICIT TAGS • Abbreviazioni (non di uso comune): • la notazione: SET OF ANY puo' essere abbreviata in: SET • la notazione: SEQUENCE OF ANY puo' essere abbreviata in: SEQUENCE 42 ASN.1: il tipo pre-definito EXTERNAL • EXTERNAL rappresenta un tipo di dato definito altrove • ma non importato! • EXTERNAL e' un tipo di dato definito da ASN.1 • tag = [UNIVERSAL 8]), anche se non e' un tipo primitivo • mentre il metatipo ANY deve essere sostituito da un tipo ASN.1, la definizione del tipo effettivo che e' effettivamente usato come EXTERNAL non necessariamente e' in ASN.1 • potrebbe essere un programma Java • la definizione di EXTERNAL consente di indicare i riferimenti che consentono di interpretare la "cosa" rappresentata dal valore EXTERNAL 43 ASN.1: il tipo pre-definito EXTERNAL EXTERNAL ::= [UNIVERSAL 8] IMPLICIT SEQUENCE direct-reference OBJECT IDENTIFIER OPTIONAL, -- documento che definisce la sintassi del tipo di dato indirect-reference INTEGER -- presentation context associato OPTIONAL, data-value-descriptor ObjectDescriptor -- altre info sul data type OPTIONAL, encoding CHOICE { single-ASN1-type [0] ANY, -- se effettivamente il tipo e' definito in ASN.1 octet-aligned [1] IMPLICIT OCTET STRING, -- tipo non definito in ASN.1 ma allineato a ottetto arbitrary [2] IMPLICIT BIT STRING -- tipo non definito in ASN.1 e non allineato a -- ottetto } } 44 ASN.1: sotto-tipi • Sono raffinamenti di altri data type ASN.1 • Sono definibili attraverso 3 meccanismi fondamentali: 1. come subrange di interi, reali, caratteri, enumerati, specificabili tramite • enumerazione esplicita • espressioni relazionali, 2. o come dimensione minima o massima (numero di elementi) che puo' avere un SET, una SEQUENCE o una stringa, 3. o come struttura che puo' assumere un data type costruito con campi opzionali quando altri campi assumono precisi valori (inner sub-typing). • Intrinsecamente un sotto-tipo ha la stessa informazione inerente di tipo del suo tipo base 45 ASN.1: esempi: sottotipi come sub-range ProtoType ::= ENUMERATED { first-class (0), business-class (1), coach-class (2), economy-class (3) } SubType ::= ProtoType (coach-class | economy-class) TenDigitString ::= PrintableString (FROM ("1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0")) 46 ASN.1: esempi: sottotipi come sub-range ProtoType ::= INTEGER NonNegativeNumber ::= Prototype (0 .. MAX) OSIlayers ::= INTEGER (1 | 2 | 3 | 4 | 5 | 6 | 7) UpperLayers ::= OSIlayers (4< .. MAX) 47 ASN.1: esempi: sottotipizzazione per dimensionamento NANplan ::= TenDigitString (SIZE (7 .. 10)) LocNumber ::= NANplan (SIZE (7 .. 7)) LongDistanceNumber ::= NANplan (SIZE (10)) VarBindList ::= SEQUENCE (SIZE (1..5)) OF VarBind 48 ASN.1: sotto-tipi: inner sub-typing 1 • The inner subtype is used to refine constructor types. • Inner subtype allows new constructor types to be defined that indicate • which portions (opzionali) of other constructor types (di un tipo base costruito) are present (o assenti), • possibly with which value (questo, per qualunque campo). • Esempio: dati i tipi base (che definiscono l'interazione di un cliente con un name-service) PDU ::= SEQUENCE { requestID operation error-occurring binding RequestID, ENUMERATED {get put Error-Occurring Binding (0), (1)}, OPTIONAL, OPTIONAL} Binding ::= SEQUENCE { name ObjectName, value ObjectSyntax OPTIONAL } 49 ASN.1: sotto-tipi: inner sub-typing 2 • Le singole interazioni di lettura e scrittura possono essere definite tramite inner sub-typing specializzando il tipo PDU. • L'operazione di lettura (invocazione e risposta) e' descritta dai due PDU: GetRequest ::= PDU (WITH COMPONENTS { operation (get), error-occurring ABSENT binding PRESENT (WITH COMPONENTS { value ABSENT }) }) GetResponse ::= PDU (WITH COMPONENTS { operation (get), binding PRESENT (WITH COMPONENTS { value PRESENT }) }) • L'operazione di scrittura (invocazione e risposta) e' lasciata per esercizio 50 Esempio ASN.1: sintassi astratta di ROSE 1 Remote-Operations-APDUs { joint-iso-ccitt remote-operations(4) apdus(1) } DEFINITIONS ::= BEGIN EXPORTS rOSE, InvokeIDType; IMPORTS OPERATION, ERROR FROM Remote-Operation-Notation { joint-iso-ccitt remote-operations(4) notation(0) } APPLICATION-SERVICE-ELEMENT FROM Remote-Operations-Notation-extension { joint-iso-ccitt remote-operations(4) notation-extension(2) }; rOSE APPLICATION-SERVICE-ELEMENT ::= { joint-iso-ccitt remote-operations(4) aseID(3) } 51 Esempio ASN.1: sintassi astratta di ROSE ReturnErrorProblem ::= INTEGER { unrecognizedInvocation errorResponseUnexpected unrecognizedError unexpectedError mistypedParameter 2 (0), (1), (2), (3), (4) } ReturnResultProblem ::= INTEGER { unrecognizedInvocation (0), resultResponseUnexpected (1), mistypedResult (2) } 52 Esempio ASN.1: sintassi astratta di ROSE 3 InvokeProblem ::= INTEGER { duplicateInvocation unrecognizedOperation mistypedArgument resourceLimitation initiatorReleasing unrecognizedLinkedId linkedResponseUnexpected unexpectedChildOperation (0), (1), (2), (3), (4), (5), (6), (7) } GeneralProblem ::= INTEGER { unrecognizedAPDU mistypedAPDU badlyStructuredAPDU (0), (1), (2) } 53 Esempio ASN.1: sintassi astratta di ROSE 4 InvokeIdType ::= INTEGER Operation ::= CHOICE { localValue globalValue INTEGER, OBJECT IDENTIFIER } Error ::= CHOICE { localValue globalValue INTEGER, OBJECT IDENTIFIER} ROIVapdu ::= [1] IMPLICIT SEQUENCE { invokeId InvokeIdType, linkedId [0] IMPLICIT InvokeIdType OPTIONAL, operation-value Operation, argument ANY DEFINED BY operation-value OPTIONAL } 54 Esempio ASN.1: sintassi astratta di ROSE 5 RORSapdu ::= [2] IMPLICIT SEQUENCE { invokeId InvokeIdType, SEQUENCE { operation-value result Operation, ANY DEFINED BY operation-value } OPTIONAL } ROERapdu ::= [3] IMPLICIT SEQUENCE { invokeId error-value parameter InvokeIdType, Error, ANY DEFINED BY error-value OPTIONAL } 55 Esempio ASN.1: sintassi astratta di ROSE 6 RORJapdu ::= [4] IMPLICIT SEQUENCE { invokeId CHOICE { invokeId InvokeIdType, nullNULL }, problem CHOICE { gen-prob[0] IMPLICIT GeneralProblem, inv-prob[1] IMPLICIT InvokeProblem, res-prob[2] IMPLICIT ReturnResultProblem, err-prob[3] IMPLICIT ReturnErrorProblem } } ROSEapdus ::= CHOICE { roiv-apdu rors-apdu roer-apdu rorj-apdu END -- module ROIVapdu, RORSapdu, ROERapdu, RORJapdu } 56 ASN.1: value notation • La sintassi dei valori di ASN.1 fornisce una notazione leggibile/scrivibile per scambiare valori di data types tra un utente umano e le implementazioni di protocolli e applicazioni di rete: • Ad esempio consente di scrivere un programma che effettui il log dei PDU scambiati in modo leggibile. • Facilita quindi la realizzazione di • analizzatori di protocolli (applicativi) • emulatori di protocolli (applicativi) 57 ASN.1: macro • The ASN.1 macro facility allows the ASN.1 grammar to be extended to meet the requirements of the abstract syntax designer. The ASN.1 macro notation literally rewrites the grammar rules of the ASN.1 language. • Ma soprattutto: le macro ASN.1 possono avere un contenuto semantico che non si esaurisce nella loro ritrascrizione (a differenza di quanto accade con le macro C, troff, assembler, ...). • Cio' rende complesso trattare le macro come parte dei processori ASN.1: solo macro il cui significato e' noto a priori possono essere trattate in modo automatico. 58 ASN.1: macro • La specifica di ROSE comprende anche la specifica di macro che definiscono una notazione (RO-notation) con cui utenti ROSE possono descrivere le loro operazioni: esistono pre-processori dedicati capaci di capire la RO-notation • espandendo le macro ASN.1 • ma trattandone anche gli aspetti semantici. • realizzando cosi' un sistema di programmazione per il supporto di RPC (Remote Procedure Call) • Il linguaggio SMI che e' alla base del Framework di gestione standard Internet e' anch'esso formalmente definito come un insieme di macro ASN.1 anche in questo caso esistono processori dedicati capaci di trattare la semantica degli statement SMI e non solo di espanderli come macro ASN.1. 59 RO-notation operationName OPERATION ARGUMENT TypeOfArgument -- if the operation may have an input parameter RESULT -- if the operation is confirmed in case of -- success TypeOfResult -- if the confirmed operation may have an output -- parameter ERRORS { <list-of-errorNames> } -- if the operation is confirmed in case of error LINKED { <list-of-linked-operationNames> } -- if the operation allows callbacks ::= <operation-id> -- localForm INTEGER -- globalForm OBJECT IDENTIFIER 60 RO-notation errorName ERROR PARAMETER TypeOfErrArgument -- if the error may have a parameter to convey -- additional information ::= <error-id> -- localForm INTEGER -- globalForm OBJECT IDENTIFIER 61 Esempio di RO-notation: CMIP-1 m-Get OPERATION ARGUMENT GetArgument RESULT GetResult -- this result is conditional; for conditions -- see Recommendation X.710 § 8.3.1.2.8 ERRORS { accessDenied, classInstanceConflict, complexityLimitation, getListError, invalidFilter, invalidScope, noSuchObjectClass, noSuchObjectInstance, operationCancelled, processingFailure, syncNotSupported } LINKED { m-Linked-Reply } ::= localValue 3 62 Esempio di RO-notation: CMIP-1 m-Set OPERATION ARGUMENT SetArgument ::= localValue 4 m-Set-Confirmed OPERATION ARGUMENT SetArgument RESULT SetResult -- this result is conditional; for conditions -- see Recommendation X.710 § 8.3.2.2.9 ERRORS { accessDenied, classInstanceConflict, complexityLimitation, invalidFilter, invalidScope, noSuchObjectClass, noSuchObjectInstance, processingFailure, setListError, syncNotSupported } LINKED { m-Linked-Reply } ::= localValue 5 63 Esempio di RO-notation: CMIP-1 accessDenied ERROR ::= localValue 2 noSuchObjectInstance ERROR PARAMETER ObjectInstance ::= localValue 1 processingFailure ERROR PARAMETER ProcessingFailure -- optional ::= localValue 10 64