ASN1::decode¶
Description¶
This command is used to decode ASN.1 records. element specifies the
data to decode. It can be either a byte array (like is returned from
TCP::payload), or an element object returned by one of the other
commands. The bytes are decoded according to formatString, and the
results are stored in variables whose names are provided as command
arguments. If a variable with a name specified doesn’t exist, it will
be created in the current scope. If the variable does exist, it’s
value will be overwritten. The command returns the number of elements
decoded. If decoding iteratively, you will likely want to use
ASN1::element next with this returned value to move to the next
appropriate element for further decoding.
Syntax¶
ASN1::decode element formatString ?varName varName ...?
formatString can have the following characters:
- a - Octet String
- B - Bit String
- b - Boolean
- e - Enum
- i - Integer
- l - Length of next element
- t - Tag of next element
- x - Skip Element. No corresponding parameter is specified
- ? - Don’t output the component if the corresponding value is empty
- ?hex-tag - Denotes that the specifier which follows is for an optional component. This is used for encoding or decoding an ASN.1 Set or Sequence which contains nested OPTIONAL or DEFAULT components. hex-tag, is a two-character hex byte of the expected tag. When used with the decode command, if the component corresponding to the optional specifier is not found, the corresponding tcl variable will be unset. This allows the iRule to use the Tcl info exists command to test the variable to determine if the component was found. See the following section for more details and examples.
- ( - Begin Sequence. No corresponding parameter is specified. The initial sequence tag and length are skipped.
- ) - End Sequence. No corresponding parameter is specified.
- < - Begin Set. No corresponding parameter is specified. The initial sequence tag and length are skipped.
- > - End Set. No corresponding parameter is specified.
Examples¶
ASN1::decode $ele "?a?aa?b" ruleId type matchValue dnAttrs
if {![info exists ruleId] && ![info exists type]} {
log local0. "ERR: extensibleMatch must contain either a matchingRule or type component"
}
# Handle default value for dnAttributes component
if {![info exists dnAttrs]} {
set dnAttrs 0
}