Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/pyasn1/type/char.py: 75%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#
2# This file is part of pyasn1 software.
3#
4# Copyright (c) 2005-2020, Ilya Etingof <etingof@gmail.com>
5# License: https://pyasn1.readthedocs.io/en/latest/license.html
6#
7import sys
9from pyasn1 import error
10from pyasn1.type import tag
11from pyasn1.type import univ
13__all__ = ['NumericString', 'PrintableString', 'TeletexString', 'T61String', 'VideotexString',
14 'IA5String', 'GraphicString', 'VisibleString', 'ISO646String',
15 'GeneralString', 'UniversalString', 'BMPString', 'UTF8String']
17NoValue = univ.NoValue
18noValue = univ.noValue
21class AbstractCharacterString(univ.OctetString):
22 """Creates |ASN.1| schema or value object.
24 |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`,
25 its objects are immutable and duck-type :class:`bytes`.
26 When used in octet-stream context, |ASN.1| type assumes
27 "|encoding|" encoding.
29 Keyword Args
30 ------------
31 value: :class:`str`, :class:`bytes` or |ASN.1| object
32 :class:`str`, alternatively :class:`bytes`
33 representing octet-stream of serialised unicode string
34 (note `encoding` parameter) or |ASN.1| class instance.
35 If `value` is not given, schema object will be created.
37 tagSet: :py:class:`~pyasn1.type.tag.TagSet`
38 Object representing non-default ASN.1 tag(s)
40 subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection`
41 Object representing non-default ASN.1 subtype constraint(s). Constraints
42 verification for |ASN.1| type occurs automatically on object
43 instantiation.
45 encoding: :py:class:`str`
46 Unicode codec ID to encode/decode
47 :class:`str` the payload when |ASN.1| object is used
48 in octet-stream context.
50 Raises
51 ------
52 ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error
53 On constraint violation or bad initializer.
54 """
56 def __str__(self):
57 return str(self._value)
59 def __bytes__(self):
60 try:
61 return self._value.encode(self.encoding)
62 except UnicodeEncodeError as exc:
63 raise error.PyAsn1UnicodeEncodeError(
64 "Can't encode string '%s' with codec "
65 "%s" % (self._value, self.encoding), exc
66 )
68 def prettyIn(self, value):
69 try:
70 if isinstance(value, str):
71 return value
72 elif isinstance(value, bytes):
73 return value.decode(self.encoding)
74 elif isinstance(value, (tuple, list)):
75 return self.prettyIn(bytes(value))
76 elif isinstance(value, univ.OctetString):
77 return value.asOctets().decode(self.encoding)
78 else:
79 return str(value)
81 except (UnicodeDecodeError, LookupError) as exc:
82 raise error.PyAsn1UnicodeDecodeError(
83 "Can't decode string '%s' with codec "
84 "%s" % (value, self.encoding), exc
85 )
87 def asOctets(self, padding=True):
88 return bytes(self)
90 def asNumbers(self, padding=True):
91 return tuple(bytes(self))
93 #
94 # See OctetString.prettyPrint() for the explanation
95 #
97 def prettyOut(self, value):
98 return value
100 def prettyPrint(self, scope=0):
101 # first see if subclass has its own .prettyOut()
102 value = self.prettyOut(self._value)
104 if value is not self._value:
105 return value
107 return AbstractCharacterString.__str__(self)
109 def __reversed__(self):
110 return reversed(self._value)
113class NumericString(AbstractCharacterString):
114 __doc__ = AbstractCharacterString.__doc__
116 #: Set (on class, not on instance) or return a
117 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
118 #: associated with |ASN.1| type.
119 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
120 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 18)
121 )
122 encoding = 'us-ascii'
124 # Optimization for faster codec lookup
125 typeId = AbstractCharacterString.getTypeId()
128class PrintableString(AbstractCharacterString):
129 __doc__ = AbstractCharacterString.__doc__
131 #: Set (on class, not on instance) or return a
132 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
133 #: associated with |ASN.1| type.
134 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
135 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 19)
136 )
137 encoding = 'us-ascii'
139 # Optimization for faster codec lookup
140 typeId = AbstractCharacterString.getTypeId()
143class TeletexString(AbstractCharacterString):
144 __doc__ = AbstractCharacterString.__doc__
146 #: Set (on class, not on instance) or return a
147 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
148 #: associated with |ASN.1| type.
149 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
150 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 20)
151 )
152 encoding = 'iso-8859-1'
154 # Optimization for faster codec lookup
155 typeId = AbstractCharacterString.getTypeId()
158class T61String(TeletexString):
159 __doc__ = TeletexString.__doc__
161 # Optimization for faster codec lookup
162 typeId = AbstractCharacterString.getTypeId()
165class VideotexString(AbstractCharacterString):
166 __doc__ = AbstractCharacterString.__doc__
168 #: Set (on class, not on instance) or return a
169 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
170 #: associated with |ASN.1| type.
171 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
172 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 21)
173 )
174 encoding = 'iso-8859-1'
176 # Optimization for faster codec lookup
177 typeId = AbstractCharacterString.getTypeId()
180class IA5String(AbstractCharacterString):
181 __doc__ = AbstractCharacterString.__doc__
183 #: Set (on class, not on instance) or return a
184 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
185 #: associated with |ASN.1| type.
186 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
187 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 22)
188 )
189 encoding = 'us-ascii'
191 # Optimization for faster codec lookup
192 typeId = AbstractCharacterString.getTypeId()
195class GraphicString(AbstractCharacterString):
196 __doc__ = AbstractCharacterString.__doc__
198 #: Set (on class, not on instance) or return a
199 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
200 #: associated with |ASN.1| type.
201 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
202 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 25)
203 )
204 encoding = 'iso-8859-1'
206 # Optimization for faster codec lookup
207 typeId = AbstractCharacterString.getTypeId()
210class VisibleString(AbstractCharacterString):
211 __doc__ = AbstractCharacterString.__doc__
213 #: Set (on class, not on instance) or return a
214 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
215 #: associated with |ASN.1| type.
216 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
217 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 26)
218 )
219 encoding = 'us-ascii'
221 # Optimization for faster codec lookup
222 typeId = AbstractCharacterString.getTypeId()
225class ISO646String(VisibleString):
226 __doc__ = VisibleString.__doc__
228 # Optimization for faster codec lookup
229 typeId = AbstractCharacterString.getTypeId()
231class GeneralString(AbstractCharacterString):
232 __doc__ = AbstractCharacterString.__doc__
234 #: Set (on class, not on instance) or return a
235 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
236 #: associated with |ASN.1| type.
237 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
238 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 27)
239 )
240 encoding = 'iso-8859-1'
242 # Optimization for faster codec lookup
243 typeId = AbstractCharacterString.getTypeId()
246class UniversalString(AbstractCharacterString):
247 __doc__ = AbstractCharacterString.__doc__
249 #: Set (on class, not on instance) or return a
250 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
251 #: associated with |ASN.1| type.
252 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
253 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 28)
254 )
255 encoding = "utf-32-be"
257 # Optimization for faster codec lookup
258 typeId = AbstractCharacterString.getTypeId()
261class BMPString(AbstractCharacterString):
262 __doc__ = AbstractCharacterString.__doc__
264 #: Set (on class, not on instance) or return a
265 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
266 #: associated with |ASN.1| type.
267 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
268 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 30)
269 )
270 encoding = "utf-16-be"
272 # Optimization for faster codec lookup
273 typeId = AbstractCharacterString.getTypeId()
276class UTF8String(AbstractCharacterString):
277 __doc__ = AbstractCharacterString.__doc__
279 #: Set (on class, not on instance) or return a
280 #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s)
281 #: associated with |ASN.1| type.
282 tagSet = AbstractCharacterString.tagSet.tagImplicitly(
283 tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 12)
284 )
285 encoding = "utf-8"
287 # Optimization for faster codec lookup
288 typeId = AbstractCharacterString.getTypeId()