Value = BitStringValue /
              BooleanValue /
              CharacterStringValue /
              ChoiceValue /
              EmbeddedPDVValue /
              EnumeratedValue /
              ExternalValue /
              GeneralizedTimeValue /
              IntegerValue /
              InstanceOfValue /
              NullValue /
              ObjectDescriptorValue /
              ObjectIdentifierValue /
              OctetStringValue /
              RealValue /
              RelativeOIDValue /
              SequenceOfValue /
              SequenceValue /
              SetOfValue /
              SetValue /
              StringValue /
              UTCTimeValue /
              VariantEncoding
StringValue       = dquote *SafeUTF8Character dquote
dquote            = %x22 ; " (double quote)
SafeUTF8Character = %x00-21 / %x23-7F /   ; ASCII minus dquote
                          dquote dquote /       ; escaped double quote
                          %xC0-DF %x80-BF /     ; 2 byte UTF-8 character
                          %xE0-EF 2(%x80-BF) /  ; 3 byte UTF-8 character
                          %xF0-F7 3(%x80-BF)    ; 4 byte UTF-8 character
GeneralizedTimeValue  = StringValue
      UTCTimeValue          = StringValue
      ObjectDescriptorValue = StringValue
identifier    = lowercase *alphanumeric *(hyphen 1*alphanumeric)
alphanumeric  = uppercase / lowercase / decimal-digit
uppercase     = %x41-5A  ; "A" to "Z"
lowercase     = %x61-7A  ; "a" to "z"
decimal-digit = %x30-39  ; "0" to "9"
hyphen        = "-"
BitStringValue = bstring / hstring / bit-list
bit-list          = "{" [ sp identifier
                             *( "," sp identifier ) ] sp "}"
hstring           = squote *hexadecimal-digit squote %x48 ; '...'H
hexadecimal-digit = %x30-39 /  ; "0" to "9"
                          %x41-46    ; "A" to "F"
bstring           = squote *binary-digit squote %x42  ; '...'B
binary-digit      = "0" / "1"
sp                = *%x20  ; zero, one or more space characters
squote            =  %x27  ; ' (single quote)
BooleanValue = %x54.52.55.45 /   ; "TRUE"
                     %x46.41.4C.53.45  ; "FALSE"
EnumeratedValue = identifier
IntegerValue    = "0" /
                        positive-number /
                        ("-" positive-number) /
                        identifier
positive-number = non-zero-digit *decimal-digit
non-zero-digit  = %x31-39  ; "1" to "9"
NullValue = %x4E.55.4C.4C  ; "NULL"
ObjectIdentifierValue = numeric-oid / descr
numeric-oid           = oid-component 1*( "." oid-component )
oid-component         = "0" / positive-number
RelativeOIDValue = oid-component *( "." oid-component )
OctetStringValue = hstring
ChoiceValue           = IdentifiedChoiceValue /
                              ChoiceOfStringsValue
IdentifiedChoiceValue = identifier ":" Value
ChoiceOfStringsValue  = StringValue
SequenceValue = ComponentList
ComponentList = "{" [ sp NamedValue *( "," sp NamedValue) ] sp "}"
NamedValue    = identifier msp Value
msp           = 1*%x20  ; one or more space characters
SetValue = ComponentList
SequenceOfValue = "{" [ sp Value *( "," sp Value) ] sp "}"
SetOfValue      = "{" [ sp Value *( "," sp Value) ] sp "}"
CharacterStringValue = SequenceValue
EmbeddedPDVValue = SequenceValue
ExternalValue = SequenceValue
InstanceOfValue = SequenceValue
RealValue  = "0"               ; zero REAL value
                   / PLUS-INFINITY   ; positive infinity
                   / MINUS-INFINITY  ; negative infinity
                   / realnumber      ; positive base 10 REAL value
                   / "-" realnumber  ; negative base 10 REAL value
                   / SequenceValue   ; non-zero REAL value, base 2 or 10
realnumber = mantissa exponent
mantissa   = (positive-number [ "." *decimal-digit ])
                   / ( "0." *("0") positive-number )
exponent   = "E" ( "0" / ([ "-" ] positive-number))
PLUS-INFINITY  = %x50.4C.55.53.2D.49.4E.46.49.4E.49.54.59
                          ; "PLUS-INFINITY"
MINUS-INFINITY = %x4D.49.4E.55.53.2D.49.4E.46.49.4E.49.54.59
                          ; "MINUS-INFINITY"
VariantEncoding = RDNSequenceValue /
                        RelativeDistinguishedNameValue /
                        ORAddressValue
RDNSequenceValue = StringValue
RelativeDistinguishedNameValue = StringValue
ORAddressValue = StringValue