test_encoder.py 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527
  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. #
  7. import sys
  8. import unittest
  9. from __tests__.base import BaseTestCase
  10. from pyasn1.type import tag
  11. from pyasn1.type import namedtype
  12. from pyasn1.type import opentype
  13. from pyasn1.type import univ
  14. from pyasn1.type import char
  15. from pyasn1.codec.ber import encoder
  16. from pyasn1.error import PyAsn1Error
  17. class LargeTagEncoderTestCase(BaseTestCase):
  18. def setUp(self):
  19. BaseTestCase.setUp(self)
  20. self.o = univ.Integer().subtype(
  21. value=1, explicitTag=tag.Tag(tag.tagClassApplication, tag.tagFormatSimple, 0xdeadbeaf)
  22. )
  23. def testEncoder(self):
  24. assert encoder.encode(self.o) == bytes((127, 141, 245, 182, 253, 47, 3, 2, 1, 1))
  25. class IntegerEncoderTestCase(BaseTestCase):
  26. def testPosInt(self):
  27. assert encoder.encode(univ.Integer(12)) == bytes((2, 1, 12))
  28. def testNegInt(self):
  29. assert encoder.encode(univ.Integer(-12)) == bytes((2, 1, 244))
  30. def testZero(self):
  31. assert encoder.encode(univ.Integer(0)) == bytes((2, 1, 0))
  32. def testCompactZero(self):
  33. encoder.IntegerEncoder.supportCompactZero = True
  34. substrate = encoder.encode(univ.Integer(0))
  35. encoder.IntegerEncoder.supportCompactZero = False
  36. assert substrate == bytes((2, 0))
  37. def testMinusOne(self):
  38. assert encoder.encode(univ.Integer(-1)) == bytes((2, 1, 255))
  39. def testPosLong(self):
  40. assert encoder.encode(
  41. univ.Integer(0xffffffffffffffff)
  42. ) == bytes((2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255))
  43. def testNegLong(self):
  44. assert encoder.encode(
  45. univ.Integer(-0xffffffffffffffff)
  46. ) == bytes((2, 9, 255, 0, 0, 0, 0, 0, 0, 0, 1))
  47. class IntegerEncoderWithSchemaTestCase(BaseTestCase):
  48. def testPosInt(self):
  49. assert encoder.encode(12, asn1Spec=univ.Integer()) == bytes((2, 1, 12))
  50. def testNegInt(self):
  51. assert encoder.encode(-12, asn1Spec=univ.Integer()) == bytes((2, 1, 244))
  52. def testZero(self):
  53. assert encoder.encode(0, asn1Spec=univ.Integer()) == bytes((2, 1, 0))
  54. def testPosLong(self):
  55. assert encoder.encode(
  56. 0xffffffffffffffff, asn1Spec=univ.Integer()
  57. ) == bytes((2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255))
  58. class BooleanEncoderTestCase(BaseTestCase):
  59. def testTrue(self):
  60. assert encoder.encode(univ.Boolean(1)) == bytes((1, 1, 1))
  61. def testFalse(self):
  62. assert encoder.encode(univ.Boolean(0)) == bytes((1, 1, 0))
  63. class BooleanEncoderWithSchemaTestCase(BaseTestCase):
  64. def testTrue(self):
  65. assert encoder.encode(True, asn1Spec=univ.Boolean()) == bytes((1, 1, 1))
  66. def testFalse(self):
  67. assert encoder.encode(False, asn1Spec=univ.Boolean()) == bytes((1, 1, 0))
  68. class BitStringEncoderTestCase(BaseTestCase):
  69. def setUp(self):
  70. BaseTestCase.setUp(self)
  71. self.b = univ.BitString((1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1))
  72. def testDefMode(self):
  73. assert encoder.encode(self.b) == bytes((3, 3, 1, 169, 138))
  74. def testIndefMode(self):
  75. assert encoder.encode(
  76. self.b, defMode=False
  77. ) == bytes((3, 3, 1, 169, 138))
  78. def testDefModeChunked(self):
  79. assert encoder.encode(
  80. self.b, maxChunkSize=1
  81. ) == bytes((35, 8, 3, 2, 0, 169, 3, 2, 1, 138))
  82. def testIndefModeChunked(self):
  83. assert encoder.encode(
  84. self.b, defMode=False, maxChunkSize=1
  85. ) == bytes((35, 128, 3, 2, 0, 169, 3, 2, 1, 138, 0, 0))
  86. def testEmptyValue(self):
  87. assert encoder.encode(univ.BitString([])) == bytes((3, 1, 0))
  88. class BitStringEncoderWithSchemaTestCase(BaseTestCase):
  89. def setUp(self):
  90. BaseTestCase.setUp(self)
  91. self.b = (1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1)
  92. self.s = univ.BitString()
  93. def testDefMode(self):
  94. assert encoder.encode(self.b, asn1Spec=self.s) == bytes((3, 3, 1, 169, 138))
  95. def testIndefMode(self):
  96. assert encoder.encode(
  97. self.b, asn1Spec=self.s, defMode=False
  98. ) == bytes((3, 3, 1, 169, 138))
  99. def testDefModeChunked(self):
  100. assert encoder.encode(
  101. self.b, asn1Spec=self.s, maxChunkSize=1
  102. ) == bytes((35, 8, 3, 2, 0, 169, 3, 2, 1, 138))
  103. def testIndefModeChunked(self):
  104. assert encoder.encode(
  105. self.b, asn1Spec=self.s, defMode=False, maxChunkSize=1
  106. ) == bytes((35, 128, 3, 2, 0, 169, 3, 2, 1, 138, 0, 0))
  107. def testEmptyValue(self):
  108. assert encoder.encode([], asn1Spec=self.s) == bytes((3, 1, 0))
  109. class OctetStringEncoderTestCase(BaseTestCase):
  110. def setUp(self):
  111. BaseTestCase.setUp(self)
  112. self.o = univ.OctetString('Quick brown fox')
  113. def testDefMode(self):
  114. assert encoder.encode(self.o) == bytes(
  115. (4, 15, 81, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120))
  116. def testIndefMode(self):
  117. assert encoder.encode(
  118. self.o, defMode=False
  119. ) == bytes((4, 15, 81, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120))
  120. def testDefModeChunked(self):
  121. assert encoder.encode(
  122. self.o, maxChunkSize=4
  123. ) == bytes((36, 23, 4, 4, 81, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 4, 111, 119,
  124. 110, 32, 4, 3, 102, 111, 120))
  125. def testIndefModeChunked(self):
  126. assert encoder.encode(
  127. self.o, defMode=False, maxChunkSize=4
  128. ) == bytes((36, 128, 4, 4, 81, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 4, 111, 119, 110,
  129. 32, 4, 3, 102, 111, 120, 0, 0))
  130. class OctetStringEncoderWithSchemaTestCase(BaseTestCase):
  131. def setUp(self):
  132. BaseTestCase.setUp(self)
  133. self.s = univ.OctetString()
  134. self.o = 'Quick brown fox'
  135. def testDefMode(self):
  136. assert encoder.encode(self.o, asn1Spec=self.s) == bytes(
  137. (4, 15, 81, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120))
  138. def testIndefMode(self):
  139. assert encoder.encode(
  140. self.o, asn1Spec=self.s, defMode=False
  141. ) == bytes((4, 15, 81, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120))
  142. def testDefModeChunked(self):
  143. assert encoder.encode(
  144. self.o, asn1Spec=self.s, maxChunkSize=4
  145. ) == bytes((36, 23, 4, 4, 81, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 4, 111, 119,
  146. 110, 32, 4, 3, 102, 111, 120))
  147. def testIndefModeChunked(self):
  148. assert encoder.encode(
  149. self.o, asn1Spec=self.s, defMode=False, maxChunkSize=4
  150. ) == bytes((36, 128, 4, 4, 81, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 4, 111, 119, 110,
  151. 32, 4, 3, 102, 111, 120, 0, 0))
  152. class ExpTaggedOctetStringEncoderTestCase(BaseTestCase):
  153. def setUp(self):
  154. BaseTestCase.setUp(self)
  155. self.o = univ.OctetString().subtype(
  156. value='Quick brown fox',
  157. explicitTag=tag.Tag(tag.tagClassApplication, tag.tagFormatSimple, 5)
  158. )
  159. def testDefMode(self):
  160. assert encoder.encode(self.o) == bytes(
  161. (101, 17, 4, 15, 81, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120))
  162. def testIndefMode(self):
  163. assert encoder.encode(
  164. self.o, defMode=False
  165. ) == bytes((101, 128, 4, 15, 81, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 0, 0))
  166. def testDefModeChunked(self):
  167. assert encoder.encode(
  168. self.o, defMode=True, maxChunkSize=4
  169. ) == bytes((101, 25, 36, 23, 4, 4, 81, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 4, 111, 119, 110, 32, 4, 3,
  170. 102, 111, 120))
  171. def testIndefModeChunked(self):
  172. assert encoder.encode(
  173. self.o, defMode=False, maxChunkSize=4
  174. ) == bytes((101, 128, 36, 128, 4, 4, 81, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 4, 111, 119, 110, 32, 4, 3, 102, 111, 120, 0, 0, 0, 0))
  175. class NullEncoderTestCase(BaseTestCase):
  176. def testNull(self):
  177. assert encoder.encode(univ.Null('')) == bytes((5, 0))
  178. class NullEncoderWithSchemaTestCase(BaseTestCase):
  179. def testNull(self):
  180. assert encoder.encode(None, univ.Null()) == bytes((5, 0))
  181. class ObjectIdentifierEncoderTestCase(BaseTestCase):
  182. def testOne(self):
  183. assert encoder.encode(
  184. univ.ObjectIdentifier((1, 3, 6, 0, 0xffffe))
  185. ) == bytes((6, 6, 43, 6, 0, 191, 255, 126))
  186. def testEdge1(self):
  187. assert encoder.encode(
  188. univ.ObjectIdentifier((0, 39))
  189. ) == bytes((6, 1, 39))
  190. def testEdge2(self):
  191. assert encoder.encode(
  192. univ.ObjectIdentifier((1, 39))
  193. ) == bytes((6, 1, 79))
  194. def testEdge3(self):
  195. # 01111111
  196. assert encoder.encode(
  197. univ.ObjectIdentifier((2, 40))
  198. ) == bytes((6, 1, 120))
  199. def testEdge4(self):
  200. # 10010000|10000000|10000000|10000000|01001111
  201. assert encoder.encode(
  202. univ.ObjectIdentifier((2, 0xffffffff))
  203. ) == bytes((6, 5, 0x90, 0x80, 0x80, 0x80, 0x4F))
  204. def testEdge5(self):
  205. # 01111111
  206. assert encoder.encode(
  207. univ.ObjectIdentifier((2, 47))
  208. ) == bytes((6, 1, 0x7F))
  209. def testEdge6(self):
  210. # 10000001|00000000
  211. assert encoder.encode(
  212. univ.ObjectIdentifier((2, 48))
  213. ) == bytes((6, 2, 0x81, 0x00))
  214. def testEdge7(self):
  215. # 10000001|00110100|00000003
  216. assert encoder.encode(
  217. univ.ObjectIdentifier((2, 100, 3))
  218. ) == bytes((6, 3, 0x81, 0x34, 0x03))
  219. def testEdge8(self):
  220. # 10000101|00000000
  221. assert encoder.encode(
  222. univ.ObjectIdentifier((2, 560))
  223. ) == bytes((6, 2, 133, 0))
  224. def testEdge9(self):
  225. # 10001000|10000100|10000111|0000010
  226. assert encoder.encode(
  227. univ.ObjectIdentifier((2, 16843570))
  228. ) == bytes((6, 4, 0x88, 0x84, 0x87, 0x02))
  229. def testEdgeA(self):
  230. assert encoder.encode(
  231. univ.ObjectIdentifier((2, 5))
  232. ) == bytes((6, 1, 85))
  233. def testImpossible1(self):
  234. try:
  235. encoder.encode(univ.ObjectIdentifier((3, 1, 2)))
  236. except PyAsn1Error:
  237. pass
  238. else:
  239. assert 0, 'impossible leading arc tolerated'
  240. def testImpossible2(self):
  241. try:
  242. encoder.encode(univ.ObjectIdentifier((0,)))
  243. except PyAsn1Error:
  244. pass
  245. else:
  246. assert 0, 'single arc OID tolerated'
  247. def testImpossible3(self):
  248. try:
  249. encoder.encode(univ.ObjectIdentifier((0, 40)))
  250. except PyAsn1Error:
  251. pass
  252. else:
  253. assert 0, 'second arc overflow tolerated'
  254. def testImpossible4(self):
  255. try:
  256. encoder.encode(univ.ObjectIdentifier((1, 40)))
  257. except PyAsn1Error:
  258. pass
  259. else:
  260. assert 0, 'second arc overflow tolerated'
  261. def testLarge1(self):
  262. assert encoder.encode(
  263. univ.ObjectIdentifier((2, 18446744073709551535184467440737095))
  264. ) == bytes((0x06, 0x11, 0x83, 0xC6, 0xDF, 0xD4, 0xCC, 0xB3, 0xFF, 0xFF, 0xFE, 0xF0, 0xB8, 0xD6, 0xB8, 0xCB,
  265. 0xE2, 0xB7, 0x17))
  266. def testLarge2(self):
  267. assert encoder.encode(
  268. univ.ObjectIdentifier((2, 999, 18446744073709551535184467440737095))
  269. ) == bytes((0x06, 0x13, 0x88, 0x37, 0x83, 0xC6, 0xDF, 0xD4, 0xCC, 0xB3, 0xFF, 0xFF, 0xFE, 0xF0, 0xB8, 0xD6,
  270. 0xB8, 0xCB, 0xE2, 0xB6, 0x47))
  271. class ObjectIdentifierWithSchemaEncoderTestCase(BaseTestCase):
  272. def testOne(self):
  273. assert encoder.encode(
  274. (1, 3, 6, 0, 0xffffe), asn1Spec=univ.ObjectIdentifier()
  275. ) == bytes((6, 6, 43, 6, 0, 191, 255, 126))
  276. class RelativeOIDEncoderTestCase(BaseTestCase):
  277. def testOne(self):
  278. assert encoder.encode(
  279. univ.RelativeOID((39,))
  280. ) == bytes((13, 1, 39))
  281. def testTwo(self):
  282. assert encoder.encode(
  283. univ.RelativeOID((5, 6))
  284. ) == bytes((13, 2, 5, 6))
  285. def testThree(self):
  286. assert encoder.encode(
  287. univ.RelativeOID((5, 6, 7))
  288. ) == bytes((13, 3, 5, 6, 7))
  289. def testLarge(self):
  290. assert encoder.encode(
  291. univ.RelativeOID((1079, 18446744073709551535184467440737095))
  292. ) == bytes((0x0D, 0x13, 0x88, 0x37, 0x83, 0xC6, 0xDF, 0xD4, 0xCC,
  293. 0xB3, 0xFF, 0xFF, 0xFE, 0xF0, 0xB8, 0xD6, 0xB8, 0xCB,
  294. 0xE2, 0xB6, 0x47))
  295. class RelativeOIDWithSchemaEncoderTestCase(BaseTestCase):
  296. def testOne(self):
  297. assert encoder.encode(
  298. (5, 6, 7), asn1Spec=univ.RelativeOID()
  299. ) == bytes((13, 3, 5, 6, 7))
  300. class RealEncoderTestCase(BaseTestCase):
  301. def testChar(self):
  302. assert encoder.encode(
  303. univ.Real((123, 10, 11))
  304. ) == bytes((9, 7, 3, 49, 50, 51, 69, 49, 49))
  305. def testBin1(self):
  306. assert encoder.encode( # default binEncBase = 2
  307. univ.Real((0.5, 2, 0)) # check encbase = 2 and exponent = -1
  308. ) == bytes((9, 3, 128, 255, 1))
  309. def testBin2(self):
  310. r = univ.Real((3.25, 2, 0))
  311. r.binEncBase = 8 # change binEncBase only for this instance of Real
  312. assert encoder.encode(
  313. r # check encbase = 8
  314. ) == bytes((9, 3, 148, 255, 13))
  315. def testBin3(self):
  316. # change binEncBase in the RealEncoder instance => for all further Real
  317. binEncBase, encoder.TYPE_MAP[univ.Real.typeId].binEncBase = encoder.TYPE_MAP[univ.Real.typeId].binEncBase, 16
  318. assert encoder.encode(
  319. univ.Real((0.00390625, 2, 0)) # check encbase = 16
  320. ) == bytes((9, 3, 160, 254, 1))
  321. encoder.TYPE_MAP[univ.Real.typeId].binEncBase = binEncBase
  322. def testBin4(self):
  323. # choose binEncBase automatically for all further Real (testBin[4-7])
  324. binEncBase, encoder.TYPE_MAP[univ.Real.typeId].binEncBase = encoder.TYPE_MAP[univ.Real.typeId].binEncBase, None
  325. assert encoder.encode(
  326. univ.Real((1, 2, 0)) # check exponent = 0
  327. ) == bytes((9, 3, 128, 0, 1))
  328. encoder.TYPE_MAP[univ.Real.typeId].binEncBase = binEncBase
  329. def testBin5(self):
  330. assert encoder.encode(
  331. univ.Real((3, 2, -1020)) # case of 2 octs for exponent and
  332. # negative exponent and abs(exponent) is
  333. # all 1's and fills the whole octet(s)
  334. ) == bytes((9, 4, 129, 252, 4, 3))
  335. def testBin6(self):
  336. assert encoder.encode(
  337. univ.Real((1, 2, 262140)) # case of 3 octs for exponent and
  338. # check that first 9 bits for exponent
  339. # are not all 1's
  340. ) == bytes((9, 5, 130, 3, 255, 252, 1))
  341. def testBin7(self):
  342. assert encoder.encode(
  343. univ.Real((-1, 2, 76354972)) # case of >3 octs for exponent and
  344. # mantissa < 0
  345. ) == bytes((9, 7, 195, 4, 4, 141, 21, 156, 1))
  346. def testPlusInf(self):
  347. assert encoder.encode(univ.Real('inf')) == bytes((9, 1, 64))
  348. def testMinusInf(self):
  349. assert encoder.encode(univ.Real('-inf')) == bytes((9, 1, 65))
  350. def testZero(self):
  351. assert encoder.encode(univ.Real(0)) == bytes((9, 0))
  352. class RealEncoderWithSchemaTestCase(BaseTestCase):
  353. def testChar(self):
  354. assert encoder.encode(
  355. (123, 10, 11), asn1Spec=univ.Real()
  356. ) == bytes((9, 7, 3, 49, 50, 51, 69, 49, 49))
  357. class UniversalStringEncoderTestCase(BaseTestCase):
  358. def testEncoding(self):
  359. assert encoder.encode(char.UniversalString('abc')) == bytes(
  360. (28, 12, 0, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99)), 'Incorrect encoding'
  361. class UniversalStringEncoderWithSchemaTestCase(BaseTestCase):
  362. def testEncoding(self):
  363. assert encoder.encode(
  364. 'abc', asn1Spec=char.UniversalString()
  365. ) == bytes((28, 12, 0, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99)), 'Incorrect encoding'
  366. class BMPStringEncoderTestCase(BaseTestCase):
  367. def testEncoding(self):
  368. assert encoder.encode(char.BMPString('abc')) == bytes(
  369. (30, 6, 0, 97, 0, 98, 0, 99)), 'Incorrect encoding'
  370. class BMPStringEncoderWithSchemaTestCase(BaseTestCase):
  371. def testEncoding(self):
  372. assert encoder.encode(
  373. 'abc', asn1Spec=char.BMPString()
  374. ) == bytes((30, 6, 0, 97, 0, 98, 0, 99)), 'Incorrect encoding'
  375. class UTF8StringEncoderTestCase(BaseTestCase):
  376. def testEncoding(self):
  377. assert encoder.encode(char.UTF8String('abc')) == bytes(
  378. (12, 3, 97, 98, 99)), 'Incorrect encoding'
  379. class UTF8StringEncoderWithSchemaTestCase(BaseTestCase):
  380. def testEncoding(self):
  381. assert encoder.encode(
  382. 'abc', asn1Spec=char.UTF8String()
  383. ) == bytes((12, 3, 97, 98, 99)), 'Incorrect encoding'
  384. class SequenceOfEncoderTestCase(BaseTestCase):
  385. def testEmpty(self):
  386. s = univ.SequenceOf()
  387. s.clear()
  388. assert encoder.encode(s) == bytes((48, 0))
  389. def testDefMode(self):
  390. s = univ.SequenceOf()
  391. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  392. assert encoder.encode(s) == bytes((48, 13, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  393. def testIndefMode(self):
  394. s = univ.SequenceOf()
  395. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  396. assert encoder.encode(
  397. s, defMode=False
  398. ) == bytes((48, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  399. def testDefModeChunked(self):
  400. s = univ.SequenceOf()
  401. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  402. assert encoder.encode(
  403. s, defMode=True, maxChunkSize=4
  404. ) == bytes((48, 19, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  405. def testIndefModeChunked(self):
  406. s = univ.SequenceOf()
  407. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  408. assert encoder.encode(
  409. s, defMode=False, maxChunkSize=4
  410. ) == bytes((48, 128, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  411. class SequenceOfEncoderWithSchemaTestCase(BaseTestCase):
  412. def setUp(self):
  413. BaseTestCase.setUp(self)
  414. self.s = univ.SequenceOf(componentType=univ.OctetString())
  415. self.v = ['quick brown']
  416. def testEmpty(self):
  417. assert encoder.encode([], asn1Spec=self.s) == bytes((48, 0))
  418. def testDefMode(self):
  419. assert encoder.encode(
  420. self.v, asn1Spec=self.s
  421. ) == bytes((48, 13, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  422. def testIndefMode(self):
  423. assert encoder.encode(
  424. self.v, asn1Spec=self.s, defMode=False
  425. ) == bytes((48, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  426. def testDefModeChunked(self):
  427. assert encoder.encode(
  428. self.v, asn1Spec=self.s, defMode=True, maxChunkSize=4
  429. ) == bytes((48, 19, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  430. def testIndefModeChunked(self):
  431. assert encoder.encode(
  432. self.v, asn1Spec=self.s, defMode=False, maxChunkSize=4
  433. ) == bytes((48, 128, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  434. class SequenceOfEncoderWithComponentsSchemaTestCase(BaseTestCase):
  435. def setUp(self):
  436. BaseTestCase.setUp(self)
  437. self.s = univ.SequenceOf(componentType=univ.OctetString())
  438. def __init(self):
  439. self.s.clear()
  440. self.s.setComponentByPosition(0, 'quick brown')
  441. def testDefMode(self):
  442. self.__init()
  443. assert encoder.encode(self.s) == bytes((48, 13, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  444. def testIndefMode(self):
  445. self.__init()
  446. assert encoder.encode(
  447. self.s, defMode=False
  448. ) == bytes((48, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  449. def testDefModeChunked(self):
  450. self.__init()
  451. assert encoder.encode(
  452. self.s, defMode=True, maxChunkSize=4
  453. ) == bytes((48, 19, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  454. def testIndefModeChunked(self):
  455. self.__init()
  456. assert encoder.encode(
  457. self.s, defMode=False, maxChunkSize=4
  458. ) == bytes((48, 128, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  459. class SetOfEncoderTestCase(BaseTestCase):
  460. def testEmpty(self):
  461. s = univ.SetOf()
  462. s.clear()
  463. assert encoder.encode(s) == bytes((49, 0))
  464. def testDefMode(self):
  465. s = univ.SetOf()
  466. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  467. assert encoder.encode(s) == bytes((49, 13, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  468. def testIndefMode(self):
  469. s = univ.SetOf()
  470. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  471. assert encoder.encode(
  472. s, defMode=False
  473. ) == bytes((49, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  474. def testDefModeChunked(self):
  475. s = univ.SetOf()
  476. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  477. assert encoder.encode(
  478. s, defMode=True, maxChunkSize=4
  479. ) == bytes((49, 19, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  480. def testIndefModeChunked(self):
  481. s = univ.SetOf()
  482. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  483. assert encoder.encode(
  484. s, defMode=False, maxChunkSize=4
  485. ) == bytes((49, 128, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  486. class SetOfEncoderWithSchemaTestCase(BaseTestCase):
  487. def setUp(self):
  488. BaseTestCase.setUp(self)
  489. self.s = univ.SetOf(componentType=univ.OctetString())
  490. self.v = ['quick brown']
  491. def testEmpty(self):
  492. s = univ.SetOf()
  493. assert encoder.encode([], asn1Spec=self.s) == bytes((49, 0))
  494. def testDefMode(self):
  495. assert encoder.encode(
  496. self.v, asn1Spec=self.s
  497. ) == bytes((49, 13, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  498. def testIndefMode(self):
  499. assert encoder.encode(
  500. self.v, asn1Spec=self.s, defMode=False
  501. ) == bytes((49, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  502. def testDefModeChunked(self):
  503. assert encoder.encode(
  504. self.v, asn1Spec=self.s, defMode=True, maxChunkSize=4
  505. ) == bytes((49, 19, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  506. def testIndefModeChunked(self):
  507. assert encoder.encode(
  508. self.v, asn1Spec=self.s, defMode=False, maxChunkSize=4
  509. ) == bytes(
  510. (49, 128, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  511. class SetOfEncoderWithComponentsSchemaTestCase(BaseTestCase):
  512. def setUp(self):
  513. BaseTestCase.setUp(self)
  514. self.s = univ.SetOf(componentType=univ.OctetString())
  515. def __init(self):
  516. self.s.clear()
  517. self.s.setComponentByPosition(0, 'quick brown')
  518. def testDefMode(self):
  519. self.__init()
  520. assert encoder.encode(self.s) == bytes((49, 13, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  521. def testIndefMode(self):
  522. self.__init()
  523. assert encoder.encode(
  524. self.s, defMode=False
  525. ) == bytes((49, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  526. def testDefModeChunked(self):
  527. self.__init()
  528. assert encoder.encode(
  529. self.s, defMode=True, maxChunkSize=4
  530. ) == bytes((49, 19, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  531. def testIndefModeChunked(self):
  532. self.__init()
  533. assert encoder.encode(
  534. self.s, defMode=False, maxChunkSize=4
  535. ) == bytes((49, 128, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  536. class SequenceEncoderTestCase(BaseTestCase):
  537. def setUp(self):
  538. BaseTestCase.setUp(self)
  539. self.s = univ.Sequence()
  540. self.s.setComponentByPosition(0, univ.Null(''))
  541. self.s.setComponentByPosition(1, univ.OctetString('quick brown'))
  542. self.s.setComponentByPosition(2, univ.Integer(1))
  543. def testDefMode(self):
  544. assert encoder.encode(self.s) == bytes((48, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1))
  545. def testIndefMode(self):
  546. assert encoder.encode(
  547. self.s, defMode=False
  548. ) == bytes((48, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1, 0, 0))
  549. def testDefModeChunked(self):
  550. assert encoder.encode(
  551. self.s, defMode=True, maxChunkSize=4
  552. ) == bytes((48, 24, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 2, 1, 1))
  553. def testIndefModeChunked(self):
  554. assert encoder.encode(
  555. self.s, defMode=False, maxChunkSize=4
  556. ) == bytes((48, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 2, 1, 1, 0, 0))
  557. class SequenceEncoderWithSchemaTestCase(BaseTestCase):
  558. def setUp(self):
  559. BaseTestCase.setUp(self)
  560. self.s = univ.Sequence(
  561. componentType=namedtype.NamedTypes(
  562. namedtype.NamedType('place-holder', univ.Null()),
  563. namedtype.OptionalNamedType('first-name', univ.OctetString()),
  564. namedtype.DefaultedNamedType('age', univ.Integer(33)),
  565. )
  566. )
  567. self.v = {
  568. 'place-holder': None,
  569. 'first-name': 'quick brown',
  570. 'age': 1
  571. }
  572. def testEmpty(self):
  573. try:
  574. assert encoder.encode({}, asn1Spec=self.s)
  575. except PyAsn1Error:
  576. pass
  577. else:
  578. assert False, 'empty bare sequence tolerated'
  579. def testDefMode(self):
  580. assert encoder.encode(
  581. self.v, asn1Spec=self.s
  582. ) == bytes((48, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1))
  583. def testIndefMode(self):
  584. assert encoder.encode(
  585. self.v, asn1Spec=self.s, defMode=False
  586. ) == bytes((48, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1, 0, 0))
  587. def testDefModeChunked(self):
  588. assert encoder.encode(
  589. self.v, asn1Spec=self.s, defMode=True, maxChunkSize=4
  590. ) == bytes((48, 24, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 2, 1, 1))
  591. def testIndefModeChunked(self):
  592. assert encoder.encode(
  593. self.v, asn1Spec=self.s, defMode=False, maxChunkSize=4
  594. ) == bytes((48, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 2, 1, 1, 0, 0))
  595. class SequenceEncoderWithUntaggedOpenTypesTestCase(BaseTestCase):
  596. def setUp(self):
  597. BaseTestCase.setUp(self)
  598. openType = opentype.OpenType(
  599. 'id',
  600. {1: univ.Integer(),
  601. 2: univ.OctetString()}
  602. )
  603. self.s = univ.Sequence(
  604. componentType=namedtype.NamedTypes(
  605. namedtype.NamedType('id', univ.Integer()),
  606. namedtype.NamedType('blob', univ.Any(), openType=openType)
  607. )
  608. )
  609. def testEncodeOpenTypeChoiceOne(self):
  610. self.s.clear()
  611. self.s[0] = 1
  612. self.s[1] = univ.Integer(12)
  613. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  614. (48, 5, 2, 1, 1, 49, 50)
  615. )
  616. def testEncodeOpenTypeChoiceTwo(self):
  617. self.s.clear()
  618. self.s[0] = 2
  619. self.s[1] = univ.OctetString('quick brown')
  620. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  621. (48, 14, 2, 1, 2, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110)
  622. )
  623. def testEncodeOpenTypeUnknownId(self):
  624. self.s.clear()
  625. self.s[0] = 2
  626. self.s[1] = univ.ObjectIdentifier('1.3.6')
  627. try:
  628. encoder.encode(self.s, asn1Spec=self.s)
  629. except PyAsn1Error:
  630. assert False, 'incompatible open type tolerated'
  631. def testEncodeOpenTypeIncompatibleType(self):
  632. self.s.clear()
  633. self.s[0] = 2
  634. self.s[1] = univ.ObjectIdentifier('1.3.6')
  635. try:
  636. encoder.encode(self.s, asn1Spec=self.s)
  637. except PyAsn1Error:
  638. assert False, 'incompatible open type tolerated'
  639. class SequenceEncoderWithImplicitlyTaggedOpenTypesTestCase(BaseTestCase):
  640. def setUp(self):
  641. BaseTestCase.setUp(self)
  642. openType = opentype.OpenType(
  643. 'id',
  644. {1: univ.Integer(),
  645. 2: univ.OctetString()}
  646. )
  647. self.s = univ.Sequence(
  648. componentType=namedtype.NamedTypes(
  649. namedtype.NamedType('id', univ.Integer()),
  650. namedtype.NamedType('blob', univ.Any().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3)), openType=openType)
  651. )
  652. )
  653. def testEncodeOpenTypeChoiceOne(self):
  654. self.s.clear()
  655. self.s[0] = 1
  656. self.s[1] = univ.Integer(12)
  657. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  658. (48, 9, 2, 1, 1, 131, 4, 131, 2, 49, 50)
  659. )
  660. class SequenceEncoderWithExplicitlyTaggedOpenTypesTestCase(BaseTestCase):
  661. def setUp(self):
  662. BaseTestCase.setUp(self)
  663. openType = opentype.OpenType(
  664. 'id',
  665. {1: univ.Integer(),
  666. 2: univ.OctetString()}
  667. )
  668. self.s = univ.Sequence(
  669. componentType=namedtype.NamedTypes(
  670. namedtype.NamedType('id', univ.Integer()),
  671. namedtype.NamedType('blob', univ.Any().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3)), openType=openType)
  672. )
  673. )
  674. def testEncodeOpenTypeChoiceOne(self):
  675. self.s.clear()
  676. self.s[0] = 1
  677. self.s[1] = univ.Integer(12)
  678. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  679. (48, 9, 2, 1, 1, 163, 4, 163, 2, 49, 50)
  680. )
  681. class SequenceEncoderWithUntaggedSetOfOpenTypesTestCase(BaseTestCase):
  682. def setUp(self):
  683. BaseTestCase.setUp(self)
  684. openType = opentype.OpenType(
  685. 'id',
  686. {1: univ.Integer(),
  687. 2: univ.OctetString()}
  688. )
  689. self.s = univ.Sequence(
  690. componentType=namedtype.NamedTypes(
  691. namedtype.NamedType('id', univ.Integer()),
  692. namedtype.NamedType('blob', univ.SetOf(
  693. componentType=univ.Any()), openType=openType)
  694. )
  695. )
  696. def testEncodeOpenTypeChoiceOne(self):
  697. self.s.clear()
  698. self.s[0] = 1
  699. self.s[1].append(univ.Integer(12))
  700. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  701. (48, 7, 2, 1, 1, 49, 2, 49, 50)
  702. )
  703. def testEncodeOpenTypeChoiceTwo(self):
  704. self.s.clear()
  705. self.s[0] = 2
  706. self.s[1].append(univ.OctetString('quick brown'))
  707. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  708. (48, 16, 2, 1, 2, 49, 11, 113, 117, 105, 99, 107, 32, 98, 114,
  709. 111, 119, 110)
  710. )
  711. def testEncodeOpenTypeUnknownId(self):
  712. self.s.clear()
  713. self.s[0] = 2
  714. self.s[1].append(univ.ObjectIdentifier('1.3.6'))
  715. try:
  716. encoder.encode(self.s, asn1Spec=self.s)
  717. except PyAsn1Error:
  718. assert False, 'incompatible open type tolerated'
  719. def testEncodeOpenTypeIncompatibleType(self):
  720. self.s.clear()
  721. self.s[0] = 2
  722. self.s[1].append(univ.ObjectIdentifier('1.3.6'))
  723. try:
  724. encoder.encode(self.s, asn1Spec=self.s)
  725. except PyAsn1Error:
  726. assert False, 'incompatible open type tolerated'
  727. class SequenceEncoderWithImplicitlyTaggedSetOfOpenTypesTestCase(BaseTestCase):
  728. def setUp(self):
  729. BaseTestCase.setUp(self)
  730. openType = opentype.OpenType(
  731. 'id',
  732. {1: univ.Integer(),
  733. 2: univ.OctetString()}
  734. )
  735. self.s = univ.Sequence(
  736. componentType=namedtype.NamedTypes(
  737. namedtype.NamedType('id', univ.Integer()),
  738. namedtype.NamedType('blob', univ.SetOf(
  739. componentType=univ.Any().subtype(
  740. implicitTag=tag.Tag(
  741. tag.tagClassContext, tag.tagFormatSimple, 3))),
  742. openType=openType)
  743. )
  744. )
  745. def testEncodeOpenTypeChoiceOne(self):
  746. self.s.clear()
  747. self.s[0] = 1
  748. self.s[1].append(univ.Integer(12))
  749. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  750. (48, 11, 2, 1, 1, 49, 6, 131, 4, 131, 2, 49, 50)
  751. )
  752. class SequenceEncoderWithExplicitlyTaggedSetOfOpenTypesTestCase(BaseTestCase):
  753. def setUp(self):
  754. BaseTestCase.setUp(self)
  755. openType = opentype.OpenType(
  756. 'id',
  757. {1: univ.Integer(),
  758. 2: univ.OctetString()}
  759. )
  760. self.s = univ.Sequence(
  761. componentType=namedtype.NamedTypes(
  762. namedtype.NamedType('id', univ.Integer()),
  763. namedtype.NamedType('blob', univ.SetOf(
  764. componentType=univ.Any().subtype(
  765. explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))),
  766. openType=openType)
  767. )
  768. )
  769. def testEncodeOpenTypeChoiceOne(self):
  770. self.s.clear()
  771. self.s[0] = 1
  772. self.s[1].append(univ.Integer(12))
  773. assert encoder.encode(self.s, asn1Spec=self.s) == bytes(
  774. (48, 11, 2, 1, 1, 49, 6, 163, 4, 163, 2, 49, 50)
  775. )
  776. class SequenceEncoderWithComponentsSchemaTestCase(BaseTestCase):
  777. def setUp(self):
  778. BaseTestCase.setUp(self)
  779. self.s = univ.Sequence(
  780. componentType=namedtype.NamedTypes(
  781. namedtype.NamedType('place-holder', univ.Null()),
  782. namedtype.OptionalNamedType('first-name', univ.OctetString()),
  783. namedtype.DefaultedNamedType('age', univ.Integer(33)),
  784. )
  785. )
  786. def __init(self):
  787. self.s.clear()
  788. self.s.setComponentByPosition(0, '')
  789. def __initWithOptional(self):
  790. self.s.clear()
  791. self.s.setComponentByPosition(0, '')
  792. self.s.setComponentByPosition(1, 'quick brown')
  793. def __initWithDefaulted(self):
  794. self.s.clear()
  795. self.s.setComponentByPosition(0, '')
  796. self.s.setComponentByPosition(2, 1)
  797. def __initWithOptionalAndDefaulted(self):
  798. self.s.clear()
  799. self.s.setComponentByPosition(0, univ.Null(''))
  800. self.s.setComponentByPosition(1, univ.OctetString('quick brown'))
  801. self.s.setComponentByPosition(2, univ.Integer(1))
  802. def testDefMode(self):
  803. self.__init()
  804. assert encoder.encode(self.s) == bytes((48, 2, 5, 0))
  805. def testIndefMode(self):
  806. self.__init()
  807. assert encoder.encode(
  808. self.s, defMode=False
  809. ) == bytes((48, 128, 5, 0, 0, 0))
  810. def testDefModeChunked(self):
  811. self.__init()
  812. assert encoder.encode(
  813. self.s, defMode=True, maxChunkSize=4
  814. ) == bytes((48, 2, 5, 0))
  815. def testIndefModeChunked(self):
  816. self.__init()
  817. assert encoder.encode(
  818. self.s, defMode=False, maxChunkSize=4
  819. ) == bytes((48, 128, 5, 0, 0, 0))
  820. def testWithOptionalDefMode(self):
  821. self.__initWithOptional()
  822. assert encoder.encode(self.s) == bytes(
  823. (48, 15, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  824. def testWithOptionalIndefMode(self):
  825. self.__initWithOptional()
  826. assert encoder.encode(
  827. self.s, defMode=False
  828. ) == bytes((48, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  829. def testWithOptionalDefModeChunked(self):
  830. self.__initWithOptional()
  831. assert encoder.encode(
  832. self.s, defMode=True, maxChunkSize=4
  833. ) == bytes((48, 21, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  834. def testWithOptionalIndefModeChunked(self):
  835. self.__initWithOptional()
  836. assert encoder.encode(
  837. self.s, defMode=False, maxChunkSize=4
  838. ) == bytes(
  839. (48, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  840. def testWithDefaultedDefMode(self):
  841. self.__initWithDefaulted()
  842. assert encoder.encode(self.s) == bytes((48, 5, 5, 0, 2, 1, 1))
  843. def testWithDefaultedIndefMode(self):
  844. self.__initWithDefaulted()
  845. assert encoder.encode(
  846. self.s, defMode=False
  847. ) == bytes((48, 128, 5, 0, 2, 1, 1, 0, 0))
  848. def testWithDefaultedDefModeChunked(self):
  849. self.__initWithDefaulted()
  850. assert encoder.encode(
  851. self.s, defMode=True, maxChunkSize=4
  852. ) == bytes((48, 5, 5, 0, 2, 1, 1))
  853. def testWithDefaultedIndefModeChunked(self):
  854. self.__initWithDefaulted()
  855. assert encoder.encode(
  856. self.s, defMode=False, maxChunkSize=4
  857. ) == bytes((48, 128, 5, 0, 2, 1, 1, 0, 0))
  858. def testWithOptionalAndDefaultedDefMode(self):
  859. self.__initWithOptionalAndDefaulted()
  860. assert encoder.encode(self.s) == bytes(
  861. (48, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1))
  862. def testWithOptionalAndDefaultedIndefMode(self):
  863. self.__initWithOptionalAndDefaulted()
  864. assert encoder.encode(
  865. self.s, defMode=False
  866. ) == bytes((48, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1, 0, 0))
  867. def testWithOptionalAndDefaultedDefModeChunked(self):
  868. self.__initWithOptionalAndDefaulted()
  869. assert encoder.encode(
  870. self.s, defMode=True, maxChunkSize=4
  871. ) == bytes(
  872. (48, 24, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 2, 1, 1))
  873. def testWithOptionalAndDefaultedIndefModeChunked(self):
  874. self.__initWithOptionalAndDefaulted()
  875. assert encoder.encode(
  876. self.s, defMode=False, maxChunkSize=4
  877. ) == bytes((48, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0,
  878. 0, 2, 1, 1, 0, 0))
  879. class ExpTaggedSequenceEncoderTestCase(BaseTestCase):
  880. def setUp(self):
  881. BaseTestCase.setUp(self)
  882. s = univ.Sequence(
  883. componentType=namedtype.NamedTypes(
  884. namedtype.NamedType('number', univ.Integer()),
  885. )
  886. )
  887. s = s.subtype(
  888. explicitTag=tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 5)
  889. )
  890. s[0] = 12
  891. self.s = s
  892. def testDefMode(self):
  893. assert encoder.encode(self.s) == bytes((101, 5, 48, 3, 2, 1, 12))
  894. def testIndefMode(self):
  895. assert encoder.encode(
  896. self.s, defMode=False
  897. ) == bytes((101, 128, 48, 128, 2, 1, 12, 0, 0, 0, 0))
  898. class ExpTaggedSequenceComponentEncoderTestCase(BaseTestCase):
  899. def setUp(self):
  900. BaseTestCase.setUp(self)
  901. self.s = univ.Sequence(
  902. componentType=namedtype.NamedTypes(
  903. namedtype.NamedType('number', univ.Boolean().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
  904. )
  905. )
  906. self.s[0] = True
  907. def testDefMode(self):
  908. assert encoder.encode(self.s) == bytes((48, 5, 160, 3, 1, 1, 1))
  909. def testIndefMode(self):
  910. assert encoder.encode(
  911. self.s, defMode=False
  912. ) == bytes((48, 128, 160, 3, 1, 1, 1, 0, 0, 0, 0))
  913. class SetEncoderTestCase(BaseTestCase):
  914. def setUp(self):
  915. BaseTestCase.setUp(self)
  916. self.s = univ.Set()
  917. self.s.setComponentByPosition(0, univ.Null(''))
  918. self.s.setComponentByPosition(1, univ.OctetString('quick brown'))
  919. self.s.setComponentByPosition(2, univ.Integer(1))
  920. def testDefMode(self):
  921. assert encoder.encode(self.s) == bytes((49, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1))
  922. def testIndefMode(self):
  923. assert encoder.encode(
  924. self.s, defMode=False
  925. ) == bytes((49, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1, 0, 0))
  926. def testDefModeChunked(self):
  927. assert encoder.encode(
  928. self.s, defMode=True, maxChunkSize=4
  929. ) == bytes((49, 24, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 2, 1, 1))
  930. def testIndefModeChunked(self):
  931. assert encoder.encode(
  932. self.s, defMode=False, maxChunkSize=4
  933. ) == bytes((49, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 2, 1, 1, 0, 0))
  934. class SetEncoderWithSchemaTestCase(BaseTestCase):
  935. def setUp(self):
  936. BaseTestCase.setUp(self)
  937. self.s = univ.Set(
  938. componentType=namedtype.NamedTypes(
  939. namedtype.NamedType('place-holder', univ.Null()),
  940. namedtype.OptionalNamedType('first-name', univ.OctetString()),
  941. namedtype.DefaultedNamedType('age', univ.Integer(33)),
  942. )
  943. )
  944. self.v = {
  945. 'place-holder': None,
  946. 'first-name': 'quick brown',
  947. 'age': 1
  948. }
  949. def testEmpty(self):
  950. try:
  951. assert encoder.encode({}, asn1Spec=self.s)
  952. except PyAsn1Error:
  953. pass
  954. else:
  955. assert False, 'empty bare SET tolerated'
  956. def testDefMode(self):
  957. assert encoder.encode(
  958. self.v, asn1Spec=self.s
  959. ) == bytes((49, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1))
  960. def testIndefMode(self):
  961. assert encoder.encode(
  962. self.v, asn1Spec=self.s, defMode=False
  963. ) == bytes((49, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1, 0, 0))
  964. def testDefModeChunked(self):
  965. assert encoder.encode(
  966. self.v, asn1Spec=self.s, defMode=True, maxChunkSize=4
  967. ) == bytes((49, 24, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 2, 1, 1))
  968. def testIndefModeChunked(self):
  969. assert encoder.encode(
  970. self.v, asn1Spec=self.s, defMode=False, maxChunkSize=4
  971. ) == bytes((49, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 2, 1, 1, 0, 0))
  972. class SetEncoderWithComponentsSchemaTestCase(BaseTestCase):
  973. def setUp(self):
  974. BaseTestCase.setUp(self)
  975. self.s = univ.Set(
  976. componentType=namedtype.NamedTypes(
  977. namedtype.NamedType('place-holder', univ.Null()),
  978. namedtype.OptionalNamedType('first-name', univ.OctetString()),
  979. namedtype.DefaultedNamedType('age', univ.Integer(33)),
  980. )
  981. )
  982. def __init(self):
  983. self.s.clear()
  984. self.s.setComponentByPosition(0, '')
  985. def __initWithOptional(self):
  986. self.s.clear()
  987. self.s.setComponentByPosition(0, '')
  988. self.s.setComponentByPosition(1, 'quick brown')
  989. def __initWithDefaulted(self):
  990. self.s.clear()
  991. self.s.setComponentByPosition(0, '')
  992. self.s.setComponentByPosition(2, 1)
  993. def __initWithOptionalAndDefaulted(self):
  994. self.s.clear()
  995. self.s.setComponentByPosition(0, univ.Null(''))
  996. self.s.setComponentByPosition(1, univ.OctetString('quick brown'))
  997. self.s.setComponentByPosition(2, univ.Integer(1))
  998. def testDefMode(self):
  999. self.__init()
  1000. assert encoder.encode(self.s) == bytes((49, 2, 5, 0))
  1001. def testIndefMode(self):
  1002. self.__init()
  1003. assert encoder.encode(
  1004. self.s, defMode=False
  1005. ) == bytes((49, 128, 5, 0, 0, 0))
  1006. def testDefModeChunked(self):
  1007. self.__init()
  1008. assert encoder.encode(
  1009. self.s, defMode=True, maxChunkSize=4
  1010. ) == bytes((49, 2, 5, 0))
  1011. def testIndefModeChunked(self):
  1012. self.__init()
  1013. assert encoder.encode(
  1014. self.s, defMode=False, maxChunkSize=4
  1015. ) == bytes((49, 128, 5, 0, 0, 0))
  1016. def testWithOptionalDefMode(self):
  1017. self.__initWithOptional()
  1018. assert encoder.encode(self.s) == bytes(
  1019. (49, 15, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  1020. def testWithOptionalIndefMode(self):
  1021. self.__initWithOptional()
  1022. assert encoder.encode(
  1023. self.s, defMode=False
  1024. ) == bytes((49, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0))
  1025. def testWithOptionalDefModeChunked(self):
  1026. self.__initWithOptional()
  1027. assert encoder.encode(
  1028. self.s, defMode=True, maxChunkSize=4
  1029. ) == bytes((49, 21, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  1030. def testWithOptionalIndefModeChunked(self):
  1031. self.__initWithOptional()
  1032. assert encoder.encode(
  1033. self.s, defMode=False, maxChunkSize=4
  1034. ) == bytes(
  1035. (49, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 0, 0))
  1036. def testWithDefaultedDefMode(self):
  1037. self.__initWithDefaulted()
  1038. assert encoder.encode(self.s) == bytes((49, 5, 5, 0, 2, 1, 1))
  1039. def testWithDefaultedIndefMode(self):
  1040. self.__initWithDefaulted()
  1041. assert encoder.encode(
  1042. self.s, defMode=False
  1043. ) == bytes((49, 128, 5, 0, 2, 1, 1, 0, 0))
  1044. def testWithDefaultedDefModeChunked(self):
  1045. self.__initWithDefaulted()
  1046. assert encoder.encode(
  1047. self.s, defMode=True, maxChunkSize=4
  1048. ) == bytes((49, 5, 5, 0, 2, 1, 1))
  1049. def testWithDefaultedIndefModeChunked(self):
  1050. self.__initWithDefaulted()
  1051. assert encoder.encode(
  1052. self.s, defMode=False, maxChunkSize=4
  1053. ) == bytes((49, 128, 5, 0, 2, 1, 1, 0, 0))
  1054. def testWithOptionalAndDefaultedDefMode(self):
  1055. self.__initWithOptionalAndDefaulted()
  1056. assert encoder.encode(self.s) == bytes(
  1057. (49, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1))
  1058. def testWithOptionalAndDefaultedIndefMode(self):
  1059. self.__initWithOptionalAndDefaulted()
  1060. assert encoder.encode(
  1061. self.s, defMode=False
  1062. ) == bytes((49, 128, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1, 0, 0))
  1063. def testWithOptionalAndDefaultedDefModeChunked(self):
  1064. self.__initWithOptionalAndDefaulted()
  1065. assert encoder.encode(
  1066. self.s, defMode=True, maxChunkSize=4
  1067. ) == bytes(
  1068. (49, 24, 5, 0, 36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 2, 1, 1))
  1069. def testWithOptionalAndDefaultedIndefModeChunked(self):
  1070. self.__initWithOptionalAndDefaulted()
  1071. assert encoder.encode(
  1072. self.s, defMode=False, maxChunkSize=4
  1073. ) == bytes((49, 128, 5, 0, 36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0, 2, 1, 1, 0, 0))
  1074. class ChoiceEncoderTestCase(BaseTestCase):
  1075. def testEmpty(self):
  1076. s = univ.Choice()
  1077. try:
  1078. encoder.encode(s)
  1079. except PyAsn1Error:
  1080. pass
  1081. else:
  1082. assert 0, 'encoded unset choice'
  1083. def testDefModeOptionOne(self):
  1084. s = univ.Choice()
  1085. s.setComponentByPosition(0, univ.Null(''))
  1086. assert encoder.encode(s) == bytes((5, 0))
  1087. def testDefModeOptionTwo(self):
  1088. s = univ.Choice()
  1089. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  1090. assert encoder.encode(s) == bytes((4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  1091. def testIndefMode(self):
  1092. s = univ.Choice()
  1093. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  1094. assert encoder.encode(
  1095. s, defMode=False
  1096. ) == bytes((4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110))
  1097. def testDefModeChunked(self):
  1098. s = univ.Choice()
  1099. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  1100. assert encoder.encode(
  1101. s, defMode=True, maxChunkSize=4
  1102. ) == bytes((36, 17, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110))
  1103. def testIndefModeChunked(self):
  1104. s = univ.Choice()
  1105. s.setComponentByPosition(0, univ.OctetString('quick brown'))
  1106. assert encoder.encode(
  1107. s, defMode=False, maxChunkSize=4
  1108. ) == bytes((36, 128, 4, 4, 113, 117, 105, 99, 4, 4, 107, 32, 98, 114, 4, 3, 111, 119, 110, 0, 0))
  1109. class ChoiceEncoderWithSchemaTestCase(BaseTestCase):
  1110. def setUp(self):
  1111. BaseTestCase.setUp(self)
  1112. self.s = univ.Choice(
  1113. componentType=namedtype.NamedTypes(
  1114. namedtype.NamedType('place-holder', univ.Null('')),
  1115. namedtype.NamedType('number', univ.Integer(0)),
  1116. namedtype.NamedType('string', univ.OctetString())
  1117. )
  1118. )
  1119. self.v = {
  1120. 'place-holder': None
  1121. }
  1122. def testFilled(self):
  1123. assert encoder.encode(
  1124. self.v, asn1Spec=self.s
  1125. ) == bytes((5, 0))
  1126. class ChoiceEncoderWithComponentsSchemaTestCase(BaseTestCase):
  1127. def setUp(self):
  1128. BaseTestCase.setUp(self)
  1129. self.s = univ.Choice(
  1130. componentType=namedtype.NamedTypes(
  1131. namedtype.NamedType('place-holder', univ.Null('')),
  1132. namedtype.NamedType('number', univ.Integer(0)),
  1133. namedtype.NamedType('string', univ.OctetString())
  1134. )
  1135. )
  1136. def testEmpty(self):
  1137. try:
  1138. encoder.encode(self.s)
  1139. except PyAsn1Error:
  1140. pass
  1141. else:
  1142. assert 0, 'encoded unset choice'
  1143. def testFilled(self):
  1144. self.s.setComponentByPosition(0, univ.Null(''))
  1145. assert encoder.encode(self.s) == bytes((5, 0))
  1146. def testTagged(self):
  1147. s = self.s.subtype(
  1148. explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4)
  1149. )
  1150. s.setComponentByPosition(0, univ.Null(''))
  1151. assert encoder.encode(s) == bytes((164, 2, 5, 0))
  1152. def testUndefLength(self):
  1153. self.s.setComponentByPosition(2, univ.OctetString('abcdefgh'))
  1154. assert encoder.encode(self.s, defMode=False, maxChunkSize=3) == bytes(
  1155. (36, 128, 4, 3, 97, 98, 99, 4, 3, 100, 101, 102, 4, 2, 103, 104, 0, 0))
  1156. def testTaggedUndefLength(self):
  1157. s = self.s.subtype(
  1158. explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4)
  1159. )
  1160. s.setComponentByPosition(2, univ.OctetString('abcdefgh'))
  1161. assert encoder.encode(s, defMode=False, maxChunkSize=3) == bytes(
  1162. (164, 128, 36, 128, 4, 3, 97, 98, 99, 4, 3, 100, 101, 102, 4, 2, 103, 104, 0, 0, 0, 0))
  1163. class AnyEncoderTestCase(BaseTestCase):
  1164. def setUp(self):
  1165. BaseTestCase.setUp(self)
  1166. self.s = univ.Any(encoder.encode(univ.OctetString('fox')))
  1167. def testUntagged(self):
  1168. assert encoder.encode(self.s) == bytes((4, 3, 102, 111, 120))
  1169. def testTaggedEx(self):
  1170. s = self.s.subtype(
  1171. explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4)
  1172. )
  1173. assert encoder.encode(s) == bytes((164, 5, 4, 3, 102, 111, 120))
  1174. def testTaggedIm(self):
  1175. s = self.s.subtype(
  1176. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4)
  1177. )
  1178. assert encoder.encode(s) == bytes((132, 5, 4, 3, 102, 111, 120))
  1179. class AnyEncoderWithSchemaTestCase(BaseTestCase):
  1180. def setUp(self):
  1181. BaseTestCase.setUp(self)
  1182. self.s = univ.Any()
  1183. self.v = encoder.encode(univ.OctetString('fox'))
  1184. def testUntagged(self):
  1185. assert encoder.encode(self.v, asn1Spec=self.s) == bytes((4, 3, 102, 111, 120))
  1186. def testTaggedEx(self):
  1187. s = self.s.subtype(
  1188. explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4)
  1189. )
  1190. assert encoder.encode(self.v, asn1Spec=s) == bytes((164, 5, 4, 3, 102, 111, 120))
  1191. def testTaggedIm(self):
  1192. s = self.s.subtype(
  1193. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4)
  1194. )
  1195. assert encoder.encode(self.v, asn1Spec=s) == bytes((132, 5, 4, 3, 102, 111, 120))
  1196. suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
  1197. if __name__ == '__main__':
  1198. unittest.TextTestRunner(verbosity=2).run(suite)