P1sec / pycrate

A Python library to ease the development of encoders and decoders for various protocols and file formats; contains ASN.1 and CSN.1 compilers.
GNU Lesser General Public License v2.1
381 stars 132 forks source link

pycrate_asn1rt.err.ASN1ObjErr: Value: value out of size constraint #154

Closed ghost closed 2 years ago

ghost commented 2 years ago

I got an Error "out of size constraint" when I create a XnAP PDU, like this :

import pycrate_asn1dir.XnAP enc=pycrate_asn1dir.XnAP.XnAP_PDU_Descriptions.XnAP_PDU a="('successfulOutcome', {'procedureCode': 10, 'criticality': 'reject', 'value': ('SNodeModificationConfirm', {'protocolIEs': [{'id': 35, 'criticality': 'ignore', 'value': ('PDUSessionAdmittedModSNModConfirm', [{'pduSessionId': 1}])}]})})" enc.set_val(a)

But, if the value of the payload has exactly 256 times {'pduSessionId': 1}, there is no error.

a=('successfulOutcome', {'procedureCode': 10, 'criticality': 'reject', 'value': ('SNodeModificationConfirm', {'protocolIEs': [{'id': 35, 'criticality': 'ignore', 'value': ('PDUSessionAdmittedModSNModConfirm', [{'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}, {'pduSessionId': 1}])}]})})

The ASN1 description for this payload is : id-PDUSessionAdmittedModSNModConfirm ProtocolIE-ID ::= 35 PDUSessionAdmittedModSNModConfirm ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionAdmittedModSNModConfirm-Item maxnoofPDUSessions INTEGER ::= 256

Normally a sequence between 1 to 256, should be accepted.

Detailed information for debugging :

Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj.py", line 1189, in set_val self._safechk_bnd(self._val) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_construct.py", line 92, in _safechk_bnd self._cont[val[0]]._safechk_bnd(val[1]) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_construct.py", line 774, in _safechk_bnd Obj._safechk_bnd(Obj._val) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_ext.py", line 184, in _safechk_bnd self._get_val_obj(val[0])._safechk_bnd(val[1]) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_construct.py", line 774, in _safechk_bnd Obj._safechk_bnd(Obj._val) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_construct.py", line 2645, in _safechk_bnd self._cont._safechk_bnd(v) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_construct.py", line 774, in _safechk_bnd Obj._safechk_bnd(Obj._val) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_ext.py", line 184, in _safechk_bnd self._get_val_obj(val[0])._safechk_bnd(val[1]) File "/usr/local/lib/python3.8/dist-packages/pycrate_asn1rt/asnobj_construct.py", line 2642, in _safechk_bnd raise(ASN1ObjErr('{0}: value out of size constraint, {1!r}'\ pycrate_asn1rt.err.ASN1ObjErr: Value: value out of size constraint, [{'pduSessionId': 1}]

asn1obj.construct.py (ligne 2636 to 2644) def _safechk_bnd(self, val): ASN1Obj._safechk_bnd(self, val) if self._const_sz and \ self._const_sz.ext is None and \ len(val) not in self._const_sz: raise(ASN1ObjErr('{0}: value out of size constraint, {1!r}'\ .format(self.fullname(), val))) for v in val: self._cont._safechk_bnd(v)

(_safechk_bnd)>>> self <Value ([PDUSessionAdmittedModSNModConfirm] SEQUENCE OF)>

(_safechk_bnd)>>> val [{'pduSessionId': 1}]

(_safechk_bnd)>>> self._const_sz ASN1Set(root=[256], ext=None)

(_safechk_bnd)>>> len(val) 1

p1-bmu commented 2 years ago

I have no issue with setting a single pduSessionId, nor with setting 256 of them:

In [1]: from pycrate_asn1dir.XnAP import *

In [2]: P = XnAP_PDU_Descriptions.XnAP_PDU

In [3]: a=('successfulOutcome', {'procedureCode': 10, 'criticality': 'reject', 'value': ('SNodeModificationConfirm', {'protocolIEs': [{'id': 35, 'criticality': 'ignore', 'value': ('PDUSessionAdmittedModSNModConfirm', [{'pduSessionId': 1}])}]})})

In [4]: P.set_val(a)

In [5]: print(P.to_asn1())
successfulOutcome : {
  procedureCode 10,
  criticality reject,
  value SNodeModificationConfirm: {
    protocolIEs {
      {
        id 35,
        criticality ignore,
        value PDUSessionAdmittedModSNModConfirm: {
          {
            pduSessionId 1
          }
        }
      }
    }
  }
}

In [6]: P.to_aper()
Out[6]: b' \n\x00\n\x00\x00\x01\x00#@\x03\x00\x00\x01'

In [7]: a=('successfulOutcome', {'procedureCode': 10, 'criticality': 'reject', 'value': ('SNodeModificationConfirm', {'protocolIEs': [{'id': 35, 'criticality': 'ignore', 'value': ('PDUSessionAdmittedModSNModConfirm', [{'pduSessionId': 1}]*256)}]})})

In [8]: P.set_val(a)

In [9]: print(P.to_asn1())
successfulOutcome : {
  procedureCode 10,
  criticality reject,
  value SNodeModificationConfirm: {
    protocolIEs {
      {
        id 35,
        criticality ignore,
        value PDUSessionAdmittedModSNModConfirm: {
          {
            pduSessionId 1
          },
          {
            pduSessionId 1
          },
          [...]
          {
            pduSessionId 1
          }
        }
      }
    }
  }
}

In [10]: P.to_aper()
Out[10]: b' \n\x00\x82\t\x00\x00\x01\x00#@\x82\x01\xff\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'

Actually, I fail to understand exactly where you have an issue.

ghost commented 2 years ago

I was using pycrate v0.5.2 upgraded to v0.5.3. With a full uninstall and install of 0.5.3, the issue is no more present.

ghost commented 2 years ago

This issue is present with v0.5.2. And also v0.5.2 installed by "pip install pycrate"+upgrade with v0.5.3 downloaded from github and installed with "python3 setup.py install"

p1-bmu commented 2 years ago

Sorry, but I don't understand what is the exact issue you are talking about, as I can't reproduce it. Please provide all the required info, as introduced here: https://github.com/P1sec/pycrate#filling-an-issue

ghost commented 2 years ago

Can you confirm that you can reproduce the issue with pycrate v0.5.2 and the 4 lines of code defined above ? Is there a difference of installing pycrate with "pip install pycrate" versus git clone+"python3 setup.py install"

p1-bmu commented 2 years ago

What 4 lines of code above ?? Yours ? Mine ? Come on, please, be rigorous on what you ask and want me to test.

Mine 4 lines are working fine, whatever pycrate's version. Yours are:

import pycrate_asn1dir.XnAP
enc=pycrate_asn1dir.XnAP.XnAP_PDU_Descriptions.XnAP_PDU
a="('successfulOutcome', {'procedureCode': 10, 'criticality': 'reject', 'value': ('SNodeModificationConfirm', {'protocolIEs': [{'id': 35, 'criticality': 'ignore', 'value': ('PDUSessionAdmittedModSNModConfirm', [{'pduSessionId': 1}])}]})})"
enc.set_val(a)

And there is an obvious issue as the value you write in a is just a string and not any structured value.

ghost commented 2 years ago

My environment in a Dockerfile named XnAP_pycrate052_test.dockerfile:

FROM python:3

RUN pip3 install pycrate==0.5.2
RUN echo "#! /usr/bin/env python3\n\
from pycrate_asn1dir.XnAP import *\n\
P = XnAP_PDU_Descriptions.XnAP_PDU\n\
a=('successfulOutcome', {'procedureCode': 10, 'criticality': 'reject', 'value': ('SNodeModificationConfirm', {'protocolIEs': [{'id': 35, 'criticality': 'ignore', 'value': ('PDUSessionAdmittedModSNModConfirm', [{'pduSessionId': 1}])}]})})\n\
P.set_val(a)\n\
print(P.to_asn1())\n"\
> /xnap.py
RUN chmod u+x /xnap.py
ENTRYPOINT ["/xnap.py"]

To execute the container :

 $ docker --config . build -t xnap52 -f XnAP_pycrate052_test.dockerfile  .
$ docker run -it  xnap52 
Traceback (most recent call last):
  File "/xnap.py", line 5, in <module>
    P.set_val(a)
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj.py", line 1189, in set_val
    self._safechk_bnd(self._val)
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_construct.py", line 92, in _safechk_bnd
    self._cont[val[0]]._safechk_bnd(val[1])
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_construct.py", line 774, in _safechk_bnd
    Obj._safechk_bnd(Obj._val)
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_ext.py", line 184, in _safechk_bnd
    self._get_val_obj(val[0])._safechk_bnd(val[1])
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_construct.py", line 774, in _safechk_bnd
    Obj._safechk_bnd(Obj._val)
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_construct.py", line 2645, in _safechk_bnd
    self._cont._safechk_bnd(v)
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_construct.py", line 774, in _safechk_bnd
    Obj._safechk_bnd(Obj._val)
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_ext.py", line 184, in _safechk_bnd
    self._get_val_obj(val[0])._safechk_bnd(val[1])
  File "/usr/local/lib/python3.10/site-packages/pycrate_asn1rt/asnobj_construct.py", line 2642, in _safechk_bnd
    raise(ASN1ObjErr('{0}: value out of size constraint, {1!r}'\
pycrate_asn1rt.err.ASN1ObjErr: Value: value out of size constraint, [{'pduSessionId': 1}]
p1-bmu commented 2 years ago

OK, I could reproduce the issue. This corresponds to an issue in the XnAP ASN.1 definition used in pycrate 0.5.2, extracted from TS 38.412 version f60 (released in 2020-01-15): https://github.com/P1sec/pycrate/blob/2e55ac324d318a1e183ac2d2b91028fecd847798/pycrate_asn1dir/3GPP_NR_XnAP_38423/XnAP-PDU-Contents.asn#L1022

The SEQUENCE OF object has a fixed length, instead of a SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF ; this has been fixed in more recent 3GPP specification.

I updated all the RAN ASN.1 definitions back in September: https://github.com/P1sec/pycrate/commit/839291c8e83719bbd607542273d41eb920a2911b, and tagged a 0.5.3 version of pycrate, what solved your issue.

ghost commented 2 years ago

Thanks