129 yield BREAK |
129 yield BREAK |
130 |
130 |
131 |
131 |
132 def streamencodeint(v: int) -> Iterator[bytes]: |
132 def streamencodeint(v: int) -> Iterator[bytes]: |
133 if v >= 18446744073709551616 or v < -18446744073709551616: |
133 if v >= 18446744073709551616 or v < -18446744073709551616: |
134 raise ValueError(b'big integers not supported') |
134 raise ValueError('big integers not supported') |
135 |
135 |
136 if v >= 0: |
136 if v >= 0: |
137 yield encodelength(MAJOR_TYPE_UINT, v) |
137 yield encodelength(MAJOR_TYPE_UINT, v) |
138 else: |
138 else: |
139 yield encodelength(MAJOR_TYPE_NEGINT, abs(v) - 1) |
139 yield encodelength(MAJOR_TYPE_NEGINT, abs(v) - 1) |
342 # It is an indefinite length bytestring. |
342 # It is an indefinite length bytestring. |
343 else: |
343 else: |
344 return True, None, 1, SPECIAL_START_INDEFINITE_BYTESTRING |
344 return True, None, 1, SPECIAL_START_INDEFINITE_BYTESTRING |
345 |
345 |
346 elif majortype == MAJOR_TYPE_STRING: |
346 elif majortype == MAJOR_TYPE_STRING: |
347 raise CBORDecodeError(b'string major type not supported') |
347 raise CBORDecodeError('string major type not supported') |
348 |
348 |
349 elif majortype == MAJOR_TYPE_ARRAY: |
349 elif majortype == MAJOR_TYPE_ARRAY: |
350 # Beginning of arrays are treated as uints in order to decode their |
350 # Beginning of arrays are treated as uints in order to decode their |
351 # length. We don't allow indefinite length arrays. |
351 # length. We don't allow indefinite length arrays. |
352 complete, size, readcount = decodeuint(subtype, b, offset) |
352 complete, size, readcount = decodeuint(subtype, b, offset) |
391 if not complete: |
391 if not complete: |
392 return False, None, readcount2, SPECIAL_NONE |
392 return False, None, readcount2, SPECIAL_NONE |
393 |
393 |
394 if special != SPECIAL_START_ARRAY: |
394 if special != SPECIAL_START_ARRAY: |
395 raise CBORDecodeError( |
395 raise CBORDecodeError( |
396 b'expected array after finite set semantic tag' |
396 'expected array after finite set semantic tag' |
397 ) |
397 ) |
398 |
398 |
399 return True, size, readcount + readcount2 + 1, SPECIAL_START_SET |
399 return True, size, readcount + readcount2 + 1, SPECIAL_START_SET |
400 |
400 |
401 else: |
401 else: |
402 raise CBORDecodeError(b'semantic tag %d not allowed' % tagvalue) |
402 raise CBORDecodeError('semantic tag %d not allowed' % tagvalue) |
403 |
403 |
404 elif majortype == MAJOR_TYPE_SPECIAL: |
404 elif majortype == MAJOR_TYPE_SPECIAL: |
405 # Only specific values for the information field are allowed. |
405 # Only specific values for the information field are allowed. |
406 if subtype == SUBTYPE_FALSE: |
406 if subtype == SUBTYPE_FALSE: |
407 return True, False, 1, SPECIAL_NONE |
407 return True, False, 1, SPECIAL_NONE |
411 return True, None, 1, SPECIAL_NONE |
411 return True, None, 1, SPECIAL_NONE |
412 elif subtype == SUBTYPE_INDEFINITE: |
412 elif subtype == SUBTYPE_INDEFINITE: |
413 return True, None, 1, SPECIAL_INDEFINITE_BREAK |
413 return True, None, 1, SPECIAL_INDEFINITE_BREAK |
414 # If value is 24, subtype is in next byte. |
414 # If value is 24, subtype is in next byte. |
415 else: |
415 else: |
416 raise CBORDecodeError(b'special type %d not allowed' % subtype) |
416 raise CBORDecodeError('special type %d not allowed' % subtype) |
417 else: |
417 else: |
418 assert False |
418 assert False |
419 |
419 |
420 |
420 |
421 def decodeuint( |
421 def decodeuint( |
461 elif subtype == 26: |
461 elif subtype == 26: |
462 s = STRUCT_BIG_ULONG |
462 s = STRUCT_BIG_ULONG |
463 elif subtype == 27: |
463 elif subtype == 27: |
464 s = STRUCT_BIG_ULONGLONG |
464 s = STRUCT_BIG_ULONGLONG |
465 else: |
465 else: |
466 raise CBORDecodeError(b'bounds condition checking violation') |
466 raise CBORDecodeError('bounds condition checking violation') |
467 |
467 |
468 if len(b) - offset >= s.size: |
468 if len(b) - offset >= s.size: |
469 return True, s.unpack_from(b, offset)[0], s.size |
469 return True, s.unpack_from(b, offset)[0], s.size |
470 else: |
470 else: |
471 return False, None, len(b) - offset - s.size |
471 return False, None, len(b) - offset - s.size |
663 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
663 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
664 self._state = self._STATE_WANT_BYTESTRING_CHUNK_FIRST |
664 self._state = self._STATE_WANT_BYTESTRING_CHUNK_FIRST |
665 |
665 |
666 else: |
666 else: |
667 raise CBORDecodeError( |
667 raise CBORDecodeError( |
668 b'unhandled special state: %d' % special |
668 'unhandled special state: %d' % special |
669 ) |
669 ) |
670 |
670 |
671 # This value becomes an element of the current array. |
671 # This value becomes an element of the current array. |
672 elif self._state == self._STATE_WANT_ARRAY_VALUE: |
672 elif self._state == self._STATE_WANT_ARRAY_VALUE: |
673 # Simple values get appended. |
673 # Simple values get appended. |
725 |
725 |
726 self._state = self._STATE_WANT_SET_VALUE |
726 self._state = self._STATE_WANT_SET_VALUE |
727 |
727 |
728 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
728 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
729 raise CBORDecodeError( |
729 raise CBORDecodeError( |
730 b'indefinite length bytestrings ' |
730 'indefinite length bytestrings ' |
731 b'not allowed as array values' |
731 'not allowed as array values' |
732 ) |
732 ) |
733 |
733 |
734 else: |
734 else: |
735 raise CBORDecodeError( |
735 raise CBORDecodeError( |
736 b'unhandled special item when ' |
736 'unhandled special item when ' |
737 b'expecting array value: %d' % special |
737 'expecting array value: %d' % special |
738 ) |
738 ) |
739 |
739 |
740 # This value becomes the key of the current map instance. |
740 # This value becomes the key of the current map instance. |
741 elif self._state == self._STATE_WANT_MAP_KEY: |
741 elif self._state == self._STATE_WANT_MAP_KEY: |
742 if special == SPECIAL_NONE: |
742 if special == SPECIAL_NONE: |
743 self._currentmapkey = value |
743 self._currentmapkey = value |
744 self._state = self._STATE_WANT_MAP_VALUE |
744 self._state = self._STATE_WANT_MAP_VALUE |
745 |
745 |
746 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
746 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
747 raise CBORDecodeError( |
747 raise CBORDecodeError( |
748 b'indefinite length bytestrings ' |
748 'indefinite length bytestrings ' |
749 b'not allowed as map keys' |
749 'not allowed as map keys' |
750 ) |
750 ) |
751 |
751 |
752 elif special in ( |
752 elif special in ( |
753 SPECIAL_START_ARRAY, |
753 SPECIAL_START_ARRAY, |
754 SPECIAL_START_MAP, |
754 SPECIAL_START_MAP, |
755 SPECIAL_START_SET, |
755 SPECIAL_START_SET, |
756 ): |
756 ): |
757 raise CBORDecodeError( |
757 raise CBORDecodeError( |
758 b'collections not supported as map keys' |
758 'collections not supported as map keys' |
759 ) |
759 ) |
760 |
760 |
761 # We do not allow special values to be used as map keys. |
761 # We do not allow special values to be used as map keys. |
762 else: |
762 else: |
763 raise CBORDecodeError( |
763 raise CBORDecodeError( |
764 b'unhandled special item when ' |
764 'unhandled special item when ' |
765 b'expecting map key: %d' % special |
765 'expecting map key: %d' % special |
766 ) |
766 ) |
767 |
767 |
768 # This value becomes the value of the current map key. |
768 # This value becomes the value of the current map key. |
769 elif self._state == self._STATE_WANT_MAP_VALUE: |
769 elif self._state == self._STATE_WANT_MAP_VALUE: |
770 # Simple values simply get inserted into the map. |
770 # Simple values simply get inserted into the map. |
826 |
826 |
827 self._state = self._STATE_WANT_SET_VALUE |
827 self._state = self._STATE_WANT_SET_VALUE |
828 |
828 |
829 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
829 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
830 raise CBORDecodeError( |
830 raise CBORDecodeError( |
831 b'indefinite length bytestrings not ' |
831 'indefinite length bytestrings not ' |
832 b'allowed as map values' |
832 'allowed as map values' |
833 ) |
833 ) |
834 |
834 |
835 else: |
835 else: |
836 raise CBORDecodeError( |
836 raise CBORDecodeError( |
837 b'unhandled special item when ' |
837 'unhandled special item when ' |
838 b'expecting map value: %d' % special |
838 'expecting map value: %d' % special |
839 ) |
839 ) |
840 |
840 |
841 self._currentmapkey = None |
841 self._currentmapkey = None |
842 |
842 |
843 # This value is added to the current set. |
843 # This value is added to the current set. |
847 lastc[b'v'].add(value) |
847 lastc[b'v'].add(value) |
848 lastc[b'remaining'] -= 1 |
848 lastc[b'remaining'] -= 1 |
849 |
849 |
850 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
850 elif special == SPECIAL_START_INDEFINITE_BYTESTRING: |
851 raise CBORDecodeError( |
851 raise CBORDecodeError( |
852 b'indefinite length bytestrings not ' |
852 'indefinite length bytestrings not ' |
853 b'allowed as set values' |
853 'allowed as set values' |
854 ) |
854 ) |
855 |
855 |
856 elif special in ( |
856 elif special in ( |
857 SPECIAL_START_ARRAY, |
857 SPECIAL_START_ARRAY, |
858 SPECIAL_START_MAP, |
858 SPECIAL_START_MAP, |
859 SPECIAL_START_SET, |
859 SPECIAL_START_SET, |
860 ): |
860 ): |
861 raise CBORDecodeError( |
861 raise CBORDecodeError( |
862 b'collections not allowed as set values' |
862 'collections not allowed as set values' |
863 ) |
863 ) |
864 |
864 |
865 # We don't allow non-trivial types to exist as set values. |
865 # We don't allow non-trivial types to exist as set values. |
866 else: |
866 else: |
867 raise CBORDecodeError( |
867 raise CBORDecodeError( |
868 b'unhandled special item when ' |
868 'unhandled special item when ' |
869 b'expecting set value: %d' % special |
869 'expecting set value: %d' % special |
870 ) |
870 ) |
871 |
871 |
872 # This value represents the first chunk in an indefinite length |
872 # This value represents the first chunk in an indefinite length |
873 # bytestring. |
873 # bytestring. |
874 elif self._state == self._STATE_WANT_BYTESTRING_CHUNK_FIRST: |
874 elif self._state == self._STATE_WANT_BYTESTRING_CHUNK_FIRST: |
895 assert not self._collectionstack |
895 assert not self._collectionstack |
896 self._state = self._STATE_NONE |
896 self._state = self._STATE_NONE |
897 |
897 |
898 else: |
898 else: |
899 raise CBORDecodeError( |
899 raise CBORDecodeError( |
900 b'unexpected special value when ' |
900 'unexpected special value when ' |
901 b'expecting bytestring chunk: %d' % special |
901 'expecting bytestring chunk: %d' % special |
902 ) |
902 ) |
903 |
903 |
904 # This value represents the non-initial chunk in an indefinite |
904 # This value represents the non-initial chunk in an indefinite |
905 # length bytestring. |
905 # length bytestring. |
906 elif self._state == self._STATE_WANT_BYTESTRING_CHUNK_SUBSEQUENT: |
906 elif self._state == self._STATE_WANT_BYTESTRING_CHUNK_SUBSEQUENT: |
917 assert not self._collectionstack |
917 assert not self._collectionstack |
918 self._state = self._STATE_NONE |
918 self._state = self._STATE_NONE |
919 |
919 |
920 else: |
920 else: |
921 raise CBORDecodeError( |
921 raise CBORDecodeError( |
922 b'unexpected special value when ' |
922 'unexpected special value when ' |
923 b'expecting bytestring chunk: %d' % special |
923 'expecting bytestring chunk: %d' % special |
924 ) |
924 ) |
925 |
925 |
926 else: |
926 else: |
927 raise CBORDecodeError( |
927 raise CBORDecodeError( |
928 b'unhandled decoder state: %d' % self._state |
928 'unhandled decoder state: %d' % self._state |
929 ) |
929 ) |
930 |
930 |
931 # We could have just added the final value in a collection. End |
931 # We could have just added the final value in a collection. End |
932 # all complete collections at the top of the stack. |
932 # all complete collections at the top of the stack. |
933 while True: |
933 while True: |
1073 decoder = sansiodecoder() |
1073 decoder = sansiodecoder() |
1074 |
1074 |
1075 havevalues, readcount, wantbytes = decoder.decode(b) |
1075 havevalues, readcount, wantbytes = decoder.decode(b) |
1076 |
1076 |
1077 if readcount != len(b): |
1077 if readcount != len(b): |
1078 raise CBORDecodeError(b'input data not fully consumed') |
1078 raise CBORDecodeError('input data not fully consumed') |
1079 |
1079 |
1080 if decoder.inprogress: |
1080 if decoder.inprogress: |
1081 raise CBORDecodeError(b'input data not complete') |
1081 raise CBORDecodeError('input data not complete') |
1082 |
1082 |
1083 return decoder.getavailable() |
1083 return decoder.getavailable() |