mirror of
https://github.com/mitmproxy/mitmproxy.git
synced 2024-11-23 05:09:57 +00:00
update kaitai definitions
This commit is contained in:
parent
821859cd4f
commit
002f919dda
2
.gitignore
vendored
2
.gitignore
vendored
@ -14,7 +14,7 @@ MANIFEST
|
||||
.tox*/
|
||||
build/
|
||||
dist/
|
||||
mitmproxy/contrib/kaitaistruct/*.ksy
|
||||
mitmproxy/contrib/kaitaistruct/**/*.ksy
|
||||
.pytest_cache
|
||||
__pycache__
|
||||
.hypothesis/
|
||||
|
@ -1,26 +1,654 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import array
|
||||
import struct
|
||||
import zlib
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
|
||||
from .exif_le import ExifLe
|
||||
from .exif_be import ExifBe
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
class Exif(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.endianness = self._io.read_u2le()
|
||||
_on = self.endianness
|
||||
if _on == 18761:
|
||||
self.body = ExifLe(self._io)
|
||||
elif _on == 19789:
|
||||
self.body = ExifBe(self._io)
|
||||
self.body = Exif.ExifBody(self._io, self, self._root)
|
||||
|
||||
class ExifBody(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
_on = self._root.endianness
|
||||
if _on == 18761:
|
||||
self._is_le = True
|
||||
elif _on == 19789:
|
||||
self._is_le = False
|
||||
if not hasattr(self, '_is_le'):
|
||||
raise kaitaistruct.UndecidedEndiannessError("/types/exif_body")
|
||||
elif self._is_le == True:
|
||||
self._read_le()
|
||||
elif self._is_le == False:
|
||||
self._read_be()
|
||||
|
||||
def _read_le(self):
|
||||
self.version = self._io.read_u2le()
|
||||
self.ifd0_ofs = self._io.read_u4le()
|
||||
|
||||
def _read_be(self):
|
||||
self.version = self._io.read_u2be()
|
||||
self.ifd0_ofs = self._io.read_u4be()
|
||||
|
||||
class Ifd(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._is_le = _is_le
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
if not hasattr(self, '_is_le'):
|
||||
raise kaitaistruct.UndecidedEndiannessError("/types/exif_body/types/ifd")
|
||||
elif self._is_le == True:
|
||||
self._read_le()
|
||||
elif self._is_le == False:
|
||||
self._read_be()
|
||||
|
||||
def _read_le(self):
|
||||
self.num_fields = self._io.read_u2le()
|
||||
self.fields = []
|
||||
for i in range(self.num_fields):
|
||||
self.fields.append(Exif.ExifBody.IfdField(self._io, self, self._root, self._is_le))
|
||||
|
||||
self.next_ifd_ofs = self._io.read_u4le()
|
||||
|
||||
def _read_be(self):
|
||||
self.num_fields = self._io.read_u2be()
|
||||
self.fields = []
|
||||
for i in range(self.num_fields):
|
||||
self.fields.append(Exif.ExifBody.IfdField(self._io, self, self._root, self._is_le))
|
||||
|
||||
self.next_ifd_ofs = self._io.read_u4be()
|
||||
|
||||
@property
|
||||
def next_ifd(self):
|
||||
if hasattr(self, '_m_next_ifd'):
|
||||
return self._m_next_ifd
|
||||
|
||||
if self.next_ifd_ofs != 0:
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.next_ifd_ofs)
|
||||
if self._is_le:
|
||||
self._m_next_ifd = Exif.ExifBody.Ifd(self._io, self, self._root, self._is_le)
|
||||
else:
|
||||
self._m_next_ifd = Exif.ExifBody.Ifd(self._io, self, self._root, self._is_le)
|
||||
self._io.seek(_pos)
|
||||
|
||||
return getattr(self, '_m_next_ifd', None)
|
||||
|
||||
|
||||
class IfdField(KaitaiStruct):
|
||||
|
||||
class FieldTypeEnum(Enum):
|
||||
byte = 1
|
||||
ascii_string = 2
|
||||
word = 3
|
||||
dword = 4
|
||||
rational = 5
|
||||
undefined = 7
|
||||
slong = 9
|
||||
srational = 10
|
||||
|
||||
class TagEnum(Enum):
|
||||
image_width = 256
|
||||
image_height = 257
|
||||
bits_per_sample = 258
|
||||
compression = 259
|
||||
photometric_interpretation = 262
|
||||
thresholding = 263
|
||||
cell_width = 264
|
||||
cell_length = 265
|
||||
fill_order = 266
|
||||
document_name = 269
|
||||
image_description = 270
|
||||
make = 271
|
||||
model = 272
|
||||
strip_offsets = 273
|
||||
orientation = 274
|
||||
samples_per_pixel = 277
|
||||
rows_per_strip = 278
|
||||
strip_byte_counts = 279
|
||||
min_sample_value = 280
|
||||
max_sample_value = 281
|
||||
x_resolution = 282
|
||||
y_resolution = 283
|
||||
planar_configuration = 284
|
||||
page_name = 285
|
||||
x_position = 286
|
||||
y_position = 287
|
||||
free_offsets = 288
|
||||
free_byte_counts = 289
|
||||
gray_response_unit = 290
|
||||
gray_response_curve = 291
|
||||
t4_options = 292
|
||||
t6_options = 293
|
||||
resolution_unit = 296
|
||||
page_number = 297
|
||||
color_response_unit = 300
|
||||
transfer_function = 301
|
||||
software = 305
|
||||
modify_date = 306
|
||||
artist = 315
|
||||
host_computer = 316
|
||||
predictor = 317
|
||||
white_point = 318
|
||||
primary_chromaticities = 319
|
||||
color_map = 320
|
||||
halftone_hints = 321
|
||||
tile_width = 322
|
||||
tile_length = 323
|
||||
tile_offsets = 324
|
||||
tile_byte_counts = 325
|
||||
bad_fax_lines = 326
|
||||
clean_fax_data = 327
|
||||
consecutive_bad_fax_lines = 328
|
||||
sub_ifd = 330
|
||||
ink_set = 332
|
||||
ink_names = 333
|
||||
numberof_inks = 334
|
||||
dot_range = 336
|
||||
target_printer = 337
|
||||
extra_samples = 338
|
||||
sample_format = 339
|
||||
s_min_sample_value = 340
|
||||
s_max_sample_value = 341
|
||||
transfer_range = 342
|
||||
clip_path = 343
|
||||
x_clip_path_units = 344
|
||||
y_clip_path_units = 345
|
||||
indexed = 346
|
||||
jpeg_tables = 347
|
||||
opi_proxy = 351
|
||||
global_parameters_ifd = 400
|
||||
profile_type = 401
|
||||
fax_profile = 402
|
||||
coding_methods = 403
|
||||
version_year = 404
|
||||
mode_number = 405
|
||||
decode = 433
|
||||
default_image_color = 434
|
||||
t82_options = 435
|
||||
jpeg_tables2 = 437
|
||||
jpeg_proc = 512
|
||||
thumbnail_offset = 513
|
||||
thumbnail_length = 514
|
||||
jpeg_restart_interval = 515
|
||||
jpeg_lossless_predictors = 517
|
||||
jpeg_point_transforms = 518
|
||||
jpegq_tables = 519
|
||||
jpegdc_tables = 520
|
||||
jpegac_tables = 521
|
||||
y_cb_cr_coefficients = 529
|
||||
y_cb_cr_sub_sampling = 530
|
||||
y_cb_cr_positioning = 531
|
||||
reference_black_white = 532
|
||||
strip_row_counts = 559
|
||||
application_notes = 700
|
||||
uspto_miscellaneous = 999
|
||||
related_image_file_format = 4096
|
||||
related_image_width = 4097
|
||||
related_image_height = 4098
|
||||
rating = 18246
|
||||
xp_dip_xml = 18247
|
||||
stitch_info = 18248
|
||||
rating_percent = 18249
|
||||
sony_raw_file_type = 28672
|
||||
light_falloff_params = 28722
|
||||
chromatic_aberration_corr_params = 28725
|
||||
distortion_corr_params = 28727
|
||||
image_id = 32781
|
||||
wang_tag1 = 32931
|
||||
wang_annotation = 32932
|
||||
wang_tag3 = 32933
|
||||
wang_tag4 = 32934
|
||||
image_reference_points = 32953
|
||||
region_xform_tack_point = 32954
|
||||
warp_quadrilateral = 32955
|
||||
affine_transform_mat = 32956
|
||||
matteing = 32995
|
||||
data_type = 32996
|
||||
image_depth = 32997
|
||||
tile_depth = 32998
|
||||
image_full_width = 33300
|
||||
image_full_height = 33301
|
||||
texture_format = 33302
|
||||
wrap_modes = 33303
|
||||
fov_cot = 33304
|
||||
matrix_world_to_screen = 33305
|
||||
matrix_world_to_camera = 33306
|
||||
model2 = 33405
|
||||
cfa_repeat_pattern_dim = 33421
|
||||
cfa_pattern2 = 33422
|
||||
battery_level = 33423
|
||||
kodak_ifd = 33424
|
||||
copyright = 33432
|
||||
exposure_time = 33434
|
||||
f_number = 33437
|
||||
md_file_tag = 33445
|
||||
md_scale_pixel = 33446
|
||||
md_color_table = 33447
|
||||
md_lab_name = 33448
|
||||
md_sample_info = 33449
|
||||
md_prep_date = 33450
|
||||
md_prep_time = 33451
|
||||
md_file_units = 33452
|
||||
pixel_scale = 33550
|
||||
advent_scale = 33589
|
||||
advent_revision = 33590
|
||||
uic1_tag = 33628
|
||||
uic2_tag = 33629
|
||||
uic3_tag = 33630
|
||||
uic4_tag = 33631
|
||||
iptc_naa = 33723
|
||||
intergraph_packet_data = 33918
|
||||
intergraph_flag_registers = 33919
|
||||
intergraph_matrix = 33920
|
||||
ingr_reserved = 33921
|
||||
model_tie_point = 33922
|
||||
site = 34016
|
||||
color_sequence = 34017
|
||||
it8_header = 34018
|
||||
raster_padding = 34019
|
||||
bits_per_run_length = 34020
|
||||
bits_per_extended_run_length = 34021
|
||||
color_table = 34022
|
||||
image_color_indicator = 34023
|
||||
background_color_indicator = 34024
|
||||
image_color_value = 34025
|
||||
background_color_value = 34026
|
||||
pixel_intensity_range = 34027
|
||||
transparency_indicator = 34028
|
||||
color_characterization = 34029
|
||||
hc_usage = 34030
|
||||
trap_indicator = 34031
|
||||
cmyk_equivalent = 34032
|
||||
sem_info = 34118
|
||||
afcp_iptc = 34152
|
||||
pixel_magic_jbig_options = 34232
|
||||
jpl_carto_ifd = 34263
|
||||
model_transform = 34264
|
||||
wb_grgb_levels = 34306
|
||||
leaf_data = 34310
|
||||
photoshop_settings = 34377
|
||||
exif_offset = 34665
|
||||
icc_profile = 34675
|
||||
tiff_fx_extensions = 34687
|
||||
multi_profiles = 34688
|
||||
shared_data = 34689
|
||||
t88_options = 34690
|
||||
image_layer = 34732
|
||||
geo_tiff_directory = 34735
|
||||
geo_tiff_double_params = 34736
|
||||
geo_tiff_ascii_params = 34737
|
||||
jbig_options = 34750
|
||||
exposure_program = 34850
|
||||
spectral_sensitivity = 34852
|
||||
gps_info = 34853
|
||||
iso = 34855
|
||||
opto_electric_conv_factor = 34856
|
||||
interlace = 34857
|
||||
time_zone_offset = 34858
|
||||
self_timer_mode = 34859
|
||||
sensitivity_type = 34864
|
||||
standard_output_sensitivity = 34865
|
||||
recommended_exposure_index = 34866
|
||||
iso_speed = 34867
|
||||
iso_speed_latitudeyyy = 34868
|
||||
iso_speed_latitudezzz = 34869
|
||||
fax_recv_params = 34908
|
||||
fax_sub_address = 34909
|
||||
fax_recv_time = 34910
|
||||
fedex_edr = 34929
|
||||
leaf_sub_ifd = 34954
|
||||
exif_version = 36864
|
||||
date_time_original = 36867
|
||||
create_date = 36868
|
||||
google_plus_upload_code = 36873
|
||||
offset_time = 36880
|
||||
offset_time_original = 36881
|
||||
offset_time_digitized = 36882
|
||||
components_configuration = 37121
|
||||
compressed_bits_per_pixel = 37122
|
||||
shutter_speed_value = 37377
|
||||
aperture_value = 37378
|
||||
brightness_value = 37379
|
||||
exposure_compensation = 37380
|
||||
max_aperture_value = 37381
|
||||
subject_distance = 37382
|
||||
metering_mode = 37383
|
||||
light_source = 37384
|
||||
flash = 37385
|
||||
focal_length = 37386
|
||||
flash_energy = 37387
|
||||
spatial_frequency_response = 37388
|
||||
noise = 37389
|
||||
focal_plane_x_resolution = 37390
|
||||
focal_plane_y_resolution = 37391
|
||||
focal_plane_resolution_unit = 37392
|
||||
image_number = 37393
|
||||
security_classification = 37394
|
||||
image_history = 37395
|
||||
subject_area = 37396
|
||||
exposure_index = 37397
|
||||
tiff_ep_standard_id = 37398
|
||||
sensing_method = 37399
|
||||
cip3_data_file = 37434
|
||||
cip3_sheet = 37435
|
||||
cip3_side = 37436
|
||||
sto_nits = 37439
|
||||
maker_note = 37500
|
||||
user_comment = 37510
|
||||
sub_sec_time = 37520
|
||||
sub_sec_time_original = 37521
|
||||
sub_sec_time_digitized = 37522
|
||||
ms_document_text = 37679
|
||||
ms_property_set_storage = 37680
|
||||
ms_document_text_position = 37681
|
||||
image_source_data = 37724
|
||||
ambient_temperature = 37888
|
||||
humidity = 37889
|
||||
pressure = 37890
|
||||
water_depth = 37891
|
||||
acceleration = 37892
|
||||
camera_elevation_angle = 37893
|
||||
xp_title = 40091
|
||||
xp_comment = 40092
|
||||
xp_author = 40093
|
||||
xp_keywords = 40094
|
||||
xp_subject = 40095
|
||||
flashpix_version = 40960
|
||||
color_space = 40961
|
||||
exif_image_width = 40962
|
||||
exif_image_height = 40963
|
||||
related_sound_file = 40964
|
||||
interop_offset = 40965
|
||||
samsung_raw_pointers_offset = 40976
|
||||
samsung_raw_pointers_length = 40977
|
||||
samsung_raw_byte_order = 41217
|
||||
samsung_raw_unknown = 41218
|
||||
flash_energy2 = 41483
|
||||
spatial_frequency_response2 = 41484
|
||||
noise2 = 41485
|
||||
focal_plane_x_resolution2 = 41486
|
||||
focal_plane_y_resolution2 = 41487
|
||||
focal_plane_resolution_unit2 = 41488
|
||||
image_number2 = 41489
|
||||
security_classification2 = 41490
|
||||
image_history2 = 41491
|
||||
subject_location = 41492
|
||||
exposure_index2 = 41493
|
||||
tiff_ep_standard_id2 = 41494
|
||||
sensing_method2 = 41495
|
||||
file_source = 41728
|
||||
scene_type = 41729
|
||||
cfa_pattern = 41730
|
||||
custom_rendered = 41985
|
||||
exposure_mode = 41986
|
||||
white_balance = 41987
|
||||
digital_zoom_ratio = 41988
|
||||
focal_length_in35mm_format = 41989
|
||||
scene_capture_type = 41990
|
||||
gain_control = 41991
|
||||
contrast = 41992
|
||||
saturation = 41993
|
||||
sharpness = 41994
|
||||
device_setting_description = 41995
|
||||
subject_distance_range = 41996
|
||||
image_unique_id = 42016
|
||||
owner_name = 42032
|
||||
serial_number = 42033
|
||||
lens_info = 42034
|
||||
lens_make = 42035
|
||||
lens_model = 42036
|
||||
lens_serial_number = 42037
|
||||
gdal_metadata = 42112
|
||||
gdal_no_data = 42113
|
||||
gamma = 42240
|
||||
expand_software = 44992
|
||||
expand_lens = 44993
|
||||
expand_film = 44994
|
||||
expand_filter_lens = 44995
|
||||
expand_scanner = 44996
|
||||
expand_flash_lamp = 44997
|
||||
pixel_format = 48129
|
||||
transformation = 48130
|
||||
uncompressed = 48131
|
||||
image_type = 48132
|
||||
image_width2 = 48256
|
||||
image_height2 = 48257
|
||||
width_resolution = 48258
|
||||
height_resolution = 48259
|
||||
image_offset = 48320
|
||||
image_byte_count = 48321
|
||||
alpha_offset = 48322
|
||||
alpha_byte_count = 48323
|
||||
image_data_discard = 48324
|
||||
alpha_data_discard = 48325
|
||||
oce_scanjob_desc = 50215
|
||||
oce_application_selector = 50216
|
||||
oce_id_number = 50217
|
||||
oce_image_logic = 50218
|
||||
annotations = 50255
|
||||
print_im = 50341
|
||||
original_file_name = 50547
|
||||
uspto_original_content_type = 50560
|
||||
dng_version = 50706
|
||||
dng_backward_version = 50707
|
||||
unique_camera_model = 50708
|
||||
localized_camera_model = 50709
|
||||
cfa_plane_color = 50710
|
||||
cfa_layout = 50711
|
||||
linearization_table = 50712
|
||||
black_level_repeat_dim = 50713
|
||||
black_level = 50714
|
||||
black_level_delta_h = 50715
|
||||
black_level_delta_v = 50716
|
||||
white_level = 50717
|
||||
default_scale = 50718
|
||||
default_crop_origin = 50719
|
||||
default_crop_size = 50720
|
||||
color_matrix1 = 50721
|
||||
color_matrix2 = 50722
|
||||
camera_calibration1 = 50723
|
||||
camera_calibration2 = 50724
|
||||
reduction_matrix1 = 50725
|
||||
reduction_matrix2 = 50726
|
||||
analog_balance = 50727
|
||||
as_shot_neutral = 50728
|
||||
as_shot_white_xy = 50729
|
||||
baseline_exposure = 50730
|
||||
baseline_noise = 50731
|
||||
baseline_sharpness = 50732
|
||||
bayer_green_split = 50733
|
||||
linear_response_limit = 50734
|
||||
camera_serial_number = 50735
|
||||
dng_lens_info = 50736
|
||||
chroma_blur_radius = 50737
|
||||
anti_alias_strength = 50738
|
||||
shadow_scale = 50739
|
||||
sr2_private = 50740
|
||||
maker_note_safety = 50741
|
||||
raw_image_segmentation = 50752
|
||||
calibration_illuminant1 = 50778
|
||||
calibration_illuminant2 = 50779
|
||||
best_quality_scale = 50780
|
||||
raw_data_unique_id = 50781
|
||||
alias_layer_metadata = 50784
|
||||
original_raw_file_name = 50827
|
||||
original_raw_file_data = 50828
|
||||
active_area = 50829
|
||||
masked_areas = 50830
|
||||
as_shot_icc_profile = 50831
|
||||
as_shot_pre_profile_matrix = 50832
|
||||
current_icc_profile = 50833
|
||||
current_pre_profile_matrix = 50834
|
||||
colorimetric_reference = 50879
|
||||
s_raw_type = 50885
|
||||
panasonic_title = 50898
|
||||
panasonic_title2 = 50899
|
||||
camera_calibration_sig = 50931
|
||||
profile_calibration_sig = 50932
|
||||
profile_ifd = 50933
|
||||
as_shot_profile_name = 50934
|
||||
noise_reduction_applied = 50935
|
||||
profile_name = 50936
|
||||
profile_hue_sat_map_dims = 50937
|
||||
profile_hue_sat_map_data1 = 50938
|
||||
profile_hue_sat_map_data2 = 50939
|
||||
profile_tone_curve = 50940
|
||||
profile_embed_policy = 50941
|
||||
profile_copyright = 50942
|
||||
forward_matrix1 = 50964
|
||||
forward_matrix2 = 50965
|
||||
preview_application_name = 50966
|
||||
preview_application_version = 50967
|
||||
preview_settings_name = 50968
|
||||
preview_settings_digest = 50969
|
||||
preview_color_space = 50970
|
||||
preview_date_time = 50971
|
||||
raw_image_digest = 50972
|
||||
original_raw_file_digest = 50973
|
||||
sub_tile_block_size = 50974
|
||||
row_interleave_factor = 50975
|
||||
profile_look_table_dims = 50981
|
||||
profile_look_table_data = 50982
|
||||
opcode_list1 = 51008
|
||||
opcode_list2 = 51009
|
||||
opcode_list3 = 51022
|
||||
noise_profile = 51041
|
||||
time_codes = 51043
|
||||
frame_rate = 51044
|
||||
t_stop = 51058
|
||||
reel_name = 51081
|
||||
original_default_final_size = 51089
|
||||
original_best_quality_size = 51090
|
||||
original_default_crop_size = 51091
|
||||
camera_label = 51105
|
||||
profile_hue_sat_map_encoding = 51107
|
||||
profile_look_table_encoding = 51108
|
||||
baseline_exposure_offset = 51109
|
||||
default_black_render = 51110
|
||||
new_raw_image_digest = 51111
|
||||
raw_to_preview_gain = 51112
|
||||
default_user_crop = 51125
|
||||
padding = 59932
|
||||
offset_schema = 59933
|
||||
owner_name2 = 65000
|
||||
serial_number2 = 65001
|
||||
lens = 65002
|
||||
kdc_ifd = 65024
|
||||
raw_file = 65100
|
||||
converter = 65101
|
||||
white_balance2 = 65102
|
||||
exposure = 65105
|
||||
shadows = 65106
|
||||
brightness = 65107
|
||||
contrast2 = 65108
|
||||
saturation2 = 65109
|
||||
sharpness2 = 65110
|
||||
smoothness = 65111
|
||||
moire_filter = 65112
|
||||
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._is_le = _is_le
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
if not hasattr(self, '_is_le'):
|
||||
raise kaitaistruct.UndecidedEndiannessError("/types/exif_body/types/ifd_field")
|
||||
elif self._is_le == True:
|
||||
self._read_le()
|
||||
elif self._is_le == False:
|
||||
self._read_be()
|
||||
|
||||
def _read_le(self):
|
||||
self.tag = KaitaiStream.resolve_enum(Exif.ExifBody.IfdField.TagEnum, self._io.read_u2le())
|
||||
self.field_type = KaitaiStream.resolve_enum(Exif.ExifBody.IfdField.FieldTypeEnum, self._io.read_u2le())
|
||||
self.length = self._io.read_u4le()
|
||||
self.ofs_or_data = self._io.read_u4le()
|
||||
|
||||
def _read_be(self):
|
||||
self.tag = KaitaiStream.resolve_enum(Exif.ExifBody.IfdField.TagEnum, self._io.read_u2be())
|
||||
self.field_type = KaitaiStream.resolve_enum(Exif.ExifBody.IfdField.FieldTypeEnum, self._io.read_u2be())
|
||||
self.length = self._io.read_u4be()
|
||||
self.ofs_or_data = self._io.read_u4be()
|
||||
|
||||
@property
|
||||
def type_byte_length(self):
|
||||
if hasattr(self, '_m_type_byte_length'):
|
||||
return self._m_type_byte_length
|
||||
|
||||
self._m_type_byte_length = (2 if self.field_type == Exif.ExifBody.IfdField.FieldTypeEnum.word else (4 if self.field_type == Exif.ExifBody.IfdField.FieldTypeEnum.dword else 1))
|
||||
return getattr(self, '_m_type_byte_length', None)
|
||||
|
||||
@property
|
||||
def byte_length(self):
|
||||
if hasattr(self, '_m_byte_length'):
|
||||
return self._m_byte_length
|
||||
|
||||
self._m_byte_length = (self.length * self.type_byte_length)
|
||||
return getattr(self, '_m_byte_length', None)
|
||||
|
||||
@property
|
||||
def is_immediate_data(self):
|
||||
if hasattr(self, '_m_is_immediate_data'):
|
||||
return self._m_is_immediate_data
|
||||
|
||||
self._m_is_immediate_data = self.byte_length <= 4
|
||||
return getattr(self, '_m_is_immediate_data', None)
|
||||
|
||||
@property
|
||||
def data(self):
|
||||
if hasattr(self, '_m_data'):
|
||||
return self._m_data
|
||||
|
||||
if not (self.is_immediate_data):
|
||||
io = self._root._io
|
||||
_pos = io.pos()
|
||||
io.seek(self.ofs_or_data)
|
||||
if self._is_le:
|
||||
self._m_data = io.read_bytes(self.byte_length)
|
||||
else:
|
||||
self._m_data = io.read_bytes(self.byte_length)
|
||||
io.seek(_pos)
|
||||
|
||||
return getattr(self, '_m_data', None)
|
||||
|
||||
|
||||
@property
|
||||
def ifd0(self):
|
||||
if hasattr(self, '_m_ifd0'):
|
||||
return self._m_ifd0
|
||||
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.ifd0_ofs)
|
||||
if self._is_le:
|
||||
self._m_ifd0 = Exif.ExifBody.Ifd(self._io, self, self._root, self._is_le)
|
||||
else:
|
||||
self._m_ifd0 = Exif.ExifBody.Ifd(self._io, self, self._root, self._is_le)
|
||||
self._io.seek(_pos)
|
||||
return getattr(self, '_m_ifd0', None)
|
||||
|
||||
|
||||
|
||||
|
@ -1,582 +0,0 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
|
||||
class ExifBe(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.version = self._io.read_u2be()
|
||||
self.ifd0_ofs = self._io.read_u4be()
|
||||
|
||||
class Ifd(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.num_fields = self._io.read_u2be()
|
||||
self.fields = [None] * (self.num_fields)
|
||||
for i in range(self.num_fields):
|
||||
self.fields[i] = self._root.IfdField(self._io, self, self._root)
|
||||
|
||||
self.next_ifd_ofs = self._io.read_u4be()
|
||||
|
||||
@property
|
||||
def next_ifd(self):
|
||||
if hasattr(self, '_m_next_ifd'):
|
||||
return self._m_next_ifd if hasattr(self, '_m_next_ifd') else None
|
||||
|
||||
if self.next_ifd_ofs != 0:
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.next_ifd_ofs)
|
||||
self._m_next_ifd = self._root.Ifd(self._io, self, self._root)
|
||||
self._io.seek(_pos)
|
||||
|
||||
return self._m_next_ifd if hasattr(self, '_m_next_ifd') else None
|
||||
|
||||
|
||||
class IfdField(KaitaiStruct):
|
||||
|
||||
class FieldTypeEnum(Enum):
|
||||
byte = 1
|
||||
ascii_string = 2
|
||||
word = 3
|
||||
dword = 4
|
||||
rational = 5
|
||||
undefined = 7
|
||||
slong = 9
|
||||
srational = 10
|
||||
|
||||
class TagEnum(Enum):
|
||||
image_width = 256
|
||||
image_height = 257
|
||||
bits_per_sample = 258
|
||||
compression = 259
|
||||
photometric_interpretation = 262
|
||||
thresholding = 263
|
||||
cell_width = 264
|
||||
cell_length = 265
|
||||
fill_order = 266
|
||||
document_name = 269
|
||||
image_description = 270
|
||||
make = 271
|
||||
model = 272
|
||||
strip_offsets = 273
|
||||
orientation = 274
|
||||
samples_per_pixel = 277
|
||||
rows_per_strip = 278
|
||||
strip_byte_counts = 279
|
||||
min_sample_value = 280
|
||||
max_sample_value = 281
|
||||
x_resolution = 282
|
||||
y_resolution = 283
|
||||
planar_configuration = 284
|
||||
page_name = 285
|
||||
x_position = 286
|
||||
y_position = 287
|
||||
free_offsets = 288
|
||||
free_byte_counts = 289
|
||||
gray_response_unit = 290
|
||||
gray_response_curve = 291
|
||||
t4_options = 292
|
||||
t6_options = 293
|
||||
resolution_unit = 296
|
||||
page_number = 297
|
||||
color_response_unit = 300
|
||||
transfer_function = 301
|
||||
software = 305
|
||||
modify_date = 306
|
||||
artist = 315
|
||||
host_computer = 316
|
||||
predictor = 317
|
||||
white_point = 318
|
||||
primary_chromaticities = 319
|
||||
color_map = 320
|
||||
halftone_hints = 321
|
||||
tile_width = 322
|
||||
tile_length = 323
|
||||
tile_offsets = 324
|
||||
tile_byte_counts = 325
|
||||
bad_fax_lines = 326
|
||||
clean_fax_data = 327
|
||||
consecutive_bad_fax_lines = 328
|
||||
sub_ifd = 330
|
||||
ink_set = 332
|
||||
ink_names = 333
|
||||
numberof_inks = 334
|
||||
dot_range = 336
|
||||
target_printer = 337
|
||||
extra_samples = 338
|
||||
sample_format = 339
|
||||
s_min_sample_value = 340
|
||||
s_max_sample_value = 341
|
||||
transfer_range = 342
|
||||
clip_path = 343
|
||||
x_clip_path_units = 344
|
||||
y_clip_path_units = 345
|
||||
indexed = 346
|
||||
jpeg_tables = 347
|
||||
opi_proxy = 351
|
||||
global_parameters_ifd = 400
|
||||
profile_type = 401
|
||||
fax_profile = 402
|
||||
coding_methods = 403
|
||||
version_year = 404
|
||||
mode_number = 405
|
||||
decode = 433
|
||||
default_image_color = 434
|
||||
t82_options = 435
|
||||
jpeg_tables2 = 437
|
||||
jpeg_proc = 512
|
||||
thumbnail_offset = 513
|
||||
thumbnail_length = 514
|
||||
jpeg_restart_interval = 515
|
||||
jpeg_lossless_predictors = 517
|
||||
jpeg_point_transforms = 518
|
||||
jpegq_tables = 519
|
||||
jpegdc_tables = 520
|
||||
jpegac_tables = 521
|
||||
y_cb_cr_coefficients = 529
|
||||
y_cb_cr_sub_sampling = 530
|
||||
y_cb_cr_positioning = 531
|
||||
reference_black_white = 532
|
||||
strip_row_counts = 559
|
||||
application_notes = 700
|
||||
uspto_miscellaneous = 999
|
||||
related_image_file_format = 4096
|
||||
related_image_width = 4097
|
||||
related_image_height = 4098
|
||||
rating = 18246
|
||||
xp_dip_xml = 18247
|
||||
stitch_info = 18248
|
||||
rating_percent = 18249
|
||||
sony_raw_file_type = 28672
|
||||
light_falloff_params = 28722
|
||||
chromatic_aberration_corr_params = 28725
|
||||
distortion_corr_params = 28727
|
||||
image_id = 32781
|
||||
wang_tag1 = 32931
|
||||
wang_annotation = 32932
|
||||
wang_tag3 = 32933
|
||||
wang_tag4 = 32934
|
||||
image_reference_points = 32953
|
||||
region_xform_tack_point = 32954
|
||||
warp_quadrilateral = 32955
|
||||
affine_transform_mat = 32956
|
||||
matteing = 32995
|
||||
data_type = 32996
|
||||
image_depth = 32997
|
||||
tile_depth = 32998
|
||||
image_full_width = 33300
|
||||
image_full_height = 33301
|
||||
texture_format = 33302
|
||||
wrap_modes = 33303
|
||||
fov_cot = 33304
|
||||
matrix_world_to_screen = 33305
|
||||
matrix_world_to_camera = 33306
|
||||
model2 = 33405
|
||||
cfa_repeat_pattern_dim = 33421
|
||||
cfa_pattern2 = 33422
|
||||
battery_level = 33423
|
||||
kodak_ifd = 33424
|
||||
copyright = 33432
|
||||
exposure_time = 33434
|
||||
f_number = 33437
|
||||
md_file_tag = 33445
|
||||
md_scale_pixel = 33446
|
||||
md_color_table = 33447
|
||||
md_lab_name = 33448
|
||||
md_sample_info = 33449
|
||||
md_prep_date = 33450
|
||||
md_prep_time = 33451
|
||||
md_file_units = 33452
|
||||
pixel_scale = 33550
|
||||
advent_scale = 33589
|
||||
advent_revision = 33590
|
||||
uic1_tag = 33628
|
||||
uic2_tag = 33629
|
||||
uic3_tag = 33630
|
||||
uic4_tag = 33631
|
||||
iptc_naa = 33723
|
||||
intergraph_packet_data = 33918
|
||||
intergraph_flag_registers = 33919
|
||||
intergraph_matrix = 33920
|
||||
ingr_reserved = 33921
|
||||
model_tie_point = 33922
|
||||
site = 34016
|
||||
color_sequence = 34017
|
||||
it8_header = 34018
|
||||
raster_padding = 34019
|
||||
bits_per_run_length = 34020
|
||||
bits_per_extended_run_length = 34021
|
||||
color_table = 34022
|
||||
image_color_indicator = 34023
|
||||
background_color_indicator = 34024
|
||||
image_color_value = 34025
|
||||
background_color_value = 34026
|
||||
pixel_intensity_range = 34027
|
||||
transparency_indicator = 34028
|
||||
color_characterization = 34029
|
||||
hc_usage = 34030
|
||||
trap_indicator = 34031
|
||||
cmyk_equivalent = 34032
|
||||
sem_info = 34118
|
||||
afcp_iptc = 34152
|
||||
pixel_magic_jbig_options = 34232
|
||||
jpl_carto_ifd = 34263
|
||||
model_transform = 34264
|
||||
wb_grgb_levels = 34306
|
||||
leaf_data = 34310
|
||||
photoshop_settings = 34377
|
||||
exif_offset = 34665
|
||||
icc_profile = 34675
|
||||
tiff_fx_extensions = 34687
|
||||
multi_profiles = 34688
|
||||
shared_data = 34689
|
||||
t88_options = 34690
|
||||
image_layer = 34732
|
||||
geo_tiff_directory = 34735
|
||||
geo_tiff_double_params = 34736
|
||||
geo_tiff_ascii_params = 34737
|
||||
jbig_options = 34750
|
||||
exposure_program = 34850
|
||||
spectral_sensitivity = 34852
|
||||
gps_info = 34853
|
||||
iso = 34855
|
||||
opto_electric_conv_factor = 34856
|
||||
interlace = 34857
|
||||
time_zone_offset = 34858
|
||||
self_timer_mode = 34859
|
||||
sensitivity_type = 34864
|
||||
standard_output_sensitivity = 34865
|
||||
recommended_exposure_index = 34866
|
||||
iso_speed = 34867
|
||||
iso_speed_latitudeyyy = 34868
|
||||
iso_speed_latitudezzz = 34869
|
||||
fax_recv_params = 34908
|
||||
fax_sub_address = 34909
|
||||
fax_recv_time = 34910
|
||||
fedex_edr = 34929
|
||||
leaf_sub_ifd = 34954
|
||||
exif_version = 36864
|
||||
date_time_original = 36867
|
||||
create_date = 36868
|
||||
google_plus_upload_code = 36873
|
||||
offset_time = 36880
|
||||
offset_time_original = 36881
|
||||
offset_time_digitized = 36882
|
||||
components_configuration = 37121
|
||||
compressed_bits_per_pixel = 37122
|
||||
shutter_speed_value = 37377
|
||||
aperture_value = 37378
|
||||
brightness_value = 37379
|
||||
exposure_compensation = 37380
|
||||
max_aperture_value = 37381
|
||||
subject_distance = 37382
|
||||
metering_mode = 37383
|
||||
light_source = 37384
|
||||
flash = 37385
|
||||
focal_length = 37386
|
||||
flash_energy = 37387
|
||||
spatial_frequency_response = 37388
|
||||
noise = 37389
|
||||
focal_plane_x_resolution = 37390
|
||||
focal_plane_y_resolution = 37391
|
||||
focal_plane_resolution_unit = 37392
|
||||
image_number = 37393
|
||||
security_classification = 37394
|
||||
image_history = 37395
|
||||
subject_area = 37396
|
||||
exposure_index = 37397
|
||||
tiff_ep_standard_id = 37398
|
||||
sensing_method = 37399
|
||||
cip3_data_file = 37434
|
||||
cip3_sheet = 37435
|
||||
cip3_side = 37436
|
||||
sto_nits = 37439
|
||||
maker_note = 37500
|
||||
user_comment = 37510
|
||||
sub_sec_time = 37520
|
||||
sub_sec_time_original = 37521
|
||||
sub_sec_time_digitized = 37522
|
||||
ms_document_text = 37679
|
||||
ms_property_set_storage = 37680
|
||||
ms_document_text_position = 37681
|
||||
image_source_data = 37724
|
||||
ambient_temperature = 37888
|
||||
humidity = 37889
|
||||
pressure = 37890
|
||||
water_depth = 37891
|
||||
acceleration = 37892
|
||||
camera_elevation_angle = 37893
|
||||
xp_title = 40091
|
||||
xp_comment = 40092
|
||||
xp_author = 40093
|
||||
xp_keywords = 40094
|
||||
xp_subject = 40095
|
||||
flashpix_version = 40960
|
||||
color_space = 40961
|
||||
exif_image_width = 40962
|
||||
exif_image_height = 40963
|
||||
related_sound_file = 40964
|
||||
interop_offset = 40965
|
||||
samsung_raw_pointers_offset = 40976
|
||||
samsung_raw_pointers_length = 40977
|
||||
samsung_raw_byte_order = 41217
|
||||
samsung_raw_unknown = 41218
|
||||
flash_energy2 = 41483
|
||||
spatial_frequency_response2 = 41484
|
||||
noise2 = 41485
|
||||
focal_plane_x_resolution2 = 41486
|
||||
focal_plane_y_resolution2 = 41487
|
||||
focal_plane_resolution_unit2 = 41488
|
||||
image_number2 = 41489
|
||||
security_classification2 = 41490
|
||||
image_history2 = 41491
|
||||
subject_location = 41492
|
||||
exposure_index2 = 41493
|
||||
tiff_ep_standard_id2 = 41494
|
||||
sensing_method2 = 41495
|
||||
file_source = 41728
|
||||
scene_type = 41729
|
||||
cfa_pattern = 41730
|
||||
custom_rendered = 41985
|
||||
exposure_mode = 41986
|
||||
white_balance = 41987
|
||||
digital_zoom_ratio = 41988
|
||||
focal_length_in35mm_format = 41989
|
||||
scene_capture_type = 41990
|
||||
gain_control = 41991
|
||||
contrast = 41992
|
||||
saturation = 41993
|
||||
sharpness = 41994
|
||||
device_setting_description = 41995
|
||||
subject_distance_range = 41996
|
||||
image_unique_id = 42016
|
||||
owner_name = 42032
|
||||
serial_number = 42033
|
||||
lens_info = 42034
|
||||
lens_make = 42035
|
||||
lens_model = 42036
|
||||
lens_serial_number = 42037
|
||||
gdal_metadata = 42112
|
||||
gdal_no_data = 42113
|
||||
gamma = 42240
|
||||
expand_software = 44992
|
||||
expand_lens = 44993
|
||||
expand_film = 44994
|
||||
expand_filter_lens = 44995
|
||||
expand_scanner = 44996
|
||||
expand_flash_lamp = 44997
|
||||
pixel_format = 48129
|
||||
transformation = 48130
|
||||
uncompressed = 48131
|
||||
image_type = 48132
|
||||
image_width2 = 48256
|
||||
image_height2 = 48257
|
||||
width_resolution = 48258
|
||||
height_resolution = 48259
|
||||
image_offset = 48320
|
||||
image_byte_count = 48321
|
||||
alpha_offset = 48322
|
||||
alpha_byte_count = 48323
|
||||
image_data_discard = 48324
|
||||
alpha_data_discard = 48325
|
||||
oce_scanjob_desc = 50215
|
||||
oce_application_selector = 50216
|
||||
oce_id_number = 50217
|
||||
oce_image_logic = 50218
|
||||
annotations = 50255
|
||||
print_im = 50341
|
||||
original_file_name = 50547
|
||||
uspto_original_content_type = 50560
|
||||
dng_version = 50706
|
||||
dng_backward_version = 50707
|
||||
unique_camera_model = 50708
|
||||
localized_camera_model = 50709
|
||||
cfa_plane_color = 50710
|
||||
cfa_layout = 50711
|
||||
linearization_table = 50712
|
||||
black_level_repeat_dim = 50713
|
||||
black_level = 50714
|
||||
black_level_delta_h = 50715
|
||||
black_level_delta_v = 50716
|
||||
white_level = 50717
|
||||
default_scale = 50718
|
||||
default_crop_origin = 50719
|
||||
default_crop_size = 50720
|
||||
color_matrix1 = 50721
|
||||
color_matrix2 = 50722
|
||||
camera_calibration1 = 50723
|
||||
camera_calibration2 = 50724
|
||||
reduction_matrix1 = 50725
|
||||
reduction_matrix2 = 50726
|
||||
analog_balance = 50727
|
||||
as_shot_neutral = 50728
|
||||
as_shot_white_xy = 50729
|
||||
baseline_exposure = 50730
|
||||
baseline_noise = 50731
|
||||
baseline_sharpness = 50732
|
||||
bayer_green_split = 50733
|
||||
linear_response_limit = 50734
|
||||
camera_serial_number = 50735
|
||||
dng_lens_info = 50736
|
||||
chroma_blur_radius = 50737
|
||||
anti_alias_strength = 50738
|
||||
shadow_scale = 50739
|
||||
sr2_private = 50740
|
||||
maker_note_safety = 50741
|
||||
raw_image_segmentation = 50752
|
||||
calibration_illuminant1 = 50778
|
||||
calibration_illuminant2 = 50779
|
||||
best_quality_scale = 50780
|
||||
raw_data_unique_id = 50781
|
||||
alias_layer_metadata = 50784
|
||||
original_raw_file_name = 50827
|
||||
original_raw_file_data = 50828
|
||||
active_area = 50829
|
||||
masked_areas = 50830
|
||||
as_shot_icc_profile = 50831
|
||||
as_shot_pre_profile_matrix = 50832
|
||||
current_icc_profile = 50833
|
||||
current_pre_profile_matrix = 50834
|
||||
colorimetric_reference = 50879
|
||||
s_raw_type = 50885
|
||||
panasonic_title = 50898
|
||||
panasonic_title2 = 50899
|
||||
camera_calibration_sig = 50931
|
||||
profile_calibration_sig = 50932
|
||||
profile_ifd = 50933
|
||||
as_shot_profile_name = 50934
|
||||
noise_reduction_applied = 50935
|
||||
profile_name = 50936
|
||||
profile_hue_sat_map_dims = 50937
|
||||
profile_hue_sat_map_data1 = 50938
|
||||
profile_hue_sat_map_data2 = 50939
|
||||
profile_tone_curve = 50940
|
||||
profile_embed_policy = 50941
|
||||
profile_copyright = 50942
|
||||
forward_matrix1 = 50964
|
||||
forward_matrix2 = 50965
|
||||
preview_application_name = 50966
|
||||
preview_application_version = 50967
|
||||
preview_settings_name = 50968
|
||||
preview_settings_digest = 50969
|
||||
preview_color_space = 50970
|
||||
preview_date_time = 50971
|
||||
raw_image_digest = 50972
|
||||
original_raw_file_digest = 50973
|
||||
sub_tile_block_size = 50974
|
||||
row_interleave_factor = 50975
|
||||
profile_look_table_dims = 50981
|
||||
profile_look_table_data = 50982
|
||||
opcode_list1 = 51008
|
||||
opcode_list2 = 51009
|
||||
opcode_list3 = 51022
|
||||
noise_profile = 51041
|
||||
time_codes = 51043
|
||||
frame_rate = 51044
|
||||
t_stop = 51058
|
||||
reel_name = 51081
|
||||
original_default_final_size = 51089
|
||||
original_best_quality_size = 51090
|
||||
original_default_crop_size = 51091
|
||||
camera_label = 51105
|
||||
profile_hue_sat_map_encoding = 51107
|
||||
profile_look_table_encoding = 51108
|
||||
baseline_exposure_offset = 51109
|
||||
default_black_render = 51110
|
||||
new_raw_image_digest = 51111
|
||||
raw_to_preview_gain = 51112
|
||||
default_user_crop = 51125
|
||||
padding = 59932
|
||||
offset_schema = 59933
|
||||
owner_name2 = 65000
|
||||
serial_number2 = 65001
|
||||
lens = 65002
|
||||
kdc_ifd = 65024
|
||||
raw_file = 65100
|
||||
converter = 65101
|
||||
white_balance2 = 65102
|
||||
exposure = 65105
|
||||
shadows = 65106
|
||||
brightness = 65107
|
||||
contrast2 = 65108
|
||||
saturation2 = 65109
|
||||
sharpness2 = 65110
|
||||
smoothness = 65111
|
||||
moire_filter = 65112
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.tag = self._root.IfdField.TagEnum(self._io.read_u2be())
|
||||
self.field_type = self._root.IfdField.FieldTypeEnum(self._io.read_u2be())
|
||||
self.length = self._io.read_u4be()
|
||||
self.ofs_or_data = self._io.read_u4be()
|
||||
|
||||
@property
|
||||
def type_byte_length(self):
|
||||
if hasattr(self, '_m_type_byte_length'):
|
||||
return self._m_type_byte_length if hasattr(self, '_m_type_byte_length') else None
|
||||
|
||||
self._m_type_byte_length = (2 if self.field_type == self._root.IfdField.FieldTypeEnum.word else (4 if self.field_type == self._root.IfdField.FieldTypeEnum.dword else 1))
|
||||
return self._m_type_byte_length if hasattr(self, '_m_type_byte_length') else None
|
||||
|
||||
@property
|
||||
def byte_length(self):
|
||||
if hasattr(self, '_m_byte_length'):
|
||||
return self._m_byte_length if hasattr(self, '_m_byte_length') else None
|
||||
|
||||
self._m_byte_length = (self.length * self.type_byte_length)
|
||||
return self._m_byte_length if hasattr(self, '_m_byte_length') else None
|
||||
|
||||
@property
|
||||
def is_immediate_data(self):
|
||||
if hasattr(self, '_m_is_immediate_data'):
|
||||
return self._m_is_immediate_data if hasattr(self, '_m_is_immediate_data') else None
|
||||
|
||||
self._m_is_immediate_data = self.byte_length <= 4
|
||||
return self._m_is_immediate_data if hasattr(self, '_m_is_immediate_data') else None
|
||||
|
||||
@property
|
||||
def data(self):
|
||||
if hasattr(self, '_m_data'):
|
||||
return self._m_data if hasattr(self, '_m_data') else None
|
||||
|
||||
if not (self.is_immediate_data):
|
||||
io = self._root._io
|
||||
_pos = io.pos()
|
||||
io.seek(self.ofs_or_data)
|
||||
self._m_data = io.read_bytes(self.byte_length)
|
||||
io.seek(_pos)
|
||||
|
||||
return self._m_data if hasattr(self, '_m_data') else None
|
||||
|
||||
|
||||
@property
|
||||
def ifd0(self):
|
||||
if hasattr(self, '_m_ifd0'):
|
||||
return self._m_ifd0 if hasattr(self, '_m_ifd0') else None
|
||||
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.ifd0_ofs)
|
||||
self._m_ifd0 = self._root.Ifd(self._io, self, self._root)
|
||||
self._io.seek(_pos)
|
||||
return self._m_ifd0 if hasattr(self, '_m_ifd0') else None
|
||||
|
||||
|
@ -1,582 +0,0 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
|
||||
class ExifLe(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.version = self._io.read_u2le()
|
||||
self.ifd0_ofs = self._io.read_u4le()
|
||||
|
||||
class Ifd(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.num_fields = self._io.read_u2le()
|
||||
self.fields = [None] * (self.num_fields)
|
||||
for i in range(self.num_fields):
|
||||
self.fields[i] = self._root.IfdField(self._io, self, self._root)
|
||||
|
||||
self.next_ifd_ofs = self._io.read_u4le()
|
||||
|
||||
@property
|
||||
def next_ifd(self):
|
||||
if hasattr(self, '_m_next_ifd'):
|
||||
return self._m_next_ifd if hasattr(self, '_m_next_ifd') else None
|
||||
|
||||
if self.next_ifd_ofs != 0:
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.next_ifd_ofs)
|
||||
self._m_next_ifd = self._root.Ifd(self._io, self, self._root)
|
||||
self._io.seek(_pos)
|
||||
|
||||
return self._m_next_ifd if hasattr(self, '_m_next_ifd') else None
|
||||
|
||||
|
||||
class IfdField(KaitaiStruct):
|
||||
|
||||
class FieldTypeEnum(Enum):
|
||||
byte = 1
|
||||
ascii_string = 2
|
||||
word = 3
|
||||
dword = 4
|
||||
rational = 5
|
||||
undefined = 7
|
||||
slong = 9
|
||||
srational = 10
|
||||
|
||||
class TagEnum(Enum):
|
||||
image_width = 256
|
||||
image_height = 257
|
||||
bits_per_sample = 258
|
||||
compression = 259
|
||||
photometric_interpretation = 262
|
||||
thresholding = 263
|
||||
cell_width = 264
|
||||
cell_length = 265
|
||||
fill_order = 266
|
||||
document_name = 269
|
||||
image_description = 270
|
||||
make = 271
|
||||
model = 272
|
||||
strip_offsets = 273
|
||||
orientation = 274
|
||||
samples_per_pixel = 277
|
||||
rows_per_strip = 278
|
||||
strip_byte_counts = 279
|
||||
min_sample_value = 280
|
||||
max_sample_value = 281
|
||||
x_resolution = 282
|
||||
y_resolution = 283
|
||||
planar_configuration = 284
|
||||
page_name = 285
|
||||
x_position = 286
|
||||
y_position = 287
|
||||
free_offsets = 288
|
||||
free_byte_counts = 289
|
||||
gray_response_unit = 290
|
||||
gray_response_curve = 291
|
||||
t4_options = 292
|
||||
t6_options = 293
|
||||
resolution_unit = 296
|
||||
page_number = 297
|
||||
color_response_unit = 300
|
||||
transfer_function = 301
|
||||
software = 305
|
||||
modify_date = 306
|
||||
artist = 315
|
||||
host_computer = 316
|
||||
predictor = 317
|
||||
white_point = 318
|
||||
primary_chromaticities = 319
|
||||
color_map = 320
|
||||
halftone_hints = 321
|
||||
tile_width = 322
|
||||
tile_length = 323
|
||||
tile_offsets = 324
|
||||
tile_byte_counts = 325
|
||||
bad_fax_lines = 326
|
||||
clean_fax_data = 327
|
||||
consecutive_bad_fax_lines = 328
|
||||
sub_ifd = 330
|
||||
ink_set = 332
|
||||
ink_names = 333
|
||||
numberof_inks = 334
|
||||
dot_range = 336
|
||||
target_printer = 337
|
||||
extra_samples = 338
|
||||
sample_format = 339
|
||||
s_min_sample_value = 340
|
||||
s_max_sample_value = 341
|
||||
transfer_range = 342
|
||||
clip_path = 343
|
||||
x_clip_path_units = 344
|
||||
y_clip_path_units = 345
|
||||
indexed = 346
|
||||
jpeg_tables = 347
|
||||
opi_proxy = 351
|
||||
global_parameters_ifd = 400
|
||||
profile_type = 401
|
||||
fax_profile = 402
|
||||
coding_methods = 403
|
||||
version_year = 404
|
||||
mode_number = 405
|
||||
decode = 433
|
||||
default_image_color = 434
|
||||
t82_options = 435
|
||||
jpeg_tables2 = 437
|
||||
jpeg_proc = 512
|
||||
thumbnail_offset = 513
|
||||
thumbnail_length = 514
|
||||
jpeg_restart_interval = 515
|
||||
jpeg_lossless_predictors = 517
|
||||
jpeg_point_transforms = 518
|
||||
jpegq_tables = 519
|
||||
jpegdc_tables = 520
|
||||
jpegac_tables = 521
|
||||
y_cb_cr_coefficients = 529
|
||||
y_cb_cr_sub_sampling = 530
|
||||
y_cb_cr_positioning = 531
|
||||
reference_black_white = 532
|
||||
strip_row_counts = 559
|
||||
application_notes = 700
|
||||
uspto_miscellaneous = 999
|
||||
related_image_file_format = 4096
|
||||
related_image_width = 4097
|
||||
related_image_height = 4098
|
||||
rating = 18246
|
||||
xp_dip_xml = 18247
|
||||
stitch_info = 18248
|
||||
rating_percent = 18249
|
||||
sony_raw_file_type = 28672
|
||||
light_falloff_params = 28722
|
||||
chromatic_aberration_corr_params = 28725
|
||||
distortion_corr_params = 28727
|
||||
image_id = 32781
|
||||
wang_tag1 = 32931
|
||||
wang_annotation = 32932
|
||||
wang_tag3 = 32933
|
||||
wang_tag4 = 32934
|
||||
image_reference_points = 32953
|
||||
region_xform_tack_point = 32954
|
||||
warp_quadrilateral = 32955
|
||||
affine_transform_mat = 32956
|
||||
matteing = 32995
|
||||
data_type = 32996
|
||||
image_depth = 32997
|
||||
tile_depth = 32998
|
||||
image_full_width = 33300
|
||||
image_full_height = 33301
|
||||
texture_format = 33302
|
||||
wrap_modes = 33303
|
||||
fov_cot = 33304
|
||||
matrix_world_to_screen = 33305
|
||||
matrix_world_to_camera = 33306
|
||||
model2 = 33405
|
||||
cfa_repeat_pattern_dim = 33421
|
||||
cfa_pattern2 = 33422
|
||||
battery_level = 33423
|
||||
kodak_ifd = 33424
|
||||
copyright = 33432
|
||||
exposure_time = 33434
|
||||
f_number = 33437
|
||||
md_file_tag = 33445
|
||||
md_scale_pixel = 33446
|
||||
md_color_table = 33447
|
||||
md_lab_name = 33448
|
||||
md_sample_info = 33449
|
||||
md_prep_date = 33450
|
||||
md_prep_time = 33451
|
||||
md_file_units = 33452
|
||||
pixel_scale = 33550
|
||||
advent_scale = 33589
|
||||
advent_revision = 33590
|
||||
uic1_tag = 33628
|
||||
uic2_tag = 33629
|
||||
uic3_tag = 33630
|
||||
uic4_tag = 33631
|
||||
iptc_naa = 33723
|
||||
intergraph_packet_data = 33918
|
||||
intergraph_flag_registers = 33919
|
||||
intergraph_matrix = 33920
|
||||
ingr_reserved = 33921
|
||||
model_tie_point = 33922
|
||||
site = 34016
|
||||
color_sequence = 34017
|
||||
it8_header = 34018
|
||||
raster_padding = 34019
|
||||
bits_per_run_length = 34020
|
||||
bits_per_extended_run_length = 34021
|
||||
color_table = 34022
|
||||
image_color_indicator = 34023
|
||||
background_color_indicator = 34024
|
||||
image_color_value = 34025
|
||||
background_color_value = 34026
|
||||
pixel_intensity_range = 34027
|
||||
transparency_indicator = 34028
|
||||
color_characterization = 34029
|
||||
hc_usage = 34030
|
||||
trap_indicator = 34031
|
||||
cmyk_equivalent = 34032
|
||||
sem_info = 34118
|
||||
afcp_iptc = 34152
|
||||
pixel_magic_jbig_options = 34232
|
||||
jpl_carto_ifd = 34263
|
||||
model_transform = 34264
|
||||
wb_grgb_levels = 34306
|
||||
leaf_data = 34310
|
||||
photoshop_settings = 34377
|
||||
exif_offset = 34665
|
||||
icc_profile = 34675
|
||||
tiff_fx_extensions = 34687
|
||||
multi_profiles = 34688
|
||||
shared_data = 34689
|
||||
t88_options = 34690
|
||||
image_layer = 34732
|
||||
geo_tiff_directory = 34735
|
||||
geo_tiff_double_params = 34736
|
||||
geo_tiff_ascii_params = 34737
|
||||
jbig_options = 34750
|
||||
exposure_program = 34850
|
||||
spectral_sensitivity = 34852
|
||||
gps_info = 34853
|
||||
iso = 34855
|
||||
opto_electric_conv_factor = 34856
|
||||
interlace = 34857
|
||||
time_zone_offset = 34858
|
||||
self_timer_mode = 34859
|
||||
sensitivity_type = 34864
|
||||
standard_output_sensitivity = 34865
|
||||
recommended_exposure_index = 34866
|
||||
iso_speed = 34867
|
||||
iso_speed_latitudeyyy = 34868
|
||||
iso_speed_latitudezzz = 34869
|
||||
fax_recv_params = 34908
|
||||
fax_sub_address = 34909
|
||||
fax_recv_time = 34910
|
||||
fedex_edr = 34929
|
||||
leaf_sub_ifd = 34954
|
||||
exif_version = 36864
|
||||
date_time_original = 36867
|
||||
create_date = 36868
|
||||
google_plus_upload_code = 36873
|
||||
offset_time = 36880
|
||||
offset_time_original = 36881
|
||||
offset_time_digitized = 36882
|
||||
components_configuration = 37121
|
||||
compressed_bits_per_pixel = 37122
|
||||
shutter_speed_value = 37377
|
||||
aperture_value = 37378
|
||||
brightness_value = 37379
|
||||
exposure_compensation = 37380
|
||||
max_aperture_value = 37381
|
||||
subject_distance = 37382
|
||||
metering_mode = 37383
|
||||
light_source = 37384
|
||||
flash = 37385
|
||||
focal_length = 37386
|
||||
flash_energy = 37387
|
||||
spatial_frequency_response = 37388
|
||||
noise = 37389
|
||||
focal_plane_x_resolution = 37390
|
||||
focal_plane_y_resolution = 37391
|
||||
focal_plane_resolution_unit = 37392
|
||||
image_number = 37393
|
||||
security_classification = 37394
|
||||
image_history = 37395
|
||||
subject_area = 37396
|
||||
exposure_index = 37397
|
||||
tiff_ep_standard_id = 37398
|
||||
sensing_method = 37399
|
||||
cip3_data_file = 37434
|
||||
cip3_sheet = 37435
|
||||
cip3_side = 37436
|
||||
sto_nits = 37439
|
||||
maker_note = 37500
|
||||
user_comment = 37510
|
||||
sub_sec_time = 37520
|
||||
sub_sec_time_original = 37521
|
||||
sub_sec_time_digitized = 37522
|
||||
ms_document_text = 37679
|
||||
ms_property_set_storage = 37680
|
||||
ms_document_text_position = 37681
|
||||
image_source_data = 37724
|
||||
ambient_temperature = 37888
|
||||
humidity = 37889
|
||||
pressure = 37890
|
||||
water_depth = 37891
|
||||
acceleration = 37892
|
||||
camera_elevation_angle = 37893
|
||||
xp_title = 40091
|
||||
xp_comment = 40092
|
||||
xp_author = 40093
|
||||
xp_keywords = 40094
|
||||
xp_subject = 40095
|
||||
flashpix_version = 40960
|
||||
color_space = 40961
|
||||
exif_image_width = 40962
|
||||
exif_image_height = 40963
|
||||
related_sound_file = 40964
|
||||
interop_offset = 40965
|
||||
samsung_raw_pointers_offset = 40976
|
||||
samsung_raw_pointers_length = 40977
|
||||
samsung_raw_byte_order = 41217
|
||||
samsung_raw_unknown = 41218
|
||||
flash_energy2 = 41483
|
||||
spatial_frequency_response2 = 41484
|
||||
noise2 = 41485
|
||||
focal_plane_x_resolution2 = 41486
|
||||
focal_plane_y_resolution2 = 41487
|
||||
focal_plane_resolution_unit2 = 41488
|
||||
image_number2 = 41489
|
||||
security_classification2 = 41490
|
||||
image_history2 = 41491
|
||||
subject_location = 41492
|
||||
exposure_index2 = 41493
|
||||
tiff_ep_standard_id2 = 41494
|
||||
sensing_method2 = 41495
|
||||
file_source = 41728
|
||||
scene_type = 41729
|
||||
cfa_pattern = 41730
|
||||
custom_rendered = 41985
|
||||
exposure_mode = 41986
|
||||
white_balance = 41987
|
||||
digital_zoom_ratio = 41988
|
||||
focal_length_in35mm_format = 41989
|
||||
scene_capture_type = 41990
|
||||
gain_control = 41991
|
||||
contrast = 41992
|
||||
saturation = 41993
|
||||
sharpness = 41994
|
||||
device_setting_description = 41995
|
||||
subject_distance_range = 41996
|
||||
image_unique_id = 42016
|
||||
owner_name = 42032
|
||||
serial_number = 42033
|
||||
lens_info = 42034
|
||||
lens_make = 42035
|
||||
lens_model = 42036
|
||||
lens_serial_number = 42037
|
||||
gdal_metadata = 42112
|
||||
gdal_no_data = 42113
|
||||
gamma = 42240
|
||||
expand_software = 44992
|
||||
expand_lens = 44993
|
||||
expand_film = 44994
|
||||
expand_filter_lens = 44995
|
||||
expand_scanner = 44996
|
||||
expand_flash_lamp = 44997
|
||||
pixel_format = 48129
|
||||
transformation = 48130
|
||||
uncompressed = 48131
|
||||
image_type = 48132
|
||||
image_width2 = 48256
|
||||
image_height2 = 48257
|
||||
width_resolution = 48258
|
||||
height_resolution = 48259
|
||||
image_offset = 48320
|
||||
image_byte_count = 48321
|
||||
alpha_offset = 48322
|
||||
alpha_byte_count = 48323
|
||||
image_data_discard = 48324
|
||||
alpha_data_discard = 48325
|
||||
oce_scanjob_desc = 50215
|
||||
oce_application_selector = 50216
|
||||
oce_id_number = 50217
|
||||
oce_image_logic = 50218
|
||||
annotations = 50255
|
||||
print_im = 50341
|
||||
original_file_name = 50547
|
||||
uspto_original_content_type = 50560
|
||||
dng_version = 50706
|
||||
dng_backward_version = 50707
|
||||
unique_camera_model = 50708
|
||||
localized_camera_model = 50709
|
||||
cfa_plane_color = 50710
|
||||
cfa_layout = 50711
|
||||
linearization_table = 50712
|
||||
black_level_repeat_dim = 50713
|
||||
black_level = 50714
|
||||
black_level_delta_h = 50715
|
||||
black_level_delta_v = 50716
|
||||
white_level = 50717
|
||||
default_scale = 50718
|
||||
default_crop_origin = 50719
|
||||
default_crop_size = 50720
|
||||
color_matrix1 = 50721
|
||||
color_matrix2 = 50722
|
||||
camera_calibration1 = 50723
|
||||
camera_calibration2 = 50724
|
||||
reduction_matrix1 = 50725
|
||||
reduction_matrix2 = 50726
|
||||
analog_balance = 50727
|
||||
as_shot_neutral = 50728
|
||||
as_shot_white_xy = 50729
|
||||
baseline_exposure = 50730
|
||||
baseline_noise = 50731
|
||||
baseline_sharpness = 50732
|
||||
bayer_green_split = 50733
|
||||
linear_response_limit = 50734
|
||||
camera_serial_number = 50735
|
||||
dng_lens_info = 50736
|
||||
chroma_blur_radius = 50737
|
||||
anti_alias_strength = 50738
|
||||
shadow_scale = 50739
|
||||
sr2_private = 50740
|
||||
maker_note_safety = 50741
|
||||
raw_image_segmentation = 50752
|
||||
calibration_illuminant1 = 50778
|
||||
calibration_illuminant2 = 50779
|
||||
best_quality_scale = 50780
|
||||
raw_data_unique_id = 50781
|
||||
alias_layer_metadata = 50784
|
||||
original_raw_file_name = 50827
|
||||
original_raw_file_data = 50828
|
||||
active_area = 50829
|
||||
masked_areas = 50830
|
||||
as_shot_icc_profile = 50831
|
||||
as_shot_pre_profile_matrix = 50832
|
||||
current_icc_profile = 50833
|
||||
current_pre_profile_matrix = 50834
|
||||
colorimetric_reference = 50879
|
||||
s_raw_type = 50885
|
||||
panasonic_title = 50898
|
||||
panasonic_title2 = 50899
|
||||
camera_calibration_sig = 50931
|
||||
profile_calibration_sig = 50932
|
||||
profile_ifd = 50933
|
||||
as_shot_profile_name = 50934
|
||||
noise_reduction_applied = 50935
|
||||
profile_name = 50936
|
||||
profile_hue_sat_map_dims = 50937
|
||||
profile_hue_sat_map_data1 = 50938
|
||||
profile_hue_sat_map_data2 = 50939
|
||||
profile_tone_curve = 50940
|
||||
profile_embed_policy = 50941
|
||||
profile_copyright = 50942
|
||||
forward_matrix1 = 50964
|
||||
forward_matrix2 = 50965
|
||||
preview_application_name = 50966
|
||||
preview_application_version = 50967
|
||||
preview_settings_name = 50968
|
||||
preview_settings_digest = 50969
|
||||
preview_color_space = 50970
|
||||
preview_date_time = 50971
|
||||
raw_image_digest = 50972
|
||||
original_raw_file_digest = 50973
|
||||
sub_tile_block_size = 50974
|
||||
row_interleave_factor = 50975
|
||||
profile_look_table_dims = 50981
|
||||
profile_look_table_data = 50982
|
||||
opcode_list1 = 51008
|
||||
opcode_list2 = 51009
|
||||
opcode_list3 = 51022
|
||||
noise_profile = 51041
|
||||
time_codes = 51043
|
||||
frame_rate = 51044
|
||||
t_stop = 51058
|
||||
reel_name = 51081
|
||||
original_default_final_size = 51089
|
||||
original_best_quality_size = 51090
|
||||
original_default_crop_size = 51091
|
||||
camera_label = 51105
|
||||
profile_hue_sat_map_encoding = 51107
|
||||
profile_look_table_encoding = 51108
|
||||
baseline_exposure_offset = 51109
|
||||
default_black_render = 51110
|
||||
new_raw_image_digest = 51111
|
||||
raw_to_preview_gain = 51112
|
||||
default_user_crop = 51125
|
||||
padding = 59932
|
||||
offset_schema = 59933
|
||||
owner_name2 = 65000
|
||||
serial_number2 = 65001
|
||||
lens = 65002
|
||||
kdc_ifd = 65024
|
||||
raw_file = 65100
|
||||
converter = 65101
|
||||
white_balance2 = 65102
|
||||
exposure = 65105
|
||||
shadows = 65106
|
||||
brightness = 65107
|
||||
contrast2 = 65108
|
||||
saturation2 = 65109
|
||||
sharpness2 = 65110
|
||||
smoothness = 65111
|
||||
moire_filter = 65112
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.tag = self._root.IfdField.TagEnum(self._io.read_u2le())
|
||||
self.field_type = self._root.IfdField.FieldTypeEnum(self._io.read_u2le())
|
||||
self.length = self._io.read_u4le()
|
||||
self.ofs_or_data = self._io.read_u4le()
|
||||
|
||||
@property
|
||||
def type_byte_length(self):
|
||||
if hasattr(self, '_m_type_byte_length'):
|
||||
return self._m_type_byte_length if hasattr(self, '_m_type_byte_length') else None
|
||||
|
||||
self._m_type_byte_length = (2 if self.field_type == self._root.IfdField.FieldTypeEnum.word else (4 if self.field_type == self._root.IfdField.FieldTypeEnum.dword else 1))
|
||||
return self._m_type_byte_length if hasattr(self, '_m_type_byte_length') else None
|
||||
|
||||
@property
|
||||
def byte_length(self):
|
||||
if hasattr(self, '_m_byte_length'):
|
||||
return self._m_byte_length if hasattr(self, '_m_byte_length') else None
|
||||
|
||||
self._m_byte_length = (self.length * self.type_byte_length)
|
||||
return self._m_byte_length if hasattr(self, '_m_byte_length') else None
|
||||
|
||||
@property
|
||||
def is_immediate_data(self):
|
||||
if hasattr(self, '_m_is_immediate_data'):
|
||||
return self._m_is_immediate_data if hasattr(self, '_m_is_immediate_data') else None
|
||||
|
||||
self._m_is_immediate_data = self.byte_length <= 4
|
||||
return self._m_is_immediate_data if hasattr(self, '_m_is_immediate_data') else None
|
||||
|
||||
@property
|
||||
def data(self):
|
||||
if hasattr(self, '_m_data'):
|
||||
return self._m_data if hasattr(self, '_m_data') else None
|
||||
|
||||
if not (self.is_immediate_data):
|
||||
io = self._root._io
|
||||
_pos = io.pos()
|
||||
io.seek(self.ofs_or_data)
|
||||
self._m_data = io.read_bytes(self.byte_length)
|
||||
io.seek(_pos)
|
||||
|
||||
return self._m_data if hasattr(self, '_m_data') else None
|
||||
|
||||
|
||||
@property
|
||||
def ifd0(self):
|
||||
if hasattr(self, '_m_ifd0'):
|
||||
return self._m_ifd0 if hasattr(self, '_m_ifd0') else None
|
||||
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.ifd0_ofs)
|
||||
self._m_ifd0 = self._root.Ifd(self._io, self, self._root)
|
||||
self._io.seek(_pos)
|
||||
return self._m_ifd0 if hasattr(self, '_m_ifd0') else None
|
||||
|
||||
|
@ -1,16 +1,32 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import array
|
||||
import struct
|
||||
import zlib
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
class Gif(KaitaiStruct):
|
||||
"""GIF (Graphics Interchange Format) is an image file format, developed
|
||||
in 1987. It became popular in 1990s as one of the main image formats
|
||||
used in World Wide Web.
|
||||
|
||||
GIF format allows encoding of palette-based images up to 256 colors
|
||||
(each of the colors can be chosen from a 24-bit RGB
|
||||
colorspace). Image data stream uses LZW (Lempel-Ziv-Welch) lossless
|
||||
compression.
|
||||
|
||||
Over the years, several version of the format were published and
|
||||
several extensions to it were made, namely, a popular Netscape
|
||||
extension that allows to store several images in one file, switching
|
||||
between them, which produces crude form of animation.
|
||||
|
||||
Structurally, format consists of several mandatory headers and then
|
||||
a stream of blocks follows. Blocks can carry additional
|
||||
metainformation or image data.
|
||||
"""
|
||||
|
||||
class BlockType(Enum):
|
||||
extension = 33
|
||||
@ -25,27 +41,39 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.hdr = self._root.Header(self._io, self, self._root)
|
||||
self.logical_screen_descriptor = self._root.LogicalScreenDescriptorStruct(self._io, self, self._root)
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.hdr = Gif.Header(self._io, self, self._root)
|
||||
self.logical_screen_descriptor = Gif.LogicalScreenDescriptorStruct(self._io, self, self._root)
|
||||
if self.logical_screen_descriptor.has_color_table:
|
||||
self._raw_global_color_table = self._io.read_bytes((self.logical_screen_descriptor.color_table_size * 3))
|
||||
io = KaitaiStream(BytesIO(self._raw_global_color_table))
|
||||
self.global_color_table = self._root.ColorTable(io, self, self._root)
|
||||
_io__raw_global_color_table = KaitaiStream(BytesIO(self._raw_global_color_table))
|
||||
self.global_color_table = Gif.ColorTable(_io__raw_global_color_table, self, self._root)
|
||||
|
||||
self.blocks = []
|
||||
i = 0
|
||||
while True:
|
||||
_ = self._root.Block(self._io, self, self._root)
|
||||
_ = Gif.Block(self._io, self, self._root)
|
||||
self.blocks.append(_)
|
||||
if ((self._io.is_eof()) or (_.block_type == self._root.BlockType.end_of_file)) :
|
||||
if ((self._io.is_eof()) or (_.block_type == Gif.BlockType.end_of_file)) :
|
||||
break
|
||||
i += 1
|
||||
|
||||
class ImageData(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
- section 22 - https://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.lzw_min_code_size = self._io.read_u1()
|
||||
self.subblocks = self._root.Subblocks(self._io, self, self._root)
|
||||
self.subblocks = Gif.Subblocks(self._io, self, self._root)
|
||||
|
||||
|
||||
class ColorTableEntry(KaitaiStruct):
|
||||
@ -53,16 +81,26 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.red = self._io.read_u1()
|
||||
self.green = self._io.read_u1()
|
||||
self.blue = self._io.read_u1()
|
||||
|
||||
|
||||
class LogicalScreenDescriptorStruct(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
- section 18 - https://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.screen_width = self._io.read_u2le()
|
||||
self.screen_height = self._io.read_u2le()
|
||||
self.flags = self._io.read_u1()
|
||||
@ -72,18 +110,18 @@ class Gif(KaitaiStruct):
|
||||
@property
|
||||
def has_color_table(self):
|
||||
if hasattr(self, '_m_has_color_table'):
|
||||
return self._m_has_color_table if hasattr(self, '_m_has_color_table') else None
|
||||
return self._m_has_color_table
|
||||
|
||||
self._m_has_color_table = (self.flags & 128) != 0
|
||||
return self._m_has_color_table if hasattr(self, '_m_has_color_table') else None
|
||||
return getattr(self, '_m_has_color_table', None)
|
||||
|
||||
@property
|
||||
def color_table_size(self):
|
||||
if hasattr(self, '_m_color_table_size'):
|
||||
return self._m_color_table_size if hasattr(self, '_m_color_table_size') else None
|
||||
return self._m_color_table_size
|
||||
|
||||
self._m_color_table_size = (2 << (self.flags & 7))
|
||||
return self._m_color_table_size if hasattr(self, '_m_color_table_size') else None
|
||||
return getattr(self, '_m_color_table_size', None)
|
||||
|
||||
|
||||
class LocalImageDescriptor(KaitaiStruct):
|
||||
@ -91,6 +129,9 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.left = self._io.read_u2le()
|
||||
self.top = self._io.read_u2le()
|
||||
self.width = self._io.read_u2le()
|
||||
@ -98,42 +139,42 @@ class Gif(KaitaiStruct):
|
||||
self.flags = self._io.read_u1()
|
||||
if self.has_color_table:
|
||||
self._raw_local_color_table = self._io.read_bytes((self.color_table_size * 3))
|
||||
io = KaitaiStream(BytesIO(self._raw_local_color_table))
|
||||
self.local_color_table = self._root.ColorTable(io, self, self._root)
|
||||
_io__raw_local_color_table = KaitaiStream(BytesIO(self._raw_local_color_table))
|
||||
self.local_color_table = Gif.ColorTable(_io__raw_local_color_table, self, self._root)
|
||||
|
||||
self.image_data = self._root.ImageData(self._io, self, self._root)
|
||||
self.image_data = Gif.ImageData(self._io, self, self._root)
|
||||
|
||||
@property
|
||||
def has_color_table(self):
|
||||
if hasattr(self, '_m_has_color_table'):
|
||||
return self._m_has_color_table if hasattr(self, '_m_has_color_table') else None
|
||||
return self._m_has_color_table
|
||||
|
||||
self._m_has_color_table = (self.flags & 128) != 0
|
||||
return self._m_has_color_table if hasattr(self, '_m_has_color_table') else None
|
||||
return getattr(self, '_m_has_color_table', None)
|
||||
|
||||
@property
|
||||
def has_interlace(self):
|
||||
if hasattr(self, '_m_has_interlace'):
|
||||
return self._m_has_interlace if hasattr(self, '_m_has_interlace') else None
|
||||
return self._m_has_interlace
|
||||
|
||||
self._m_has_interlace = (self.flags & 64) != 0
|
||||
return self._m_has_interlace if hasattr(self, '_m_has_interlace') else None
|
||||
return getattr(self, '_m_has_interlace', None)
|
||||
|
||||
@property
|
||||
def has_sorted_color_table(self):
|
||||
if hasattr(self, '_m_has_sorted_color_table'):
|
||||
return self._m_has_sorted_color_table if hasattr(self, '_m_has_sorted_color_table') else None
|
||||
return self._m_has_sorted_color_table
|
||||
|
||||
self._m_has_sorted_color_table = (self.flags & 32) != 0
|
||||
return self._m_has_sorted_color_table if hasattr(self, '_m_has_sorted_color_table') else None
|
||||
return getattr(self, '_m_has_sorted_color_table', None)
|
||||
|
||||
@property
|
||||
def color_table_size(self):
|
||||
if hasattr(self, '_m_color_table_size'):
|
||||
return self._m_color_table_size if hasattr(self, '_m_color_table_size') else None
|
||||
return self._m_color_table_size
|
||||
|
||||
self._m_color_table_size = (2 << (self.flags & 7))
|
||||
return self._m_color_table_size if hasattr(self, '_m_color_table_size') else None
|
||||
return getattr(self, '_m_color_table_size', None)
|
||||
|
||||
|
||||
class Block(KaitaiStruct):
|
||||
@ -141,60 +182,92 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.block_type = self._root.BlockType(self._io.read_u1())
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.block_type = KaitaiStream.resolve_enum(Gif.BlockType, self._io.read_u1())
|
||||
_on = self.block_type
|
||||
if _on == self._root.BlockType.extension:
|
||||
self.body = self._root.Extension(self._io, self, self._root)
|
||||
elif _on == self._root.BlockType.local_image_descriptor:
|
||||
self.body = self._root.LocalImageDescriptor(self._io, self, self._root)
|
||||
if _on == Gif.BlockType.extension:
|
||||
self.body = Gif.Extension(self._io, self, self._root)
|
||||
elif _on == Gif.BlockType.local_image_descriptor:
|
||||
self.body = Gif.LocalImageDescriptor(self._io, self, self._root)
|
||||
|
||||
|
||||
class ColorTable(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
- section 19 - https://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.entries = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.entries.append(self._root.ColorTableEntry(self._io, self, self._root))
|
||||
self.entries.append(Gif.ColorTableEntry(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
|
||||
class Header(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
- section 17 - https://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.magic = self._io.ensure_fixed_contents(struct.pack('3b', 71, 73, 70))
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.magic = self._io.read_bytes(3)
|
||||
if not self.magic == b"\x47\x49\x46":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x47\x49\x46", self.magic, self._io, u"/types/header/seq/0")
|
||||
self.version = (self._io.read_bytes(3)).decode(u"ASCII")
|
||||
|
||||
|
||||
class ExtGraphicControl(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
- section 23 - https://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.block_size = self._io.ensure_fixed_contents(struct.pack('1b', 4))
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.block_size = self._io.read_bytes(1)
|
||||
if not self.block_size == b"\x04":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x04", self.block_size, self._io, u"/types/ext_graphic_control/seq/0")
|
||||
self.flags = self._io.read_u1()
|
||||
self.delay_time = self._io.read_u2le()
|
||||
self.transparent_idx = self._io.read_u1()
|
||||
self.terminator = self._io.ensure_fixed_contents(struct.pack('1b', 0))
|
||||
self.terminator = self._io.read_bytes(1)
|
||||
if not self.terminator == b"\x00":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x00", self.terminator, self._io, u"/types/ext_graphic_control/seq/4")
|
||||
|
||||
@property
|
||||
def transparent_color_flag(self):
|
||||
if hasattr(self, '_m_transparent_color_flag'):
|
||||
return self._m_transparent_color_flag if hasattr(self, '_m_transparent_color_flag') else None
|
||||
return self._m_transparent_color_flag
|
||||
|
||||
self._m_transparent_color_flag = (self.flags & 1) != 0
|
||||
return self._m_transparent_color_flag if hasattr(self, '_m_transparent_color_flag') else None
|
||||
return getattr(self, '_m_transparent_color_flag', None)
|
||||
|
||||
@property
|
||||
def user_input_flag(self):
|
||||
if hasattr(self, '_m_user_input_flag'):
|
||||
return self._m_user_input_flag if hasattr(self, '_m_user_input_flag') else None
|
||||
return self._m_user_input_flag
|
||||
|
||||
self._m_user_input_flag = (self.flags & 2) != 0
|
||||
return self._m_user_input_flag if hasattr(self, '_m_user_input_flag') else None
|
||||
return getattr(self, '_m_user_input_flag', None)
|
||||
|
||||
|
||||
class Subblock(KaitaiStruct):
|
||||
@ -202,8 +275,26 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.num_bytes = self._io.read_u1()
|
||||
self.bytes = self._io.read_bytes(self.num_bytes)
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len_bytes = self._io.read_u1()
|
||||
self.bytes = self._io.read_bytes(self.len_bytes)
|
||||
|
||||
|
||||
class ApplicationId(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len_bytes = self._io.read_u1()
|
||||
if not self.len_bytes == 11:
|
||||
raise kaitaistruct.ValidationNotEqualError(11, self.len_bytes, self._io, u"/types/application_id/seq/0")
|
||||
self.application_identifier = (self._io.read_bytes(8)).decode(u"ASCII")
|
||||
self.application_auth_code = self._io.read_bytes(3)
|
||||
|
||||
|
||||
class ExtApplication(KaitaiStruct):
|
||||
@ -211,13 +302,18 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.application_id = self._root.Subblock(self._io, self, self._root)
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.application_id = Gif.ApplicationId(self._io, self, self._root)
|
||||
self.subblocks = []
|
||||
i = 0
|
||||
while True:
|
||||
_ = self._root.Subblock(self._io, self, self._root)
|
||||
_ = Gif.Subblock(self._io, self, self._root)
|
||||
self.subblocks.append(_)
|
||||
if _.num_bytes == 0:
|
||||
if _.len_bytes == 0:
|
||||
break
|
||||
i += 1
|
||||
|
||||
|
||||
class Subblocks(KaitaiStruct):
|
||||
@ -225,12 +321,17 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.entries = []
|
||||
i = 0
|
||||
while True:
|
||||
_ = self._root.Subblock(self._io, self, self._root)
|
||||
_ = Gif.Subblock(self._io, self, self._root)
|
||||
self.entries.append(_)
|
||||
if _.num_bytes == 0:
|
||||
if _.len_bytes == 0:
|
||||
break
|
||||
i += 1
|
||||
|
||||
|
||||
class Extension(KaitaiStruct):
|
||||
@ -238,16 +339,19 @@ class Gif(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.label = self._root.ExtensionLabel(self._io.read_u1())
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.label = KaitaiStream.resolve_enum(Gif.ExtensionLabel, self._io.read_u1())
|
||||
_on = self.label
|
||||
if _on == self._root.ExtensionLabel.application:
|
||||
self.body = self._root.ExtApplication(self._io, self, self._root)
|
||||
elif _on == self._root.ExtensionLabel.comment:
|
||||
self.body = self._root.Subblocks(self._io, self, self._root)
|
||||
elif _on == self._root.ExtensionLabel.graphic_control:
|
||||
self.body = self._root.ExtGraphicControl(self._io, self, self._root)
|
||||
if _on == Gif.ExtensionLabel.application:
|
||||
self.body = Gif.ExtApplication(self._io, self, self._root)
|
||||
elif _on == Gif.ExtensionLabel.comment:
|
||||
self.body = Gif.Subblocks(self._io, self, self._root)
|
||||
elif _on == Gif.ExtensionLabel.graphic_control:
|
||||
self.body = Gif.ExtGraphicControl(self._io, self, self._root)
|
||||
else:
|
||||
self.body = self._root.Subblocks(self._io, self, self._root)
|
||||
self.body = Gif.Subblocks(self._io, self, self._root)
|
||||
|
||||
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
from .vlq_base128_le import VlqBase128Le
|
||||
from . import vlq_base128_le
|
||||
class GoogleProtobuf(KaitaiStruct):
|
||||
"""Google Protocol Buffers (AKA protobuf) is a popular data
|
||||
serialization scheme used for communication protocols, data storage,
|
||||
@ -48,8 +49,10 @@ class GoogleProtobuf(KaitaiStruct):
|
||||
|
||||
def _read(self):
|
||||
self.pairs = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.pairs.append(self._root.Pair(self._io, self, self._root))
|
||||
self.pairs.append(GoogleProtobuf.Pair(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
class Pair(KaitaiStruct):
|
||||
@ -69,15 +72,15 @@ class GoogleProtobuf(KaitaiStruct):
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.key = VlqBase128Le(self._io)
|
||||
self.key = vlq_base128_le.VlqBase128Le(self._io)
|
||||
_on = self.wire_type
|
||||
if _on == self._root.Pair.WireTypes.varint:
|
||||
self.value = VlqBase128Le(self._io)
|
||||
elif _on == self._root.Pair.WireTypes.len_delimited:
|
||||
self.value = self._root.DelimitedBytes(self._io, self, self._root)
|
||||
elif _on == self._root.Pair.WireTypes.bit_64:
|
||||
if _on == GoogleProtobuf.Pair.WireTypes.varint:
|
||||
self.value = vlq_base128_le.VlqBase128Le(self._io)
|
||||
elif _on == GoogleProtobuf.Pair.WireTypes.len_delimited:
|
||||
self.value = GoogleProtobuf.DelimitedBytes(self._io, self, self._root)
|
||||
elif _on == GoogleProtobuf.Pair.WireTypes.bit_64:
|
||||
self.value = self._io.read_u8le()
|
||||
elif _on == self._root.Pair.WireTypes.bit_32:
|
||||
elif _on == GoogleProtobuf.Pair.WireTypes.bit_32:
|
||||
self.value = self._io.read_u4le()
|
||||
|
||||
@property
|
||||
@ -91,10 +94,10 @@ class GoogleProtobuf(KaitaiStruct):
|
||||
arbitrary bytes from UTF-8 encoded strings, etc.
|
||||
"""
|
||||
if hasattr(self, '_m_wire_type'):
|
||||
return self._m_wire_type if hasattr(self, '_m_wire_type') else None
|
||||
return self._m_wire_type
|
||||
|
||||
self._m_wire_type = self._root.Pair.WireTypes((self.key.value & 7))
|
||||
return self._m_wire_type if hasattr(self, '_m_wire_type') else None
|
||||
self._m_wire_type = KaitaiStream.resolve_enum(GoogleProtobuf.Pair.WireTypes, (self.key.value & 7))
|
||||
return getattr(self, '_m_wire_type', None)
|
||||
|
||||
@property
|
||||
def field_tag(self):
|
||||
@ -102,10 +105,10 @@ class GoogleProtobuf(KaitaiStruct):
|
||||
field name in a `.proto` file by this field tag.
|
||||
"""
|
||||
if hasattr(self, '_m_field_tag'):
|
||||
return self._m_field_tag if hasattr(self, '_m_field_tag') else None
|
||||
return self._m_field_tag
|
||||
|
||||
self._m_field_tag = (self.key.value >> 3)
|
||||
return self._m_field_tag if hasattr(self, '_m_field_tag') else None
|
||||
return getattr(self, '_m_field_tag', None)
|
||||
|
||||
|
||||
class DelimitedBytes(KaitaiStruct):
|
||||
@ -116,7 +119,7 @@ class GoogleProtobuf(KaitaiStruct):
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len = VlqBase128Le(self._io)
|
||||
self.len = vlq_base128_le.VlqBase128Le(self._io)
|
||||
self.body = self._io.read_bytes(self.len.value)
|
||||
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
import struct
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
class Ico(KaitaiStruct):
|
||||
"""Microsoft Windows uses specific file format to store applications
|
||||
@ -13,7 +14,7 @@ class Ico(KaitaiStruct):
|
||||
contained inside).
|
||||
|
||||
.. seealso::
|
||||
Source - https://msdn.microsoft.com/en-us/library/ms997538.aspx
|
||||
Source - https://docs.microsoft.com/en-us/previous-versions/ms997538(v=msdn.10)
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
@ -22,11 +23,13 @@ class Ico(KaitaiStruct):
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.magic = self._io.ensure_fixed_contents(struct.pack('4b', 0, 0, 1, 0))
|
||||
self.magic = self._io.read_bytes(4)
|
||||
if not self.magic == b"\x00\x00\x01\x00":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x00\x00\x01\x00", self.magic, self._io, u"/seq/0")
|
||||
self.num_images = self._io.read_u2le()
|
||||
self.images = [None] * (self.num_images)
|
||||
self.images = []
|
||||
for i in range(self.num_images):
|
||||
self.images[i] = self._root.IconDirEntry(self._io, self, self._root)
|
||||
self.images.append(Ico.IconDirEntry(self._io, self, self._root))
|
||||
|
||||
|
||||
class IconDirEntry(KaitaiStruct):
|
||||
@ -40,7 +43,9 @@ class Ico(KaitaiStruct):
|
||||
self.width = self._io.read_u1()
|
||||
self.height = self._io.read_u1()
|
||||
self.num_colors = self._io.read_u1()
|
||||
self.reserved = self._io.ensure_fixed_contents(struct.pack('1b', 0))
|
||||
self.reserved = self._io.read_bytes(1)
|
||||
if not self.reserved == b"\x00":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x00", self.reserved, self._io, u"/types/icon_dir_entry/seq/3")
|
||||
self.num_planes = self._io.read_u2le()
|
||||
self.bpp = self._io.read_u2le()
|
||||
self.len_img = self._io.read_u4le()
|
||||
@ -53,13 +58,13 @@ class Ico(KaitaiStruct):
|
||||
relevant parser, if needed to parse image data further.
|
||||
"""
|
||||
if hasattr(self, '_m_img'):
|
||||
return self._m_img if hasattr(self, '_m_img') else None
|
||||
return self._m_img
|
||||
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.ofs_img)
|
||||
self._m_img = self._io.read_bytes(self.len_img)
|
||||
self._io.seek(_pos)
|
||||
return self._m_img if hasattr(self, '_m_img') else None
|
||||
return getattr(self, '_m_img', None)
|
||||
|
||||
@property
|
||||
def png_header(self):
|
||||
@ -67,22 +72,22 @@ class Ico(KaitaiStruct):
|
||||
embedded PNG file.
|
||||
"""
|
||||
if hasattr(self, '_m_png_header'):
|
||||
return self._m_png_header if hasattr(self, '_m_png_header') else None
|
||||
return self._m_png_header
|
||||
|
||||
_pos = self._io.pos()
|
||||
self._io.seek(self.ofs_img)
|
||||
self._m_png_header = self._io.read_bytes(8)
|
||||
self._io.seek(_pos)
|
||||
return self._m_png_header if hasattr(self, '_m_png_header') else None
|
||||
return getattr(self, '_m_png_header', None)
|
||||
|
||||
@property
|
||||
def is_png(self):
|
||||
"""True if this image is in PNG format."""
|
||||
if hasattr(self, '_m_is_png'):
|
||||
return self._m_is_png if hasattr(self, '_m_is_png') else None
|
||||
return self._m_is_png
|
||||
|
||||
self._m_is_png = self.png_header == struct.pack('8b', -119, 80, 78, 71, 13, 10, 26, 10)
|
||||
return self._m_is_png if hasattr(self, '_m_is_png') else None
|
||||
self._m_is_png = self.png_header == b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"
|
||||
return getattr(self, '_m_is_png', None)
|
||||
|
||||
|
||||
|
||||
|
@ -1,18 +1,32 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import array
|
||||
import struct
|
||||
import zlib
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
|
||||
from .exif import Exif
|
||||
|
||||
from . import exif
|
||||
class Jpeg(KaitaiStruct):
|
||||
"""JPEG File Interchange Format, or JFIF, or, more colloquially known
|
||||
as just "JPEG" or "JPG", is a popular 2D bitmap image file format,
|
||||
offering lossy compression which works reasonably well with
|
||||
photographic images.
|
||||
|
||||
Format is organized as a container format, serving multiple
|
||||
"segments", each starting with a magic and a marker. JFIF standard
|
||||
dictates order and mandatory apperance of segments:
|
||||
|
||||
* SOI
|
||||
* APP0 (with JFIF magic)
|
||||
* APP0 (with JFXX magic, optional)
|
||||
* everything else
|
||||
* SOS
|
||||
* JPEG-compressed stream
|
||||
* EOI
|
||||
"""
|
||||
|
||||
class ComponentId(Enum):
|
||||
y = 1
|
||||
@ -24,9 +38,14 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.segments = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.segments.append(self._root.Segment(self._io, self, self._root))
|
||||
self.segments.append(Jpeg.Segment(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
class Segment(KaitaiStruct):
|
||||
@ -69,33 +88,38 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.magic = self._io.ensure_fixed_contents(struct.pack('1b', -1))
|
||||
self.marker = self._root.Segment.MarkerEnum(self._io.read_u1())
|
||||
if ((self.marker != self._root.Segment.MarkerEnum.soi) and (self.marker != self._root.Segment.MarkerEnum.eoi)) :
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.magic = self._io.read_bytes(1)
|
||||
if not self.magic == b"\xFF":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\xFF", self.magic, self._io, u"/types/segment/seq/0")
|
||||
self.marker = KaitaiStream.resolve_enum(Jpeg.Segment.MarkerEnum, self._io.read_u1())
|
||||
if ((self.marker != Jpeg.Segment.MarkerEnum.soi) and (self.marker != Jpeg.Segment.MarkerEnum.eoi)) :
|
||||
self.length = self._io.read_u2be()
|
||||
|
||||
if ((self.marker != self._root.Segment.MarkerEnum.soi) and (self.marker != self._root.Segment.MarkerEnum.eoi)) :
|
||||
if ((self.marker != Jpeg.Segment.MarkerEnum.soi) and (self.marker != Jpeg.Segment.MarkerEnum.eoi)) :
|
||||
_on = self.marker
|
||||
if _on == self._root.Segment.MarkerEnum.sos:
|
||||
if _on == Jpeg.Segment.MarkerEnum.app1:
|
||||
self._raw_data = self._io.read_bytes((self.length - 2))
|
||||
io = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = self._root.SegmentSos(io, self, self._root)
|
||||
elif _on == self._root.Segment.MarkerEnum.app1:
|
||||
_io__raw_data = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = Jpeg.SegmentApp1(_io__raw_data, self, self._root)
|
||||
elif _on == Jpeg.Segment.MarkerEnum.app0:
|
||||
self._raw_data = self._io.read_bytes((self.length - 2))
|
||||
io = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = self._root.SegmentApp1(io, self, self._root)
|
||||
elif _on == self._root.Segment.MarkerEnum.sof0:
|
||||
_io__raw_data = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = Jpeg.SegmentApp0(_io__raw_data, self, self._root)
|
||||
elif _on == Jpeg.Segment.MarkerEnum.sof0:
|
||||
self._raw_data = self._io.read_bytes((self.length - 2))
|
||||
io = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = self._root.SegmentSof0(io, self, self._root)
|
||||
elif _on == self._root.Segment.MarkerEnum.app0:
|
||||
_io__raw_data = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = Jpeg.SegmentSof0(_io__raw_data, self, self._root)
|
||||
elif _on == Jpeg.Segment.MarkerEnum.sos:
|
||||
self._raw_data = self._io.read_bytes((self.length - 2))
|
||||
io = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = self._root.SegmentApp0(io, self, self._root)
|
||||
_io__raw_data = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = Jpeg.SegmentSos(_io__raw_data, self, self._root)
|
||||
else:
|
||||
self.data = self._io.read_bytes((self.length - 2))
|
||||
|
||||
if self.marker == self._root.Segment.MarkerEnum.sos:
|
||||
if self.marker == Jpeg.Segment.MarkerEnum.sos:
|
||||
self.image_data = self._io.read_bytes_full()
|
||||
|
||||
|
||||
@ -105,10 +129,13 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.num_components = self._io.read_u1()
|
||||
self.components = [None] * (self.num_components)
|
||||
self.components = []
|
||||
for i in range(self.num_components):
|
||||
self.components[i] = self._root.SegmentSos.Component(self._io, self, self._root)
|
||||
self.components.append(Jpeg.SegmentSos.Component(self._io, self, self._root))
|
||||
|
||||
self.start_spectral_selection = self._io.read_u1()
|
||||
self.end_spectral = self._io.read_u1()
|
||||
@ -119,7 +146,10 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.id = self._root.ComponentId(self._io.read_u1())
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.id = KaitaiStream.resolve_enum(Jpeg.ComponentId, self._io.read_u1())
|
||||
self.huffman_table = self._io.read_u1()
|
||||
|
||||
|
||||
@ -129,10 +159,13 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.magic = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
|
||||
_on = self.magic
|
||||
if _on == u"Exif":
|
||||
self.body = self._root.ExifInJpeg(self._io, self, self._root)
|
||||
self.body = Jpeg.ExifInJpeg(self._io, self, self._root)
|
||||
|
||||
|
||||
class SegmentSof0(KaitaiStruct):
|
||||
@ -140,13 +173,16 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.bits_per_sample = self._io.read_u1()
|
||||
self.image_height = self._io.read_u2be()
|
||||
self.image_width = self._io.read_u2be()
|
||||
self.num_components = self._io.read_u1()
|
||||
self.components = [None] * (self.num_components)
|
||||
self.components = []
|
||||
for i in range(self.num_components):
|
||||
self.components[i] = self._root.SegmentSof0.Component(self._io, self, self._root)
|
||||
self.components.append(Jpeg.SegmentSof0.Component(self._io, self, self._root))
|
||||
|
||||
|
||||
class Component(KaitaiStruct):
|
||||
@ -154,25 +190,28 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.id = self._root.ComponentId(self._io.read_u1())
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.id = KaitaiStream.resolve_enum(Jpeg.ComponentId, self._io.read_u1())
|
||||
self.sampling_factors = self._io.read_u1()
|
||||
self.quantization_table_id = self._io.read_u1()
|
||||
|
||||
@property
|
||||
def sampling_x(self):
|
||||
if hasattr(self, '_m_sampling_x'):
|
||||
return self._m_sampling_x if hasattr(self, '_m_sampling_x') else None
|
||||
return self._m_sampling_x
|
||||
|
||||
self._m_sampling_x = ((self.sampling_factors & 240) >> 4)
|
||||
return self._m_sampling_x if hasattr(self, '_m_sampling_x') else None
|
||||
return getattr(self, '_m_sampling_x', None)
|
||||
|
||||
@property
|
||||
def sampling_y(self):
|
||||
if hasattr(self, '_m_sampling_y'):
|
||||
return self._m_sampling_y if hasattr(self, '_m_sampling_y') else None
|
||||
return self._m_sampling_y
|
||||
|
||||
self._m_sampling_y = (self.sampling_factors & 15)
|
||||
return self._m_sampling_y if hasattr(self, '_m_sampling_y') else None
|
||||
return getattr(self, '_m_sampling_y', None)
|
||||
|
||||
|
||||
|
||||
@ -181,10 +220,15 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.extra_zero = self._io.ensure_fixed_contents(struct.pack('1b', 0))
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.extra_zero = self._io.read_bytes(1)
|
||||
if not self.extra_zero == b"\x00":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x00", self.extra_zero, self._io, u"/types/exif_in_jpeg/seq/0")
|
||||
self._raw_data = self._io.read_bytes_full()
|
||||
io = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = Exif(io)
|
||||
_io__raw_data = KaitaiStream(BytesIO(self._raw_data))
|
||||
self.data = exif.Exif(_io__raw_data)
|
||||
|
||||
|
||||
class SegmentApp0(KaitaiStruct):
|
||||
@ -197,12 +241,18 @@ class Jpeg(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.magic = (self._io.read_bytes(5)).decode(u"ASCII")
|
||||
self.version_major = self._io.read_u1()
|
||||
self.version_minor = self._io.read_u1()
|
||||
self.density_units = self._root.SegmentApp0.DensityUnit(self._io.read_u1())
|
||||
self.density_units = KaitaiStream.resolve_enum(Jpeg.SegmentApp0.DensityUnit, self._io.read_u1())
|
||||
self.density_x = self._io.read_u2be()
|
||||
self.density_y = self._io.read_u2be()
|
||||
self.thumbnail_x = self._io.read_u1()
|
||||
self.thumbnail_y = self._io.read_u1()
|
||||
self.thumbnail = self._io.read_bytes(((self.thumbnail_x * self.thumbnail_y) * 3))
|
||||
|
||||
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/exif_be.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/exif_le.ksy
|
||||
set -e
|
||||
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/exif.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/gif.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/jpeg.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/png.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/ico.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/common/vlq_base128_le.ksy
|
||||
wget -N -P common/ https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/common/vlq_base128_le.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/serialization/google_protobuf.ksy
|
||||
wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/network/tls_client_hello.ksy
|
||||
|
||||
kaitai-struct-compiler --target python --opaque-types=true ./*.ksy
|
||||
kaitai-struct-compiler --target python --opaque-types=true -I . --python-package . ./*.ksy
|
||||
|
@ -1,16 +1,36 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import array
|
||||
import struct
|
||||
import zlib
|
||||
from enum import Enum
|
||||
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
from enum import Enum
|
||||
import zlib
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
class Png(KaitaiStruct):
|
||||
"""Test files for APNG can be found at the following locations:
|
||||
|
||||
* <https://philip.html5.org/tests/apng/tests.html>
|
||||
* <http://littlesvr.ca/apng/>
|
||||
"""
|
||||
|
||||
class PhysUnit(Enum):
|
||||
unknown = 0
|
||||
meter = 1
|
||||
|
||||
class BlendOpValues(Enum):
|
||||
source = 0
|
||||
over = 1
|
||||
|
||||
class CompressionMethods(Enum):
|
||||
zlib = 0
|
||||
|
||||
class DisposeOpValues(Enum):
|
||||
none = 0
|
||||
background = 1
|
||||
previous = 2
|
||||
|
||||
class ColorType(Enum):
|
||||
greyscale = 0
|
||||
@ -18,31 +38,41 @@ class Png(KaitaiStruct):
|
||||
indexed = 3
|
||||
greyscale_alpha = 4
|
||||
truecolor_alpha = 6
|
||||
|
||||
class PhysUnit(Enum):
|
||||
unknown = 0
|
||||
meter = 1
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.magic = self._io.ensure_fixed_contents(struct.pack('8b', -119, 80, 78, 71, 13, 10, 26, 10))
|
||||
self.ihdr_len = self._io.ensure_fixed_contents(struct.pack('4b', 0, 0, 0, 13))
|
||||
self.ihdr_type = self._io.ensure_fixed_contents(struct.pack('4b', 73, 72, 68, 82))
|
||||
self.ihdr = self._root.IhdrChunk(self._io, self, self._root)
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.magic = self._io.read_bytes(8)
|
||||
if not self.magic == b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", self.magic, self._io, u"/seq/0")
|
||||
self.ihdr_len = self._io.read_u4be()
|
||||
if not self.ihdr_len == 13:
|
||||
raise kaitaistruct.ValidationNotEqualError(13, self.ihdr_len, self._io, u"/seq/1")
|
||||
self.ihdr_type = self._io.read_bytes(4)
|
||||
if not self.ihdr_type == b"\x49\x48\x44\x52":
|
||||
raise kaitaistruct.ValidationNotEqualError(b"\x49\x48\x44\x52", self.ihdr_type, self._io, u"/seq/2")
|
||||
self.ihdr = Png.IhdrChunk(self._io, self, self._root)
|
||||
self.ihdr_crc = self._io.read_bytes(4)
|
||||
self.chunks = []
|
||||
i = 0
|
||||
while True:
|
||||
_ = self._root.Chunk(self._io, self, self._root)
|
||||
_ = Png.Chunk(self._io, self, self._root)
|
||||
self.chunks.append(_)
|
||||
if ((_.type == u"IEND") or (self._io.is_eof())) :
|
||||
break
|
||||
i += 1
|
||||
|
||||
class Rgb(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.r = self._io.read_u1()
|
||||
self.g = self._io.read_u1()
|
||||
self.b = self._io.read_u1()
|
||||
@ -53,59 +83,78 @@ class Png(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len = self._io.read_u4be()
|
||||
self.type = (self._io.read_bytes(4)).decode(u"UTF-8")
|
||||
_on = self.type
|
||||
if _on == u"iTXt":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.InternationalTextChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.InternationalTextChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"gAMA":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.GamaChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.GamaChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"tIME":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.TimeChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.TimeChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"PLTE":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.PlteChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.PlteChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"bKGD":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.BkgdChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.BkgdChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"pHYs":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.PhysChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.PhysChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"fdAT":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.FrameDataChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"tEXt":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.TextChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.TextChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"cHRM":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.ChrmChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.ChrmChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"acTL":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.AnimationControlChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"sRGB":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.SrgbChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.SrgbChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"zTXt":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.CompressedTextChunk(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.CompressedTextChunk(_io__raw_body, self, self._root)
|
||||
elif _on == u"fcTL":
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = Png.FrameControlChunk(_io__raw_body, self, self._root)
|
||||
else:
|
||||
self.body = self._io.read_bytes(self.len)
|
||||
self.crc = self._io.read_bytes(4)
|
||||
|
||||
|
||||
class BkgdIndexed(KaitaiStruct):
|
||||
"""Background chunk for images with indexed palette."""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.palette_index = self._io.read_u1()
|
||||
|
||||
|
||||
@ -114,71 +163,105 @@ class Png(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.x_int = self._io.read_u4be()
|
||||
self.y_int = self._io.read_u4be()
|
||||
|
||||
@property
|
||||
def x(self):
|
||||
if hasattr(self, '_m_x'):
|
||||
return self._m_x if hasattr(self, '_m_x') else None
|
||||
return self._m_x
|
||||
|
||||
self._m_x = (self.x_int / 100000.0)
|
||||
return self._m_x if hasattr(self, '_m_x') else None
|
||||
return getattr(self, '_m_x', None)
|
||||
|
||||
@property
|
||||
def y(self):
|
||||
if hasattr(self, '_m_y'):
|
||||
return self._m_y if hasattr(self, '_m_y') else None
|
||||
return self._m_y
|
||||
|
||||
self._m_y = (self.y_int / 100000.0)
|
||||
return self._m_y if hasattr(self, '_m_y') else None
|
||||
return getattr(self, '_m_y', None)
|
||||
|
||||
|
||||
class BkgdGreyscale(KaitaiStruct):
|
||||
"""Background chunk for greyscale images."""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.value = self._io.read_u2be()
|
||||
|
||||
|
||||
class ChrmChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11cHRM
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.white_point = self._root.Point(self._io, self, self._root)
|
||||
self.red = self._root.Point(self._io, self, self._root)
|
||||
self.green = self._root.Point(self._io, self, self._root)
|
||||
self.blue = self._root.Point(self._io, self, self._root)
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.white_point = Png.Point(self._io, self, self._root)
|
||||
self.red = Png.Point(self._io, self, self._root)
|
||||
self.green = Png.Point(self._io, self, self._root)
|
||||
self.blue = Png.Point(self._io, self, self._root)
|
||||
|
||||
|
||||
class IhdrChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11IHDR
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.width = self._io.read_u4be()
|
||||
self.height = self._io.read_u4be()
|
||||
self.bit_depth = self._io.read_u1()
|
||||
self.color_type = self._root.ColorType(self._io.read_u1())
|
||||
self.color_type = KaitaiStream.resolve_enum(Png.ColorType, self._io.read_u1())
|
||||
self.compression_method = self._io.read_u1()
|
||||
self.filter_method = self._io.read_u1()
|
||||
self.interlace_method = self._io.read_u1()
|
||||
|
||||
|
||||
class PlteChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11PLTE
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.entries = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.entries.append(self._root.Rgb(self._io, self, self._root))
|
||||
self.entries.append(Png.Rgb(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
|
||||
class SrgbChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11sRGB
|
||||
"""
|
||||
|
||||
class Intent(Enum):
|
||||
perceptual = 0
|
||||
@ -189,101 +272,250 @@ class Png(KaitaiStruct):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.render_intent = self._root.SrgbChunk.Intent(self._io.read_u1())
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.render_intent = KaitaiStream.resolve_enum(Png.SrgbChunk.Intent, self._io.read_u1())
|
||||
|
||||
|
||||
class CompressedTextChunk(KaitaiStruct):
|
||||
"""Compressed text chunk effectively allows to store key-value
|
||||
string pairs in PNG container, compressing "value" part (which
|
||||
can be quite lengthy) with zlib compression.
|
||||
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11zTXt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
|
||||
self.compression_method = self._io.read_u1()
|
||||
self.compression_method = KaitaiStream.resolve_enum(Png.CompressionMethods, self._io.read_u1())
|
||||
self._raw_text_datastream = self._io.read_bytes_full()
|
||||
self.text_datastream = zlib.decompress(self._raw_text_datastream)
|
||||
|
||||
|
||||
class BkgdTruecolor(KaitaiStruct):
|
||||
class FrameDataChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://wiki.mozilla.org/APNG_Specification#.60fdAT.60:_The_Frame_Data_Chunk
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.sequence_number = self._io.read_u4be()
|
||||
self.frame_data = self._io.read_bytes_full()
|
||||
|
||||
|
||||
class BkgdTruecolor(KaitaiStruct):
|
||||
"""Background chunk for truecolor images."""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.red = self._io.read_u2be()
|
||||
self.green = self._io.read_u2be()
|
||||
self.blue = self._io.read_u2be()
|
||||
|
||||
|
||||
class GamaChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11gAMA
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.gamma_int = self._io.read_u4be()
|
||||
|
||||
@property
|
||||
def gamma_ratio(self):
|
||||
if hasattr(self, '_m_gamma_ratio'):
|
||||
return self._m_gamma_ratio if hasattr(self, '_m_gamma_ratio') else None
|
||||
return self._m_gamma_ratio
|
||||
|
||||
self._m_gamma_ratio = (100000.0 / self.gamma_int)
|
||||
return self._m_gamma_ratio if hasattr(self, '_m_gamma_ratio') else None
|
||||
return getattr(self, '_m_gamma_ratio', None)
|
||||
|
||||
|
||||
class BkgdChunk(KaitaiStruct):
|
||||
"""Background chunk stores default background color to display this
|
||||
image against. Contents depend on `color_type` of the image.
|
||||
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11bKGD
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
_on = self._root.ihdr.color_type
|
||||
if _on == self._root.ColorType.greyscale_alpha:
|
||||
self.bkgd = self._root.BkgdGreyscale(self._io, self, self._root)
|
||||
elif _on == self._root.ColorType.indexed:
|
||||
self.bkgd = self._root.BkgdIndexed(self._io, self, self._root)
|
||||
elif _on == self._root.ColorType.greyscale:
|
||||
self.bkgd = self._root.BkgdGreyscale(self._io, self, self._root)
|
||||
elif _on == self._root.ColorType.truecolor_alpha:
|
||||
self.bkgd = self._root.BkgdTruecolor(self._io, self, self._root)
|
||||
elif _on == self._root.ColorType.truecolor:
|
||||
self.bkgd = self._root.BkgdTruecolor(self._io, self, self._root)
|
||||
if _on == Png.ColorType.indexed:
|
||||
self.bkgd = Png.BkgdIndexed(self._io, self, self._root)
|
||||
elif _on == Png.ColorType.truecolor_alpha:
|
||||
self.bkgd = Png.BkgdTruecolor(self._io, self, self._root)
|
||||
elif _on == Png.ColorType.greyscale_alpha:
|
||||
self.bkgd = Png.BkgdGreyscale(self._io, self, self._root)
|
||||
elif _on == Png.ColorType.truecolor:
|
||||
self.bkgd = Png.BkgdTruecolor(self._io, self, self._root)
|
||||
elif _on == Png.ColorType.greyscale:
|
||||
self.bkgd = Png.BkgdGreyscale(self._io, self, self._root)
|
||||
|
||||
|
||||
class PhysChunk(KaitaiStruct):
|
||||
""""Physical size" chunk stores data that allows to translate
|
||||
logical pixels into physical units (meters, etc) and vice-versa.
|
||||
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11pHYs
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.pixels_per_unit_x = self._io.read_u4be()
|
||||
self.pixels_per_unit_y = self._io.read_u4be()
|
||||
self.unit = self._root.PhysUnit(self._io.read_u1())
|
||||
self.unit = KaitaiStream.resolve_enum(Png.PhysUnit, self._io.read_u1())
|
||||
|
||||
|
||||
class FrameControlChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://wiki.mozilla.org/APNG_Specification#.60fcTL.60:_The_Frame_Control_Chunk
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.sequence_number = self._io.read_u4be()
|
||||
self.width = self._io.read_u4be()
|
||||
if not self.width >= 1:
|
||||
raise kaitaistruct.ValidationLessThanError(1, self.width, self._io, u"/types/frame_control_chunk/seq/1")
|
||||
if not self.width <= self._root.ihdr.width:
|
||||
raise kaitaistruct.ValidationGreaterThanError(self._root.ihdr.width, self.width, self._io, u"/types/frame_control_chunk/seq/1")
|
||||
self.height = self._io.read_u4be()
|
||||
if not self.height >= 1:
|
||||
raise kaitaistruct.ValidationLessThanError(1, self.height, self._io, u"/types/frame_control_chunk/seq/2")
|
||||
if not self.height <= self._root.ihdr.height:
|
||||
raise kaitaistruct.ValidationGreaterThanError(self._root.ihdr.height, self.height, self._io, u"/types/frame_control_chunk/seq/2")
|
||||
self.x_offset = self._io.read_u4be()
|
||||
if not self.x_offset <= (self._root.ihdr.width - self.width):
|
||||
raise kaitaistruct.ValidationGreaterThanError((self._root.ihdr.width - self.width), self.x_offset, self._io, u"/types/frame_control_chunk/seq/3")
|
||||
self.y_offset = self._io.read_u4be()
|
||||
if not self.y_offset <= (self._root.ihdr.height - self.height):
|
||||
raise kaitaistruct.ValidationGreaterThanError((self._root.ihdr.height - self.height), self.y_offset, self._io, u"/types/frame_control_chunk/seq/4")
|
||||
self.delay_num = self._io.read_u2be()
|
||||
self.delay_den = self._io.read_u2be()
|
||||
self.dispose_op = KaitaiStream.resolve_enum(Png.DisposeOpValues, self._io.read_u1())
|
||||
self.blend_op = KaitaiStream.resolve_enum(Png.BlendOpValues, self._io.read_u1())
|
||||
|
||||
@property
|
||||
def delay(self):
|
||||
"""Time to display this frame, in seconds."""
|
||||
if hasattr(self, '_m_delay'):
|
||||
return self._m_delay
|
||||
|
||||
self._m_delay = (self.delay_num / (100.0 if self.delay_den == 0 else self.delay_den))
|
||||
return getattr(self, '_m_delay', None)
|
||||
|
||||
|
||||
class InternationalTextChunk(KaitaiStruct):
|
||||
"""International text chunk effectively allows to store key-value string pairs in
|
||||
PNG container. Both "key" (keyword) and "value" (text) parts are
|
||||
given in pre-defined subset of iso8859-1 without control
|
||||
characters.
|
||||
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11iTXt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
|
||||
self.compression_flag = self._io.read_u1()
|
||||
self.compression_method = self._io.read_u1()
|
||||
self.compression_method = KaitaiStream.resolve_enum(Png.CompressionMethods, self._io.read_u1())
|
||||
self.language_tag = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
|
||||
self.translated_keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
|
||||
self.text = (self._io.read_bytes_full()).decode(u"UTF-8")
|
||||
|
||||
|
||||
class TextChunk(KaitaiStruct):
|
||||
"""Text chunk effectively allows to store key-value string pairs in
|
||||
PNG container. Both "key" (keyword) and "value" (text) parts are
|
||||
given in pre-defined subset of iso8859-1 without control
|
||||
characters.
|
||||
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11tEXt
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"iso8859-1")
|
||||
self.text = (self._io.read_bytes_full()).decode(u"iso8859-1")
|
||||
|
||||
|
||||
class TimeChunk(KaitaiStruct):
|
||||
class AnimationControlChunk(KaitaiStruct):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://wiki.mozilla.org/APNG_Specification#.60acTL.60:_The_Animation_Control_Chunk
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.num_frames = self._io.read_u4be()
|
||||
self.num_plays = self._io.read_u4be()
|
||||
|
||||
|
||||
class TimeChunk(KaitaiStruct):
|
||||
"""Time chunk stores time stamp of last modification of this image,
|
||||
up to 1 second precision in UTC timezone.
|
||||
|
||||
.. seealso::
|
||||
Source - https://www.w3.org/TR/PNG/#11tIME
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.year = self._io.read_u2be()
|
||||
self.month = self._io.read_u1()
|
||||
self.day = self._io.read_u1()
|
||||
|
@ -1,39 +1,37 @@
|
||||
meta:
|
||||
id: tls_client_hello
|
||||
xref:
|
||||
rfc: 5246 # TLS 1.2
|
||||
wikidata: Q206494 # TLS
|
||||
license: MIT
|
||||
endian: be
|
||||
|
||||
seq:
|
||||
- id: version
|
||||
type: version
|
||||
|
||||
|
||||
- id: random
|
||||
type: random
|
||||
|
||||
|
||||
- id: session_id
|
||||
type: session_id
|
||||
|
||||
|
||||
- id: cipher_suites
|
||||
type: cipher_suites
|
||||
|
||||
|
||||
- id: compression_methods
|
||||
type: compression_methods
|
||||
|
||||
- id: extensions
|
||||
size: 0
|
||||
repeat: expr
|
||||
repeat-expr: 0
|
||||
if: _io.eof == true
|
||||
|
||||
- id: extensions
|
||||
type: extensions
|
||||
if: _io.eof == false
|
||||
|
||||
|
||||
types:
|
||||
version:
|
||||
seq:
|
||||
- id: major
|
||||
type: u1
|
||||
|
||||
|
||||
- id: minor
|
||||
type: u1
|
||||
|
||||
@ -41,7 +39,7 @@ types:
|
||||
seq:
|
||||
- id: gmt_unix_time
|
||||
type: u4
|
||||
|
||||
|
||||
- id: random
|
||||
size: 28
|
||||
|
||||
@ -49,15 +47,15 @@ types:
|
||||
seq:
|
||||
- id: len
|
||||
type: u1
|
||||
|
||||
|
||||
- id: sid
|
||||
size: len
|
||||
|
||||
|
||||
cipher_suites:
|
||||
seq:
|
||||
- id: len
|
||||
type: u2
|
||||
|
||||
|
||||
- id: cipher_suites
|
||||
type: u2
|
||||
repeat: expr
|
||||
@ -67,7 +65,7 @@ types:
|
||||
seq:
|
||||
- id: len
|
||||
type: u1
|
||||
|
||||
|
||||
- id: compression_methods
|
||||
size: len
|
||||
|
||||
@ -79,23 +77,23 @@ types:
|
||||
- id: extensions
|
||||
type: extension
|
||||
repeat: eos
|
||||
|
||||
|
||||
extension:
|
||||
seq:
|
||||
- id: type
|
||||
type: u2
|
||||
|
||||
|
||||
- id: len
|
||||
type: u2
|
||||
|
||||
|
||||
- id: body
|
||||
size: len
|
||||
type:
|
||||
type:
|
||||
switch-on: type
|
||||
cases:
|
||||
0: sni
|
||||
16: alpn
|
||||
|
||||
|
||||
sni:
|
||||
seq:
|
||||
- id: list_length
|
||||
@ -104,12 +102,12 @@ types:
|
||||
- id: server_names
|
||||
type: server_name
|
||||
repeat: eos
|
||||
|
||||
|
||||
server_name:
|
||||
seq:
|
||||
- id: name_type
|
||||
type: u1
|
||||
|
||||
|
||||
- id: length
|
||||
type: u2
|
||||
|
||||
@ -129,6 +127,6 @@ types:
|
||||
seq:
|
||||
- id: strlen
|
||||
type: u1
|
||||
|
||||
|
||||
- id: name
|
||||
size: strlen
|
||||
|
@ -1,137 +1,189 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import array
|
||||
import struct
|
||||
import zlib
|
||||
from enum import Enum
|
||||
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
class TlsClientHello(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self.version = self._root.Version(self._io, self, self._root)
|
||||
self.random = self._root.Random(self._io, self, self._root)
|
||||
self.session_id = self._root.SessionId(self._io, self, self._root)
|
||||
self.cipher_suites = self._root.CipherSuites(self._io, self, self._root)
|
||||
self.compression_methods = self._root.CompressionMethods(self._io, self, self._root)
|
||||
if self._io.is_eof() == True:
|
||||
self.extensions = [None] * (0)
|
||||
for i in range(0):
|
||||
self.extensions[i] = self._io.read_bytes(0)
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.version = TlsClientHello.Version(self._io, self, self._root)
|
||||
self.random = TlsClientHello.Random(self._io, self, self._root)
|
||||
self.session_id = TlsClientHello.SessionId(self._io, self, self._root)
|
||||
self.cipher_suites = TlsClientHello.CipherSuites(self._io, self, self._root)
|
||||
self.compression_methods = TlsClientHello.CompressionMethods(self._io, self, self._root)
|
||||
if self._io.is_eof() == False:
|
||||
self.extensions = self._root.Extensions(self._io, self, self._root)
|
||||
self.extensions = TlsClientHello.Extensions(self._io, self, self._root)
|
||||
|
||||
|
||||
class ServerName(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.name_type = self._io.read_u1()
|
||||
self.length = self._io.read_u2be()
|
||||
self.host_name = self._io.read_bytes(self.length)
|
||||
|
||||
|
||||
class Random(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.gmt_unix_time = self._io.read_u4be()
|
||||
self.random = self._io.read_bytes(28)
|
||||
|
||||
|
||||
class SessionId(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len = self._io.read_u1()
|
||||
self.sid = self._io.read_bytes(self.len)
|
||||
|
||||
|
||||
class Sni(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.list_length = self._io.read_u2be()
|
||||
self.server_names = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.server_names.append(self._root.ServerName(self._io, self, self._root))
|
||||
self.server_names.append(TlsClientHello.ServerName(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
|
||||
class CipherSuites(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len = self._io.read_u2be()
|
||||
self.cipher_suites = [None] * (self.len // 2)
|
||||
self.cipher_suites = []
|
||||
for i in range(self.len // 2):
|
||||
self.cipher_suites[i] = self._io.read_u2be()
|
||||
self.cipher_suites.append(self._io.read_u2be())
|
||||
|
||||
|
||||
|
||||
class CompressionMethods(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len = self._io.read_u1()
|
||||
self.compression_methods = self._io.read_bytes(self.len)
|
||||
|
||||
|
||||
class Alpn(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.ext_len = self._io.read_u2be()
|
||||
self.alpn_protocols = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.alpn_protocols.append(self._root.Protocol(self._io, self, self._root))
|
||||
self.alpn_protocols.append(TlsClientHello.Protocol(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
|
||||
class Extensions(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.len = self._io.read_u2be()
|
||||
self.extensions = []
|
||||
i = 0
|
||||
while not self._io.is_eof():
|
||||
self.extensions.append(self._root.Extension(self._io, self, self._root))
|
||||
self.extensions.append(TlsClientHello.Extension(self._io, self, self._root))
|
||||
i += 1
|
||||
|
||||
|
||||
|
||||
class Version(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.major = self._io.read_u1()
|
||||
self.minor = self._io.read_u1()
|
||||
|
||||
|
||||
class Protocol(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.strlen = self._io.read_u1()
|
||||
self.name = self._io.read_bytes(self.strlen)
|
||||
|
||||
|
||||
class Extension(KaitaiStruct):
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
self._parent = _parent
|
||||
self._root = _root if _root else self
|
||||
self._read()
|
||||
|
||||
def _read(self):
|
||||
self.type = self._io.read_u2be()
|
||||
self.len = self._io.read_u2be()
|
||||
_on = self.type
|
||||
if _on == 0:
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.Sni(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = TlsClientHello.Sni(_io__raw_body, self, self._root)
|
||||
elif _on == 16:
|
||||
self._raw_body = self._io.read_bytes(self.len)
|
||||
io = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = self._root.Alpn(io, self, self._root)
|
||||
_io__raw_body = KaitaiStream(BytesIO(self._raw_body))
|
||||
self.body = TlsClientHello.Alpn(_io__raw_body, self, self._root)
|
||||
else:
|
||||
self.body = self._io.read_bytes(self.len)
|
||||
|
||||
|
||||
|
||||
|
@ -1,13 +1,15 @@
|
||||
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
||||
|
||||
import kaitaistruct
|
||||
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
||||
|
||||
|
||||
# manually removed version check, see https://github.com/mitmproxy/mitmproxy/issues/5401
|
||||
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
|
||||
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
||||
|
||||
class VlqBase128Le(KaitaiStruct):
|
||||
"""A variable-length unsigned integer using base128 encoding. 1-byte groups
|
||||
consists of 1-bit flag of continuation and 7-bit value, and are ordered
|
||||
"""A variable-length unsigned/signed integer using base128 encoding. 1-byte groups
|
||||
consist of 1-bit flag of continuation and 7-bit value chunk, and are ordered
|
||||
"least significant group first", i.e. in "little-endian" manner.
|
||||
|
||||
This particular encoding is specified and used in:
|
||||
@ -17,10 +19,10 @@ class VlqBase128Le(KaitaiStruct):
|
||||
* Google Protocol Buffers, where it's called "Base 128 Varints".
|
||||
https://developers.google.com/protocol-buffers/docs/encoding?csw=1#varints
|
||||
* Apache Lucene, where it's called "VInt"
|
||||
http://lucene.apache.org/core/3_5_0/fileformats.html#VInt
|
||||
https://lucene.apache.org/core/3_5_0/fileformats.html#VInt
|
||||
* Apache Avro uses this as a basis for integer encoding, adding ZigZag on
|
||||
top of it for signed ints
|
||||
http://avro.apache.org/docs/current/spec.html#binary_encode_primitive
|
||||
https://avro.apache.org/docs/current/spec.html#binary_encode_primitive
|
||||
|
||||
More information on this encoding is available at https://en.wikipedia.org/wiki/LEB128
|
||||
|
||||
@ -34,15 +36,16 @@ class VlqBase128Le(KaitaiStruct):
|
||||
|
||||
def _read(self):
|
||||
self.groups = []
|
||||
i = 0
|
||||
while True:
|
||||
_ = self._root.Group(self._io, self, self._root)
|
||||
_ = VlqBase128Le.Group(self._io, self, self._root)
|
||||
self.groups.append(_)
|
||||
if not (_.has_next):
|
||||
break
|
||||
i += 1
|
||||
|
||||
class Group(KaitaiStruct):
|
||||
"""One byte group, clearly divided into 7-bit "value" and 1-bit "has continuation
|
||||
in the next byte" flag.
|
||||
"""One byte group, clearly divided into 7-bit "value" chunk and 1-bit "continuation" flag.
|
||||
"""
|
||||
def __init__(self, _io, _parent=None, _root=None):
|
||||
self._io = _io
|
||||
@ -57,36 +60,56 @@ class VlqBase128Le(KaitaiStruct):
|
||||
def has_next(self):
|
||||
"""If true, then we have more bytes to read."""
|
||||
if hasattr(self, '_m_has_next'):
|
||||
return self._m_has_next if hasattr(self, '_m_has_next') else None
|
||||
return self._m_has_next
|
||||
|
||||
self._m_has_next = (self.b & 128) != 0
|
||||
return self._m_has_next if hasattr(self, '_m_has_next') else None
|
||||
return getattr(self, '_m_has_next', None)
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
"""The 7-bit (base128) numeric value of this group."""
|
||||
"""The 7-bit (base128) numeric value chunk of this group."""
|
||||
if hasattr(self, '_m_value'):
|
||||
return self._m_value if hasattr(self, '_m_value') else None
|
||||
return self._m_value
|
||||
|
||||
self._m_value = (self.b & 127)
|
||||
return self._m_value if hasattr(self, '_m_value') else None
|
||||
return getattr(self, '_m_value', None)
|
||||
|
||||
|
||||
@property
|
||||
def len(self):
|
||||
if hasattr(self, '_m_len'):
|
||||
return self._m_len if hasattr(self, '_m_len') else None
|
||||
return self._m_len
|
||||
|
||||
self._m_len = len(self.groups)
|
||||
return self._m_len if hasattr(self, '_m_len') else None
|
||||
return getattr(self, '_m_len', None)
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
"""Resulting value as normal integer."""
|
||||
"""Resulting unsigned value as normal integer."""
|
||||
if hasattr(self, '_m_value'):
|
||||
return self._m_value if hasattr(self, '_m_value') else None
|
||||
return self._m_value
|
||||
|
||||
self._m_value = (((((((self.groups[0].value + ((self.groups[1].value << 7) if self.len >= 2 else 0)) + ((self.groups[2].value << 14) if self.len >= 3 else 0)) + ((self.groups[3].value << 21) if self.len >= 4 else 0)) + ((self.groups[4].value << 28) if self.len >= 5 else 0)) + ((self.groups[5].value << 35) if self.len >= 6 else 0)) + ((self.groups[6].value << 42) if self.len >= 7 else 0)) + ((self.groups[7].value << 49) if self.len >= 8 else 0))
|
||||
return self._m_value if hasattr(self, '_m_value') else None
|
||||
return getattr(self, '_m_value', None)
|
||||
|
||||
@property
|
||||
def sign_bit(self):
|
||||
if hasattr(self, '_m_sign_bit'):
|
||||
return self._m_sign_bit
|
||||
|
||||
self._m_sign_bit = (1 << ((7 * self.len) - 1))
|
||||
return getattr(self, '_m_sign_bit', None)
|
||||
|
||||
@property
|
||||
def value_signed(self):
|
||||
"""
|
||||
.. seealso::
|
||||
Source - https://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend
|
||||
"""
|
||||
if hasattr(self, '_m_value_signed'):
|
||||
return self._m_value_signed
|
||||
|
||||
self._m_value_signed = ((self.value ^ self.sign_bit) - self.sign_bit)
|
||||
return getattr(self, '_m_value_signed', None)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user