| Index: third_party/gsutil/third_party/pyasn1/doc/constructed.html
|
| diff --git a/third_party/gsutil/third_party/pyasn1/doc/constructed.html b/third_party/gsutil/third_party/pyasn1/doc/constructed.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..88de750758a5301030c7392faae2881cf44c8382
|
| --- /dev/null
|
| +++ b/third_party/gsutil/third_party/pyasn1/doc/constructed.html
|
| @@ -0,0 +1,377 @@
|
| +<html>
|
| +<title>
|
| +PyASN1 Constructed types
|
| +</title>
|
| +<head>
|
| +</head>
|
| +<body>
|
| +<center>
|
| +<table width=60%>
|
| +<tr>
|
| +<td>
|
| +
|
| +<h4>
|
| +1.3 PyASN1 Constructed types
|
| +</h4>
|
| +
|
| +<p>
|
| +Besides scalar types, ASN.1 specifies so-called constructed ones - these
|
| +are capable of holding one or more values of other types, both scalar
|
| +and constructed.
|
| +</p>
|
| +
|
| +<p>
|
| +In pyasn1 implementation, constructed ASN.1 types behave like
|
| +Python sequences, and also support additional component addressing methods,
|
| +specific to particular constructed type.
|
| +</p>
|
| +
|
| +<a name="1.3.1"></a>
|
| +<h4>
|
| +1.3.1 Sequence and Set types
|
| +</h4>
|
| +
|
| +<p>
|
| +The Sequence and Set types have many similar properties:
|
| +</p>
|
| +<ul>
|
| +<li>they can hold any number of inner components of different types
|
| +<li>every component has a human-friendly identifier
|
| +<li>any component can have a default value
|
| +<li>some components can be absent.
|
| +</ul>
|
| +
|
| +<p>
|
| +However, Sequence type guarantees the ordering of Sequence value components
|
| +to match their declaration order. By contrast, components of the
|
| +Set type can be ordered to best suite application's needs.
|
| +<p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +Record ::= SEQUENCE {
|
| + id INTEGER,
|
| + room [0] INTEGER OPTIONAL,
|
| + house [1] INTEGER DEFAULT 0
|
| +}
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +Up to this moment, the only method we used for creating new pyasn1 types
|
| +is Python sub-classing. With this method, a new, named Python class is created
|
| +what mimics type derivation in ASN.1 grammar. However, ASN.1 also allows for
|
| +defining anonymous subtypes (room and house components in the example above).
|
| +To support anonymous subtyping in pyasn1, a cloning operation on an existing
|
| +pyasn1 type object can be invoked what creates a new instance of original
|
| +object with possibly modified properties.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> from pyasn1.type import univ, namedtype, tag
|
| +>>> class Record(univ.Sequence):
|
| +... componentType = namedtype.NamedTypes(
|
| +... namedtype.NamedType('id', univ.Integer()),
|
| +... namedtype.OptionalNamedType(
|
| +... 'room',
|
| +... univ.Integer().subtype(
|
| +... implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
|
| +... )
|
| +... ),
|
| +... namedtype.DefaultedNamedType(
|
| +... 'house',
|
| +... univ.Integer(0).subtype(
|
| +... implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)
|
| +... )
|
| +... )
|
| +... )
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +All pyasn1 constructed type classes have a class attribute <b>componentType</b>
|
| +that represent default type specification. Its value is a NamedTypes object.
|
| +</p>
|
| +
|
| +<p>
|
| +The NamedTypes class instance holds a sequence of NameType, OptionalNamedType
|
| +or DefaultedNamedType objects which, in turn, refer to pyasn1 type objects that
|
| +represent inner SEQUENCE components specification.
|
| +</p>
|
| +
|
| +<p>
|
| +Finally, invocation of a subtype() method of pyasn1 type objects in the code
|
| +above returns an implicitly tagged copy of original object.
|
| +</p>
|
| +
|
| +<p>
|
| +Once a SEQUENCE or SET type is decleared with pyasn1, it can be instantiated
|
| +and initialized (continuing the above code):
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> record = Record()
|
| +>>> record.setComponentByName('id', 123)
|
| +>>> print(record.prettyPrint())
|
| +Record:
|
| + id=123
|
| +>>>
|
| +>>> record.setComponentByPosition(1, 321)
|
| +>>> print(record.prettyPrint())
|
| +Record:
|
| + id=123
|
| + room=321
|
| +>>>
|
| +>>> record.setDefaultComponents()
|
| +>>> print(record.prettyPrint())
|
| +Record:
|
| + id=123
|
| + room=321
|
| + house=0
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +Inner components of pyasn1 Sequence/Set objects could be accessed using the
|
| +following methods:
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> record.getComponentByName('id')
|
| +Integer(123)
|
| +>>> record.getComponentByPosition(1)
|
| +Integer(321)
|
| +>>> record[2]
|
| +Integer(0)
|
| +>>> for idx in range(len(record)):
|
| +... print(record.getNameByPosition(idx), record.getComponentByPosition(idx))
|
| +id 123
|
| +room 321
|
| +house 0
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +The Set type share all the properties of Sequence type, and additionally
|
| +support by-tag component addressing (as all Set components have distinct
|
| +types).
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> from pyasn1.type import univ, namedtype, tag
|
| +>>> class Gamer(univ.Set):
|
| +... componentType = namedtype.NamedTypes(
|
| +... namedtype.NamedType('score', univ.Integer()),
|
| +... namedtype.NamedType('player', univ.OctetString()),
|
| +... namedtype.NamedType('id', univ.ObjectIdentifier())
|
| +... )
|
| +>>> gamer = Gamer()
|
| +>>> gamer.setComponentByType(univ.Integer().getTagSet(), 121343)
|
| +>>> gamer.setComponentByType(univ.OctetString().getTagSet(), 'Pascal')
|
| +>>> gamer.setComponentByType(univ.ObjectIdentifier().getTagSet(), (1,3,7,2))
|
| +>>> print(gamer.prettyPrint())
|
| +Gamer:
|
| + score=121343
|
| + player=b'Pascal'
|
| + id=1.3.7.2
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<a name="1.3.2"></a>
|
| +<h4>
|
| +1.3.2 SequenceOf and SetOf types
|
| +</h4>
|
| +
|
| +<p>
|
| +Both, SequenceOf and SetOf types resemble an unlimited size list of components.
|
| +All the components must be of the same type.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +Progression ::= SEQUENCE OF INTEGER
|
| +
|
| +arithmeticProgression Progression ::= { 1, 3, 5, 7 }
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +SequenceOf and SetOf types are expressed by the very similar pyasn1 type
|
| +objects. Their components can only be addressed by position and they
|
| +both have a property of automatic resize.
|
| +</p>
|
| +
|
| +<p>
|
| +To specify inner component type, the <b>componentType</b> class attribute
|
| +should refer to another pyasn1 type object.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> from pyasn1.type import univ
|
| +>>> class Progression(univ.SequenceOf):
|
| +... componentType = univ.Integer()
|
| +>>> arithmeticProgression = Progression()
|
| +>>> arithmeticProgression.setComponentByPosition(1, 111)
|
| +>>> print(arithmeticProgression.prettyPrint())
|
| +Progression:
|
| +-empty- 111
|
| +>>> arithmeticProgression.setComponentByPosition(0, 100)
|
| +>>> print(arithmeticProgression.prettyPrint())
|
| +Progression:
|
| +100 111
|
| +>>>
|
| +>>> for idx in range(len(arithmeticProgression)):
|
| +... arithmeticProgression.getComponentByPosition(idx)
|
| +Integer(100)
|
| +Integer(111)
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +Any scalar or constructed pyasn1 type object can serve as an inner component.
|
| +Missing components are prohibited in SequenceOf/SetOf value objects.
|
| +</p>
|
| +
|
| +<a name="1.3.3"></a>
|
| +<h4>
|
| +1.3.3 Choice type
|
| +</h4>
|
| +
|
| +<p>
|
| +Values of ASN.1 CHOICE type can contain only a single value of a type from a
|
| +list of possible alternatives. Alternatives must be ASN.1 types with
|
| +distinct tags for the whole structure to remain unambiguous. Unlike most
|
| +other types, CHOICE is an untagged one, e.g. it has no base tag of its own.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +CodeOrMessage ::= CHOICE {
|
| + code INTEGER,
|
| + message OCTET STRING
|
| +}
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +In pyasn1 implementation, Choice object behaves like Set but accepts only
|
| +a single inner component at a time. It also offers a few additional methods
|
| +specific to its behaviour.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> from pyasn1.type import univ, namedtype
|
| +>>> class CodeOrMessage(univ.Choice):
|
| +... componentType = namedtype.NamedTypes(
|
| +... namedtype.NamedType('code', univ.Integer()),
|
| +... namedtype.NamedType('message', univ.OctetString())
|
| +... )
|
| +>>>
|
| +>>> codeOrMessage = CodeOrMessage()
|
| +>>> print(codeOrMessage.prettyPrint())
|
| +CodeOrMessage:
|
| +>>> codeOrMessage.setComponentByName('code', 123)
|
| +>>> print(codeOrMessage.prettyPrint())
|
| +CodeOrMessage:
|
| + code=123
|
| +>>> codeOrMessage.setComponentByName('message', 'my string value')
|
| +>>> print(codeOrMessage.prettyPrint())
|
| +CodeOrMessage:
|
| + message=b'my string value'
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +Since there could be only a single inner component value in the pyasn1 Choice
|
| +value object, either of the following methods could be used for fetching it
|
| +(continuing previous code):
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> codeOrMessage.getName()
|
| +'message'
|
| +>>> codeOrMessage.getComponent()
|
| +OctetString(b'my string value')
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<a name="1.3.4"></a>
|
| +<h4>
|
| +1.3.4 Any type
|
| +</h4>
|
| +
|
| +<p>
|
| +The ASN.1 ANY type is a kind of wildcard or placeholder that matches
|
| +any other type without knowing it in advance. Like CHOICE type, ANY
|
| +has no base tag.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +Error ::= SEQUENCE {
|
| + code INTEGER,
|
| + parameter ANY DEFINED BY code
|
| +}
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +The ANY type is frequently used in specifications, where exact type is not
|
| +yet agreed upon between communicating parties or the number of possible
|
| +alternatives of a type is infinite.
|
| +Sometimes an auxiliary selector is kept around to help parties indicate
|
| +the kind of ANY payload in effect ("code" in the example above).
|
| +</p>
|
| +
|
| +<p>
|
| +Values of the ANY type contain serialized ASN.1 value(s) in form of
|
| +an octet string. Therefore pyasn1 Any value object share the properties of
|
| +pyasn1 OctetString object.
|
| +</p>
|
| +
|
| +<table bgcolor="lightgray" border=0 width=100%><TR><TD>
|
| +<pre>
|
| +>>> from pyasn1.type import univ
|
| +>>> someValue = univ.Any(b'\x02\x01\x01')
|
| +>>> someValue
|
| +Any(b'\x02\x01\x01')
|
| +>>> str(someValue)
|
| +'\x02\x01\x01'
|
| +>>> bytes(someValue)
|
| +b'\x02\x01\x01'
|
| +>>>
|
| +</pre>
|
| +</td></tr></table>
|
| +
|
| +<p>
|
| +Receiving application is supposed to explicitly deserialize the content of Any
|
| +value object, possibly using auxiliary selector for figuring out its ASN.1
|
| +type to pick appropriate decoder.
|
| +</p>
|
| +
|
| +<p>
|
| +There will be some more talk and code snippets covering Any type in the codecs
|
| +chapters that follow.
|
| +</p>
|
| +
|
| +<hr>
|
| +
|
| +</td>
|
| +</tr>
|
| +</table>
|
| +</center>
|
| +</body>
|
| +</html>
|
|
|