Linux server.nvwebsoft.co.in 3.10.0-1160.114.2.el7.x86_64 #1 SMP Wed Mar 20 15:54:52 UTC 2024 x86_64
Apache
: 162.240.12.249 | : 3.129.211.190
202 Domain
8.1.31
nbspublicschool
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
usr /
share /
doc /
python2-pyasn1-0.1.9 /
[ HOME SHELL ]
Name
Size
Permission
Action
README.txt
1.56
KB
-rw-r--r--
codecs.html
14.99
KB
-rw-r--r--
constraints.html
12.32
KB
-rw-r--r--
constructed.html
9.41
KB
-rw-r--r--
intro.html
5.97
KB
-rw-r--r--
pyasn1-tutorial.html
66.63
KB
-rw-r--r--
scalar.html
19.31
KB
-rw-r--r--
tagging.html
6.75
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : constructed.html
<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>
Close