In the Name of the Most High Abstract Syntax Notation One ASN.1 by Behzad Akbari Fall 2011 These slides are based in parts upon slides of Prof. Dssouli (Concordia university) Abstract Syntax Notation One Both the information and communications models need to be specified syntactically and semantically. This requires a language that specifies the management protocol in the application layer. This is where Abstract Syntax Notation One (ASN.1) plays a role. ASN.1 is actually more than a syntax; it’s a language that addresses both syntax and semantics Two type of syntax Abstract syntax: set of rules that specify data type and structure for information storage Transfer syntax: set of rules for communicating information between systems Can generate machine-readable code: Basic Encoding Rules (BER) ASN.1 is based on the Backus system and uses the formal syntax and grammar of the Backus-Nauer Form (BNF) Backus-Nauer Form (BNF) Definition: <name> ::= <definition> where <name> denotes “entity” and the symbol “::=“ represents “defined as” primitive definitions: <digit> ::= 0|1|2|3|4|5|6|7|8|9 <op> ::= +|-|x|/ similarly, an entity number can be constructed from primitives: <number> ::= <number> | <digit> <number> Example: 9 is primitive 9 19 is construct of 1 and 9 619 is construct of 6 and 19 ASN.1 Assignments Assignments <BooleanType> ::= BOOLEAN data type assignment (or name of the entity) <BooleanValue> ::= TRUE | FALSE value assignment (assigned value to the data type) Group of assignments: Modules Start with capital letters Usually modules are built from primitive (atomic) data types (e.g., INTEGER, REAL, etc..) May use ASN.1 constructs (e.g., SET, SEQUENCE, etc.) Constructors are used to build structured data types Backward and forward references, and inline definition ASN.1 Modules PersonnelRecord ::= SET Constructs: “list makers” Name, { GraphicString, title division CHOICE { A module PersonnelRecord [0] SEQUENCE marketing (a set of data types) {Sector, Primitives data types Country}, [1] CHOICE research {product-based [0] NULL, Construct: alternatives [1] NULL}, basic [2] SEQUENCE production {Product-line, }} Country } Three construction mechanisms (develop structured data types): Alternatives: CHOICE List: SET and SEQUENCE Repetition: SET OF and SEQUENCE OF ASN.1 Modules PersonnelRecord ::= SET Lists built with “SEQUENCE” { Name, maintains the correct order title GraphicString, division CHOICE { PersonnelRecord is a set of marketing [0] SEQUENCE different data types, each uniquely {Sector, associated with a name and can Country}, be encoded and transmitted research [1] CHOICE in any order. {product-based [0] NULL, basic [1] NULL}, production [2] SEQUENCE {Product-line, Country } }} Example: “Smith”, “Manager”, {“North”, “Chile”} “Manager”, “Smith”, {“North”, “Chile”} {“North”, “Chile”}, “Smith”, “Manager” ASN.1 Symbols Symbol ::= | -{} [] () .. Meaning Defined as or, alternative, options of a list Signed number Following the symbol are comments Start and end of a list Start and end of a tag Start and end of subtype Range Data Types Data Types Convention Example Object name Initial lowercase letter sysDescr, etherStatsPkts Application data type Initial uppercase letter Counter, IpAddress Module Initial uppercase letter PersonnelRecord Macro, MIB module All uppercase letters RMON-MIB Keywords All uppercase letters INTEGER, BEGIN Data types are generally defined based on a structure and a tag: Structure: simple (or atomic), structured, etc.. Tag: class and a tag Data Type: Structure & Tag Data Type Tag • Structure defines how data type is built • Tag uniquely identifies the data type Structure Number Simple Structured Tagged Other Universal Class Application Contextspecific Private ASN.1 simple types Basic Types o o o o o o BOOLEAN INTEGER ENUMERATED REAL BIT STRING OCTET STRING Character String Types (various subsets of ISO 10646-1) o o o o o o o NumericString (0-9,<space>) PrintableString (0-9,A-Z,a z,<space>,<special>) VisibleString GraphicString TeletexString UTF8String IA5String ASN.1 simple types Syntax : <type name> ::= type Example: counter ::= INTEGER IpAddress ::= OCTET STRING PageNumber ::= INTEGER ChapterNumber::= INTEGER Months ::= ENUMERATED {january (1), february (2), march (3), april (4), may (5), june (6), july (7 august (8), september (9), october (10), november (11), december (12)} ASN.1 simple types A subtype is derived from a parent type Syntax: <subtype name> ::= <type> ( <constraint> ) Examples: Counter ::= INTEGER ( 0..4294967295 ) IpAddress ::= OCTET STRING ( SIZE(4) ) Spring ::= Months ( march | april | may ) Summer ::= Months ( june | july | august ) SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 ) Structure • Simple PageNumber ::= INTEGER ChapterNumber ::= INTEGER • Structured / Construct BookPageNumber ::= SEQUENCE {ChapterNumber, Separator, PageNumber} • Tagged • Derived from another type; given a new ID • In Fig. 3-14, INTEGER is either universal or application specific • Other • CHOICE, ANY Structured Type SEQUENCE SEQUENCE OF Ordered array of repetitive data SET Ordered list maker Unordered list maker SET OF Unordered list of repetitive data ASN.1 structured types A data type is structured type when it contains other types (i.e., have components) BookPageNumber ::= SEQUENCE {ChapterNumber, Separator, PageNumber} separator is a VisibleString data type with value “-” Example: {1-1, 2-3, 3-39} BookPages ::= SEQUENCE OF { BookPageNumber } BookPages ::= SEQUENCE OF { SEQUENCE {ChapterNumber, Separator, PageNumber}} Example: {1-1, 1-2,..,2-1, 2-2,…..} ASN.1 structured types The pages of a book could also be specified as a collection of individual pages in random order BookPages ::= SET OF { SEQUENCE {ChapterNumber, Separator, PageNumber} } ASN.1 Tagged Types Tag uniquely identifies a data type and is required for encoding the data types for communication Comprises class and tag number Class: o o o o Universal - similar to global variables Application - only in the application used Context-specific - specific context in application Private - used extensively by commercial vendors Example: BOOLEAN INTEGER research product-based Universal 1 Universal 2 Application [1] Context-specific under research [0] ASN.1 Tagged Types UNIVERSAL 1 BOOLEAN UNIVERSAL 2 INTEGER UNIVERSAL - basic types 3 BIT STRING UNIVERSAL 4 OCTET STRING UNIVERSAL 9 REAL UNIVERSAL 10 ENUMERATED UNIVERSAL 6 - object types UNIVERSAL 7 OBJECT IDENTIFIER ObjectDescriptor UNIVERSAL 26 types VisibleString - character string UNIVERSAL 5 ... NULL UNIVERSAL 23 types UTCTime - miscellaneous UNIVERSAL 24 GeneralizedTime UNIVERSAL 16 SEQUENCE [OF] - structured types UNIVERSAL 17 SET [OF] ASN.1 Tagged Types PersonnelRecord ::= SET { Name, title GraphicString, division CHOICE { marketing [0] SEQUENCE Tag nb is 1 (overrides {Sector, that of BOOLEAN) Country}, research [1] CHOICE {product-based [0] NULL, Application specific basic [1] NULL}, production [2] SEQUENCE {Product-line, Context specific (subset of Country } }} an application, and limited to the application) ASN.1 Object Types Used to name and describe information objects Such as standard documents, data structures, managed objects In general, an information object is a class of information, e.g., file format, rather than an instance of such a class (i.e., individual file) Object identifier is a unique identifier for a particular object and its value consist of a set of integers Object descriptor is a human readable description of an information object ASN.1 Object Types root ccitt(0) iso(1) joint-iso-ccitt(2) org(3) internet(1) mgmt(2) mib-2(1) dod(6) private(4) experimental(3) enterprise(1) internet OBJECT IDENTIFIER ::= {iso(1) org(3) dod(6) 1 } private OBJECT IDENTIFIER ::= {internet 4 } ASN.1 Object Types Private type is used extensively by vendors of network products A vendor is assigned a node on the MIT, all branches and leaves under that node will be assigned private data types by the vendor itu 0 iso 1 org 3 dod 6 internet 1 private 4 enterprise 1 ibm OBJECT IDENTIFIER ::= {iso(1) org(3) dod(6) internet(1) private(4) enterprize(1) 2} IBM 2 iso-itu 2 Encoding Structure ASN.1 syntax containing management information is encoded using the Basic Encoding Rules (BER) that is defined for the transfer syntax BER is a specification developed and standardized by CCITT and OSI ASCII data is converted to bit-oriented data TLV, Type-Length-Value: is a specific encoding structure Type: indicates the ASN.1 type, class of the type Length: length of the actual value representation Value: the value of the ASN.1 type as a string of octets Encoding Structure Type Class (7-8th bits) Length P/C (6th bit) Value Tag Number (1-5th bits) 1 byte P/C (1-bit) specifies whether the structure is simple or a construct 0 for simple 1 for construct Encoding Structure Type Class (7-8th bits) Length P/C (6th bit) Value Tag Number (1-5th bits) 1 byte Class (2 bits): specifies the class being used Class Universal Application Context-specific Private th 8 bit 0 0 1 1 th 7 bit 0 1 0 1 Encoding Structure Type Class (7-8th bits) Length P/C (6th bit) Value Tag Number (1-5th bits) 1 byte Tag Number: designates the tag value in binary Example: 00 0 00010 for encoding INTEGER Universal class Primitive Tag value = 2 Tag number < 31 Identifier Octet Bits 8 7 Class 6 5 4 P/C 3 2 Tag number 0 = Primitive 1 = Constructed 0 0 = Universal 0 1 = Application 1 0 = Context-specific 1 1 = Private 1 Tag number >= 31 Leading octet Class P/C 1 1 1 1 1 2nd octet 1 Last octet ... 1 + ... + = Tag number 0 + Encoding of Length Field Short form ( L < 128 octets) one octet 0 Length L L octets Contents (or Value) field Long form ( 128 L < 21008 octets) first octet 1 K K octets L octets Length L Contents field Example, L = 128: 10000001 10000000 Binary equivalent of 128 BER, Examples Type Length Value distance INTEGER ::= 27 02 01 1B 00 0 00010 UNIVERSAL P today INTEGER ::= 129 02 02 2 00 81 Length is 2 to indicate 2 octets for Value DayOfYear ::= [APPLICATION 17] IMPLICIT INTEGER today DayOfYear ::= 129 51 02 01 0 10001 APPLICATION P 17 00 81 BER, Examples Birthday name day } ::= SEQUENCE { VisibleString, DayOfYear Type Definition UNIVERSAL 16 00 1 10000 Value Assignment myBirthday Birthday ::= { name "Jane", day 129 } Birthday Length Contents 30 ?? 0A VisibleString 1A DayOfYear 51 BER Encoding Length 04 Length 02 Contents "Jane" Contents 00 81 Example: SNMP Message Tag Message ::= SEQUENCE { version INTEGER { version-1(0) }, community OCTET STRING, data ANY } 30 02 04 Example: SNMP Message Type 30: SEQUENCE Length 82 01 c0: 448 octets 82: 10000010 Type 30: SEQUENCE Length 32: 50 octets Macros <macroname> MACRO ::= BEGIN TYPE NOTATION ::= <syntaxOfNewType> VALUE NOTATION ::= <syntaxOfNewValue> <auxiliaryAssignments> END Macro Example OBJECT-TYPE MACRO ::= BEGIN TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax) “ACCESS" Access "STATUS" Status VALUE NOTATION ::= value (VALUE ObjectName) Access ::= "read-only" | "read-write“ | "write-only | "not-accessible" Status ::= "mandatory” | "optional“ END | "obsolete" Object-Type Example sysName OBJECT-TYPE SYNTAX DisplayString (SIZE (0..255)) ACCESS read-write STATUS mandatory ::= { system 5 } Marco Example 2 CAR MACRO::= BEGIN TYPE NOTATION ::= Brand Engine CarType Year VALUE NOTATION ::= value (VALUE OBJECT IDENTIFIER) Brand ::= “BRAND” value (PrintableString) Engine ::= “CC” Ccs Ccs ::= Cc | Ccs”,” Cc Cc ::= value (INTEGER (600..5000)) CarType ::= “STYLE” CType CType ::= “Sedan” | “Liftback” | “SUV” | “Other” Year ::= “YEAR” value (INTEGER) END Camry CAR BRAND Toyota CC 2000, 2400, 3000 STYLE Sedan YEAR 2006 ::= {toyota 3}